web/views/workflow.py
changeset 2968 0e3460341023
parent 2789 39712da6f397
parent 2920 64322aa83a1d
child 3230 1d25e928c299
equal deleted inserted replaced
2902:dd9f2dd02f85 2968:0e3460341023
    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 
   133 
   131 
   134 # workflow images #############################################################
   132 # workflow images #############################################################
   135 
   133 
   136 class ViewWorkflowAction(action.Action):
   134 class ViewWorkflowAction(action.Action):
   137     id = 'workflow'
   135     id = 'workflow'
   138     __select__ = implements('CWEType') & has_related_entities('state_of', 'object')
   136     __select__ = implements('CWEType') & has_related_entities('workflow_of', 'object')
   139 
   137 
   140     category = 'mainactions'
   138     category = 'mainactions'
   141     title = _('view workflow')
   139     title = _('view workflow')
   142     def url(self):
   140     def url(self):
   143         entity = self.rset.get_entity(self.row or 0, self.col or 0)
   141         entity = self.rset.get_entity(self.row or 0, self.col or 0)