18 from cubicweb.selectors import (implements, has_related_entities, |
18 from cubicweb.selectors import (implements, has_related_entities, |
19 relation_possible, match_form_params) |
19 relation_possible, match_form_params) |
20 from cubicweb.interfaces import IWorkflowable |
20 from cubicweb.interfaces import IWorkflowable |
21 from cubicweb.view import EntityView |
21 from cubicweb.view import EntityView |
22 from cubicweb.web import stdmsgs, action, component, form |
22 from cubicweb.web import stdmsgs, action, component, form |
23 from cubicweb.web.form import FormViewMixIn |
23 from cubicweb.web import formfields as ff, formwidgets as fwdgs |
24 from cubicweb.web.formfields import StringField, RichTextField |
|
25 from cubicweb.web.formwidgets import HiddenInput, SubmitButton, Button |
|
26 from cubicweb.web.views import TmpFileViewMixin, forms |
24 from cubicweb.web.views import TmpFileViewMixin, forms |
27 |
25 |
28 |
26 |
29 # IWorkflowable views ######################################################### |
27 # IWorkflowable views ######################################################### |
30 |
28 |
31 class ChangeStateForm(forms.EntityFieldsForm): |
29 class ChangeStateForm(forms.CompositeEntityForm): |
32 id = 'changestate' |
30 id = 'changestate' |
33 |
31 |
34 form_renderer_id = 'base' # don't want EntityFormRenderer |
32 form_renderer_id = 'base' # don't want EntityFormRenderer |
35 form_buttons = [SubmitButton(stdmsgs.YES), |
33 form_buttons = [fwdgs.SubmitButton(stdmsgs.YES), |
36 Button(stdmsgs.NO, cwaction='cancel')] |
34 fwdgs.Button(stdmsgs.NO, cwaction='cancel')] |
37 |
35 |
38 __method = StringField(name='__method', initial='set_state', |
36 |
39 widget=HiddenInput) |
37 class ChangeStateFormView(form.FormViewMixIn, view.EntityView): |
40 state = StringField(eidparam=True, widget=HiddenInput) |
|
41 trcomment = RichTextField(label=_('comment:'), eidparam=True) |
|
42 |
|
43 |
|
44 class ChangeStateFormView(FormViewMixIn, view.EntityView): |
|
45 id = 'statuschange' |
38 id = 'statuschange' |
46 title = _('status change') |
39 title = _('status change') |
47 __select__ = implements(IWorkflowable) & match_form_params('treid') |
40 __select__ = implements(IWorkflowable) & match_form_params('treid') |
48 |
41 |
49 def cell_call(self, row, col): |
42 def cell_call(self, row, col): |
50 entity = self.rset.get_entity(row, col) |
43 entity = self.rset.get_entity(row, col) |
51 state = entity.in_state[0] |
|
52 transition = self.req.entity_from_eid(self.req.form['treid']) |
44 transition = self.req.entity_from_eid(self.req.form['treid']) |
53 dest = transition.destination() |
45 dest = transition.destination() |
54 _ = self.req._ |
46 _ = self.req._ |
55 form = self.vreg.select('forms', 'changestate', self.req, rset=self.rset, |
47 form = self.vreg['forms'].select('changestate', self.req, entity=entity, |
56 row=row, col=col, entity=entity, |
48 redirect_path=self.redirectpath(entity)) |
57 redirect_path=self.redirectpath(entity)) |
|
58 self.w(form.error_message()) |
49 self.w(form.error_message()) |
59 self.w(u'<h4>%s %s</h4>\n' % (_(transition.name), |
50 self.w(u'<h4>%s %s</h4>\n' % (_(transition.name), |
60 entity.view('oneline'))) |
51 entity.view('oneline'))) |
61 msg = _('status will change from %(st1)s to %(st2)s') % { |
52 msg = _('status will change from %(st1)s to %(st2)s') % { |
62 'st1': _(state.name), |
53 'st1': _(entity.current_state.name), |
63 'st2': _(dest.name)} |
54 'st2': _(dest.name)} |
64 self.w(u'<p>%s</p>\n' % msg) |
55 self.w(u'<p>%s</p>\n' % msg) |
65 self.w(form.form_render(state=dest.eid, trcomment=u'', |
56 trinfo = self.vreg['etypes'].etype_class('TrInfo')(self.req) |
66 trcomment_format=self.req.property_value('ui.default-text-format'))) |
57 self.initialize_varmaker() |
|
58 trinfo.eid = self.varmaker.next() |
|
59 subform = self.vreg['forms'].select('edition', self.req, entity=trinfo, |
|
60 mainform=False) |
|
61 subform.field_by_name('by_transition').widget = fwdgs.HiddenInput() |
|
62 form.form_add_subform(subform) |
|
63 self.w(form.form_render(wf_info_for=entity.eid, |
|
64 by_transition=transition.eid)) |
67 |
65 |
68 def redirectpath(self, entity): |
66 def redirectpath(self, entity): |
69 return entity.rest_path() |
67 return entity.rest_path() |
70 |
68 |
71 |
69 |