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 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 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): required, change_required, delete_required, create_required

  • Auf einer Aktion: required required

  • Auf einem Layout-Panel:

Permission handler sitzen an folgenden Stellen:

  • 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 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 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 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