Projet

Général

Profil

0001-wf-add-action-to-create-card-data-39997.patch

Voir les différences:

Subject: [PATCH] wf: add action to create card data (#39997)

 tests/test_backoffice_pages.py | 79 ++++++++++++++++++++++++++++++++++
 tests/test_workflows.py        | 77 +++++++++++++++++++++++++++++++++
 wcs/wf/create_carddata.py      | 54 +++++++++++++++++++++++
 wcs/wf/create_formdata.py      | 17 +++++---
 wcs/workflows.py               |  1 +
 5 files changed, 221 insertions(+), 7 deletions(-)
 create mode 100644 wcs/wf/create_carddata.py
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 quixote import get_publisher
18

  
19
from wcs.workflows import register_item_class
20
from wcs.carddef import CardDef
21

  
22
from wcs.wf.create_formdata import (CreateFormdataWorkflowStatusItem,
23
                                    LinkedFormdataEvolutionPart)
24

  
25

  
26
class LinkedCardDataEvolutionPart(LinkedFormdataEvolutionPart):
27
    formdef_class = CardDef
28

  
29

  
30
class CardManagement(object):
31

  
32
    @classmethod
33
    def is_available(cls, workflow=None):
34
        return get_publisher().has_site_option('studio')
35

  
36

  
37
class CreateCarddataWorkflowStatusItem(CardManagement, CreateFormdataWorkflowStatusItem):
38
    description = N_('Create Card Data')
39
    key = 'create_carddata'
40
    category = 'formdata-action'
41
    ok_in_global_action = True
42

  
43
    formdef_class = CardDef
44
    evolution_part_class = LinkedCardDataEvolutionPart
45

  
46
    formdef_label = N_('Card')
47
    mappings_label = N_('Mappings to new card fields')
48
    varname_hint = N_('This is used to get linked card in expressions.')
49

  
50
    def get_parameters(self):
51
        return ('formdef_slug', 'mappings', 'keep_user', 'varname')
52

  
53

  
54
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
......
171 172

  
172 173
    def __getattr__(self, varname):
173 174
        for part in self._formdata.iter_evolution_parts():
174
            if not isinstance(part, LinkedFormdataEvolutionPart):
175
                continue
176 175
            if part.varname == varname and part.formdata:
177 176
                return part.formdata.get_substitution_variables()
178 177
        raise AttributeError(varname)
......
193 192
    evolution_part_class = LinkedFormdataEvolutionPart
194 193

  
195 194
    formdef_slug = None
195
    formdef_label = N_('Form')
196
    mappings_label = N_('Mappings to new form fields')
197
    varname_hint = N_('This is used to get linked forms in expressions.')
198

  
196 199
    draft = False
197 200
    backoffice_submission = False
198 201
    keep_user = True
......
221 224
            list_forms = [(None, '---', '')]
222 225
            list_forms += [(x.url_name, x.name, x.url_name) for x in self.formdef_class.select(order_by='name')]
223 226
            form.add(SingleSelectWidget, 'formdef_slug',
224
                     title=_('Form'),
227
                     title=_(self.formdef_label),
225 228
                     value=self.formdef_slug,
226 229
                     options=list_forms)
227 230
        if 'draft' in parameters:
......
247 250
        formdef = self._resolve_formdef_slug(form.get('formdef_slug'))
248 251
        if 'mappings' in parameters and formdef:
249 252
            form.add(MappingsWidget, '%smappings' % prefix,
250
                     title=_('Mappings to new form fields'),
253
                     title=_(self.mappings_label),
251 254
                     to_formdef=formdef,
252 255
                     value=self.mappings)
253 256
        if 'varname' in parameters:
254 257
            form.add(VarnameWidget, '%svarname' % prefix,
255 258
                     title=_('Identifier'), value=self.varname,
256
                     hint=_('This is used to get linked forms in expressions.'),
259
                     hint=_(self.varname_hint),
257 260
                     advanced=not(bool(self.varname)))
258 261
        if 'map_fields_by_varname' in parameters and self.formdef:
259 262
            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
-