Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More
2026¶
This is the 2026 change log for Lino. Learn how to read and maintain this document in Documenting changes.
2026-03-24¶
For #6482 (Add a SubscribeToList action in noi2) we converted the
SubscribeToList action to a webform. Side effects: the default value for
lino.modlib.memo.front_end is now primary_front_end and no longer
editing_front_end because we
want the <a> tag generated by a ref memo command to use the
publisher front end, not the admin front end. At least if the model has a
publisher view. Also added a new plugin settings error_tolerance and with_eval to lino.modlib.memo Changed the verbose
name of lino_xl.lib.lists.List from “Partner list” to “Newsletter”.
2026-03-18¶
The lists.partner_model setting no longer exists. A list member is now always a user (lists.Member is a UserAuthored). Even for a website with “simple free newsletter” there must be some way for these members to opt out. Consequences;
1) In Lino Amici, lists has been replaced by topics. For data migration, the
site maintainer must edit the restore.py. lists_List becomes
topics_Topic and lists_Member becomes topics_Interest. More precisely:
lists_List = resolve_model("topics.Topic")
lists_Member = resolve_model("topics.Interest")
def create_lists_list(id, designation, ref, list_type_id, remarks, default_for_new_users):
if designation is not None: kw.update(bv2kw('name',designation))
kw.update(ref=ref)
# kw.update(list_type_id=list_type_id)
# kw.update(remarks=remarks)
# kw.update(default_for_new_users=default_for_new_users)
return lists_List(**kw)
def create_lists_member(id, seqno, list_id, partner_id, remark):
...
# kw.update(seqno=seqno)
kw.update(topic_id=list_id)
...
def create_system_siteconfig(id, primereact_theme, default_build_method, simulate_today, default_event_type_id, site_calendar_id, max_auto_events, hide_>
...
# kw.update(newsletter_list_id=newsletter_list_id)
2) In Lino Avanti we removed the lists plugin as it isn’t used on any production site.
2026-03-18¶
Added support for two-factor authentication in lino.modlib.users via
the new setting lino.modlib.users.enable_two_factor_auth.
When enabled, Lino can require a one-time device verification code and then
remember trusted devices using an HttpOnly cookie (see also
lino.modlib.users.trusted_device_cookie_max_age and Two-Factor Auth, Trusted Devices, and OTP).
2026-03-12¶
An application developer can now temporarily change a @schedule_often
into @schedule_often(log_level=”DEBUG”) for debugging. Until now Lino always
always forced lino.modlib.linod.SystemTask.log_level to WARNING for
background tasks with a frequency specified in seconds.
2026-03-10¶
Added new mixins FormatPreviewable and
HistoryAwarePreviewable
and new actions ResetToRevision and
CompareRevisions, see their corresponding
documentations.
2026-03-05¶
Introduce new action ForgetMe on User to schedule
the deletion of all data related to a user. Running this action sets the current
datetime on User.forget_me_since.
The actual deletion of data is done by a data checker
ForgettableChecker that looks for objects
that are instances of Forgettable mixin
and whose Forgettable.get_forgettable_data
method returns a queryset that contains objects that are related to the user and needs to be deleted.
The data checker calls the Forgettable.forget() method on these objects, which deletes them unless
the developer has defined a custom behavior.
Changes in lino.modlib.printing:
Add new attribute DocumentClass.mirror_pages.
Add a keyword argument with_url to Addressable.get_address_lines().
Both features are currently used only by songbook.weasy.html.
TODO: use it also in the other document classes.
Add new plugin setting auto_load_config_files, which defaults to
False. Set it to True to preserve old behaviour (which is to look for a
series of image files in the config directory). This feature isn’t used on any
production site and I think we can deprecate it. Only the
DocumentClass.page_background_image seems useful and recommended.
2026-02-26¶
The new choicelist lino.modlib.printing.DocumentClasses
(#6632) makes it possible to have multiple sets of layouts for
printable documents.
The settings.py potentially need manual conversion; instead of saying:
yield ('weasyprint', 'header_height', 30)
in your get_plugin_configs() you must now override (e.g.) your
startup() method:
def startup(self):
super().startup()
self.models.printing.DocumentClasses.default.header_height = 30
You can now start numbering the items of a page at an arbitrary number. Added a
new field Page.start_num, and Sequenced now calls this instead
of unconditionally starting with 1.
2026-02-24¶
Updated the signature of msg_func (the 5th positional argument to
notify.Message.emit_notification)
now takes user as the only positional argument.
2026-02-20¶
New feature #6605 (A feedback form for collecting contact data). New
plugin lino.modlib.webforms. Visible in noi2: the pages “Contact” and
“Register” each contain a form that is generated from the insert_layout of the
respective model and whose submit button does the same AJAX request under
publisher as under react. The body of these pages contains a memo command [show
webforms.RequestContactsWeb.insert], which is a new variant of the show command.
2026-02-10¶
New site setting lino.core.site.Site.unwrap_span_tags.
2026-02-03¶
Moved TextFieldTemplate from tinymce to jinja. The biggest side effect now is the menu location: “My text field templates” was moved from “Configuration” to the main menu and “Text field templates” was moved from “Explorer” to “Configuration”.
2026-01-27¶
A subtle optimization for #6595 (Suboptimal breadcrumbs in
SectionResponsesByCertificate): When get_parent_links() yields at least
one breadcrumb, then Lino no longer adds a link to the list view.
Added instructions for testing Breadcrumbs in the manual test suite.
2026-01-26¶
New features
ensure_even_pages
and clear_cache_of_children
for lino.modlib.printing.MultiCachedPrintable (#6591).
2026-01-12¶
Added new Model attribute
exempt_from_clean.
The field names given on this Iterable/Sequence are exempted from
validation during full_clean.
By default all VirtualField
if this set is empty (NOT overridden).
2026-01-08¶
Add a new database field lino_xl.lib.trading.TradingRule.journal. In
Lino Studio we want a default value for
lino_xl.lib.trading.TradingRule.columns_to_print per journal.