From 7cfb8059710c09787680cb9d48f3c47da1c03932 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 1 Jul 2013 14:00:41 +0200 Subject: [PATCH 1/3] add TODO markers; fix layout in non-Lobo skins --- compound/book/view_macros.pt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index 8f657f6..43be71b 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -7,8 +7,10 @@ tal:attributes="class string:content-$level">

+ tal:content="related/title" /> +
+
@@ -40,7 +42,8 @@ -
+
+
From 66c26e77cd3331bf1759cf6665ea3b8b77cdfb0c Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 1 Jul 2013 14:01:38 +0200 Subject: [PATCH 2/3] more Pythonic formulation for boolean check on list --- organize/member.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/organize/member.py b/organize/member.py index 88428aa..ab2aded 100644 --- a/organize/member.py +++ b/organize/member.py @@ -80,8 +80,8 @@ class MemberRegistrationManager(object): pfName = options(self.principalfolder_key, (self.default_principalfolder,))[0] self.createPrincipal(pfName, userId, password, lastName, firstName, - useExisting=useExisting) - if len(groups)==0: + useExisting=useExisting) + if not groups: groups = options(self.groups_key, ()) self.setGroupsForPrincipal(pfName, userId, groups=groups) return self.createPersonForPrincipal(pfName, userId, lastName, firstName, From 65ece8b8079167ea1c9ad9ed4e383bff37e90a3a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 3 Jul 2013 12:43:12 +0200 Subject: [PATCH 3/3] issue a 'modified' event on state change; track details of the state change in the change record --- organize/stateful/browser.py | 10 +++++++--- organize/tracking/change.py | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index 130daf4..b01d224 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -23,7 +23,9 @@ Views and actions for states management. from zope import component from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy +from zope.event import notify from zope.i18n import translate +from zope.lifecycleevent import ObjectModifiedEvent, Attributes from cybertools.browser.action import Action, actions from cybertools.composer.schema.field import Field @@ -132,8 +134,7 @@ class ChangeStateForm(ObjectForm, ChangeStateBase): @Lazy def schema(self): - # TODO: create schema directly, use field information specified - # in transition + # TODO: use field information specified in transition commentsField = Field('comments', _(u'label_transition_comments'), 'textarea', description=_(u'desc_transition_comments')) @@ -145,8 +146,11 @@ class ChangeStateForm(ObjectForm, ChangeStateBase): class ChangeState(EditObject, ChangeStateBase): def update(self): - print '***', self.request.form + comments = self.request.form.get('comments') or u'' self.stateful.doTransition(self.action) + notify(ObjectModifiedEvent(self.view.virtualTargetObject, + dict(transition=self.action, comments=comments))) + #Attributes(IStateful, 'state', 'comments'))) return True diff --git a/organize/tracking/change.py b/organize/tracking/change.py index b3e3057..98141c8 100644 --- a/organize/tracking/change.py +++ b/organize/tracking/change.py @@ -70,6 +70,12 @@ class ChangeManager(BaseRecordManager): if relation is not None: data['predicate'] = util.getUidForObject(relation.predicate) data['second'] = util.getUidForObject(relation.second) + event = kw.get('event') + if event is not None: + desc = getattr(event, 'descriptions', ()) + for item in desc: + if isinstance(item, dict): + data.update(item) if update: self.storage.updateTrack(last, data) else: @@ -90,16 +96,18 @@ class ChangeRecord(Track): @adapter(ILoopsObject, IObjectModifiedEvent) def recordModification(obj, event): - ChangeManager(obj).recordModification() + ChangeManager(obj).recordModification(event=event) @adapter(ILoopsObject, IObjectAddedEvent) def recordAdding(obj, event): - ChangeManager(obj).recordModification('add') + ChangeManager(obj).recordModification('add', event=event) @adapter(ILoopsObject, IAssignmentEvent) def recordAssignment(obj, event): - ChangeManager(obj).recordModification('assign', relation=event.relation) + ChangeManager(obj).recordModification('assign', + event=event, relation=event.relation) @adapter(ILoopsObject, IDeassignmentEvent) def recordDeassignment(obj, event): - ChangeManager(obj).recordModification('deassign', relation=event.relation) + ChangeManager(obj).recordModification('deassign', + event=event, relation=event.relation)