0001-wf-add-edit-card-data-action-41829.patch
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 | |
... | ... | |
4934 | 4935 |
logged_error = LoggedError.select()[0] |
4935 | 4936 |
assert logged_error.summary == 'Could not find linked "Data" object by id %s' % carddata.id |
4936 | 4937 |
assert logged_error.exception_class == 'KeyError' |
4938 | ||
4939 | ||
4940 |
def test_edit_carddata_with_data_sourced_object(pub): |
|
4941 |
FormDef.wipe() |
|
4942 |
CardDef.wipe() |
|
4943 |
LoggedError.wipe() |
|
4944 | ||
4945 |
datasource = {'type': 'formula', |
|
4946 |
'value': repr([{'id': 'b', 'text': 'baker'}, |
|
4947 |
{'id': 'c', 'text': 'cook'}, |
|
4948 |
{'id': 'l', 'text': 'lawyer'}])} |
|
4949 |
carddef = CardDef() |
|
4950 |
carddef.name = 'Person' |
|
4951 |
carddef.fields = [ |
|
4952 |
StringField(id='0', label='First Name', varname='first_name'), |
|
4953 |
StringField(id='1', label='Last Name', varname='last_name'), |
|
4954 |
ItemField(id='2', label='Profession', type='item', |
|
4955 |
varname='profession', data_source=datasource), |
|
4956 |
] |
|
4957 |
carddef.digest_template = '{{ form_var_first_name }} {{ form_var_last_name }}' |
|
4958 |
carddef.store() |
|
4959 | ||
4960 |
carddata = carddef.data_class()() |
|
4961 |
carddata.data = { |
|
4962 |
'0': 'Foo', |
|
4963 |
'1': 'Bar', |
|
4964 |
'2': 'l', |
|
4965 |
'2_display': 'lawyer'} |
|
4966 |
carddata.store() |
|
4967 | ||
4968 |
wf = Workflow(name='Card update') |
|
4969 |
st1 = wf.add_status('Update card', 'st1') |
|
4970 | ||
4971 |
edit = EditCarddataWorkflowStatusItem() |
|
4972 |
edit.formdef_slug = carddef.url_name |
|
4973 |
edit.mappings = [ |
|
4974 |
Mapping(field_id='2', expression='{{ form_var_new_profession }}'), |
|
4975 |
] |
|
4976 |
edit.id = 'edit' |
|
4977 |
st1.items.append(edit) |
|
4978 |
edit.parent = st1 |
|
4979 |
wf.store() |
|
4980 | ||
4981 |
datasource = {'type': 'carddef:%s' % carddef.url_name} |
|
4982 |
formdef = FormDef() |
|
4983 |
formdef.name = 'Persons' |
|
4984 |
formdef.fields = [ |
|
4985 |
ItemField(id='0', label='Person', |
|
4986 |
type='item', varname='person', |
|
4987 |
data_source=datasource), |
|
4988 |
StringField(id='1', label='New profession', |
|
4989 |
varname='new_profession') |
|
4990 |
] |
|
4991 |
formdef.workflow = wf |
|
4992 |
formdef.store() |
|
4993 | ||
4994 |
formdata = formdef.data_class()() |
|
4995 |
formdata.data = { |
|
4996 |
'0': '1', |
|
4997 |
'1': 'c' |
|
4998 |
} |
|
4999 |
formdata.store() |
|
5000 |
formdata.just_created() |
|
5001 |
formdata.perform_workflow() |
|
5002 | ||
5003 |
data = carddef.data_class().select()[0] |
|
5004 |
assert data.data['2'] == 'c' |
|
5005 |
assert data.data['2_display'] == 'cook' |
|
5006 | ||
5007 |
formdata = formdef.data_class()() |
|
5008 |
formdata.data = { |
|
5009 |
'0': '1', |
|
5010 |
'1': 'b' |
|
5011 |
} |
|
5012 |
formdata.store() |
|
5013 |
formdata.just_created() |
|
5014 |
formdata.perform_workflow() |
|
5015 | ||
5016 |
data = carddef.data_class().select()[0] |
|
5017 |
assert data.data['2'] == 'b' |
|
5018 |
assert data.data['2_display'] == 'baker' |
|
5019 | ||
5020 | ||
5021 |
def test_edit_carddata_with_linked_object(pub): |
|
5022 |
FormDef.wipe() |
|
5023 |
CardDef.wipe() |
|
5024 |
LoggedError.wipe() |
|
5025 | ||
5026 |
carddef = CardDef() |
|
5027 |
carddef.name = 'Parent' |
|
5028 |
carddef.fields = [ |
|
5029 |
StringField(id='0', label='First Name', varname='first_name'), |
|
5030 |
StringField(id='1', label='Last Name', varname='last_name'), |
|
5031 |
StringField(id='2', label='Kids number', varname='kids_number'), |
|
5032 |
] |
|
5033 |
carddef.store() |
|
5034 | ||
5035 |
wf = Workflow(name='Card create and update') |
|
5036 |
st1 = wf.add_status('Create card', 'st1') |
|
5037 |
edit = CreateCarddataWorkflowStatusItem() |
|
5038 |
edit.formdef_slug = carddef.url_name |
|
5039 |
edit.mappings = [ |
|
5040 |
Mapping(field_id='0', expression='{{ form_var_first_name }}'), |
|
5041 |
Mapping(field_id='1', expression='{{ form_var_last_name }}'), |
|
5042 |
Mapping(field_id='2', expression='{{ form_var_kids_number|default:"0" }}'), |
|
5043 |
] |
|
5044 |
st1.items.append(edit) |
|
5045 |
edit.parent = st1 |
|
5046 |
jump = JumpWorkflowStatusItem() |
|
5047 |
jump.id = '_jump' |
|
5048 |
jump.by = ['_submitter', '_receiver'] |
|
5049 |
jump.status = 'st2' |
|
5050 |
st1.items.append(jump) |
|
5051 |
jump.parent = st1 |
|
5052 | ||
5053 |
st2 = wf.add_status('Update card', 'st2') |
|
5054 |
edit = EditCarddataWorkflowStatusItem() |
|
5055 |
edit.formdef_slug = carddef.url_name |
|
5056 |
edit.mappings = [ |
|
5057 |
Mapping(field_id='2', expression='{{ form_var_kids_number|add:"1" }}'), |
|
5058 |
] |
|
5059 |
edit.id = 'edit' |
|
5060 |
st2.items.append(edit) |
|
5061 |
edit.parent = st2 |
|
5062 |
wf.store() |
|
5063 | ||
5064 |
formdef = FormDef() |
|
5065 |
formdef.name = 'Parents' |
|
5066 |
formdef.fields = [ |
|
5067 |
StringField(id='0', label='First Name', |
|
5068 |
varname='first_name'), |
|
5069 |
StringField(id='1', label='Last Name', |
|
5070 |
varname='last_name'), |
|
5071 |
StringField(id='2', label='Number of kids', |
|
5072 |
varname='kids_number') |
|
5073 |
] |
|
5074 |
formdef.workflow = wf |
|
5075 |
formdef.store() |
|
5076 | ||
5077 |
formdata = formdef.data_class()() |
|
5078 |
formdata.data = { |
|
5079 |
'0': 'Parent', |
|
5080 |
'1': 'Foo', |
|
5081 |
'2': '2' |
|
5082 |
} |
|
5083 |
formdata.store() |
|
5084 |
formdata.just_created() |
|
5085 |
formdata.perform_workflow() |
|
5086 | ||
5087 |
assert carddef.data_class().count() == 1 |
|
5088 |
card_data = carddef.data_class().select()[0] |
|
5089 |
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 |
def get_parameters(self): |
|
33 |
return ('formdef_slug', 'mappings', 'condition') |
|
34 | ||
35 |
def get_datasourced_objects_ids(self, formdata): |
|
36 |
ids = [] |
|
37 |
for field in formdata.get_formdef().get_all_fields(): |
|
38 |
if getattr(field, 'data_source', None) and field.data_source['type'] == 'carddef:%s' % self.formdef_slug: |
|
39 |
ids.append(formdata.data.get(field.id)) |
|
40 |
return ids |
|
41 | ||
42 |
def perform(self, formdata): |
|
43 |
carddef = CardDef.get_by_urlname(self.formdef_slug) |
|
44 |
if not carddef: |
|
45 |
return |
|
46 | ||
47 |
for target_data in self.iter_target_datas(formdata, carddef): |
|
48 |
self.apply_mappings(dest=target_data, src=formdata) |
|
49 |
with get_publisher().substitutions.freeze(): |
|
50 |
target_data.store() |
|
51 | ||
52 | ||
53 |
register_item_class(EditCarddataWorkflowStatusItem) |
wcs/wf/external_workflow.py | ||
---|---|---|
111 | 111 |
'object_name': objectdef.name} |
112 | 112 |
return _('not completed') |
113 | 113 | |
114 |
def iter_target_datas(self, formdata, objectdef): |
|
115 |
data_ids = [] |
|
116 |
# search linked objects in data sources |
|
114 |
def get_datasourced_objects_ids(self, formdata): |
|
115 |
ids = [] |
|
117 | 116 |
for field in formdata.get_formdef().get_all_fields(): |
118 | 117 |
if getattr(field, 'data_source', None) and field.data_source['type'] == self.slug: |
119 |
data_ids.append(formdata.data.get(field.id)) |
|
118 |
ids.append(formdata.data.get(field.id)) |
|
119 |
return ids |
|
120 | ||
121 |
def iter_target_datas(self, formdata, objectdef): |
|
122 |
# get linked objects from data sources |
|
123 |
data_ids = self.get_datasourced_objects_ids(formdata) |
|
120 | 124 | |
121 | 125 |
# search in evolution |
122 | 126 |
for part in formdata.iter_evolution_parts(): |
wcs/workflows.py | ||
---|---|---|
3030 | 3030 |
from .wf import create_formdata |
3031 | 3031 |
from .wf import create_carddata |
3032 | 3032 |
from .wf import external_workflow |
3033 |
from .wf import edit_carddata |
|
3033 | 3034 | |
3034 | 3035 |
from .wf.export_to_model import ExportToModel |
3035 |
- |