ferrosoft.apps.ferrobase.tenant package

Submodules

ferrosoft.apps.ferrobase.tenant.context module

Context-variable storage for the currently active tenant.

Multi-tenancy is propagated through a single ContextVar so that both threaded and asynchronous request handling pick up the correct tenant without any explicit argument passing. ORM helpers in ferrosoft.apps.ferrobase.tenant.utils consult this variable to pick the right database alias.

ferrosoft.apps.ferrobase.tenant.context.active_tenant(tenant)[source]

Activate tenant for the duration of the with block.

On enter the tenant’s database connection is activated (when tenant is not None) and the context variable is set. On exit the previous context value is restored via the token-based reset pattern, so nested activations behave correctly.

Parameters:

tenant (Tenant | None) – Tenant to activate, or None to enter a no-tenant scope.

Yields:

Tenant | None – The tenant that was activated.

ferrosoft.apps.ferrobase.tenant.context.get_current_tenant()[source]

Return the tenant active in the current execution context, or None.

Return type:

Tenant | None

ferrosoft.apps.ferrobase.tenant.context.set_current_tenant(tenant)[source]

Set the active tenant for the current execution context.

Performs no database side effects and does not restore the previous value on exit. Prefer active_tenant() whenever the activation is scoped to a block of code.

Parameters:

tenant (Tenant | None) – The tenant to activate, or None to clear the context.

ferrosoft.apps.ferrobase.tenant.forms module

class ferrosoft.apps.ferrobase.tenant.forms.SignupForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None, bound_field_class=None)[source]

Bases: Form

Public self-service signup form: applicant identity and company.

base_fields = {'company': <django.forms.fields.CharField object>, 'email': <django.forms.fields.EmailField object>, 'first_name': <django.forms.fields.CharField object>, 'last_name': <django.forms.fields.CharField object>}
clean_company()[source]

Reject company names already used by an organisation or tenant.

clean_email()[source]

Reject signup when an account with this email already exists.

declared_fields = {'company': <django.forms.fields.CharField object>, 'email': <django.forms.fields.EmailField object>, 'first_name': <django.forms.fields.CharField object>, 'last_name': <django.forms.fields.CharField object>}
property media

Return all media required to render the widgets on this form.

class ferrosoft.apps.ferrobase.tenant.forms.SignupUserForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None, bound_field_class=None)[source]

Bases: Form

Account activation form collecting and confirming the initial password.

base_fields = {'password': <django.forms.fields.CharField object>, 'password_confirm': <django.forms.fields.CharField object>}
clean()[source]

Require both password fields to match.

The placeholder defaults ("1" / "2") ensure that missing values are treated as mismatched rather than accidentally equal.

declared_fields = {'password': <django.forms.fields.CharField object>, 'password_confirm': <django.forms.fields.CharField object>}
property media

Return all media required to render the widgets on this form.

class ferrosoft.apps.ferrobase.tenant.forms.UserResourcesForm(query)[source]

Bases: Form

Request payload carrying the storage-location UUIDs to grant a user.

storage_location = <ferrosoft.request.UUIDField object>
class ferrosoft.apps.ferrobase.tenant.forms.UserSettingsForm(*args, **kwargs)[source]

Bases: ModelForm

ModelForm for the user-editable subset of personal settings.

class Meta[source]

Bases: object

fields = ['first_name', 'last_name', 'email', 'language', 'timezone', 'color_theme']
model

alias of User

base_fields = {'color_theme': <django.forms.fields.TypedChoiceField object>, 'email': <django.forms.fields.EmailField object>, 'first_name': <django.forms.fields.CharField object>, 'language': <django.forms.models.ModelChoiceField object>, 'last_name': <django.forms.fields.CharField object>, 'timezone': <django.forms.models.ModelChoiceField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

ferrosoft.apps.ferrobase.tenant.tables module

class ferrosoft.apps.ferrobase.tenant.tables.UserTable(data=None, order_by=None, orderable=None, empty_text=None, exclude=None, attrs=None, row_attrs=None, pinned_row_attrs=None, sequence=None, prefix=None, order_by_field=None, page_field=None, per_page_field=None, template_name=None, default=None, request=None, show_header=None, show_footer=True, extra_columns=None)[source]

Bases: Table

Read-only Bootstrap 5 listing of users with edit/delete/assign actions.

class Meta[source]

Bases: object

attrs = {'class': 'table nowrap fixed-layout'}
fields = ('username', 'first_name', 'last_name', 'email', 'language')
model

alias of User

orderable = False
template_name = 'ferrobase/table_bootstrap5.html'
base_columns = {'assign_tenants': <ferrosoft.apps.ferrobase.tables.columns.ActionColumn object>, 'delete': <ferrosoft.apps.ferrobase.tables.columns.ActionColumn object>, 'edit': <ferrosoft.apps.ferrobase.tables.columns.ActionColumn object>, 'email': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'empty': <ferrosoft.apps.ferrobase.tables.columns.EmptyExpandColumn object>, 'first_name': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'language': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'last_name': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'username': <ferrosoft.apps.ferrobase.tables.columns.Column object>}

ferrosoft.apps.ferrobase.tenant.utils module

ferrosoft.apps.ferrobase.tenant.utils.tenant_db_connection()[source]

Get django.db.connection object for current tenant.

ferrosoft.apps.ferrobase.tenant.utils.tenant_db_transaction()[source]

Get transaction context manager for database connection of current tenant.