Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More


Defines the classes AbstractTable and VirtualTable.


AbstractTable(*args, **kw)

An AbstractTable is the definition of a tabular data table, usually displayed in a Grid (but it's up to the user interface to decide how to implement this).

ButtonsTable(*args, **kw)

Probably deprecated.



For every table we create one "handle" per renderer.

VentilatedColumns(*args, **kw)

A mixin for tables that have a series of automatically generated columns.

VentilatingTable(*args, **kw)

VirtualTable(*args, **kw)

An AbstractTable that works on an volatile (non persistent) list of rows.

class lino.core.tables.TableHandle(actor)

Bases: object

For every table we create one “handle” per renderer.

See also lino.core.actors.Actor.setup_handle(), which is called during startup and sets more attributes.

class lino.core.tables.AbstractTable(*args, **kw)

Bases: Actor

An AbstractTable is the definition of a tabular data table, usually displayed in a Grid (but it’s up to the user interface to decide how to implement this).

Base class for Table and VirtualTable.

hide_zero_rows = False

Set this to True if you want to remove rows which contain no values when rendering this table as plain HTML. This is ignored when rendered as ExtJS.

tablet_columns = {}

The columns that must remain visible when this table is rendered on a tablet device.

mobile_columns = {}

The columns that must remain visible when this table is rendered on a mobile device.

popin_columns = {}

The columns that must pop in below the first column if there is no space to render them on the device.

If None: All columns not listed in mobile_columns nor Tablet_columns will not pop-in.

group_by = None

A list of field names that define the groups of rows in this table. Each group can have her own header and/or total lines.

custom_groups = []

Used internally to store groups defined by this Table.

master_field = None

For internal use. Automatically set to the field descriptor of the master_key.

get_data_rows = None

Maybe deprecated. Use get_request_queryset() instead.

Virtual tables must define this method, model-based tables may define it. e.g. in case they need local filtering.

This will be called with a lino.core.requests.TableRequest object and is expected to return or yield the list of “rows”:

def get_data_rows(self, ar):
    yield somerow
row_height = 1

Number of text rows per data row.

variable_row_height = False

Set this to True if you want each row to get the height that it needs.

auto_fit_column_widths = True

Set this to True if you want to have the column widths adjusted to always fill the available width. This implies that there will be no horizontal scrollbar.

active_fields = frozenset({})

A list of field names that are “active”. Value and inheritance as for hidden_columns.

When a field is “active”, this means only that it will cause an immediate “background” save and refresh of the detail window when their value was changed. The true “activity” (i.e. other fields being updated according to the value of an active field) is defined in the model’s full_clean and FOO_changed methods.

Note that active fields are active only in a detail window, not in an insert window. That’s because there they would lead to the unexpected behaviour of closing the window.

page_length = 20

Number of rows to display per page. Used to control the height of a combobox of a ForeignKey pointing to this model

cell_edit = True

True (default) to use ExtJS CellSelectionModel, False to use RowSelectionModel. When True, the users cannot select multiple rows. When False, the users cannot edit individual cells using the F2 key..

show_detail_navigator = True

Whether a Detail view on a row of this table should have a navigator.

typo_check = True

True means that Lino shoud issue a warning if a subclass defines any attribute that did not exist in the base class. Usually such a warning means that there is something wrong.

display_mode = ((70, 'summary'), (None, 'grid'))

A tuple of (width, display_mode) items used to select a display mode depending on the available width (in characters) on the client.

The last item should have a width of None.

See also get_display_mode() and Customize how data is formatted.

classmethod get_display_mode(available_width=None)

Given the available width, return the display mode to use.

max_render_depth = 2

Used to limit the rendering of slave card views.

hide_if_empty = False

In a detail view if a slave table is empty, it’s element will be hidden

stay_in_grid = False

Set this to True if Lino should prefer grid mode and not open a detail window on a newly created record. SubmitDetail closes the window when this is True.

Usage example LanguageKnowledgesByPerson.

no_phantom_row = False

Suppress a phantom row in situations where Lino would otherwise add one.

The phantom row can disturb for example when users want to see the number of existing entries. End users can double-click on the phantom row to open an insert window and create a new item.

Used for lino_xl.lib.accounting.ByJournal where a phantom row is disturbing and not needed.

order_by = None

If specified, this must be a tuple or list of field names that will be passed to Django’s order_by method in order to sort the rows of the queryset.

filter = None

If specified, this must be a models.Q object (not a dict of (fieldname -> value) pairs) which will be passed to Django’s filter method.

Note that if you allow a user to insert rows into a filtered table, you should make sure that new records satisfy your filter condition, otherwise you can get surprising behaviour if the user creates a new row.

If your filter consists of simple static values on some known field, then you might prefer to use known_values instead because this will add automatic behaviour.

One advantage of filter over known_values is that this can use the full range of Django’s field lookup methods

exclude = None

If specified, this must be dict which will be passed to Django’s exclude method on the queryset.

extra = None


extra = dict(select=dict(lower_name='lower(name)'))
# (or if you prefer:)
# extra = {'select':{'lower_name':'lower(name)'},'order_by'=['lower_name']}

List of SQL functions and which RDBMS supports them: http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Functions_and_expressions/String_functions

hide_sums = False

Set this to True if you don’t want Lino to display sums in a table view.

use_paging = False

Set this to True in Extjs6 to not use a Buffered Store, and use a JsonStore with paging instead.

drag_drop_sequenced_field = None

Extjs6 only Enables drag and drop reordering for a table. Set to the field name that is used to track the order. Only used in lino.mixins.sequenced.Sequenced. Field name seqno

If True , when the grid opens, the initial keyboard focus will be in the quick search field.

classmethod parse_req(request, rqdata, **kw)

This is called when an incoming web request on this actor is being parsed.

If you override parse_req(), then keep in mind that it will be called before Lino checks the requirements. For example the user may be AnonymousUser even if the requirements won’t let it be executed. ar.subst_user.user_type may be None, e.g. when called from find_appointment in welfare.pcsw.Clients.

classmethod get_row_by_pk(ar, pk)

dbtables.Table overrides this.

classmethod row_as_paragraph(ar, row)

Return an HTML string that represents the given row as a single paragraph.

See Represent a row as a paragraph.

classmethod row_as_page(ar, row, **kwargs)

Return an HTML string that represent the given row as a plain page.

classmethod get_column_names(ar)

Dynamic tables can subclass this method and return a value for column_names which depends on the request.

classmethod get_filter_kw(ar, **kw)

Return a dict with the “master keywords” for this table and a given master_instance.

For example, if you have two models Book and Author, and a foreign key Book.author which points to the author of the book, and a table BooksByAuthor having master_key set to 'author', then get_filter_kw would return a dict {‘author’: <PK>} where PK is the primary key of the action request’s master_instance.

Another example is lino_xl.lib.tickets.EntriesBySession, where blog entries are not directly linked to a session, but in the detail of a session we want to display a table of related blog entries.

lino_xl.lib.households.SiblingsByPerson Household members are not directly linked to a Person, but usually a Person is member of exactly one household, and in the Detail of a Person we want to display the members of that household.

classmethod request(master_instance=None, **kw)

Return a new TableRequest on this table.

If this is a slave table, the master_instance can be specified as optional first positional argument.

classmethod run_action_from_console(pk=None, an=None)

Not yet stable. Used by print_tx25.py. To be combined with the show management command.

classmethod add_quick_search_filter(data, search_text)

Add a filter to the given data iterator in order to apply a quick search for the given search_text.

class lino.core.tables.VirtualTable(*args, **kw)

Bases: AbstractTable

An AbstractTable that works on an volatile (non persistent) list of rows.

By nature it cannot have database fields, only virtual fields.

Subclasses must define a get_data_rows() method.

class lino.core.tables.VentilatedColumns(*args, **kw)

Bases: VirtualTable

A mixin for tables that have a series of automatically generated columns. TODO: rename this to DynamicColumns.

column_names_template = ''

The template to use for column_names. It should contain a string {vcolumns}, which will be replaced by a space-separated list of the column names given by get_ventilated_columns().

class lino.core.tables.ButtonsTable(*args, **kw)

Bases: VirtualTable

Probably deprecated. Might not work as expected in React (because of hide_top_toolbar).

An abstract VirtualTable with only one column and whose rows are action buttons.

Subclasses must implement get_data_rows to yield action buttons.

Usage example lino_welfare.modlib.reception.models.FindDateByClientTable.