wf: add edit card data action (#41829)
This commit is contained in:
parent
b1d7230590
commit
0aed92cc55
|
@ -3667,6 +3667,32 @@ def test_workflows_global_actions_external_workflow_action(pub):
|
|||
assert 'External workflow (not completed)' in resp.text
|
||||
|
||||
|
||||
def test_workflows_edit_carddata_action(pub):
|
||||
create_superuser(pub)
|
||||
Workflow.wipe()
|
||||
|
||||
wf = Workflow(name='edit card')
|
||||
st = wf.add_status('Update card', 'st')
|
||||
wf.store()
|
||||
|
||||
app = login(get_app(pub))
|
||||
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st.id))
|
||||
assert 'Edit Card Data' not in [o[0] for o in resp.forms[0]['action-formdata-action'].options]
|
||||
|
||||
# activate option
|
||||
if not pub.site_options.has_section('options'):
|
||||
pub.site_options.add_section('options')
|
||||
pub.site_options.set('options', 'external-workflow', 'true')
|
||||
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
|
||||
pub.site_options.write(fd)
|
||||
|
||||
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st.id))
|
||||
assert 'Edit Card Data' in [o[0] for o in resp.forms[0]['action-formdata-action'].options]
|
||||
|
||||
resp.forms[0]['action-formdata-action'] = 'Edit Card Data'
|
||||
resp = resp.forms[0].submit().follow()
|
||||
|
||||
|
||||
def test_workflows_criticality_levels(pub):
|
||||
create_superuser(pub)
|
||||
create_role()
|
||||
|
|
|
@ -62,6 +62,7 @@ from wcs.wf.redirect_to_url import RedirectToUrlWorkflowStatusItem
|
|||
from wcs.wf.notification import SendNotificationWorkflowStatusItem
|
||||
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping
|
||||
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem
|
||||
from wcs.wf.edit_carddata import EditCarddataWorkflowStatusItem
|
||||
from wcs.wf.external_workflow import ExternalWorkflowGlobalAction
|
||||
|
||||
|
||||
|
@ -5021,3 +5022,155 @@ def test_call_external_workflow_with_parent_object(pub):
|
|||
perform_items([update_action], formdata)
|
||||
card = carddef.data_class().get(carddata.id)
|
||||
assert card.data['bo0'] == '1' # got called
|
||||
|
||||
|
||||
def test_edit_carddata_with_data_sourced_object(pub):
|
||||
FormDef.wipe()
|
||||
CardDef.wipe()
|
||||
LoggedError.wipe()
|
||||
|
||||
datasource = {'type': 'formula',
|
||||
'value': repr([{'id': 'b', 'text': 'baker'},
|
||||
{'id': 'c', 'text': 'cook'},
|
||||
{'id': 'l', 'text': 'lawyer'}])}
|
||||
carddef = CardDef()
|
||||
carddef.name = 'Person'
|
||||
carddef.fields = [
|
||||
StringField(id='0', label='First Name', varname='first_name'),
|
||||
StringField(id='1', label='Last Name', varname='last_name'),
|
||||
ItemField(id='2', label='Profession', type='item',
|
||||
varname='profession', data_source=datasource),
|
||||
]
|
||||
carddef.digest_template = '{{ form_var_first_name }} {{ form_var_last_name }}'
|
||||
carddef.store()
|
||||
|
||||
carddata = carddef.data_class()()
|
||||
carddata.data = {
|
||||
'0': 'Foo',
|
||||
'1': 'Bar',
|
||||
'2': 'l',
|
||||
'2_display': 'lawyer'}
|
||||
carddata.store()
|
||||
|
||||
wf = Workflow(name='Card update')
|
||||
st1 = wf.add_status('Update card', 'st1')
|
||||
|
||||
edit = EditCarddataWorkflowStatusItem()
|
||||
edit.formdef_slug = carddef.url_name
|
||||
edit.mappings = [
|
||||
Mapping(field_id='2', expression='{{ form_var_new_profession }}'),
|
||||
]
|
||||
edit.id = 'edit'
|
||||
st1.items.append(edit)
|
||||
edit.parent = st1
|
||||
wf.store()
|
||||
|
||||
datasource = {'type': 'carddef:%s' % carddef.url_name}
|
||||
formdef = FormDef()
|
||||
formdef.name = 'Persons'
|
||||
formdef.fields = [
|
||||
ItemField(id='0', label='Person',
|
||||
type='item', varname='person',
|
||||
data_source=datasource),
|
||||
StringField(id='1', label='New profession',
|
||||
varname='new_profession')
|
||||
]
|
||||
formdef.workflow = wf
|
||||
formdef.store()
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {
|
||||
'0': '1',
|
||||
'1': 'c'
|
||||
}
|
||||
formdata.store()
|
||||
formdata.just_created()
|
||||
formdata.perform_workflow()
|
||||
|
||||
data = carddef.data_class().select()[0]
|
||||
assert data.data['2'] == 'c'
|
||||
assert data.data['2_display'] == 'cook'
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {
|
||||
'0': '1',
|
||||
'1': 'b'
|
||||
}
|
||||
formdata.store()
|
||||
formdata.just_created()
|
||||
formdata.perform_workflow()
|
||||
|
||||
data = carddef.data_class().select()[0]
|
||||
assert data.data['2'] == 'b'
|
||||
assert data.data['2_display'] == 'baker'
|
||||
|
||||
|
||||
def test_edit_carddata_with_linked_object(pub):
|
||||
FormDef.wipe()
|
||||
CardDef.wipe()
|
||||
LoggedError.wipe()
|
||||
|
||||
carddef = CardDef()
|
||||
carddef.name = 'Parent'
|
||||
carddef.fields = [
|
||||
StringField(id='0', label='First Name', varname='first_name'),
|
||||
StringField(id='1', label='Last Name', varname='last_name'),
|
||||
StringField(id='2', label='Kids number', varname='kids_number'),
|
||||
]
|
||||
carddef.store()
|
||||
|
||||
wf = Workflow(name='Card create and update')
|
||||
st1 = wf.add_status('Create card', 'st1')
|
||||
edit = CreateCarddataWorkflowStatusItem()
|
||||
edit.formdef_slug = carddef.url_name
|
||||
edit.mappings = [
|
||||
Mapping(field_id='0', expression='{{ form_var_first_name }}'),
|
||||
Mapping(field_id='1', expression='{{ form_var_last_name }}'),
|
||||
Mapping(field_id='2', expression='{{ form_var_kids_number|default:"0" }}'),
|
||||
]
|
||||
st1.items.append(edit)
|
||||
edit.parent = st1
|
||||
jump = JumpWorkflowStatusItem()
|
||||
jump.id = '_jump'
|
||||
jump.by = ['_submitter', '_receiver']
|
||||
jump.status = 'st2'
|
||||
st1.items.append(jump)
|
||||
jump.parent = st1
|
||||
|
||||
st2 = wf.add_status('Update card', 'st2')
|
||||
edit = EditCarddataWorkflowStatusItem()
|
||||
edit.formdef_slug = carddef.url_name
|
||||
edit.mappings = [
|
||||
Mapping(field_id='2', expression='{{ form_var_kids_number|add:"1" }}'),
|
||||
]
|
||||
edit.id = 'edit'
|
||||
st2.items.append(edit)
|
||||
edit.parent = st2
|
||||
wf.store()
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'Parents'
|
||||
formdef.fields = [
|
||||
StringField(id='0', label='First Name',
|
||||
varname='first_name'),
|
||||
StringField(id='1', label='Last Name',
|
||||
varname='last_name'),
|
||||
StringField(id='2', label='Number of kids',
|
||||
varname='kids_number')
|
||||
]
|
||||
formdef.workflow = wf
|
||||
formdef.store()
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {
|
||||
'0': 'Parent',
|
||||
'1': 'Foo',
|
||||
'2': '2'
|
||||
}
|
||||
formdata.store()
|
||||
formdata.just_created()
|
||||
formdata.perform_workflow()
|
||||
|
||||
assert carddef.data_class().count() == 1
|
||||
card_data = carddef.data_class().select()[0]
|
||||
assert card_data.data['2'] == '3'
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
# w.c.s. - web application for online forms
|
||||
# Copyright (C) 2005-2020 Entr'ouvert
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from wcs.qommon import _
|
||||
from quixote import get_publisher
|
||||
|
||||
from wcs.workflows import register_item_class
|
||||
from wcs.carddef import CardDef
|
||||
|
||||
from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem
|
||||
from wcs.wf.external_workflow import ExternalWorkflowGlobalAction
|
||||
|
||||
|
||||
class EditCarddataWorkflowStatusItem(CreateCarddataWorkflowStatusItem, ExternalWorkflowGlobalAction):
|
||||
description = _('Edit Card Data')
|
||||
key = 'edit_carddata'
|
||||
mappings_label = _('Mappings to card fields')
|
||||
|
||||
@classmethod
|
||||
def is_available(cls, workflow=None):
|
||||
return ExternalWorkflowGlobalAction.is_available()
|
||||
|
||||
def get_parameters(self):
|
||||
return ('formdef_slug', 'mappings', 'condition')
|
||||
|
||||
@property
|
||||
def slug(self):
|
||||
# act only on linked carddefs
|
||||
return 'carddef:%s' % self.formdef_slug
|
||||
|
||||
def perform(self, formdata):
|
||||
carddef = CardDef.get_by_urlname(self.formdef_slug)
|
||||
if not carddef:
|
||||
return
|
||||
|
||||
for target_data in self.iter_target_datas(formdata, carddef):
|
||||
self.apply_mappings(dest=target_data, src=formdata)
|
||||
with get_publisher().substitutions.freeze():
|
||||
target_data.store()
|
||||
|
||||
|
||||
register_item_class(EditCarddataWorkflowStatusItem)
|
|
@ -3026,5 +3026,6 @@ def load_extra():
|
|||
from .wf import create_formdata
|
||||
from .wf import create_carddata
|
||||
from .wf import external_workflow
|
||||
from .wf import edit_carddata
|
||||
|
||||
from .wf.export_to_model import ExportToModel
|
||||
|
|
Loading…
Reference in New Issue