0001-wf-add-action-to-create-card-data-39997.patch
tests/test_backoffice_pages.py | ||
---|---|---|
48 | 48 |
from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem |
49 | 49 |
from wcs.wf.resubmit import ResubmitWorkflowStatusItem |
50 | 50 |
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping |
51 |
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem |
|
51 | 52 |
from wcs.carddef import CardDef |
52 | 53 |
from wcs.categories import Category |
53 | 54 |
from wcs.formdef import FormDef |
... | ... | |
6065 | 6066 |
assert pq('.wf-links') |
6066 | 6067 |
else: |
6067 | 6068 |
assert not pq('.wf-links') |
6069 | ||
6070 | ||
6071 |
def test_backoffice_create_carddata_from_formdata(pub, studio): |
|
6072 |
CardDef.wipe() |
|
6073 |
FormDef.wipe() |
|
6074 | ||
6075 |
user = create_user(pub, is_admin=True) |
|
6076 |
user.name = 'Foo Bar' |
|
6077 |
user.email = 'foo@example.com' |
|
6078 |
user.store() |
|
6079 | ||
6080 |
carddef = CardDef() |
|
6081 |
carddef.name = 'My card' |
|
6082 |
carddef.fields = [ |
|
6083 |
fields.StringField(id='1', label='string'), |
|
6084 |
fields.ItemField(id='2', label='List', items=['item1', 'item2']), |
|
6085 |
fields.DateField(id='3', label='Date') |
|
6086 |
] |
|
6087 |
carddef.store() |
|
6088 | ||
6089 |
wf = Workflow(name='create-carddata') |
|
6090 |
st1 = wf.add_status('New') |
|
6091 |
st2 = wf.add_status('Create card') |
|
6092 | ||
6093 |
jump = ChoiceWorkflowStatusItem() |
|
6094 |
jump.id = '_createcard' |
|
6095 |
jump.label = 'Create card' |
|
6096 |
jump.by = ['_receiver'] |
|
6097 |
jump.status = st2.id |
|
6098 |
jump.parent = st1 |
|
6099 |
st1.items.append(jump) |
|
6100 | ||
6101 |
create_card = CreateCarddataWorkflowStatusItem() |
|
6102 |
create_card.label = 'Create Card Data' |
|
6103 |
create_card.varname = 'mycard' |
|
6104 |
create_card.id = '_create' |
|
6105 |
create_card.formdef_slug = carddef.url_name |
|
6106 |
create_card.mappings = [ |
|
6107 |
Mapping(field_id='1', expression='Simple String'), |
|
6108 |
Mapping(field_id='2', expression='{{ form_var_list_raw }}'), |
|
6109 |
Mapping(field_id='3', expression='{{ form_var_date }}'), |
|
6110 |
] |
|
6111 |
create_card.parent = st2 |
|
6112 |
st2.items.append(create_card) |
|
6113 | ||
6114 |
display_message = DisplayMessageWorkflowStatusItem() |
|
6115 |
display_message.message = 'Card nr. {{ form_links_mycard_form_number }} created' |
|
6116 |
display_message.parent = st2 |
|
6117 |
st2.items.append(display_message) |
|
6118 |
wf.store() |
|
6119 | ||
6120 |
formdef = FormDef() |
|
6121 |
formdef.name = 'Source form' |
|
6122 |
formdef.workflow_roles = {'_receiver': 1} |
|
6123 |
formdef.fields = [ |
|
6124 |
fields.ItemField(id='1', label='List', items=['item1', 'item2'], |
|
6125 |
varname='list'), |
|
6126 |
fields.DateField(id='2', label='Date', varname='date') |
|
6127 |
] |
|
6128 |
formdef.workflow_id = wf.id |
|
6129 |
formdef.store() |
|
6130 | ||
6131 |
formdata = formdef.data_class()() |
|
6132 |
today = time.strptime('2020-01-01', '%Y-%m-%d') |
|
6133 |
formdata.data = { |
|
6134 |
'1': 'item2', |
|
6135 |
'2': today |
|
6136 |
} |
|
6137 | ||
6138 |
formdata.user = user |
|
6139 |
formdata.just_created() |
|
6140 |
formdata.store() |
|
6141 |
formdata.perform_workflow() |
|
6142 | ||
6143 |
app = login(get_app(pub)) |
|
6144 |
resp = app.get(formdata.get_url(backoffice=True)) |
|
6145 |
resp = resp.form.submit(name='button_createcard').follow() |
|
6146 |
assert 'Card nr. 1-1 created' in resp |
tests/test_workflows.py | ||
---|---|---|
21 | 21 |
from wcs.qommon.form import * |
22 | 22 | |
23 | 23 |
from wcs.formdef import FormDef |
24 |
from wcs.carddef import CardDef |
|
24 | 25 |
from wcs import sessions |
25 | 26 |
from wcs.fields import (StringField, DateField, MapField, FileField, ItemField, |
26 | 27 |
ItemsField, CommentField) |
... | ... | |
52 | 53 |
from wcs.wf.redirect_to_url import RedirectToUrlWorkflowStatusItem |
53 | 54 |
from wcs.wf.notification import SendNotificationWorkflowStatusItem |
54 | 55 |
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping |
56 |
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem |
|
55 | 57 | |
56 | 58 | |
57 | 59 |
from utilities import (create_temporary_pub, MockSubstitutionVariables, |
... | ... | |
4407 | 4409 |
assert len(errors) == 2 |
4408 | 4410 |
assert any('form_var_toto_string' in (error.exception_message or '') for error in errors) |
4409 | 4411 |
assert any('Missing field' in error.summary for error in errors) |
4412 | ||
4413 | ||
4414 |
def test_create_carddata(pub): |
|
4415 |
CardDef.wipe() |
|
4416 |
FormDef.wipe() |
|
4417 |
LoggedError.wipe() |
|
4418 | ||
4419 |
carddef = CardDef() |
|
4420 |
carddef.name = 'My card' |
|
4421 |
carddef.fields = [ |
|
4422 |
StringField(id='1', label='string'), |
|
4423 |
ItemField(id='2', label='List', items=['item1', 'item2'], |
|
4424 |
varname='clist'), |
|
4425 |
DateField(id='3', label='Date', varname='cdate') |
|
4426 |
] |
|
4427 |
carddef.store() |
|
4428 | ||
4429 |
wf = Workflow(name='create-carddata') |
|
4430 |
wf.possible_status = Workflow.get_default_workflow().possible_status[:] |
|
4431 |
create = CreateCarddataWorkflowStatusItem() |
|
4432 |
create.label = 'Create CardDef' |
|
4433 |
create.varname = 'mycard' |
|
4434 |
create.id = '_create' |
|
4435 |
create.formdef_slug = carddef.url_name |
|
4436 |
create.mappings = [ |
|
4437 |
Mapping(field_id='1', expression='=form_var_undefined'), |
|
4438 |
Mapping(field_id='2', expression='{{ form_var_list }}'), |
|
4439 |
Mapping(field_id='3', expression='{{ form_var_date }}'), |
|
4440 |
] |
|
4441 |
create.parent = wf.possible_status[1] |
|
4442 |
wf.possible_status[1].items.insert(0, create) |
|
4443 |
wf.store() |
|
4444 | ||
4445 |
formdef = FormDef() |
|
4446 |
formdef.name = 'source form' |
|
4447 |
formdef.fields = [ |
|
4448 |
ItemField(id='1', label='List', items=['item1', 'item2'], |
|
4449 |
varname='list'), |
|
4450 |
DateField(id='2', label='Date', varname='date') |
|
4451 |
] |
|
4452 |
formdef.workflow_id = wf.id |
|
4453 |
formdef.store() |
|
4454 | ||
4455 |
formdata = formdef.data_class()() |
|
4456 |
formdata.data = {} |
|
4457 |
formdata.just_created() |
|
4458 | ||
4459 |
assert carddef.data_class().count() == 0 |
|
4460 | ||
4461 |
formdata = formdef.data_class()() |
|
4462 |
formdata.data = {} |
|
4463 | ||
4464 |
formdata.just_created() |
|
4465 |
formdata.perform_workflow() |
|
4466 | ||
4467 |
assert carddef.data_class().count() == 1 |
|
4468 | ||
4469 |
errors = LoggedError.select() |
|
4470 |
assert len(errors) == 2 |
|
4471 |
assert any('form_var_undefined' in (error.exception_message or '') for error in errors) |
|
4472 |
assert any('invalid date value' in (error.exception_message or '') for error in errors) |
|
4473 | ||
4474 |
formdata = formdef.data_class()() |
|
4475 |
today = datetime.date.today() |
|
4476 | ||
4477 |
formdata.data = {'1': 'item1', |
|
4478 |
'1_display': 'item1', |
|
4479 |
'2': today} |
|
4480 |
formdata.just_created() |
|
4481 |
formdata.perform_workflow() |
|
4482 | ||
4483 |
assert formdata.get_substitution_variables()['form_links_mycard_form_number'] == '1-2' |
|
4484 |
carddata = carddef.data_class().get(id=2) |
|
4485 |
assert carddata.get_substitution_variables()['form_var_clist'] == 'item1' |
|
4486 |
assert carddata.get_substitution_variables()['form_var_cdate'] == today |
wcs/wf/create_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 N_ |
|
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_formdata import (CreateFormdataWorkflowStatusItem, |
|
24 |
LinkedFormdataEvolutionPart) |
|
25 | ||
26 | ||
27 |
class LinkedCardDataEvolutionPart(LinkedFormdataEvolutionPart): |
|
28 |
formdef_class = CardDef |
|
29 | ||
30 | ||
31 |
class CreateCarddataWorkflowStatusItem(CreateFormdataWorkflowStatusItem): |
|
32 |
description = N_('Create Card Data') |
|
33 |
key = 'create_carddata' |
|
34 |
category = 'formdata-action' |
|
35 |
ok_in_global_action = True |
|
36 | ||
37 |
formdef_class = CardDef |
|
38 |
evolution_part_class = LinkedCardDataEvolutionPart |
|
39 | ||
40 |
formdef_label = N_('Card') |
|
41 |
mappings_label = N_('Mappings to new card fields') |
|
42 |
varname_hint = N_('This is used to get linked card in expressions.') |
|
43 | ||
44 |
@classmethod |
|
45 |
def is_available(cls, workflow=None): |
|
46 |
return get_publisher().has_site_option('studio') |
|
47 | ||
48 |
def get_parameters(self): |
|
49 |
return ('formdef_slug', 'mappings', 'keep_user', 'varname') |
|
50 | ||
51 | ||
52 |
register_item_class(CreateCarddataWorkflowStatusItem) |
wcs/wf/create_formdata.py | ||
---|---|---|
141 | 141 |
return {k: v for k, v in self.__dict__.items() if not k.startswith('_')} |
142 | 142 | |
143 | 143 |
def __repr__(self): |
144 |
return '<Link "%s-%s">' % (self.formdef_id, self.formdata_id) |
|
144 |
return '<Linked %s "%s-%s">' % (self.formdef_class.__name__, |
|
145 |
self.formdef_id, self.formdata_id) |
|
145 | 146 | |
146 | 147 |
@classmethod |
147 | 148 |
def get_substitution_variables(cls, formdata): |
148 | 149 |
d = {} |
149 | 150 |
for part in formdata.iter_evolution_parts(): |
150 |
if not isinstance(part, LinkedFormdataEvolutionPart):
|
|
151 |
if not isinstance(part, cls):
|
|
151 | 152 |
continue |
152 | 153 |
if part.formdata: |
153 | 154 |
d['form_links_%s' % (part.varname or '*')] = part |
... | ... | |
193 | 194 |
evolution_part_class = LinkedFormdataEvolutionPart |
194 | 195 | |
195 | 196 |
formdef_slug = None |
197 |
formdef_label = N_('Form') |
|
198 |
mappings_label = N_('Mappings to new form fields') |
|
199 |
varname_hint = N_('This is used to get linked forms in expressions.') |
|
200 | ||
196 | 201 |
draft = False |
197 | 202 |
backoffice_submission = False |
198 | 203 |
keep_user = True |
... | ... | |
221 | 226 |
list_forms = [(None, '---', '')] |
222 | 227 |
list_forms += [(x.url_name, x.name, x.url_name) for x in self.formdef_class.select(order_by='name')] |
223 | 228 |
form.add(SingleSelectWidget, 'formdef_slug', |
224 |
title=_('Form'),
|
|
229 |
title=_(self.formdef_label),
|
|
225 | 230 |
value=self.formdef_slug, |
226 | 231 |
options=list_forms) |
227 | 232 |
if 'draft' in parameters: |
... | ... | |
247 | 252 |
formdef = self._resolve_formdef_slug(form.get('formdef_slug')) |
248 | 253 |
if 'mappings' in parameters and formdef: |
249 | 254 |
form.add(MappingsWidget, '%smappings' % prefix, |
250 |
title=_('Mappings to new form fields'),
|
|
255 |
title=_(self.mappings_label),
|
|
251 | 256 |
to_formdef=formdef, |
252 | 257 |
value=self.mappings) |
253 | 258 |
if 'varname' in parameters: |
254 | 259 |
form.add(VarnameWidget, '%svarname' % prefix, |
255 | 260 |
title=_('Identifier'), value=self.varname, |
256 |
hint=_('This is used to get linked forms in expressions.'),
|
|
261 |
hint=_(self.varname_hint),
|
|
257 | 262 |
advanced=not(bool(self.varname))) |
258 | 263 |
if 'map_fields_by_varname' in parameters and self.formdef: |
259 | 264 |
form.add(CheckboxWidget, '%smap_fields_by_varname' % prefix, |
wcs/workflows.py | ||
---|---|---|
2924 | 2924 |
from .wf import redirect_to_url |
2925 | 2925 |
from .wf import notification |
2926 | 2926 |
from .wf import create_formdata |
2927 |
from .wf import create_carddata |
|
2927 | 2928 | |
2928 | 2929 |
from .wf.export_to_model import ExportToModel |
2929 |
- |