20131205 (Thursday, 05 December 2013)¶
Plugins are Apps¶
I continued to think about what Joe and I had called “plugins”. And ha, I understood something! Excerpt from a mail I wrote to Joe on November 18:
Difference between plugins and apps:
The nature of plugins is to be another level of modularization besides apps, another direction of applying our analytic knife when describing a complex system (in case you have read “Zen and the Art of Motorcycle Maintenance”). Plugins can require certain apps to be installed, but the list of installed apps does not automatically lead to a list of installed plugins. This is why I have get_installed_plugins.
The thing I understood is that the above paragraph is bullshit. The direction of your analytic knife should not depend on the fact whether it is a plugin or an app.
So I merged the classes Plugin and App and
converted our proof-of-concept plugin (BeIdReaderPlugin)
into an app (named
The former BeIdJsLibPlugin is now in
lino.apps.beid, that’s why it must have the
same app_label. Here is the content of lino/apps:
. ├── beid └── eid_jslib └── beid
Note that I hereby started to grow new apps in a
lino.apps instead of
move also the setup_xxx_menu methods from models module to App
Now before going on it’s really time to get all test suites up and running again. The suites for Lino Patrols, Renamed “Lino Faggio” to “Lino Voga” and Lino Welfare had been broken for some time. Now they pass again.
I also had neglected the
userdocs directories, now they all
build again without any warning.
Moved get_installed_apps method from
Because intuitively I’d say that this is a better place for it.
This should make no difference for applications.
One subtle difference is that
"lino" is no longer at the
end just before
Replace SiteMixin hacks by App usages¶
A first positive effect of today’s work:
I can remove the SiteMixin classes from
And the latter even protect myself from forgetting
to convert local settings files because I added an error
message in that case.
Every Django app which defines a class object called “App” in its main module (not in the models module) now gets some special functionality: the class object will be instiantiated exactly once when the Site instantiates (i.e. before Django settings are ready), and this object is stored (under the app_label as key), in settings.SITE.plugins.
That’s really cool! (Just a pity that these human bodies need to sleep every now and then ;-) Don’t hesitate to contact me directly and ask questions, because this is complex stuff, and I won’t have time until end of January to document it as it would deserve.
Convert lino.extjs to a plugin (oops, i mean “an app with an