15 from logilab.common.graph import escape, GraphGenerator, DotBackend |
15 from logilab.common.graph import escape, GraphGenerator, DotBackend |
16 |
16 |
17 from cubicweb import Unauthorized, view |
17 from cubicweb import Unauthorized, view |
18 from cubicweb.selectors import (implements, has_related_entities, one_line_rset, |
18 from cubicweb.selectors import (implements, has_related_entities, one_line_rset, |
19 relation_possible, match_form_params, |
19 relation_possible, match_form_params, |
20 entity_implements, score_entity) |
20 implements, score_entity) |
21 from cubicweb.interfaces import IWorkflowable |
21 from cubicweb.interfaces import IWorkflowable |
22 from cubicweb.view import EntityView |
22 from cubicweb.view import EntityView |
23 from cubicweb.schema import display_name |
23 from cubicweb.schema import display_name |
24 from cubicweb.web import uicfg, stdmsgs, action, component, form, action |
24 from cubicweb.web import uicfg, stdmsgs, action, component, form, action |
25 from cubicweb.web import formfields as ff, formwidgets as fwdgs |
25 from cubicweb.web import formfields as ff, formwidgets as fwdgs |
78 def redirectpath(self, entity): |
78 def redirectpath(self, entity): |
79 return entity.rest_path() |
79 return entity.rest_path() |
80 |
80 |
81 def get_form(self, entity, transition, **kwargs): |
81 def get_form(self, entity, transition, **kwargs): |
82 # XXX used to specify both rset/row/col and entity in case implements |
82 # XXX used to specify both rset/row/col and entity in case implements |
83 # selector (and not entity_implements) is used on custom form |
83 # selector (and not implements) is used on custom form |
84 form = self._cw.vreg['forms'].select( |
84 form = self._cw.vreg['forms'].select( |
85 'changestate', self._cw, entity=entity, transition=transition, |
85 'changestate', self._cw, entity=entity, transition=transition, |
86 redirect_path=self.redirectpath(entity), **kwargs) |
86 redirect_path=self.redirectpath(entity), **kwargs) |
87 trinfo = self._cw.vreg['etypes'].etype_class('TrInfo')(self._cw) |
87 trinfo = self._cw.vreg['etypes'].etype_class('TrInfo')(self._cw) |
88 trinfo.eid = self._cw.varmaker.next() |
88 trinfo.eid = self._cw.varmaker.next() |
231 for e in getattr(wf, 'reverse_%s' % wfrelation) |
231 for e in getattr(wf, 'reverse_%s' % wfrelation) |
232 if rschema.has_perm(req, 'add', toeid=e.eid)) |
232 if rschema.has_perm(req, 'add', toeid=e.eid)) |
233 |
233 |
234 |
234 |
235 class TransitionEditionForm(autoform.AutomaticEntityForm): |
235 class TransitionEditionForm(autoform.AutomaticEntityForm): |
236 __select__ = entity_implements('Transition') |
236 __select__ = implements('Transition') |
237 |
237 |
238 def workflow_states_for_relation(self, targetrelation): |
238 def workflow_states_for_relation(self, targetrelation): |
239 eids = self.edited_entity.linked_to('transition_of', 'subject') |
239 eids = self.edited_entity.linked_to('transition_of', 'subject') |
240 if eids: |
240 if eids: |
241 return workflow_items_for_relation(self.req, eids[0], 'state_of', |
241 return workflow_items_for_relation(self.req, eids[0], 'state_of', |
252 return self.workflow_states_for_relation('allowed_transition') |
252 return self.workflow_states_for_relation('allowed_transition') |
253 return self.object_relation_vocabulary(rtype, limit) |
253 return self.object_relation_vocabulary(rtype, limit) |
254 |
254 |
255 |
255 |
256 class StateEditionForm(autoform.AutomaticEntityForm): |
256 class StateEditionForm(autoform.AutomaticEntityForm): |
257 __select__ = entity_implements('State') |
257 __select__ = implements('State') |
258 |
258 |
259 def subject_allowed_transition_vocabulary(self, rtype, limit=None): |
259 def subject_allowed_transition_vocabulary(self, rtype, limit=None): |
260 if not self.edited_entity.has_eid(): |
260 if not self.edited_entity.has_eid(): |
261 eids = self.edited_entity.linked_to('state_of', 'subject') |
261 eids = self.edited_entity.linked_to('state_of', 'subject') |
262 if eids: |
262 if eids: |