diff -r a64f48dd5fe4 -r 9ab2b4c74baf web/views/workflow.py --- a/web/views/workflow.py Thu May 20 20:47:13 2010 +0200 +++ b/web/views/workflow.py Thu May 20 20:47:55 2010 +0200 @@ -33,13 +33,13 @@ from cubicweb import Unauthorized, view from cubicweb.selectors import (implements, has_related_entities, one_line_rset, relation_possible, match_form_params, - implements, score_entity) -from cubicweb.interfaces import IWorkflowable + implements, score_entity, adaptable) from cubicweb.view import EntityView from cubicweb.schema import display_name from cubicweb.web import uicfg, stdmsgs, action, component, form, action from cubicweb.web import formfields as ff, formwidgets as fwdgs -from cubicweb.web.views import TmpFileViewMixin, forms, primary, autoform +from cubicweb.web.views import TmpFileViewMixin +from cubicweb.web.views import forms, primary, autoform, ibreadcrumbs from cubicweb.web.views.tabs import TabbedPrimaryView, PrimaryTab _pvs = uicfg.primaryview_section @@ -89,8 +89,9 @@ class ChangeStateFormView(form.FormViewMixIn, view.EntityView): __regid__ = 'statuschange' title = _('status change') - __select__ = (one_line_rset() & implements(IWorkflowable) - & match_form_params('treid')) + __select__ = (one_line_rset() + & match_form_params('treid') + & adaptable('IWorkflowable')) def cell_call(self, row, col): entity = self.cw_rset.get_entity(row, col) @@ -99,7 +100,7 @@ self.w(u'

%s %s

\n' % (self._cw._(transition.name), entity.view('oneline'))) msg = self._cw._('status will change from %(st1)s to %(st2)s') % { - 'st1': entity.printable_state, + 'st1': entity.cw_adapt_to('IWorkflowable').printable_state, 'st2': self._cw._(transition.destination(entity).name)} self.w(u'

%s

\n' % msg) self.w(form.render()) @@ -128,7 +129,7 @@ class WFHistoryView(EntityView): __regid__ = 'wfhistory' __select__ = relation_possible('wf_info_for', role='object') & \ - score_entity(lambda x: x.workflow_history) + score_entity(lambda x: x.cw_adapt_to('IWorkflowable').workflow_history) title = _('Workflow history') @@ -183,22 +184,24 @@ def fill_menu(self, box, menu): entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) - menu.label = u'%s: %s' % (self._cw._('state'), entity.printable_state) + menu.label = u'%s: %s' % (self._cw._('state'), + entity.cw_adapt_to('IWorkflowable').printable_state) menu.append_anyway = True super(WorkflowActions, self).fill_menu(box, menu) def actual_actions(self): entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) + iworkflowable = entity.cw_adapt_to('IWorkflowable') hastr = False - for tr in entity.possible_transitions(): + for tr in iworkflowable.possible_transitions(): url = entity.absolute_url(vid='statuschange', treid=tr.eid) yield self.build_action(self._cw._(tr.name), url) hastr = True # don't propose to see wf if user can't pass any transition if hastr: - wfurl = entity.current_workflow.absolute_url() + wfurl = iworkflowable.current_workflow.absolute_url() yield self.build_action(self._cw._('view workflow'), wfurl) - if entity.workflow_history: + if iworkflowable.workflow_history: wfurl = entity.absolute_url(vid='wfhistory') yield self.build_action(self._cw._('view history'), wfurl) @@ -346,6 +349,27 @@ 'allowed_transition') return [] +class WorkflowIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): + __select__ = implements('Workflow') + # XXX what if workflow of multiple types? + def parent_entity(self): + return self.entity.workflow_of and self.entity.workflow_of[0] or None + +class WorkflowItemIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): + __select__ = implements('BaseTransition', 'State') + def parent_entity(self): + return self.entity.workflow + +class TransitionItemIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): + __select__ = implements('SubWorkflowExitPoint') + def parent_entity(self): + return self.entity.reverse_subworkflow_exit[0] + +class TrInfoIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): + __select__ = implements('TrInfo') + def parent_entity(self): + return self.entity.for_entity + # workflow images ##############################################################