20120628 ======== Noch permissions ---------------- Ich fange an klar zu sehen für die workflows im Kalender. Beim Programmieren kam aber noch ein Design-Fehler zutage: ich kann Aktionen wie Print und Post nicht vom Model aus mit permission handler versehen. Das brauchen wir noch. Das Folgende ist eigentlich teilweise schon wieder veraltet. Bei Gelegenheit muss ich mal ordentliche Doku schreiben... Also noch mal eine Operation unter Vollnarkose. Noch mal der Versuch eines Überblicks. Permission handler sind namenlose Funktionen, die in :func:`lino.utils.perms.make_permission_handler` erzeugt werden. Das sind die Dinger, die optimal laufen müssen (also möglichst wenig unnütze Dinge nachprüfen), weil sie *oft* aufgerufen werden. Permission handler werden beim Server-Start :func:`lino.core.kernel.load_workflows` einmalig erzeugt. Die Option `required` ist (wenn definiert) ein `dict` mit den keys `user_level` und/oder `user_groups`. Kann definiert sein: - Auf dem Actor (der Tabelle): :attr:`required `, :attr:`change_required `, :attr:`delete_required `, :attr:`create_required ` - Auf einer Aktion: :attr:`required ` :attr:`required ` - Auf einem Layout-Panel: Permission handler sitzen an folgenden Stellen: - :attr:`lino.ui.extjs3.ext_elems.Container.allow_read` wird beim Instanzieren des Containers generiert (was erst beim ersten `get_handle` des Elements stattfindet, z.B. beim Generieren der `lino*.js`) - Actor.allow_read Container Action.allow get_view_permission wird benutzt zum Generieren des JS-Codes. Da ist also normalerweise kein spezieller Record gemeint, also `obj` ist `None`. Kleinkram --------- - Übersetzungen Tx25 - moved lino.tools and lino.core.coretools to a single module :mod:`lino.core.modeltools`. - Worked on documentation. Updated tutorials. New - Miscellaneous optimizations "pour Joël qui va peut-être trouver le temps de se lancer dans Lino". - Bugfix: Lino didn't add a PhantomRow in slave grids without detail layout. - Worked on :mod:`lino.apps.presto`. Lazy object returned unexpected type. ------------------------------------- This error can come when you have `lino.Lino.languages` set to only ``['en']``, and when the application module uses Django's `pgettext_lazy` function which is needed when you need to specify a context for a translation message. Sander van Leeuwen fortunately found and reported a workaround on `stackoverflow.com `__ E.g. in :mod:`lino.modlib.courses` we have a line:: add('50', pgettext_lazy("courses","Failed"),"failed") # nicht bestanden Sander's workaround is to always pass unicode strings to `pgettext_lazy()`:: add('50', pgettext_lazy(u"courses",u"Failed"),"failed") # nicht bestanden