Projet

Général

Profil

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

Serghei Mihai, 26 mai 2020 11:23

Télécharger (9,54 ko)

Voir les différences:

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

 tests/test_workflows.py     | 153 ++++++++++++++++++++++++++++++++++++
 wcs/wf/edit_carddata.py     |  53 +++++++++++++
 wcs/wf/external_workflow.py |  12 ++-
 wcs/workflows.py            |   1 +
 4 files changed, 215 insertions(+), 4 deletions(-)
 create mode 100644 wcs/wf/edit_carddata.py
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
-