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

2025

This is the 2025 change log for Lino. Learn how to read and maintain this document in Documenting changes.

2025-03-31

The lino.modlib.linod.Runnable mixin has a new database field lino.modlib.linod.Runnable.requested_at and a new action to cancel a manual request to run a job. Manual run requests are now handled a bit differently.

The lino.utils.format_date module has a new function for formatting timestamps: lino.utils.format_date.ftf(). See Formatting timestamps.

2025-03-25

Added a new plugin setting lino.modlib.weasyprint.page_background_image used to customize the pdf of an invoice.

2025-03-25

New feature “Quick-fix data checkers”. We use it in Lino Prima on Group and Certificate where the combobutton with three actions (“Check for problems”, “Fix them” and “Show the messages”) feels like overkill, we prefer Lino to fix any problems instantly with a single button click. The current implementation isn’t documented because it’s not finished and might change significantly. But it works for us so far: When a model has a class attribute quickfix_checkdata_label, which is assumed to hold a translatable string, then Lino adds a single button that runs all checkers with fix=True, and the string is used as the label for this single button. Side-effect: CheckerAction no longer requires a model at instantiation.

2025-03-23

The slave panels AuthoritiesTaken and AuthoritiesGiven now have an optimized details_of_master_template “Authorities taken by Username” and “Authorities given by Username”

2025-03-22

I removed pm buildsite again, and pm buildcache now also runs collectstatic.

2025-03-21

The methods mark_virgin() and check_virgin() have been moved from lino.core.site.Site to a separate module lino.utils.dbhash because these things are never needed on a production site. I wrote a documentation page that explains the topic: The lino.utils.dbhash module.

2025-03-20

pm buildsite no longer calls install nor makehelp. It does exactly what buildcache does, plus an option -c to also run collectstatic, and it defines -b or –batch as aliases for –noinput. The advantage is that after an upgrade you can type pm buildsite -bc and then focus on other things rather than waiting for pm buildsite to finish and then typing pm collectstatic --noinput.

New plugin setting lino_xl.lib.peppol.onboarding_date.

2025-03-20

Optimized the behaviour of lino.modlib.extjs.views.ApiElement.get() when the specified primary key isn’t visible in this table. Renamed request to create_request, on Actor and on BoundAction.

2025-03-17

Added color “Teal” to lino.modlib.system.DisplayColors. The pull.sh script now asks for confirmation before starting. New command pm buildsite. Move lino.utils.fieldutils.fields_help() out of lino.api.doctest into a new module lino.utils.fieldutils.

2025-03-14

The lino_xl.lib.tim2lino plugin now supports updating a live Lino database from TIM legacy data. Until now the migration was a single-jump operation.

The Voucher model now has its own field Voucher.fiscal_year, which is automatically set to the year of the Voucher.accounting_period. This makes things easier when querying the database and when importing vouchers from external sources.

The methods Site.mark_virgin(), Site.check_virgin() and Site.get_dbhash() have been optimized and moved from SITE.kernel to SITE.

2025-03-12

It is now possible to disable all the actions of the workflow_buttons field by adding “workflow_buttons” into the set returned by disabled_fields(). This optimization was originally added for #5976 where I thought that Lino should no longer permit to change the workflow state of a calendar guest when the calendar entry is in a fixed state (“took place”) or or “suggested” (has not yet been user-modified). But I found a less intrusive solution: calendar entries are now considered “user edited” not only if their state says so but also when their guests_modified flag is set. So the new feature isn’t used anywhere right now.

Renamed lino_xl.lib.ibanity to lino_xl.lib.peppol.

2025-03-06

The lino_xl.lib.accounting plugin now defines an lino.modlib.uploads.Shortcuts source_document, which is used by lino_xl.lib.peppol when it finds an embedded pdf file in an inbound Peppol document. As a side effect we optimized the rendering of upload shortcut fields.

2025-03-05

The lino_xl.lib.peppol plugin gets ready for the integration phase. The tables Inbox, Archive, Outbox and Sent are now in the menu. It has a quick link to the system task that starts the synchronization. The linod daemon now runs as the user specified by lino.modlib.linod.daemon_user instead of anonymously. Internal optimization: lino.core.kernel.Kernel.run_action() no longer treats ValidationError and IntegrityError with a traceback.

2025-03-01

The method BuildMethod.before_printable_build() has been replaced by BuildMethod.must_build_printable() is is now expected to return a boolean. The filename_root() method was renamed to get_printable_target_stem(). The get_target_name() method was removed, we now call self.get_target_file().name or self.get_target_file().path lino.utils.media.MediaFile is now implemented differently and has a path attribute instead of a name property.

After upgrading a production server you should test whether editable print actions still work.

2025-02-27

Advancing with #5670 (Support e-invoices using PEPPOL): The values of the individual choices of lino_xl.lib.products.DeliveryUnits are now the codes that are allowed in the unitCode attribute of a InvoicedQuantity element. Added a new attribute lino_xl.lib.vat.VatRegime.reverse_charge, which is True for the VAT regimes intracom and cocontractor. This is currently used only by vat.VatItemBase.get_peppol_vat_category(). When migrating your database, you can specify a lino.core.ChoiceList.old2new for DeliveryUnits by adding the following line to your restore.py file:

settings.SITE.models.products.DeliveryUnits.old2new = {"10": "HUR", "20": "XPP", "30". "KGM", "40": "XBX"}

2025-02-24

Advancing with #5670 (Support e-invoices using PEPPOL). lino_xl.lib.contacts.Partner.is_outbound

2025-02-12

Fixed #5924 (Menu “My invoicing plan” fails)”. Optimize choosers for FollowUpRule.invoice_generator and Task.procedure (which is defined as lino.modlib.linod.Runnable.procedure.) Plan.invoicing_task may now be empty. Optimize lino.modlib.users.UserPlan and lino.modlib.linod.Runnable. Fine-tune error reporting during ApiElement.get().

2025-02-10

Fixed #5917 (Clicking on the img rendered by file memo command doesn’t show the image). The demo data in Lino Noi now includes screenshots in ticket descriptions in order to reproduce and verify this bug. New context manager ar.override_attrs.

2025-02-09

Reviewed lino.utils.soup.truncate_comment() and updated Truncating HTML texts to fix #5916.

2025-02-05

The lino_xl.lib.peppol plugin is growing. New option no_auto for data checkers. lino_xl.lib.peppol.SupplierChecker sets this to True because we do not want this checker to run automatically during checkdata. It should run only when called manually because it requires Ibanity credentials, which are not available e.g. on GitLab.

2025-02-01

Started working on the new plugin lino_xl.lib.peppol. Work in progress.

2025-01-27

Fixed #5881 (Lino lets me add items to a registered invoice). Added a new lino.core.model.Model.disable_create() used to disable creating rows on a model in a given action request even when permission has been given.

2025-01-24

New setting users.demo_password so that the password of users on a demo site is no longer a hard-coded “1234”.

2025-01-23

The lino_xl.lib.tim2lino plugin was re-activated and the lino.utils.dbfreader module migrated to Python 3.

The sliders-h button, which is used to show or hide the parameter panel of a table, is now in the upper right corner and no longer in the toolbar.