Introduction to actions¶
This section tries to explain everything you need to know about actions.
Actions are always linked to a given actor. Each actor has its list of actions.
Standard actions are installed more or less automatically on every table
when Lino starts up. They are defined in
Application developers can define new Writing custom actions, or also override standard actions with their own custom actions.
Some action attributes include:
label : the text to place on the button or menu item
help_text : the text to appear as tooltip when the mouse is over that button
handler function : the function to call when the action is invoked
permission requirements : for whom and under which conditions this action is available
Open a window with a tabular grid editor on this table. The grid editor is that main widget of that window (otherwise it would be a slave table).
Most items of the main menu are
Open an insert window on this actor. A new row will be inserted only when this window gets submitted, which is a separate action named
Some actions do nothing but opening a new window on the client. We call them window actions.
This behaviour is specified by the
Specifies whether this action opens a window. It is up to the front end to actually render that window.
Another class of actions also open a window, but that window is not their main purpose. For example the Merge action always opens a dialog window with miscellaneous parameters, and the action itself will execute only when the user confirms that dialog window. These actions are called parameter actions.
DeleteSelected action is visible in the toolbars of
the grid and the detail windows and in the context menu on a grid row.
A read-only action is an action that doesn't cause any change in the current
data object. A read-only action has its
attribute set to True.
For example the lino.modlib.printing.DirectPrintAction action is read-only.
ShowInsert is read-only because it does not modify the current
data object. Otherwise it would be disabled on a registered invoice.
readonly to False will (1) disable the
action for readonly user types or when
True, and (2) will cause it to be logged when
log_each_action_request is set to True.
Note that when a read-only action actually does modify the object, Lino won't "notice" it.
Maybe we should change the name
writing (and set the default value False). Because that would look
more intuitive for the application developer. Or --maybe better but probably
with even more consequences-- the default value should be False. Because
being read-only, for actions, is a kind of "privilege": they don't get logged,
they also exist for read-only users... It would be more "secure" when the
developer must explicitly "say something" in order to grant that privilege.
Another subtlety is the fact that this attribute is used by
lino.modlib.users.UserAuthored. For example the
StartTicketSession action in
Lino Noi is declared
readonly because we want Workers who are not
Triagers to see this action even if they are not the author (reporter) of a
ticket. In this use case the attribute name should rather be
A same action instance can be shared by many actors. For example the
DeleteSelected action exists only as one instance shared among all
actors that use it.
Other actions can exist as different instances even on a same actor. For example
- instance action
An action that has been bound to a given database object.
For example in the
setup_menu method in the Polls tutorial) we say:
def setup_menu(self, user_type, main): super(Site, self).setup_menu(user_type, main) m = main.add_menu("polls", "Polls") m.add_action('polls.Questions') m.add_action('polls.Choices')
(Above snippet is from
add_action method of
lino.core.menus.Menu is smart enough to understand
that if you specify a Table, you mean in fact that table's default