Index: viewlets/content.py =================================================================== --- viewlets/content.py (revision 18438) +++ viewlets/content.py (working copy) @@ -1,5 +1,5 @@ from AccessControl import getSecurityManager -from Acquisition import aq_inner +from Acquisition import aq_inner, aq_base from zope.component import getMultiAdapter, queryMultiAdapter from plone.memoize.instance import memoize @@ -8,6 +8,7 @@ from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.CMFCore.utils import getToolByName +from Products.DCWorkflow.Transitions import TRIGGER_AUTOMATIC from Products.CMFPlone import PloneMessageFactory as _ @@ -117,40 +118,55 @@ workflow = self.tools.workflow() membership = self.tools.membership() - history = [] + histories = [] # a list of (wf_id, wf_title, review_history) tuples # check if the current user has the proper permissions - if membership.checkPermission('Modify portal content', self.context): + if membership.checkPermission('Review portal content', self.context) \ + or membership.checkPermission('Request review', self.context): try: - # get total history - review_history = workflow.getInfoFor(self.context, 'review_history') + for wf in workflow.getWorkflowsFor(self.context): + wf_id, wf_title = wf.getId(), wf.title + # get total history + review_history = workflow.getInfoFor(self.context, 'review_history', wf_id=wf_id) - # filter out the irrelevant stuff - review_history = [r for r in review_history if r['action']] - for r in review_history: - r['transition_title'] = workflow.getTitleForTransitionOnType(r['action'], - self.context.portal_type) - actorid = r['actor'] - r['actorid'] = actorid - if actorid is None: - # action performed by an anonymous user - r['actor'] = {'username': _(u'label_anonymous_user', default=u'Anonymous User')} - r['actor_home'] = '' - else: - r['actor'] = membership.getMemberInfo(actorid) - if r['actor'] is not None: - r['actor_home'] = self.portal_url + '/author/' + actorid + # filter out the irrelevant stuff + history = [] + for r in review_history: + if not r['action']: + continue # filter out irrelevant stuff + trans_name = r['action'] + trans = wf.transitions.get(trans_name, None) + if trans is not None: + if trans.trigger_type is TRIGGER_AUTOMATIC: + continue # filter out automatic transitions + r['transition_title'] = getattr(aq_base(trans), 'actbox_name', None) or trans_name else: - # member info is not available - # the user was probably deleted + r['transition_title'] = trans_name + actorid = r['actor'] + r['actorid'] = actorid + if actorid is None: + # action performed by an anonymous user + r['actor'] = {'username': _(u'label_anonymous_user', default=u'Anonymous User')} r['actor_home'] = '' - #reverse the list - history = self.context.reverseList(review_history) + else: + r['actor'] = membership.getMemberInfo(actorid) + if r['actor'] is not None: + r['actor_home'] = self.portal_url + '/author/' + actorid + else: + # member info is not available + # the user was probably deleted + r['actor_home'] = '' + history.append(r) + if not history: + continue + #reverse the list + history.reverse() + histories.append({'workflow_id': wf_id, 'workflow_title': wf_title, 'review_history': history}) except WorkflowException: log( 'plone.app.layout.viewlets.content: ' '%s has no associated workflow' % self.context.absolute_url(), severity=logging.DEBUG) - return history + return histories render = ViewPageTemplateFile("review_history.pt") Index: viewlets/review_history.pt =================================================================== --- viewlets/review_history.pt (revision 18438) +++ viewlets/review_history.pt (working copy) @@ -2,10 +2,10 @@ id="review-history" metal:define-macro="review_history" i18n:domain="plone" - tal:define="history view/workflowHistory;"> - -
-
History
+ tal:define="histories view/workflowHistory;"> + +
+
Workflow
Comment - +