ferrosoft.apps.ferrobase.tables package¶
Submodules¶
ferrosoft.apps.ferrobase.tables.columns module¶
Reusable django-tables2 column classes for Ferrosoft tables.
The columns add rendering for domain-specific values (currency, units,
dates, arrays, inline-edit widgets) as well as layout helpers (fixed-width
classes, summing footers, action links) on top of django-tables2’s base
Column.
- class ferrosoft.apps.ferrobase.tables.columns.ActionColumn(href=None, label=None, attributes=None, font_icon=None, *args, **kwargs)[source]¶
Bases:
ColumnDisplay a action in the column, in the form of a link. The link can have arbitrary attributes, allowing for HTMX interactivity.
- class ferrosoft.apps.ferrobase.tables.columns.ArrayColumn(fixed_width=None, mixins=None, *args, **kwargs)[source]¶
Bases:
ColumnRender array values (of PostgreSQL array columns)
- class ferrosoft.apps.ferrobase.tables.columns.Column(fixed_width=None, mixins=None, *args, **kwargs)[source]¶
Bases:
ColumnBase column adding fixed-width sizing and stackable render mixins.
All Ferrosoft columns inherit from this class so they share the same
fixed_width(CSScw-{n}class) shortcut and mixin pipeline.- render(value, *args, **kwargs)[source]¶
Pipe
valuethrough each mixin’srenderand return the result.
Pipe footer rendering through each mixin’s
render_footer.
- class ferrosoft.apps.ferrobase.tables.columns.DateTimeColumn(format_string=None, *args, **kwargs)[source]¶
Bases:
ColumnRender a datetime in the requesting user’s timezone.
- class ferrosoft.apps.ferrobase.tables.columns.DefaultValue(default_value, *args, **kwargs)[source]¶
Bases:
ColumnColumn that substitutes a configured default when the value is
None.
- class ferrosoft.apps.ferrobase.tables.columns.EmptyExpandColumn(*args, **kwargs)[source]¶
Bases:
ColumnEmpty placeholder column that stretches to fill remaining width.
- class ferrosoft.apps.ferrobase.tables.columns.InlineEditColumn(input_name='', input_attrs=None, number_display=False, quantize=None, options=None, form_name=None, read_only=False, *args, **kwargs)[source]¶
Bases:
ColumnColumn rendering a read-only value alongside an editable input/select.
The template emits both a view-mode anchor and a form control so the cell can switch between display and edit modes client-side.
- classmethod input_name_with_pk(base_name)[source]¶
Create input names with record’s pk as subscript.
Example: If base_name is foo and a record’s pk is 1234, the resulting input name is foo[1234].
- Parameters:
base_name (
str) – the part of input name before subscript
Returns: lambda that’s suitable for input_name attribute.
- class ferrosoft.apps.ferrobase.tables.columns.MonthColumn(fixed_width=None, mixins=None, *args, **kwargs)[source]¶
Bases:
ColumnRender a 1-12 month number as its localised month name.
- class ferrosoft.apps.ferrobase.tables.columns.NewlineToHTMLBreak(fixed_width=None, mixins=None, *args, **kwargs)[source]¶
Bases:
ColumnMixin column converting embedded newlines to
<br>while HTML-escaping.
- class ferrosoft.apps.ferrobase.tables.columns.NumberColumn(with_symbol=False, quantize=None, transform=None, transform_value=None, *args, **kwargs)[source]¶
Bases:
ColumnRight-aligned number column with optional unit symbol and transforms.
ferrosoft.apps.ferrobase.tables.crud module¶
- class ferrosoft.apps.ferrobase.tables.crud.Action(url, label)[source]¶
Bases:
objectExtra header action exposed in the table template (label + URL).
- class ferrosoft.apps.ferrobase.tables.crud.CRUDTable(*args, **kwargs)[source]¶
Bases:
TableTable preconfigured with create/update/delete affordances.
Renders the “with add button” Bootstrap 5 template and an
actionscolumn containing per-row edit/delete buttons. The button URLs are resolved throughget_update_action_url()andget_delete_action_url(), both of which subclasses are expected to override when they need custom routes. Passingdisable_update=Trueon construction hides the actions column and the add button — useful for read-only views.Template context exposes
actions,create_label,create_urlanddisable_updatein addition to the base table context.- class Meta[source]¶
Bases:
object- create_label = 'Add'¶
- create_url = None¶
- template_name = 'ferrobase/bootstrap5/table/with_add_button.html'¶
- base_columns = {'actions': <ferrosoft.apps.ferrobase.tables.columns.WidgetColumn object>}¶
- get_delete_action_url(*args, **kwargs)[source]¶
Return the delete URL for
kwargs['record']orNone(default).
ferrosoft.apps.ferrobase.tables.models module¶
- class ferrosoft.apps.ferrobase.tables.models.APITokenTable(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:
TableRead-only listing of
APITokenrecords (name, tenant, status, expiry).- base_columns = {'expiration': <django_tables2.columns.datetimecolumn.DateTimeColumn object>, 'name': <django_tables2.columns.base.Column object>, 'status': <django_tables2.columns.base.Column object>, 'tenant': <django_tables2.columns.base.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.FeatureAssignmentTable(*args, **kwargs)[source]¶
Bases:
CRUDTableCRUD table for
FeatureAssignment; renders0limits as an em-dash.- class Meta[source]¶
Bases:
Meta- fields = ['actions', 'feature', 'limit']¶
- model¶
alias of
FeatureAssignment
- base_columns = {'actions': <ferrosoft.apps.ferrobase.tables.columns.WidgetColumn object>, 'empty': <ferrosoft.apps.ferrobase.tables.columns.EmptyExpandColumn object>, 'feature': <django_tables2.columns.base.Column object>, 'limit': <ferrosoft.apps.ferrobase.tables.columns.NumberColumn object>}¶
- class ferrosoft.apps.ferrobase.tables.models.IDSequenceTable(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:
TableListing of ID-sequence configurations linkified on the
namecolumn.- class Meta[source]¶
Bases:
object- fields = ['name', 'prefix', 'padding_amount']¶
- model¶
alias of
IdSequenceConfig
- base_columns = {'name': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'padding_amount': <django_tables2.columns.base.Column object>, 'prefix': <django_tables2.columns.base.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.OrganizationTable(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:
TableListing of
Organizationrecords linkified on thenamecolumn.- class Meta[source]¶
Bases:
object- fields = ['name', 'contact_email', 'contact_first_name', 'contact_last_name']¶
- model¶
alias of
Organization
- base_columns = {'contact_email': <django_tables2.columns.emailcolumn.EmailColumn object>, 'contact_first_name': <django_tables2.columns.base.Column object>, 'contact_last_name': <django_tables2.columns.base.Column object>, 'name': <ferrosoft.apps.ferrobase.tables.columns.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.StoredFileTable(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:
TableListing of stored files linking each name to its update view.
- class Meta[source]¶
Bases:
object- fields = ['name', 'owner', 'media_type', 'creation_time', 'expire_on']¶
- model¶
alias of
StoredFile
- base_columns = {'creation_time': <django_tables2.columns.datetimecolumn.DateTimeColumn object>, 'expire_on': <django_tables2.columns.datetimecolumn.DateTimeColumn object>, 'media_type': <django_tables2.columns.base.Column object>, 'name': <ferrosoft.apps.ferrobase.tables.columns.Column object>, 'owner': <django_tables2.columns.base.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.SubscriptionPlanTable(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:
TableListing of subscription plans linkified on the
namecolumn.- class Meta[source]¶
Bases:
object- fields = ['name', 'max_tonnage', 'enable_all_features']¶
- model¶
alias of
SubscriptionPlan
- base_columns = {'enable_all_features': <django_tables2.columns.booleancolumn.BooleanColumn object>, 'max_tonnage': <django_tables2.columns.base.Column object>, 'name': <ferrosoft.apps.ferrobase.tables.columns.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.TenantTable(*args, **kwargs)[source]¶
Bases:
CRUDTableCRUD table for tenants nested under an organisation.
- base_columns = {'actions': <ferrosoft.apps.ferrobase.tables.columns.WidgetColumn object>, 'active': <django_tables2.columns.booleancolumn.BooleanColumn object>, 'empty': <ferrosoft.apps.ferrobase.tables.columns.EmptyExpandColumn object>, 'expiry_date': <django_tables2.columns.datetimecolumn.DateTimeColumn object>, 'name': <django_tables2.columns.base.Column object>}¶
- class ferrosoft.apps.ferrobase.tables.models.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:
TableListing of users linkified on the
usernamecolumn.- class Meta[source]¶
Bases:
object- fields = ['username', 'is_active', 'first_name', 'last_name', 'email', 'organization', 'date_joined']¶
- base_columns = {'date_joined': <django_tables2.columns.datetimecolumn.DateTimeColumn object>, 'email': <django_tables2.columns.emailcolumn.EmailColumn object>, 'first_name': <django_tables2.columns.base.Column object>, 'is_active': <django_tables2.columns.booleancolumn.BooleanColumn object>, 'last_name': <django_tables2.columns.base.Column object>, 'organization': <django_tables2.columns.base.Column object>, 'username': <ferrosoft.apps.ferrobase.tables.columns.Column object>}¶
ferrosoft.apps.ferrobase.tables.table module¶
- class ferrosoft.apps.ferrobase.tables.table.Table(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:
TableBase table class that adapts to the responsive UI and permission state.
On render the table strips its
fixed-layoutCSS class in portrait/UI mode and removes the first visible column’s link when the current user lacksUPDATEpermission on the model.- base_columns = {}¶