web/views/workflow.py
branchstable
changeset 7598 781def950a85
parent 7411 238da9684f99
child 7875 65e460690139
child 7879 9aae456abab5
--- a/web/views/workflow.py	Wed Jun 29 13:03:04 2011 +0200
+++ b/web/views/workflow.py	Fri Jul 01 12:20:24 2011 +0200
@@ -39,7 +39,7 @@
 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
-from cubicweb.web.views import forms, primary, autoform, ibreadcrumbs
+from cubicweb.web.views import forms, primary, ibreadcrumbs
 from cubicweb.web.views.tabs import TabbedPrimaryView, PrimaryTab
 from cubicweb.web.views.dotgraphview import DotGraphView, DotPropsHandler
 
@@ -72,11 +72,7 @@
 _abaa.tag_object_of(('WorkflowTransition', 'transition_of', 'Workflow'), True)
 
 _afs = uicfg.autoform_section
-_afs.tag_subject_of(('TrInfo', 'to_state', '*'), 'main', 'hidden')
-_afs.tag_subject_of(('TrInfo', 'from_state', '*'), 'main', 'hidden')
-_afs.tag_attribute(('TrInfo', 'tr_count'), 'main', 'hidden')
-_afs.tag_object_of(('State', 'allowed_transition', '*'), 'main', 'attributes')
-
+_affk = uicfg.autoform_field_kwargs
 
 # IWorkflowable views #########################################################
 
@@ -324,51 +320,56 @@
 
 # workflow entity types edition ################################################
 
-_afs = uicfg.autoform_section
+def _wf_items_for_relation(req, wfeid, wfrelation, field):
+    wf = req.entity_from_eid(wfeid)
+    rschema = req.vreg.schema[field.name]
+    param = 'toeid' if field.role == 'subject' else 'fromeid'
+    return sorted((e.view('combobox'), e.eid)
+                  for e in getattr(wf, 'reverse_%s' % wfrelation)
+                  if rschema.has_perm(req, 'add', **{param: e.eid}))
+
+# TrInfo
 _afs.tag_subject_of(('TrInfo', 'to_state', '*'), 'main', 'hidden')
 _afs.tag_subject_of(('TrInfo', 'from_state', '*'), 'main', 'hidden')
-_afs.tag_object_of(('State', 'allowed_transition', '*'), 'main', 'attributes')
-_afs.tag_subject_of(('State', 'allowed_transition', '*'), 'main', 'attributes')
+_afs.tag_attribute(('TrInfo', 'tr_count'), 'main', 'hidden')
+
+# BaseTransition
+# XXX * allowed_transition BaseTransition
+# XXX BaseTransition destination_state *
+
+def transition_states_vocabulary(form, field):
+    entity = form.edited_entity
+    if not entity.has_eid():
+        eids = entity.linked_to('transition_of', 'subject')
+        if not eids:
+            return []
+        return _wf_items_for_relation(form._cw, eids[0], 'state_of', field)
+    return ff.relvoc_unrelated(entity, field.name, field.role)
 
-def workflow_items_for_relation(req, wfeid, wfrelation, targetrelation):
-    wf = req.entity_from_eid(wfeid)
-    rschema = req.vreg.schema[targetrelation]
-    return sorted((e.view('combobox'), e.eid)
-                  for e in getattr(wf, 'reverse_%s' % wfrelation)
-                  if rschema.has_perm(req, 'add', toeid=e.eid))
+_afs.tag_subject_of(('*', 'destination_state', '*'), 'main', 'attributes')
+_affk.tag_subject_of(('*', 'destination_state', '*'),
+                     {'choices': transition_states_vocabulary})
+_afs.tag_object_of(('*', 'allowed_transition', '*'), 'main', 'attributes')
+_affk.tag_object_of(('*', 'allowed_transition', '*'),
+                     {'choices': transition_states_vocabulary})
+
+# State
+
+def state_transitions_vocabulary(form, field):
+    entity = form.edited_entity
+    if not entity.has_eid():
+        eids = entity.linked_to('state_of', 'subject')
+        if eids:
+            return _wf_items_for_relation(form._cw, eids[0], 'transition_of', field)
+        return []
+    return ff.relvoc_unrelated(entity, field.name, field.role)
+
+_afs.tag_subject_of(('State', 'allowed_transition', '*'), 'main', 'attributes')
+_affk.tag_subject_of(('State', 'allowed_transition', '*'),
+                     {'choices': state_transitions_vocabulary})
 
 
-class TransitionEditionForm(autoform.AutomaticEntityForm):
-    __select__ = is_instance('Transition')
-
-    def workflow_states_for_relation(self, targetrelation):
-        eids = self.edited_entity.linked_to('transition_of', 'subject')
-        if eids:
-            return workflow_items_for_relation(self._cw, eids[0], 'state_of',
-                                               targetrelation)
-        return []
-
-    def subject_destination_state_vocabulary(self, rtype, limit=None):
-        if not self.edited_entity.has_eid():
-            return self.workflow_states_for_relation('destination_state')
-        return self.subject_relation_vocabulary(rtype, limit)
-
-    def object_allowed_transition_vocabulary(self, rtype, limit=None):
-        if not self.edited_entity.has_eid():
-            return self.workflow_states_for_relation('allowed_transition')
-        return self.object_relation_vocabulary(rtype, limit)
-
-
-class StateEditionForm(autoform.AutomaticEntityForm):
-    __select__ = is_instance('State')
-
-    def subject_allowed_transition_vocabulary(self, rtype, limit=None):
-        if not self.edited_entity.has_eid():
-            eids = self.edited_entity.linked_to('state_of', 'subject')
-            if eids:
-                return workflow_items_for_relation(self._cw, eids[0], 'transition_of',
-                                                   'allowed_transition')
-        return []
+# adaptaters ###################################################################
 
 class WorkflowIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter):
     __select__ = is_instance('Workflow')