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


This is the 2020 change log for Developer Guide. General information about how to read and maintain this document in Documenting changes.


Fixed #3898, an old bug in lino_xl.lib.trading that caused Lino to not accept another invoice after having inserted a first invoice.


Lino sites now have a default favicon. The icon itself needs some optimization, though, it’s just a very small copy of the Lino logo.

Fixed two tickets #3893 (Exception while resolving variable ‘name’ in template ‘unknown’) and #3890 (GET /static/react/service-worker.js causes 404 under runserver).


Fix React front end encoding problem in choicelists data.

Release to PyPI: React front end


Release to PyPI: The lino package, Lino Extensions Library, Lino Così, Lino Voga, Lino Amici.


Lino Amici : Optimize detail views of households, persons and companies


Lino Voga : Remove custom activity layouts from default settings.


lino_xl.lib.countries.Places had no insert_layout and hence no insert button. Now it has.


Fixed a bug in lino_xl.lib.finan.BankStatement caused by misinterpreting Debit and Credit after #3817 (see 2020-10-15).


Better support for empty declaration_plugin : Adapted the payments fixture of lino_xl.lib.accounting to also work when this setting is empty. The get_installed_plugins() of the lino_voga.lib.voga.settings.Site no longer yields the lino_xl.lib.bevats plugin (because this is done automatically when declaration_plugin is set).


Lino no longer prints a message “num2words not installed, use python manage.py install to install” at each startup of an application that does not install lino_xl.lib.cal but imports a mixin from this plugin, This message was meant to be useful, but it was suboptimal: the recommended thing to do when a requireed Python package seems to be missing is to run install (which will also upgrade dependencies). And then it was disturbing because it caused the doctests in mentori to fail.

Released xl 20.10.1 to PyPI.


Accounting movements are no longer stored in two separate fields (one for the amount and another for the booking direction, debit or credit) but simply as the amount, and a negative amount indicates a debit. Existing production sites must edit their restore.py:

from lino_xl.lib.accounting.choicelists import DC

def create_ledger_journal(...):
  if dc:
  # same change also in create_sheets_item()

def create_ledger_movement():
  if dc: amount = -amount
  #kw.update(dc=dc)  # uncomment this line

  # same change also in create_finan_bankstatementitem, create_finan_journalentryitem, create_finan_paymentorderitem

It might make sense to run reregister after database migration.

When migrating from Lino before 20201008, keep in mind that that a checked dc field (True) means credit and not checked (False) means debit, and that Lino now stores the amount of a crediting movement (dc was True) as a negative number.

PyPI releases: react, lino, xl, cosi, voga, tera.


The lino_xl.lib.courses plugin no longer requires the lino_l.lib.cal plugin.


In lino_xl.lib.sheets, the reports now have columns “Balance before” and “Balance after” instead of “Debit before”, “Credit before”, “Debit after” and “Credit after”.

Fixed some bugs that caused the report to not show all totals.

Database migration might require manual change in file /sheets_item.py where you should change “6100” to “6010” and “6200” to “6020”:

loader.save(create_sheets_item(20,'6010',['Operating expenses', '', 'Operating expenses', 'Operating expenses'],False,'R','6010',None))
loader.save(create_sheets_item(21,'6020',['Other expenses', '', 'Other expenses', 'Other expenses'],False,'R','6020',None))

New admin command showsettings.


When lino.utils.IncompleteDate.parse() could not parse a date, it no longer raises an error but returns None.


lino.utils.diag.Analyzer.get_complexity_factors() no longer yields the number of user_roles. Because I realized that this number is meaningless for discussing the commercial complexity of an application.


lino.core.site.Site.setup_quicklinks() no longer searches and executes a global function setup_quicklinks() in each plugin, but calls the new plugin method lino.core.plugin.Plugin.get_quicklinks(). The Model.get_simple_parameters method may now return an iterator (or a list or a tuple) of fields names.


Learning foreign keys now also work in React front end. The lino_xl.lib.cal.Guest.partner field is now a learning foreign key.

Moved the functions choices_response() and choices_for_field() from lino_react.react.views to lino.core.views and to lino.core.fields because this was duplicated code.


Fixed two issues in lino_xl.lib.calview for #3769: “Week navigation causes calendar to mess up weeks” and “slave title says ‘None in Week 50 / 2019 (09 December)’”

Released to PyPI : lino 20.8.2 and Lino Extensions Library 20.8.2.


Fixed #3766 (‘NoneType’ object has no attribute ‘get_layout_handle’ when trying to edit any combobox field in the lino.modlib.users.MySettings form.


Released to PyPI : lino 20.8.1.


The duplicate action is again visible for every user, not only for experts (users having lino.core.roles.Expert)

Adapted lino.sphinxcontrib.help_texts_extractor to a change in Sphinx that caused the help_text.py files to not get updated any more: the sphinx.addnodes.desc_signature node now stores the name of the described object now in the “ids” attribute instead of “names”. I didn’t understand every detail but it seems to work again.


Fix some issues using the recently released version 3.1 of Django (e.g. ImportError: cannot import name ‘FieldDoesNotExist’)


Fix #3745 (Lino says “partner: cannot be null” when trying to create a person).

Released to PyPI : lino_xl 20.8.1,


Released to PyPI : lino_welfare 20.8.0 and lino_weleup 20.8.0.


Released to PyPI : lino_presto 20.8.0.


Released to PyPI : lino 20.8.0, lino_xl 20.8.0, lino_avanti 20.8.0

Released to PyPI : lino_openui5 20.8.0


Auto-fill ref field using custom rule : The ref field of a client in Lino Avanti (“Legacy file number”) can now automatically find the next available reference number. The current solution is hard-coded and just enough to satisfy the customer’s requirement. Not yet sure whether it makes sense to generalize this feature.


Fixed two exceptions caused by a calendar entry with an auto_type but no owner (which is a checkdata problem because this case doesn’t occur theoretically). The checkdata message “Has auto_type but no owner.” is now fixable, it fixes the problem by setting the auto_type to None in that case.

Released Lino Extensions Library to PyPI.


Release to PyPI : lino 20.7.3 (just removed three dependencies, no functional changes)

Release to PyPI : lino 20.7.4, atelier, getlino, xl, avanti, tera, presto (several subtle changes, see blog)


Released to PyPI : welfare, weleup and welcht

Fixed two bugs: #3715 (“IndexError: list index out of range” after deleting from detail window) and #3714 (After saying No to Apply beid changes to client? Lino seems to apply them nevertheless.)

Released to PyPI : Lino and XL

Released to PyPI : avanti (should fix a failure in getlino test suite: Exception: Problem installing fixture ‘/home/lino/lino/lino_local/avanti1/env/repositories/xl/lino_xl/lib/uploads/fixtures/demo2.py’: ‘nathalie’ : no such user)


Several bug fixes.

Released the following packages to PyPI: The lino package 20.7.1, Lino Extensions Library 20.7.2, Lino Tera 20.7.0, OpenUI5 front end 20.7.0.


Optimization for #3695: Upload.needed is now also included in the insert window.

Released XL 20.7.1 to PyPi.


Reactivated the weasyprint/top-right.jpg feature


Released to PyPI (all with version 20.7.0) : Lino, XL, Avanti.


Added a new method lino.core.requests.BaseRequest.clear_cached_status().

Fixed a bug in AnswersByResponse that caused remarks to always be stored next to the first question of a poll. Fixed a bug that made it impossible to edit the “My remark” field in AnswersByResponseEditor.


When LINO_CACHE_ROOT is set (e.g. on Travis CI), Lino forgot to add the site configuration directory to its list of config dirs. Another problem was that these “non-local site config dirs” (for example lino_book.projects.apc when run on travis) must come before the plugin config dirs.


Last changes in lino_xl.lib.uploads: MyExpiringUploads is now a dashboard item. Two new settings Plugin.expiring_start and Plugin.expiring_end.


Lino has a new admin command passwd.

Six releases to PyPI (all with version 20.6.0) : Lino, XL, Lino Presto, Lino Amici, Lino Avanti and React front end.



Added a new database field lino_xl.lib.beid.BeIdHolder.nationality_text. (#3681)


The item_vat option (whether we want to include VAT in the price of the items of an invoice) no longer depends on the VAT regime but is configurable as a new plugin attribute lino_xl.lib.vat.Plugin.item_vat

Released lino, xl and cosi to PyPI.


Changes in the lino_xl.lib.products.PriceRule model) require a database migration: Field event_type has been renamed to lino_xl.lib.products.PriceRule.selector. Field fee has been renamed to lino_xl.lib.products.PriceRule.product.


Fixed #3637 (can only concatenate str (not “__proxy__”) to str).

WebIndexTestCase now (1) runs on the populated demo data (and no longer on an empty database created by the django test runner) (2) checks several variants of test_urls (3) tests them for each user (unless lino.core.site.Site.user_model is None)


Released Lino 20.5.1 and XL 20.4.2. With several internal optimizations that caused the test suites of book, presto, amici and welfare to fail.


Lino no longer allows several transitions for a same target state. Every state of a workflow can have at most one “transition” action for entering this state. This change imposes more discipline for application developers when designing a workflow definition. It has the advantage that you can now access the transition of a given state in order to change its configuration. For example Lino Presto uses this to change the lino_xl.lib.cal.MarkEventTookPlace transition. Added a new attribute lino.core.workflows.State.transition and a new exception “Tried to add another transition to <state name>”. The lino_book.projects.workflows demo project is an example of an application that had to be adapted to this new limitation.


Added a new observable date range lino.mixins.periods.Weekly.

Released Lino 20.4.1 and XL 20.4.2.


Released to PyPI : lino lino-xl

Fix ImportError: cannot import name ‘ZERO_DURATION’ from ‘lino.utils.quantities’


The has_open_movements choice to the observed_events parameter field of the lino_xl.lib.contacts.Partners table didn’t work and was not tested. Fixed it and added test coverage in accounting: General accounting.


New method lino.core.tablerequest.TableRequest.gen_insert_button() is a generalized and no longer hackerish implementation of the hackerish solution used in the calview monthly view until now.

When the label of a table is None, the ExtJS front-end now suppresses the header of the grid panel (including the “open in own window” button). This is used by the slave tables in the detail layouts of the calendar views. But note that you cannot simply set label = None on the actor because that default value is overridden by the model’s verbose_name_plural. So to get an actor without label you be more explicit and say:

def get_actor_label(cls):
    return None


Released to PyPI : react


New feature: every voucher model can now define its own workflow rules. This change required the state field of vouchers to move from the Voucher model to the implementing MTI child models. This requires manual changes in the restore.py file when migrating existing data. One possibility is to simply remove the state from create_ledger_voucher and set all vouchers to “registered” by patching the reregister command:

# qs = cl.objects.filter(journal=jnl, state=VoucherStates.registered)
qs = cl.objects.filter(journal=jnl)


Released to PyPI : lino 20.1.1 and xl 20.1.4 (because amici, presto etc are failing on travis).


show_complexity_factors() no longer counts actions with no_params_window.


Fixed a bug that caused lino.core.choicelists.ChoiceList.preferred_width to be 4 for all choicelists. Wrote a new doctest utility lino.api.doctest.show_choicelists() so that application maintainers can easily cover these in their specs. Usage example is apc : A Lino Così for Belgium (DE).


Released to PyPI : lino 20.1.0 and xl 20.1.3

Don’t use get_head_lines for notify (Lino 26c8a9c11)

Fixed #3470 (Lino sets wrong booking direction in suggested bank statement item) and #3471 (Deleting a voucher item does not refresh the grid).

ItemsByVoucher now uses default display_mode for financial vouchers.

Fixed #3473 (eevat declaration doesn’t generate movements). Added an exception “SumDeclarationField may not be payable” to avoid the pitfall.


Released lino-book 20.1.1 to make it installable via pip.

Changed the designation “Uploads” to “Upload files”.


New plugin lino.modlib.publisher.

Changes in lino.modlib.notify.


Changes in lino_xl.lib.accounting and lino_xl.lib.vat. Fix booking direction of returnable VAT.

Done #3459 (Move calendar view from “cal” to a separate plugin lino_xl.lib.calview). One consequence for data migration: DailyPlannerRow has moved from cal to calview


The ShowInsert action now has a more specific help text.

lino_xl.lib.accounting.JournalsOverview has now display_mode “summary”.

Released Lino Extensions Library 20.1.2.

More bugfixes in lino_xl.lib.eevat and lino_xl.lib.vat.


Released Lino Care 20.1.0 and Developer Guide 20.1.0 just to get the Travis CI builds green. Released Lino Extensions Library 20.1.1 for Lino Così.

More bugfixes in lino_xl.lib.eevat : Sales invoices to lino_xl.lib.eevat.VatRegimes.outside weren’t handled correctly.


New field lino_xl.lib.accounting.Journal.preliminary, and lino_xl.lib.vat now ignores preliminary transactions.


Released to PyPI : lino-react 20.1.0, lino-amici 20.1.0, XL 20.1.0