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-04-21¶
Removed Site.get_database_settings()
(#6050).
2025-04-19¶
Installation instructions in the Hosting Guide now recommend
/usr/local/lino/venvs/main
instead of
/usr/local/lino/shared/env/master
as the path for the “master
environment”, which is now called the main environment.
2025-04-17¶
In Lino Noi, some fields were missing on the detail layout of a partner, e.g.
email. And Noi now uses lino_xl.lib.sepa
.
2025-04-15¶
A series of changes for #5670 (Support Peppol e-invoicing using Ibanity).
Bugfix: #6038 (The first address of a partner should be primary).
lino_xl.lib.addresses
.
Internal: I moved the lino.core.kernel.Kernel.lino_version
property back
from Site to lino.core.kernel.Kernel
, and on a devserver it now uses
(as before) the lino.utils.code.codetime()
function, a
lino_version.txt
file is now created only on a production site.
Experimental: #6040 (How to handle channels.exceptions.ChannelFull). If
you get these exceptions, set lino.modlib.notify.api.DONT_CATCH
to
False. lino.mixins.Created
now also sets a default time when
loading_from_dump
is True.
2025-04-12¶
Database change: The field next_partner_id
from
lino.modlib.system.SiteConfig
has been removed. Because this was
actually an anti-feature. The first Lino customer needed this back in 2010.
Meanwhile they also don’t use it any more. Nobody else has ever wanted such a
feature. Technically spoken it doesn’t handle race conditions correctly. And it
disturbed for importing data from TIM.
2025-04-11¶
Internal optimizations for #5876 (tim2lino bridge for Peppol): Renamed database
field lino_xl.lib.contacts.Partner.is_outbound
to
lino_xl.lib.contacts.Partner.send_peppol
.
VoucherTypes.get_for_model
now returns the first
voucher type that suits the given database model (and no longer the only one).
VoucherTypes.get_for_table
now returns the first
voucher type that uses a subclass of the specified actor.
The lino.modlib.system.SiteConfig.next_partner_id
field is no longer
being used.
2025-04-10¶
Optimize detail layout of trading.Invoices
.
2025-04-09¶
Add React front end feature top links. Functions that implements this feature:
Site.get_top_links
Site.add_top_link_generator
.
working.MySessionsByDate
now uses display_mode list
instead of
summary
on a mobile device. Fix #6025`(Stopping the session in noi1r
causes “Cannot accept value”). Optimize
:meth:`lino_xl.lib.working.Session.as_paragraph to use
lino.utils.format_date.fds()
instead of date_format_strftime
. Side effects: Add method
dd.now
and use it instead of
timezone.now()
. In lino.utils.format_date
, rename fts()
to
fdts()
and ftl()
to fdtl()
and add fts()
. The value of
lino.modlib.users.User.nickname
is now ""
instead of None when
lino.modlib.users.with_nickname
is False.
lino.core.fields.DummyField
now accepts one optional argument,
dummy_value
.
2025-04-08¶
Database change in lino_xl.lib.trading
: new field default_discount
on the TradingVoucher
model.
Renamed model mixins SalesDocument
and ProductDocItem
to
TradingVoucher
and TradingVoucherItem
, respectively.
And I changed the default decimal_places of PercentageField
from 2 to
0 because it’s silly to write “10.00%” or “70.00%”. Yes I remember a customer
who wanted to give 3.75% of discount to their customers, but these cases are
rare, if we want such flexibility, we might implement PercentField as a
QuantityField, similar to DurationField.
2025-04-07¶
Activate feature Actor.start_at_bottom
,
on React front end, on a grid view, paginator starts at the last page.
2025-04-06¶
Add a method lino.modlib.jinja.XMLMaker.get_xml_file()
.
2025-04-04¶
Fixed #6013 (QuerySet.exclude() argument after ** must be a mapping,
not Q). lino.core.tables.AbstractTable.exclude
must now be an instance of
django.db.models.Q
, no longer a dict
. This had been marked as
TODO for some time, now it became useful because in lino_xl.lib.peppol
we
want to use the same django.db.models.Q
object as
lino.core.tables.AbstractTable.filter
for lino_xl.lib.peppol.Inbox
and
as lino.core.tables.AbstractTable.exclude
for
lino_xl.lib.peppol.Archive
2025-04-03¶
Lino stores the value for URL_PARAM_LINO_VERSION
now as the timestamp of a file
lino_version.txt
in the lino.core.site.Site.site_dir
directory.
If such a file doesn’t yet exist, Lino creates it at startup. The content of the
file is irrelevant, its only purpose is the timestamp. The mtime of this file is
read only once per process when the property Site.lino_version
is
accessed. Kernel.code_mtime
has been removed because it is no longer
needed.
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.fdtf()
. 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 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.