Skip to Content

Contributors

Re: Module loading priority and inheritance

After investigation, the sequence field is only used for the kanban view to display applications in a specific order.

Module list is fetched from database in odoo/odoo/modules/loading.py::load_marked_modules with this query

cr.execute("SELECT name from ir_module_module WHERE state IN %s" ,(tuple(states),))

So, the module loading order actually depends on 4 params:
  1. PostgreSQL database collation
  2. Module name
  3. Datetime of the creation of the ir_module_module row (since no ORDER BY is defined in the query)
  4. The dependencies
That's a terrible loading implementation as the parameter 3 is based on an internal postgreSQL data, it also depends on the list order of your addons_path and also depends on when odoo/addons/base/models/ir_module.py::update_list is called.

Example for this last assertion:
  • On the development database:
    • You add the module account_extra, that depends on account and override method update_something, in your main addons path
    • update_list()
    • Two weeks later, you add the module account_best , that also depends on account and also override the method update_something, in your main addons path
    • update_list()
    • Module account_extra will be loaded before account_best
  • Three weeks later, on the production database:
    • You add modules account_extra and account_best in your main addons path
    • update_list()
    • Module account_best will be loaded before account_extra
And there I'm not talking about other cases like:
  • Multiple addons_path
  • Manual module deletion from odoo module list followed by a module list update
  • Manual module installation from UI whereas the server is already started with loaded modules

So, I agree that most cases would be solved by the depends attribute but a fix could still be:
  • Add a loading_priority manifest key:
    • default value is 0 if not set, could be positive (load before) or negative (load after)
    • add an ORDER BY loading_priority, name in all SQL query of the loading.py
  • Add a soft_depends manifest key:
    • a list of modules that we depends on, only if they exists and are installed


by Yann Papouin - 11:00 - 17 Jun 2022

Reference

  • Module loading priority and inheritance
    Hi,

    I just installed the auth_totp module to add MFA support to our odoo 12.0 instance and its behaviour is totally broken after a server restart when the auth_ldap module is also installed.

    Because _check_credentials logic is just made to accept at least one Valid authentication and not globally refuse any authentication, the current implementation of the auth_totp will always fail if a module validate _check_credentials after that the MfaLoginNeeded exception is raised.

    To me it's more a framework issue and the manifest should allow a new priority value to sort modules without inter-dependencies (because actually, it seems to use an alphabetic sorting based on module name).
    But without this, how do you handle such situations ?

    --
    Yann PAPOUIN, Ingénieur R&D | DEC


    by Yann Papouin - 03:31 - 15 Jun 2022