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

Lino core utilities

This document tests some functionality of lino.core.utils.

Side note: Code snippets (lines starting with >>>) in this document get tested as part of our development workflow. The following initialization snippet tells you which demo project is being used in this document.

>>> import lino
>>> lino.startup('lino_book.projects.min2.settings.demo')
>>> from lino.api.doctest import *

Get installed models that are subclass of something

The lino.core.utils.models_by_base() function returns a list of models which are subclass of a given class.

For example here is how you can get all your models that implement lino.mixins.duplicable.Duplicable:

>>> from lino.mixins.duplicable import Duplicable
>>> pprint(rt.models_by_base(Duplicable))  
[<class 'lino_xl.lib.cal.models.Event'>,
 <class 'lino_xl.lib.cal.models.EventType'>,
 <class 'lino_xl.lib.cal.models.RemoteCalendar'>,
 <class 'lino_xl.lib.contacts.models.Company'>,
 <class 'lino_xl.lib.contacts.models.Partner'>,
 <class 'lino_xl.lib.contacts.models.Person'>,
 <class 'lino_xl.lib.countries.models.Place'>,
 <class 'lino.modlib.linod.models.SystemTask'>]
>>> rt.models_by_base(rt.models.contacts.Person)
[<class 'lino_xl.lib.contacts.models.Person'>]

Getting only top-level models

The toplevel_only option is used by lino.modlib.checkdata. For example the AddressOwnerChecker needs to run only on Partner, not also on Person, Company, Household or any other MTI children.

>>> rt.models_by_base(rt.models.contacts.Partner, toplevel_only=True)
[<class 'lino_xl.lib.contacts.models.Partner'>]
>>> rt.models_by_base(rt.models.contacts.Person, toplevel_only=True)
[<class 'lino_xl.lib.contacts.models.Person'>]