Friday, October 2, 2015

Accounting translations for Lino Welfare

There was yet another problem with the side-effect of #520: after having transferred the translations to Lino Così, they still did not become activated in Lino Welfare.

Note that for generating language files, Lino does not use Django’s system (Localization: how to create language files) but the system defined by Babel. It is visible in the setup_info.py files where we define message_extractors. There were several reasons for this and I don’t remember them all right now. One of the principal problems with Django’s system is that it works only for the INSTALLED_APPS, and there is no Lino application which uses all plugins at once. Even lino.projects.docs doesn’t use them all, because some are mutually exclusive.

A consequence –or feature– is that I centralize all translations into one “main” plugin per software project. The fab mm command knows this thanks to the locale_dir setting in fabfile.py.

The translations for Lino are in lino.modlib.lino_startup. Those for Lino Welfare are in lino_welfare.modlib.welfare. And now, the translations for Lino Così are in lino_cosi.lib.cosi.

Applications don’t need to know this since it is automatic because lino_cosi.lib.accounts now has lino_cosi.lib.cosi in its needs_plugin.

A side effect of above is that we now have new methods setup_actions and setup_layouts. Because I had to move the things that were in lino_cosi.lib.cosi.models to some other place. These definitions would not have been wanted for Lino Welfare.

Ticket #219

I pushed above changes and released them to The Lino framework. Mainly in order to test Hamza’s fix for #219.

I discovered that this fix has an irritating side effect: the insert window, after clicking the “Create” button, is now being displayed once more for a short time before it closes.

I removed the fix temporarily for the next push (which is easy because is is just an additional call to ‘panel.refresh();` in linoweb.js) because I also promised a release to CPAS de Châtelet, and am afraid that they won’t like the irritating side effect.

In general I hope that we can find a better solution.

Release in Chatelet

The release in CPAS de Châtelet went without surprises (of course I had to add Lino Così to their repositories and to run $ sudo apt-get build-dep lxml).

no such table: django_session

I get this when I run fab initdb in the Lino Noi repository, then go to the team demo database and runserver:

OperationalError at / no such table: django_session

Hamza also had this some days ago, and only after having had it myself, I started to understand the reason.

It is because the fabfile.py of Lino Noi defines two demo projects, lino_noi.projects.team and lino_noi.projects.bs3, and because the second demo project uses the same database file as the first. So fab initdb does the work twice. This not yet a problem, but bs3 has default_user set to ‘anonymous’, which causes it to deactivate both authentication and sessions. And especially the latter means that the database has no sessions table.

To solve this, I added a new site attribute readonly which causes initdb to do nothing (except issuing an info message “Skipped initdb on readonly site ‘foo.settings’.”

And lino_noi.projects.bs3.settings.demo uses this.

So after running fab initdb in the Lino Noi repository, you can now run runserver in both demo projects (team uses the normal “editable” user interface and bs3 the readonly user interface). The public ticket database of the Lino team at http://bugs.lino-framework.org/ uses a subclass of lino_noi.projects.bs3.

More about #219

The definition of this function (generated in lino_900_en.js) is:

Lino.tickets.Tickets.wf3 = function(rp, pk, params) {
  var h = function() {
    Lino.run_row_action(rp, "/tickets/Tickets", "GET", pk, "wf3", params, null);
  };
  var panel = Ext.getCmp(rp);
  if(panel) panel.do_when_clean(true, h); else h();
};

It is strange that this call to Lino.run_row_action would issue a POST

While exploring above, I noticed the following error message in the Javascript console:

TypeError: opt is undefined             (in ext-all-debug.js:28435:17)

This was due to a stupid bug in Lino.FormPanel.do_when_clean() (when auto_save is true) which caused it to call MessageBox.show() without any config object.

And to my surprise, #219 was gone afterwards!

So Hamza’s fix for #219 was not yet the solution, but it inspired me to find the solution. This is what I would call synergy. Hamza, don’t be sad. The fact that you were able at all to find a first solution to such a hidden problem shows your competence. Really. It would just have been too beautiful if your fix had been the final solution. Please check my code change and make sure that you understand what happened.