Projet

Général

Profil

0001-wf-add-edit-card-data-action-41829.patch

Serghei Mihai, 03 juin 2020 08:58

Télécharger (9,74 ko)

Voir les différences:

Subject: [PATCH] wf: add edit card data action (#41829)

 tests/test_admin_pages.py |  26 +++++++
 tests/test_workflows.py   | 153 ++++++++++++++++++++++++++++++++++++++
 wcs/wf/edit_carddata.py   |  55 ++++++++++++++
 wcs/workflows.py          |   1 +
 4 files changed, 235 insertions(+)
 create mode 100644 wcs/wf/edit_carddata.py
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
-