author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 02 Jun 2010 15:29:18 +0200 | |
changeset 5633 | 879590c52679 |
parent 5556 | 9ab2b4c74baf |
child 5685 | 17883ced01f8 |
permissions | -rw-r--r-- |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
18 |
"""workflow views: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
19 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
20 |
* IWorkflowable views and forms |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
21 |
* workflow entities views (State, Transition, TrInfo) |
0 | 22 |
|
23 |
""" |
|
24 |
__docformat__ = "restructuredtext en" |
|
1739 | 25 |
_ = unicode |
0 | 26 |
|
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
27 |
import tempfile |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
28 |
import os |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
29 |
|
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2005
diff
changeset
|
30 |
from logilab.mtconverter import xml_escape |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
31 |
from logilab.common.graph import escape, GraphGenerator, DotBackend |
822 | 32 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
33 |
from cubicweb import Unauthorized, view |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
34 |
from cubicweb.selectors import (implements, has_related_entities, one_line_rset, |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
35 |
relation_possible, match_form_params, |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
36 |
implements, score_entity, adaptable) |
2438
576f4d51f826
[cleanup] fix deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2381
diff
changeset
|
37 |
from cubicweb.view import EntityView |
3215
bf30ab5ba6ee
fix workflow graph views and tabs for the new wf system, remove useless view and action (actually useless since introduction of tabbed entity type view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2920
diff
changeset
|
38 |
from cubicweb.schema import display_name |
3262
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
39 |
from cubicweb.web import uicfg, stdmsgs, action, component, form, action |
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2726
diff
changeset
|
40 |
from cubicweb.web import formfields as ff, formwidgets as fwdgs |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
41 |
from cubicweb.web.views import TmpFileViewMixin |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
42 |
from cubicweb.web.views import forms, primary, autoform, ibreadcrumbs |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
43 |
from cubicweb.web.views.tabs import TabbedPrimaryView, PrimaryTab |
3306
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
44 |
|
3487
2e705d9fdaf1
[views] workflow primary view: do not show states and transitions in side boxes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3350
diff
changeset
|
45 |
_pvs = uicfg.primaryview_section |
2e705d9fdaf1
[views] workflow primary view: do not show states and transitions in side boxes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3350
diff
changeset
|
46 |
_pvs.tag_subject_of(('Workflow', 'initial_state', '*'), 'hidden') |
2e705d9fdaf1
[views] workflow primary view: do not show states and transitions in side boxes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3350
diff
changeset
|
47 |
_pvs.tag_object_of(('*', 'state_of', 'Workflow'), 'hidden') |
2e705d9fdaf1
[views] workflow primary view: do not show states and transitions in side boxes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3350
diff
changeset
|
48 |
_pvs.tag_object_of(('*', 'transition_of', 'Workflow'), 'hidden') |
5239
471554b842d2
[schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5224
diff
changeset
|
49 |
_pvs.tag_object_of(('*', 'wf_info_for', '*'), 'hidden') |
471554b842d2
[schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5224
diff
changeset
|
50 |
for rtype in ('in_state', 'by_transition', 'from_state', 'to_state'): |
471554b842d2
[schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5224
diff
changeset
|
51 |
_pvs.tag_subject_of(('*', rtype, '*'), 'hidden') |
471554b842d2
[schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5224
diff
changeset
|
52 |
_pvs.tag_object_of(('*', rtype, '*'), 'hidden') |
471554b842d2
[schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5224
diff
changeset
|
53 |
_pvs.tag_object_of(('*', 'wf_info_for', '*'), 'hidden') |
3487
2e705d9fdaf1
[views] workflow primary view: do not show states and transitions in side boxes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3350
diff
changeset
|
54 |
|
3262
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
55 |
_abaa = uicfg.actionbox_appearsin_addmenu |
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
56 |
_abaa.tag_subject_of(('BaseTransition', 'condition', 'RQLExpression'), False) |
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
57 |
_abaa.tag_subject_of(('State', 'allowed_transition', 'BaseTransition'), False) |
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
58 |
_abaa.tag_object_of(('SubWorkflowExitPoint', 'destination_state', 'State'), |
12ffb1e95771
uicfg tweaks for wf
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3228
diff
changeset
|
59 |
False) |
4995
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
60 |
_abaa.tag_subject_of(('*', 'wf_info_for', '*'), False) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
61 |
_abaa.tag_object_of(('*', 'wf_info_for', '*'), False) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
62 |
|
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
63 |
_abaa.tag_object_of(('*', 'state_of', 'CWEType'), True) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
64 |
_abaa.tag_object_of(('*', 'transition_of', 'CWEType'), True) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
65 |
_abaa.tag_subject_of(('Transition', 'destination_state', '*'), True) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
66 |
_abaa.tag_object_of(('*', 'allowed_transition', 'Transition'), True) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
67 |
_abaa.tag_object_of(('*', 'destination_state', 'State'), True) |
1817b87c7f67
[web] move workflow related uicfg stuff to the workflow module
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4780
diff
changeset
|
68 |
_abaa.tag_subject_of(('State', 'allowed_transition', '*'), True) |
3306
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
69 |
_abaa.tag_object_of(('State', 'state_of', 'Workflow'), True) |
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
70 |
_abaa.tag_object_of(('Transition', 'transition_of', 'Workflow'), True) |
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
71 |
_abaa.tag_object_of(('WorkflowTransition', 'transition_of', 'Workflow'), True) |
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
72 |
|
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
73 |
_afs = uicfg.autoform_section |
3659 | 74 |
_afs.tag_subject_of(('TrInfo', 'to_state', '*'), 'main', 'hidden') |
75 |
_afs.tag_subject_of(('TrInfo', 'from_state', '*'), 'main', 'hidden') |
|
76 |
_afs.tag_object_of(('State', 'allowed_transition', '*'), 'main', 'attributes') |
|
3306
bf50dc056edd
[wf] uicfg tweaks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3304
diff
changeset
|
77 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
78 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
79 |
# IWorkflowable views ######################################################### |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
80 |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2726
diff
changeset
|
81 |
class ChangeStateForm(forms.CompositeEntityForm): |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
82 |
__regid__ = 'changestate' |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
83 |
|
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
84 |
form_renderer_id = 'base' # don't want EntityFormRenderer |
3805
ad0b38e1a4eb
[web ui] rename form buttons to ok/cancel where workflow change state
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3513
diff
changeset
|
85 |
form_buttons = [fwdgs.SubmitButton(), |
ad0b38e1a4eb
[web ui] rename form buttons to ok/cancel where workflow change state
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3513
diff
changeset
|
86 |
fwdgs.Button(stdmsgs.BUTTON_CANCEL, cwaction='cancel')] |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
87 |
|
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
88 |
|
2920
64322aa83a1d
start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2726
diff
changeset
|
89 |
class ChangeStateFormView(form.FormViewMixIn, view.EntityView): |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
90 |
__regid__ = 'statuschange' |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
91 |
title = _('status change') |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
92 |
__select__ = (one_line_rset() |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
93 |
& match_form_params('treid') |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
94 |
& adaptable('IWorkflowable')) |
0 | 95 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
96 |
def cell_call(self, row, col): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
97 |
entity = self.cw_rset.get_entity(row, col) |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
98 |
transition = self._cw.entity_from_eid(self._cw.form['treid']) |
3920
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
99 |
form = self.get_form(entity, transition) |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
100 |
self.w(u'<h4>%s %s</h4>\n' % (self._cw._(transition.name), |
1305
395ef7f2b95b
cleanup, remove some unnecessary (sometime buggy) stuff
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
101 |
entity.view('oneline'))) |
4780
58432e8e7dde
fix a Depression Warning
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
4646
diff
changeset
|
102 |
msg = self._cw._('status will change from %(st1)s to %(st2)s') % { |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
103 |
'st1': entity.cw_adapt_to('IWorkflowable').printable_state, |
4646
322c3dd96dd5
[workflow] finish refactoring introduced by 021035b9a7ab for 'go back' transition:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
104 |
'st2': self._cw._(transition.destination(entity).name)} |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
105 |
self.w(u'<p>%s</p>\n' % msg) |
4167
73e649a7797d
fix render (formerly form_render) prototype
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4159
diff
changeset
|
106 |
self.w(form.render()) |
3920
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
107 |
|
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
108 |
def redirectpath(self, entity): |
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
109 |
return entity.rest_path() |
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
110 |
|
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
111 |
def get_form(self, entity, transition, **kwargs): |
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
112 |
# XXX used to specify both rset/row/col and entity in case implements |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4004
diff
changeset
|
113 |
# selector (and not implements) is used on custom form |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
114 |
form = self._cw.vreg['forms'].select( |
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
115 |
'changestate', self._cw, entity=entity, transition=transition, |
3920
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
116 |
redirect_path=self.redirectpath(entity), **kwargs) |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
117 |
trinfo = self._cw.vreg['etypes'].etype_class('TrInfo')(self._cw) |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
118 |
trinfo.eid = self._cw.varmaker.next() |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
119 |
subform = self._cw.vreg['forms'].select('edition', self._cw, entity=trinfo, |
4159
6b2b20c73d59
refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4090
diff
changeset
|
120 |
mainform=False) |
6b2b20c73d59
refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4090
diff
changeset
|
121 |
subform.field_by_name('wf_info_for', 'subject').value = entity.eid |
6b2b20c73d59
refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4090
diff
changeset
|
122 |
trfield = subform.field_by_name('by_transition', 'subject') |
6b2b20c73d59
refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4090
diff
changeset
|
123 |
trfield.widget = fwdgs.HiddenInput() |
6b2b20c73d59
refactor form field value handling, to get a nicer api and an easier algorithm to get field's value
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4090
diff
changeset
|
124 |
trfield.value = transition.eid |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3487
diff
changeset
|
125 |
form.add_subform(subform) |
3920
366b30a6f9f6
refactor to ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3868
diff
changeset
|
126 |
return form |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
127 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
128 |
|
2440
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
129 |
class WFHistoryView(EntityView): |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
130 |
__regid__ = 'wfhistory' |
3948
24a25b676671
make wfhistory non selectable for entities without record in its workflow history
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3920
diff
changeset
|
131 |
__select__ = relation_possible('wf_info_for', role='object') & \ |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
132 |
score_entity(lambda x: x.cw_adapt_to('IWorkflowable').workflow_history) |
3998
94cc7cad3d2d
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
133 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
134 |
title = _('Workflow history') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
135 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
136 |
def cell_call(self, row, col, view=None): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
137 |
_ = self._cw._ |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
138 |
eid = self.cw_rset[row][col] |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
139 |
sel = 'Any FS,TS,WF,D' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
140 |
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
|
141 |
'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
|
142 |
'WF creation_date D' |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
143 |
if self._cw.vreg.schema.eschema('CWUser').has_perm(self._cw, 'read'): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
144 |
sel += ',U,C' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
145 |
rql += ', WF owned_by U?' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
146 |
displaycols = range(5) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
147 |
headers = (_('from_state'), _('to_state'), _('comment'), _('date'), |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
148 |
_('CWUser')) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
149 |
else: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
150 |
sel += ',C' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
151 |
displaycols = range(4) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
152 |
headers = (_('from_state'), _('to_state'), _('comment'), _('date')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
153 |
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
|
154 |
try: |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4995
diff
changeset
|
155 |
rset = self._cw.execute(rql, {'x': eid}) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
156 |
except Unauthorized: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
157 |
return |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
158 |
if rset: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
159 |
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
|
160 |
displaycols=displaycols, headers=headers) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
161 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
162 |
|
2440
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
163 |
class WFHistoryVComponent(component.EntityVComponent): |
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
164 |
"""display the workflow history for entities supporting it""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
165 |
__regid__ = 'wfhistory' |
2440
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
166 |
__select__ = WFHistoryView.__select__ & component.EntityVComponent.__select__ |
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
167 |
context = 'navcontentbottom' |
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
168 |
title = _('Workflow history') |
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
169 |
|
8e6b83e3b6b5
#343227: display the workflow history of any entity
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2438
diff
changeset
|
170 |
def cell_call(self, row, col, view=None): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
171 |
self.wview('wfhistory', self.cw_rset, row=row, col=col, view=view) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
172 |
|
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
173 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
174 |
# workflow actions ############################################################# |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
175 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
176 |
class WorkflowActions(action.Action): |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
177 |
"""fill 'workflow' sub-menu of the actions box""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
178 |
__regid__ = 'workflow' |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
179 |
__select__ = (action.Action.__select__ & one_line_rset() & |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
180 |
relation_possible('in_state')) |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
181 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
182 |
submenu = _('workflow') |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
183 |
order = 10 |
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
184 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
185 |
def fill_menu(self, box, menu): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
186 |
entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
187 |
menu.label = u'%s: %s' % (self._cw._('state'), |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
188 |
entity.cw_adapt_to('IWorkflowable').printable_state) |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
189 |
menu.append_anyway = True |
3228
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
190 |
super(WorkflowActions, self).fill_menu(box, menu) |
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
191 |
|
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
192 |
def actual_actions(self): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
193 |
entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
194 |
iworkflowable = entity.cw_adapt_to('IWorkflowable') |
3228
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
195 |
hastr = False |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
196 |
for tr in iworkflowable.possible_transitions(): |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
197 |
url = entity.absolute_url(vid='statuschange', treid=tr.eid) |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
198 |
yield self.build_action(self._cw._(tr.name), url) |
3228
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
199 |
hastr = True |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
200 |
# don't propose to see wf if user can't pass any transition |
3228
7b05b2709439
[actions] refactor: extract actual_actions from fill_menu to work with table filter form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3220
diff
changeset
|
201 |
if hastr: |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
202 |
wfurl = iworkflowable.current_workflow.absolute_url() |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
203 |
yield self.build_action(self._cw._('view workflow'), wfurl) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
204 |
if iworkflowable.workflow_history: |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
205 |
wfurl = entity.absolute_url(vid='wfhistory') |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
206 |
yield self.build_action(self._cw._('view history'), wfurl) |
3219
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
207 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
208 |
|
be8cfc00ae04
edit box refactoring to gain more control by using actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3216
diff
changeset
|
209 |
# workflow entity types views ################################################## |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
210 |
|
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
211 |
_pvs = uicfg.primaryview_section |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
212 |
_pvs.tag_subject_of(('Workflow', 'initial_state', '*'), 'hidden') |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
213 |
_pvs.tag_object_of(('*', 'state_of', 'Workflow'), 'hidden') |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
214 |
_pvs.tag_object_of(('*', 'transition_of', 'Workflow'), 'hidden') |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
215 |
_pvs.tag_object_of(('*', 'default_workflow', 'Workflow'), 'hidden') |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
216 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
217 |
_abaa = uicfg.actionbox_appearsin_addmenu |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
218 |
_abaa.tag_subject_of(('BaseTransition', 'condition', 'RQLExpression'), False) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
219 |
_abaa.tag_subject_of(('State', 'allowed_transition', 'BaseTransition'), False) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
220 |
_abaa.tag_object_of(('SubWorkflowExitPoint', 'destination_state', 'State'), |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
221 |
False) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
222 |
_abaa.tag_object_of(('State', 'state_of', 'Workflow'), True) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
223 |
_abaa.tag_object_of(('BaseTransition', 'transition_of', 'Workflow'), False) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
224 |
_abaa.tag_object_of(('Transition', 'transition_of', 'Workflow'), True) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
225 |
_abaa.tag_object_of(('WorkflowTransition', 'transition_of', 'Workflow'), True) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
226 |
|
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
227 |
class WorkflowPrimaryView(TabbedPrimaryView): |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
228 |
__select__ = implements('Workflow') |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
229 |
tabs = [ _('wf_tab_info'), _('wfgraph'),] |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
230 |
default_tab = 'wf_tab_info' |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
231 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
232 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
233 |
class CellView(view.EntityView): |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
234 |
__regid__ = 'cell' |
728
a95b284150d1
first pass to use __select__ instead of __selectors__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
688
diff
changeset
|
235 |
__select__ = implements('TrInfo') |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
236 |
|
0 | 237 |
def cell_call(self, row, col, cellvid=None): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3377
diff
changeset
|
238 |
self.w(self.cw_rset.get_entity(row, col).view('reledit', rtype='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
|
239 |
|
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
240 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
241 |
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
|
242 |
"""convenience trick, State's incontext view should not be clickable""" |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
243 |
__regid__ = 'incontext' |
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
244 |
__select__ = implements('State') |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
245 |
|
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
246 |
def cell_call(self, row, col): |
3460
e4843535db25
[api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3451
diff
changeset
|
247 |
self.w(xml_escape(self._cw.view('textincontext', self.cw_rset, |
e4843535db25
[api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3451
diff
changeset
|
248 |
row=row, col=col))) |
795
63f4f81e19f1
restore appropriate in State's incontext view, moved it into wfentities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
728
diff
changeset
|
249 |
|
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
250 |
class WorkflowTabTextView(PrimaryTab): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
251 |
__regid__ = 'wf_tab_info' |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
252 |
__select__ = PrimaryTab.__select__ & one_line_rset() & implements('Workflow') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
253 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
254 |
def render_entity_attributes(self, entity): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
255 |
_ = self._cw._ |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
256 |
self.w(u'<div>%s</div>' % (entity.printable_value('description'))) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
257 |
self.w(u'<span>%s%s</span>' % (_("workflow_of").capitalize(), _(" :"))) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
258 |
html = [] |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
259 |
for e in entity.workflow_of: |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
260 |
view = e.view('outofcontext') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
261 |
if entity.eid == e.default_workflow[0].eid: |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
262 |
view += u' <span>[%s]</span>' % _('default_workflow') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
263 |
html.append(view) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
264 |
self.w(', '.join(v for v in html)) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
265 |
self.w(u'<h2>%s</h2>' % _("Transition_plural")) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
266 |
rset = self._cw.execute( |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
267 |
'Any T,T,DS,T,TT ORDERBY TN WHERE T transition_of WF, WF eid %(x)s,' |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
268 |
'T type TT, T name TN, T destination_state DS?', {'x': entity.eid}) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
269 |
self.wview('editable-table', rset, 'null', |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
270 |
cellvids={ 1: 'trfromstates', 2: 'outofcontext', 3:'trsecurity',}, |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
271 |
headers = (_('Transition'), _('from_state'), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
272 |
_('to_state'), _('permissions'), _('type') ), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
273 |
) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
274 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
275 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
276 |
class TransitionSecurityTextView(view.EntityView): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
277 |
__regid__ = 'trsecurity' |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
278 |
__select__ = implements('Transition') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
279 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
280 |
def cell_call(self, row, col): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
281 |
_ = self._cw._ |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
282 |
entity = self.cw_rset.get_entity(self.cw_row, self.cw_col) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
283 |
if entity.require_group: |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
284 |
self.w(u'<div>%s%s %s</div>' % |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
285 |
(_('groups'), _(" :"), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
286 |
u', '.join((g.view('incontext') for g |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
287 |
in entity.require_group)))) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
288 |
if entity.condition: |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
289 |
self.w(u'<div>%s%s %s</div>' % |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
290 |
( _('conditions'), _(" :"), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
291 |
u'<br/>'.join((e.dc_title() for e |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
292 |
in entity.condition)))) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
293 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
294 |
class TransitionAllowedTextView(view.EntityView): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
295 |
__regid__ = 'trfromstates' |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
296 |
__select__ = implements('Transition') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
297 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
298 |
def cell_call(self, row, col): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
299 |
entity = self.cw_rset.get_entity(self.cw_row, self.cw_col) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
300 |
self.w(u', '.join((e.view('outofcontext') for e |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
301 |
in entity.reverse_allowed_transition))) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
302 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
303 |
|
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
304 |
# workflow entity types edition ################################################ |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
305 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
306 |
_afs = uicfg.autoform_section |
4004
c52619c738a5
api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
307 |
_afs.tag_subject_of(('TrInfo', 'to_state', '*'), 'main', 'hidden') |
c52619c738a5
api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
308 |
_afs.tag_subject_of(('TrInfo', 'from_state', '*'), 'main', 'hidden') |
c52619c738a5
api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
309 |
_afs.tag_object_of(('State', 'allowed_transition', '*'), 'main', 'attributes') |
c52619c738a5
api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
310 |
_afs.tag_subject_of(('State', 'allowed_transition', '*'), 'main', 'attributes') |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
311 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
312 |
def workflow_items_for_relation(req, wfeid, wfrelation, targetrelation): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
313 |
wf = req.entity_from_eid(wfeid) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
314 |
rschema = req.vreg.schema[targetrelation] |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
315 |
return sorted((e.view('combobox'), e.eid) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
316 |
for e in getattr(wf, 'reverse_%s' % wfrelation) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
317 |
if rschema.has_perm(req, 'add', toeid=e.eid)) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
318 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
319 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
320 |
class TransitionEditionForm(autoform.AutomaticEntityForm): |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4004
diff
changeset
|
321 |
__select__ = implements('Transition') |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
322 |
|
3868
161a5f7d1190
oops, fix wf entity types vocabulary while in creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3867
diff
changeset
|
323 |
def workflow_states_for_relation(self, targetrelation): |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
324 |
eids = self.edited_entity.linked_to('transition_of', 'subject') |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
325 |
if eids: |
4087 | 326 |
return workflow_items_for_relation(self._cw, eids[0], 'state_of', |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
327 |
targetrelation) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
328 |
return [] |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
329 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
330 |
def subject_destination_state_vocabulary(self, rtype, limit=None): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
331 |
if not self.edited_entity.has_eid(): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
332 |
return self.workflow_states_for_relation('destination_state') |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
333 |
return self.subject_relation_vocabulary(rtype, limit) |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
334 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
335 |
def object_allowed_transition_vocabulary(self, rtype, limit=None): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
336 |
if not self.edited_entity.has_eid(): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
337 |
return self.workflow_states_for_relation('allowed_transition') |
3957
4a71754bf5eb
oops, this is an object relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3953
diff
changeset
|
338 |
return self.object_relation_vocabulary(rtype, limit) |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
339 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
340 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
341 |
class StateEditionForm(autoform.AutomaticEntityForm): |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4004
diff
changeset
|
342 |
__select__ = implements('State') |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
343 |
|
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
344 |
def subject_allowed_transition_vocabulary(self, rtype, limit=None): |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
345 |
if not self.edited_entity.has_eid(): |
3868
161a5f7d1190
oops, fix wf entity types vocabulary while in creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3867
diff
changeset
|
346 |
eids = self.edited_entity.linked_to('state_of', 'subject') |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
347 |
if eids: |
4087 | 348 |
return workflow_items_for_relation(self._cw, eids[0], 'transition_of', |
3867
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
349 |
'allowed_transition') |
06ac8f00a99f
fix vocabulary for destination_state/allowed_transitions when creating state or transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3805
diff
changeset
|
350 |
return [] |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
351 |
|
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
352 |
class WorkflowIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
353 |
__select__ = implements('Workflow') |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
354 |
# XXX what if workflow of multiple types? |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
355 |
def parent_entity(self): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
356 |
return self.entity.workflow_of and self.entity.workflow_of[0] or None |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
357 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
358 |
class WorkflowItemIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
359 |
__select__ = implements('BaseTransition', 'State') |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
360 |
def parent_entity(self): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
361 |
return self.entity.workflow |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
362 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
363 |
class TransitionItemIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
364 |
__select__ = implements('SubWorkflowExitPoint') |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
365 |
def parent_entity(self): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
366 |
return self.entity.reverse_subworkflow_exit[0] |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
367 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
368 |
class TrInfoIBreadCrumbsAdapter(ibreadcrumbs.IBreadCrumbsAdapter): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
369 |
__select__ = implements('TrInfo') |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
370 |
def parent_entity(self): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
371 |
return self.entity.for_entity |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
372 |
|
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
373 |
|
3215
bf30ab5ba6ee
fix workflow graph views and tabs for the new wf system, remove useless view and action (actually useless since introduction of tabbed entity type view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2920
diff
changeset
|
374 |
# workflow images ############################################################## |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
375 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
376 |
class WorkflowDotPropsHandler(object): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
377 |
def __init__(self, req): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
378 |
self._ = req._ |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
379 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
380 |
def node_properties(self, stateortransition): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
381 |
"""return default DOT drawing options for a state or transition""" |
3304
2b18276b21ab
[ui] translate state/tr names in wf image
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3262
diff
changeset
|
382 |
props = {'label': stateortransition.printable_value('name'), |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
383 |
'fontname': 'Courier', 'fontsize':10, |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
384 |
'href': stateortransition.absolute_url(), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
385 |
} |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
386 |
if hasattr(stateortransition, 'state_of'): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
387 |
props['shape'] = 'box' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
388 |
props['style'] = 'filled' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
389 |
if stateortransition.reverse_initial_state: |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
390 |
props['fillcolor'] = '#88CC88' |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
391 |
else: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
392 |
props['shape'] = 'ellipse' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
393 |
descr = [] |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
394 |
tr = stateortransition |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
395 |
if descr: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
396 |
props['label'] += escape('\n'.join(descr)) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
397 |
return props |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
398 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
399 |
def edge_properties(self, transition, fromstate, tostate): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
400 |
return {'label': '', 'dir': 'forward', |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
401 |
'color': 'black', 'style': 'filled'} |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
402 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
403 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
404 |
class WorkflowVisitor: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
405 |
def __init__(self, entity): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
406 |
self.entity = entity |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
407 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
408 |
def nodes(self): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
409 |
for state in self.entity.reverse_state_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
410 |
state.complete() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
411 |
yield state.eid, state |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
412 |
for transition in self.entity.reverse_transition_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
413 |
transition.complete() |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
414 |
yield transition.eid, transition |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
415 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
416 |
def edges(self): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
417 |
for transition in self.entity.reverse_transition_of: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
418 |
for incomingstate in transition.reverse_allowed_transition: |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
419 |
yield incomingstate.eid, transition.eid, transition |
4646
322c3dd96dd5
[workflow] finish refactoring introduced by 021035b9a7ab for 'go back' transition:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
420 |
for outgoingstate in transition.potential_destinations(): |
322c3dd96dd5
[workflow] finish refactoring introduced by 021035b9a7ab for 'go back' transition:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
421 |
yield transition.eid, outgoingstate.eid, transition |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
422 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
423 |
|
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
424 |
class WorkflowGraphView(view.EntityView): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
425 |
__regid__ = 'wfgraph' |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
426 |
__select__ = EntityView.__select__ & one_line_rset() & implements('Workflow') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
427 |
|
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
428 |
def cell_call(self, row, col): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
429 |
entity = self.cw_rset.get_entity(row, col) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
430 |
visitor = WorkflowVisitor(entity) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
431 |
prophdlr = WorkflowDotPropsHandler(self._cw) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
432 |
wfname = 'workflow%s' % str(entity.eid) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
433 |
generator = GraphGenerator(DotBackend(wfname, None, |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
434 |
ratio='compress', size='30,10')) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
435 |
# map file |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
436 |
pmap, mapfile = tempfile.mkstemp(".map", wfname) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
437 |
os.close(pmap) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
438 |
# image file |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
439 |
fd, tmpfile = tempfile.mkstemp('.png') |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
440 |
os.close(fd) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
441 |
generator.generate(visitor, prophdlr, tmpfile, mapfile) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
442 |
self.w(u'<img src="%s" alt="%s" usemap="#%s" />' % ( |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
443 |
xml_escape(entity.absolute_url(vid='wfimage', tmpfile=tmpfile)), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
444 |
xml_escape(self._cw._('graphical workflow for %s') % entity.name), |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
445 |
wfname)) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
446 |
stream = open(mapfile, 'r').read() |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
447 |
stream = stream.decode(self._cw.encoding) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
448 |
self.w(stream) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
449 |
os.unlink(mapfile) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
450 |
|
3215
bf30ab5ba6ee
fix workflow graph views and tabs for the new wf system, remove useless view and action (actually useless since introduction of tabbed entity type view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2920
diff
changeset
|
451 |
class WorkflowImageView(TmpFileViewMixin, view.EntityView): |
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
452 |
__regid__ = 'wfimage' |
3377
dd9d292b6a6d
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
453 |
__select__ = implements('Workflow') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
984
diff
changeset
|
454 |
content_type = 'image/png' |
1504
c6051f141807
register to catalog, delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents:
1398
diff
changeset
|
455 |
|
5224
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
456 |
def cell_call(self, row=0, col=0): |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
457 |
tmpfile = self._cw.form.get('tmpfile', None) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
458 |
self.w(open(tmpfile, 'rb').read()) |
34e669b6fd95
[mq]: worklfow view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
459 |
os.unlink(tmpfile) |