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

Lino core utilities

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

Lines starting with >>> in this document are code snippets that get tested as part of our development workflow.

>>> 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'>]