0001-wf-add-edit-card-data-action-41829.patch
tests/test_admin_pages.py | ||
---|---|---|
3667 | 3667 |
assert 'External workflow (not completed)' in resp.text |
3668 | 3668 | |
3669 | 3669 | |
3670 |
def test_workflows_edit_carddata_action(pub): |
|
3671 |
create_superuser(pub) |
|
3672 |
Workflow.wipe() |
|
3673 | ||
3674 |
wf = Workflow(name='edit card') |
|
3675 |
st = wf.add_status('Update card', 'st') |
|
3676 |
wf.store() |
|
3677 | ||
3678 |
app = login(get_app(pub)) |
|
3679 |
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st.id)) |
|
3680 |
assert 'Edit Card Data' not in [o[0] for o in resp.forms[0]['action-formdata-action'].options] |
|
3681 | ||
3682 |
# activate option |
|
3683 |
if not pub.site_options.has_section('options'): |
|
3684 |
pub.site_options.add_section('options') |
|
3685 |
pub.site_options.set('options', 'external-workflow', 'true') |
|
3686 |
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd: |
|
3687 |
pub.site_options.write(fd) |
|
3688 | ||
3689 |
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st.id)) |
|
3690 |
assert 'Edit Card Data' in [o[0] for o in resp.forms[0]['action-formdata-action'].options] |
|
3691 | ||
3692 |
resp.forms[0]['action-formdata-action'] = 'Edit Card Data' |
|
3693 |
resp = resp.forms[0].submit().follow() |
|
3694 | ||
3695 | ||
3670 | 3696 |
def test_workflows_criticality_levels(pub): |
3671 | 3697 |
create_superuser(pub) |
3672 | 3698 |
create_role() |
tests/test_workflows.py | ||
---|---|---|
62 | 62 |
from wcs.wf.notification import SendNotificationWorkflowStatusItem |
63 | 63 |
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping |
64 | 64 |
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem |
65 |
from wcs.wf.edit_carddata import EditCarddataWorkflowStatusItem |
|
65 | 66 |
from wcs.wf.external_workflow import ExternalWorkflowGlobalAction |
66 | 67 | |
67 | 68 | |
... | ... | |
4904 | 4905 |
logged_error = LoggedError.select()[0] |
4905 | 4906 |
assert logged_error.summary == 'Could not find linked "Data" object by id %s' % carddata.id |
4906 | 4907 |
assert logged_error.exception_class == 'KeyError' |
4908 | ||
4909 | ||
4910 |
def test_edit_carddata_with_data_sourced_object(pub): |
|
4911 |
FormDef.wipe() |
|
4912 |
CardDef.wipe() |
|
4913 |
LoggedError.wipe() |
|
4914 | ||
4915 |
datasource = {'type': 'formula', |
|
4916 |
'value': repr([{'id': 'b', 'text': 'baker'}, |
|
4917 |
{'id': 'c', 'text': 'cook'}, |
|
4918 |
{'id': 'l', 'text': 'lawyer'}])} |
|
4919 |
carddef = CardDef() |
|
4920 |
carddef.name = 'Person' |
|
4921 |
carddef.fields = [ |
|
4922 |
StringField(id='0', label='First Name', varname='first_name'), |
|
4923 |
StringField(id='1', label='Last Name', varname='last_name'), |
|
4924 |
ItemField(id='2', label='Profession', type='item', |
|
4925 |
varname='profession', data_source=datasource), |
|
4926 |
] |
|
4927 |
carddef.digest_template = '{{ form_var_first_name }} {{ form_var_last_name }}' |
|
4928 |
carddef.store() |
|
4929 | ||
4930 |
carddata = carddef.data_class()() |
|
4931 |
carddata.data = { |
|
4932 |
'0': 'Foo', |
|
4933 |
'1': 'Bar', |
|
4934 |
'2': 'l', |
|
4935 |
'2_display': 'lawyer'} |
|
4936 |
carddata.store() |
|
4937 | ||
4938 |
wf = Workflow(name='Card update') |
|
4939 |
st1 = wf.add_status('Update card', 'st1') |
|
4940 | ||
4941 |
edit = EditCarddataWorkflowStatusItem() |
|
4942 |
edit.formdef_slug = carddef.url_name |
|
4943 |
edit.mappings = [ |
|
4944 |
Mapping(field_id='2', expression='{{ form_var_new_profession }}'), |
|
4945 |
] |
|
4946 |
edit.id = 'edit' |
|
4947 |
st1.items.append(edit) |
|
4948 |
edit.parent = st1 |
|
4949 |
wf.store() |
|
4950 | ||
4951 |
datasource = {'type': 'carddef:%s' % carddef.url_name} |
|
4952 |
formdef = FormDef() |
|
4953 |
formdef.name = 'Persons' |
|
4954 |
formdef.fields = [ |
|
4955 |
ItemField(id='0', label='Person', |
|
4956 |
type='item', varname='person', |
|
4957 |
data_source=datasource), |
|
4958 |
StringField(id='1', label='New profession', |
|
4959 |
varname='new_profession') |
|
4960 |
] |
|
4961 |
formdef.workflow = wf |
|
4962 |
formdef.store() |
|
4963 | ||
4964 |
formdata = formdef.data_class()() |
|
4965 |
formdata.data = { |
|
4966 |
'0': '1', |
|
4967 |
'1': 'c' |
|
4968 |
} |
|
4969 |
formdata.store() |
|
4970 |
formdata.just_created() |
|
4971 |
formdata.perform_workflow() |
|
4972 | ||
4973 |
data = carddef.data_class().select()[0] |
|
4974 |
assert data.data['2'] == 'c' |
|
4975 |
assert data.data['2_display'] == 'cook' |
|
4976 | ||
4977 |
formdata = formdef.data_class()() |
|
4978 |
formdata.data = { |
|
4979 |
'0': '1', |
|
4980 |
'1': 'b' |
|
4981 |
} |
|
4982 |
formdata.store() |
|
4983 |
formdata.just_created() |
|
4984 |
formdata.perform_workflow() |
|
4985 | ||
4986 |
data = carddef.data_class().select()[0] |
|
4987 |
assert data.data['2'] == 'b' |
|
4988 |
assert data.data['2_display'] == 'baker' |
|
4989 | ||
4990 | ||
4991 |
def test_edit_carddata_with_linked_object(pub): |
|
4992 |
FormDef.wipe() |
|
4993 |
CardDef.wipe() |
|
4994 |
LoggedError.wipe() |
|
4995 | ||
4996 |
carddef = CardDef() |
|
4997 |
carddef.name = 'Parent' |
|
4998 |
carddef.fields = [ |
|
4999 |
StringField(id='0', label='First Name', varname='first_name'), |
|
5000 |
StringField(id='1', label='Last Name', varname='last_name'), |
|
5001 |
StringField(id='2', label='Kids number', varname='kids_number'), |
|
5002 |
] |
|
5003 |
carddef.store() |
|
5004 | ||
5005 |
wf = Workflow(name='Card create and update') |
|
5006 |
st1 = wf.add_status('Create card', 'st1') |
|
5007 |
edit = CreateCarddataWorkflowStatusItem() |
|
5008 |
edit.formdef_slug = carddef.url_name |
|
5009 |
edit.mappings = [ |
|
5010 |
Mapping(field_id='0', expression='{{ form_var_first_name }}'), |
|
5011 |
Mapping(field_id='1', expression='{{ form_var_last_name }}'), |
|
5012 |
Mapping(field_id='2', expression='{{ form_var_kids_number|default:"0" }}'), |
|
5013 |
] |
|
5014 |
st1.items.append(edit) |
|
5015 |
edit.parent = st1 |
|
5016 |
jump = JumpWorkflowStatusItem() |
|
5017 |
jump.id = '_jump' |
|
5018 |
jump.by = ['_submitter', '_receiver'] |
|
5019 |
jump.status = 'st2' |
|
5020 |
st1.items.append(jump) |
|
5021 |
jump.parent = st1 |
|
5022 | ||
5023 |
st2 = wf.add_status('Update card', 'st2') |
|
5024 |
edit = EditCarddataWorkflowStatusItem() |
|
5025 |
edit.formdef_slug = carddef.url_name |
|
5026 |
edit.mappings = [ |
|
5027 |
Mapping(field_id='2', expression='{{ form_var_kids_number|add:"1" }}'), |
|
5028 |
] |
|
5029 |
edit.id = 'edit' |
|
5030 |
st2.items.append(edit) |
|
5031 |
edit.parent = st2 |
|
5032 |
wf.store() |
|
5033 | ||
5034 |
formdef = FormDef() |
|
5035 |
formdef.name = 'Parents' |
|
5036 |
formdef.fields = [ |
|
5037 |
StringField(id='0', label='First Name', |
|
5038 |
varname='first_name'), |
|
5039 |
StringField(id='1', label='Last Name', |
|
5040 |
varname='last_name'), |
|
5041 |
StringField(id='2', label='Number of kids', |
|
5042 |
varname='kids_number') |
|
5043 |
] |
|
5044 |
formdef.workflow = wf |
|
5045 |
formdef.store() |
|
5046 | ||
5047 |
formdata = formdef.data_class()() |
|
5048 |
formdata.data = { |
|
5049 |
'0': 'Parent', |
|
5050 |
'1': 'Foo', |
|
5051 |
'2': '2' |
|
5052 |
} |
|
5053 |
formdata.store() |
|
5054 |
formdata.just_created() |
|
5055 |
formdata.perform_workflow() |
|
5056 | ||
5057 |
assert carddef.data_class().count() == 1 |
|
5058 |
card_data = carddef.data_class().select()[0] |
|
5059 |
assert card_data.data['2'] == '3' |
wcs/wf/edit_carddata.py | ||
---|---|---|
1 |
# w.c.s. - web application for online forms |
|
2 |
# Copyright (C) 2005-2020 Entr'ouvert |
|
3 |
# |
|
4 |
# This program is free software; you can redistribute it and/or modify |
|
5 |
# it under the terms of the GNU General Public License as published by |
|
6 |
# the Free Software Foundation; either version 2 of the License, or |
|
7 |
# (at your option) any later version. |
|
8 |
# |
|
9 |
# This program is distributed in the hope that it will be useful, |
|
10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
# GNU General Public License for more details. |
|
13 |
# |
|
14 |
# You should have received a copy of the GNU General Public License |
|
15 |
# along with this program; if not, see <http://www.gnu.org/licenses/>. |
|
16 | ||
17 |
from wcs.qommon import _ |
|
18 |
from quixote import get_publisher |
|
19 | ||
20 |
from wcs.workflows import register_item_class |
|
21 |
from wcs.carddef import CardDef |
|
22 | ||
23 |
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem |
|
24 |
from wcs.wf.external_workflow import ExternalWorkflowGlobalAction |
|
25 | ||
26 | ||
27 |
class EditCarddataWorkflowStatusItem(CreateCarddataWorkflowStatusItem, ExternalWorkflowGlobalAction): |
|
28 |
description = _('Edit Card Data') |
|
29 |
key = 'edit_carddata' |
|
30 |
mappings_label = _('Mappings to card fields') |
|
31 | ||
32 |
@classmethod |
|
33 |
def is_available(cls, workflow=None): |
|
34 |
return ExternalWorkflowGlobalAction.is_available() |
|
35 | ||
36 |
def get_parameters(self): |
|
37 |
return ('formdef_slug', 'mappings', 'condition') |
|
38 | ||
39 |
@property |
|
40 |
def slug(self): |
|
41 |
# act only on linked carddefs |
|
42 |
return 'carddef:%s' % self.formdef_slug |
|
43 | ||
44 |
def perform(self, formdata): |
|
45 |
carddef = CardDef.get_by_urlname(self.formdef_slug) |
|
46 |
if not carddef: |
|
47 |
return |
|
48 | ||
49 |
for target_data in self.iter_target_datas(formdata, carddef): |
|
50 |
self.apply_mappings(dest=target_data, src=formdata) |
|
51 |
with get_publisher().substitutions.freeze(): |
|
52 |
target_data.store() |
|
53 | ||
54 | ||
55 |
register_item_class(EditCarddataWorkflowStatusItem) |
wcs/workflows.py | ||
---|---|---|
3022 | 3022 |
from .wf import create_formdata |
3023 | 3023 |
from .wf import create_carddata |
3024 | 3024 |
from .wf import external_workflow |
3025 |
from .wf import edit_carddata |
|
3025 | 3026 | |
3026 | 3027 |
from .wf.export_to_model import ExportToModel |
3027 |
- |