author | sylvain.thenault@logilab.fr |
Fri, 24 Apr 2009 17:04:14 +0200 | |
branch | tls-sprint |
changeset 1477 | b056a49c16dc |
parent 1398 | 5fe84a5f7035 |
child 1504 | c6051f141807 |
permissions | -rw-r--r-- |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
1 |
"""workflow views: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
2 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
3 |
* IWorkflowable views and forms |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
4 |
* workflow entities views (State, Transition, TrInfo) |
0 | 5 |
|
6 |
:organization: Logilab |
|
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
7 |
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
0 | 8 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
9 |
""" |
|
10 |
__docformat__ = "restructuredtext en" |
|
11 |
||
822 | 12 |
from logilab.mtconverter import html_escape |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
13 |
from logilab.common.graph import escape, GraphGenerator, DotBackend |
822 | 14 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
15 |
from cubicweb import Unauthorized, view |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
16 |
from cubicweb.selectors import (implements, has_related_entities, |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
17 |
relation_possible, match_form_params) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
18 |
from cubicweb.interfaces import IWorkflowable |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
19 |
from cubicweb.web import stdmsgs, action, component, form |
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1305
diff
changeset
|
20 |
from cubicweb.web.form import FormViewMixIn |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
21 |
from cubicweb.web.formfields import StringField, RichTextField |
1304 | 22 |
from cubicweb.web.formwidgets import HiddenInput, SubmitButton, Button |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
23 |
from cubicweb.web.views import TmpFileViewMixin |
1151
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
24 |
from cubicweb.web.views.boxes import EditBox |
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
25 |
|
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
26 |
|
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
27 |
EditBox.rmode.set_rtag('create', 'destination_state', 'subject', 'Transition') |
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
28 |
EditBox.rmode.set_rtag('create', 'allowed_transition', 'object', 'Transition') |
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
29 |
EditBox.rmode.set_rtag('create', 'destination_state', 'object', 'State') |
b20677336ee6
turn old __rtags__ the new way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
30 |
EditBox.rmode.set_rtag('create', 'allowed_transition', 'subject', 'State') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
31 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
32 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
33 |
# IWorkflowable views ######################################################### |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
34 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
35 |
class ChangeStateForm(form.EntityFieldsForm): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
36 |
id = 'changestate' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
37 |
|
1305
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
38 |
__method = StringField(name='__method', initial='set_state', |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
39 |
widget=HiddenInput) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
40 |
state = StringField(widget=HiddenInput, eidparam=True) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
41 |
trcomment = RichTextField(eidparam=True) |
1304 | 42 |
form_buttons = [SubmitButton(stdmsgs.YES), |
43 |
Button(stdmsgs.NO, cwaction='cancel')] |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
44 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
45 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1305
diff
changeset
|
46 |
class ChangeStateFormView(FormViewMixIn, view.EntityView): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
47 |
id = 'statuschange' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
48 |
title = _('status change') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
49 |
__select__ = implements(IWorkflowable) & match_form_params('treid') |
0 | 50 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
51 |
def cell_call(self, row, col): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
52 |
entity = self.entity(row, col) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
53 |
state = entity.in_state[0] |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
54 |
transition = self.req.eid_rset(self.req.form['treid']).get_entity(0, 0) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
55 |
dest = transition.destination() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
56 |
_ = self.req._ |
1305
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
57 |
form = self.vreg.select_object('forms', 'changestate', self.req, |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
58 |
self.rset, row=row, col=col, |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
59 |
entity=entity, |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
60 |
redirect_path=self.redirectpath(entity)) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
61 |
self.w(form.error_message()) |
1305
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
62 |
self.w(u'<h4>%s %s</h4>\n' % (_(transition.name), |
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
63 |
entity.view('oneline'))) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
64 |
msg = _('status will change from %(st1)s to %(st2)s') % { |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
65 |
'st1': _(state.name), |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
66 |
'st2': _(dest.name)} |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
67 |
self.w(u'<p>%s</p>\n' % msg) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
68 |
self.w(form.form_render(state=dest.eid, trcomment=u'')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
69 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
70 |
def redirectpath(self, entity): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
71 |
return entity.rest_path() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
72 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
73 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
74 |
class WFHistoryVComponent(component.EntityVComponent): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
75 |
"""display the workflow history for entities supporting it""" |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
76 |
id = 'wfhistory' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
77 |
__select__ = (component.EntityVComponent.__select__ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
78 |
& relation_possible('wf_info_for', role='object')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
79 |
context = 'navcontentbottom' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
80 |
title = _('Workflow history') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
81 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
82 |
def cell_call(self, row, col, view=None): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
83 |
_ = self.req._ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
84 |
eid = self.rset[row][col] |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
85 |
sel = 'Any FS,TS,WF,D' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
86 |
rql = ' ORDERBY D DESC WHERE WF wf_info_for X,'\ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
87 |
'WF from_state FS, WF to_state TS, WF comment C,'\ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
88 |
'WF creation_date D' |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
89 |
if self.vreg.schema.eschema('CWUser').has_perm(self.req, 'read'): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
90 |
sel += ',U,C' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
91 |
rql += ', WF owned_by U?' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
92 |
displaycols = range(5) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
93 |
headers = (_('from_state'), _('to_state'), _('comment'), _('date'), |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
94 |
_('CWUser')) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
95 |
else: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
96 |
sel += ',C' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
97 |
displaycols = range(4) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
98 |
headers = (_('from_state'), _('to_state'), _('comment'), _('date')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
99 |
rql = '%s %s, X eid %%(x)s' % (sel, rql) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
100 |
try: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
101 |
rset = self.req.execute(rql, {'x': eid}, 'x') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
102 |
except Unauthorized: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
103 |
return |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
104 |
if rset: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
105 |
self.wview('table', rset, title=_(self.title), displayactions=False, |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
106 |
displaycols=displaycols, headers=headers) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
107 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
108 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
109 |
# workflow entity types views ################################################# |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
110 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
111 |
class CellView(view.EntityView): |
0 | 112 |
id = 'cell' |
728
a95b284150d1
first pass to use __select__ instead of __selectors__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
688
diff
changeset
|
113 |
__select__ = implements('TrInfo') |
688
cddfbdee0eb3
remove all accepts = ('Foo',) declaration and use __selectors__ = implements('Foo') instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
0
diff
changeset
|
114 |
|
0 | 115 |
def cell_call(self, row, col, cellvid=None): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
116 |
self.w(self.entity(row, col).printable_value('comment')) |
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
117 |
|
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
118 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
119 |
class StateInContextView(view.EntityView): |
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
120 |
"""convenience trick, State's incontext view should not be clickable""" |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
121 |
id = 'incontext' |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
122 |
__select__ = implements('State') |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
123 |
|
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
124 |
def cell_call(self, row, col): |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
125 |
self.w(html_escape(self.view('textincontext', self.rset, |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
126 |
row=row, col=col))) |
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
127 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
128 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
129 |
# workflow images ############################################################# |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
130 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
131 |
class ViewWorkflowAction(action.Action): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
132 |
id = 'workflow' |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
133 |
__select__ = implements('CWEType') & has_related_entities('state_of', 'object') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
134 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
135 |
category = 'mainactions' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
136 |
title = _('view workflow') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
137 |
def url(self): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
138 |
entity = self.rset.get_entity(self.row or 0, self.col or 0) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
139 |
return entity.absolute_url(vid='workflow') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
140 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
141 |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
142 |
class CWETypeWorkflowView(view.EntityView): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
143 |
id = 'workflow' |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
144 |
__select__ = implements('CWEType') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
145 |
cache_max_age = 60*60*2 # stay in http cache for 2 hours by default |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
146 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
147 |
def cell_call(self, row, col, **kwargs): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
148 |
entity = self.entity(row, col) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
149 |
self.w(u'<h1>%s</h1>' % (self.req._('workflow for %s') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
150 |
% display_name(self.req, entity.name))) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
151 |
self.w(u'<img src="%s" alt="%s"/>' % ( |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
152 |
html_escape(entity.absolute_url(vid='ewfgraph')), |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
153 |
html_escape(self.req._('graphical workflow for %s') % entity.name))) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
154 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
155 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
156 |
class WorkflowDotPropsHandler(object): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
157 |
def __init__(self, req): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
158 |
self._ = req._ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
159 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
160 |
def node_properties(self, stateortransition): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
161 |
"""return default DOT drawing options for a state or transition""" |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
162 |
props = {'label': stateortransition.name, |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
163 |
'fontname': 'Courier'} |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
164 |
if hasattr(stateortransition, 'state_of'): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
165 |
props['shape'] = 'box' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
166 |
props['style'] = 'filled' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
167 |
if stateortransition.reverse_initial_state: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
168 |
props['color'] = '#88CC88' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
169 |
else: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
170 |
props['shape'] = 'ellipse' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
171 |
descr = [] |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
172 |
tr = stateortransition |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
173 |
if tr.require_group: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
174 |
descr.append('%s %s'% ( |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
175 |
self._('groups:'), |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
176 |
','.join(g.name for g in tr.require_group))) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
177 |
if tr.condition: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
178 |
descr.append('%s %s'% (self._('condition:'), tr.condition)) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
179 |
if descr: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
180 |
props['label'] += escape('\n'.join(descr)) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
181 |
return props |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
182 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
183 |
def edge_properties(self, transition, fromstate, tostate): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
184 |
return {'label': '', 'dir': 'forward', |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
185 |
'color': 'black', 'style': 'filled'} |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
186 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
187 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
188 |
class WorkflowVisitor: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
189 |
def __init__(self, entity): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
190 |
self.entity = entity |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
191 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
192 |
def nodes(self): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
193 |
for state in self.entity.reverse_state_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
194 |
state.complete() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
195 |
yield state.eid, state |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
196 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
197 |
for transition in self.entity.reverse_transition_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
198 |
transition.complete() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
199 |
yield transition.eid, transition |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
200 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
201 |
def edges(self): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
202 |
for transition in self.entity.reverse_transition_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
203 |
for incomingstate in transition.reverse_allowed_transition: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
204 |
yield incomingstate.eid, transition.eid, transition |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
205 |
yield transition.eid, transition.destination().eid, transition |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
206 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
207 |
|
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
208 |
class CWETypeWorkflowImageView(TmpFileViewMixin, view.EntityView): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
209 |
id = 'ewfgraph' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
210 |
content_type = 'image/png' |
1398
5fe84a5f7035
rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents:
1318
diff
changeset
|
211 |
__select__ = implements('CWEType') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
212 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
213 |
def _generate(self, tmpfile): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
214 |
"""display schema information for an entity""" |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
215 |
entity = self.entity(self.row, self.col) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
216 |
visitor = WorkflowVisitor(entity) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
217 |
prophdlr = WorkflowDotPropsHandler(self.req) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
218 |
generator = GraphGenerator(DotBackend('workflow', 'LR', |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
219 |
ratio='compress', size='30,12')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
220 |
return generator.generate(visitor, prophdlr, tmpfile) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
221 |