Tuesday, January 8, 2019

Lino under Python 3

I repaired some failures under Python 3. Two of them were easy:

But a third one is more trick: SQLite schema editor cannot be used while foreign key constraint checks are enabled. Make sure to disable them before entering a transaction.atomic() context because SQLite3 does not support disabling them in the middle of a multi-statement transaction..

The problem occurs only when using Django 2.1.5, not with Django 2.1.4.

https://docs.djangoproject.com/en/5.0//releases/2.1.5/

It is a side effect of Django ticket 30023: https://code.djangoproject.com/ticket/30023

The source code says:

if not self.connection.disable_constraint_checking():

TODO: investigate more, maybe write a problem report.

Lino and Django migrations

Yes of course pm prep uses the –run-syncdb option. Because Lino doesn’t use Django migrations.

I understood this as an impulse to dive once more into #2322 (Django migrations with Lino). One problem was that choicelist fields are custom fields and so we must explain Django how to migrate them. I did some changes in the lino.core.choicelists and now probably fixed the problem. At least makemigrations now works:

$ go tera1
$ dm makemigrations tera

Output:

Migrations for 'tera':
.../lino_tera/lib/tera/migrations/0001_initial.py
  - Create model Client
  - Create model LifeMode
  - Create model Procurer
  - Add field life_mode to client
  - Add field nationality to client
  - Add field obsoletes to client
  - Add field user to client

Or the same with contacts:

$ dm makemigrations contacts
Migrations for 'contacts':
  .../lino_tera/lib/contacts/migrations/0001_initial.py
    - Create model CompanyType
    - Create model Partner
    - Create model Role
    - Create model RoleType
    - Create model Company
    - Create model Person
    - Add field type to role
    - Add field city to partner
    - Add field client_contact_type to partner
    - Add field country to partner
    - Add field payment_term to partner
    - Add field purchase_account to partner
    - Add field region to partner
    - Add field company to role
    - Add field person to role

Note that above does not work under Python 2. Under Python 2 the resulting migration files are invalid. If I make the migrations for the second plugin, I get a SyntaxError when that operation tries to import the generated files of the first. For example:

Traceback (most recent call last):
  File "manage.py", line 7, in <module>
    execute_from_command_line(sys.argv)
  ...
  File "/media/dell1tb/work/tera/lino_tera/lib/contacts/migrations/0001_initial.py", line 50
    ('language', lino.utils.mldbc.fields.LanguageField(blank=True, choices=[(en', 'English'), (de', 'German'), (fr', 'French')], help_text='The language to use when communicating with this partner.', max_length=5, verbose_name='Language')),
                                                                                  ^
SyntaxError: invalid syntax

Of courses the choices=[(en', 'English'), (de', 'German'), (fr', 'French')] in above example is an invalid syntax.

I currently suspect the str of the future package of disturbing Django: Django tries to artificially remove the u prefixes from string literals but does not know that there is a future package which simulates Python 3 strings.