From 7cfb8059710c09787680cb9d48f3c47da1c03932 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 1 Jul 2013 14:00:41 +0200 Subject: [PATCH 1/5] 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/5] 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/5] 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) From 90265b3cf99e757b33b513bce36ebdab65d9eb4f Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 3 Jul 2013 15:33:05 +0200 Subject: [PATCH 4/5] allow for suppression of change tracking via request parameter --- organize/stateful/browser.py | 1 - organize/tracking/change.py | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index b01d224..633417b 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -150,7 +150,6 @@ class ChangeState(EditObject, ChangeStateBase): 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 98141c8..d9e8bbd 100644 --- a/organize/tracking/change.py +++ b/organize/tracking/change.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ """ Recording changes to loops objects. - -$Id$ """ from zope.app.container.interfaces import IObjectAddedEvent, IObjectRemovedEvent @@ -53,6 +51,9 @@ class ChangeManager(BaseRecordManager): @Lazy def valid(self): + req = util.getRequest() + if req and req.form.get('organize.suppress_tracking'): + return False return (not (self.context is None or self.storage is None or self.personId is None) From a9d865a1d0b76ed3fad6edcb06329e2e99c6acb9 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 3 Jul 2013 19:31:24 +0200 Subject: [PATCH 5/5] use state title for display not the internal state name --- organize/stateful/view_macros.pt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index 6a4286d..9aa02a8 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -112,7 +112,8 @@
State: - + tal:define="stateObject view/stateful/getStateObject" + tal:content="stateObject/title" /> - Transition: