Projet

Général

Profil

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

Serghei Mihai (congés, retour 15/05), 28 février 2020 16:02

Télécharger (12,9 ko)

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/cards.py                | 56 ++++++++++++++++++++++++
 wcs/wf/create_formdata.py      | 17 +++++---
 wcs/workflows.py               |  1 +
 5 files changed, 223 insertions(+), 7 deletions(-)
 create mode 100644 wcs/wf/cards.py
tests/test_backoffice_pages.py
47 47
from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem
48 48
from wcs.wf.resubmit import ResubmitWorkflowStatusItem
49 49
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping
50
from wcs.wf.cards import CreateCarddataWorkflowStatusItem
50 51
from wcs.carddef import CardDef
51 52
from wcs.categories import Category
52 53
from wcs.formdef import FormDef
......
5919 5920
    pq = resp.pyquery.remove_namespaces()
5920 5921
    assert pq('.field-type-string .value').text() == 'coucou'
5921 5922
    assert pq('.field-type-file .value').text() == 'bar'
5923

  
5924

  
5925
def test_backoffice_create_carddata_from_formdata(pub, studio):
5926
    CardDef.wipe()
5927
    FormDef.wipe()
5928

  
5929
    user = create_user(pub, is_admin=True)
5930
    user.name = 'Foo Bar'
5931
    user.email = 'foo@example.com'
5932
    user.store()
5933

  
5934
    carddef = CardDef()
5935
    carddef.name = 'My card'
5936
    carddef.fields = [
5937
        fields.StringField(id='1', label='string'),
5938
        fields.ItemField(id='2', label='List', items=['item1', 'item2']),
5939
        fields.DateField(id='3', label='Date')
5940
    ]
5941
    carddef.store()
5942

  
5943
    wf = Workflow(name='create-carddata')
5944
    st1 = wf.add_status('New')
5945
    st2 = wf.add_status('Create card')
5946

  
5947
    jump = ChoiceWorkflowStatusItem()
5948
    jump.id = '_createcard'
5949
    jump.label = 'Create card'
5950
    jump.by = ['_receiver']
5951
    jump.status = st2.id
5952
    jump.parent = st1
5953
    st1.items.append(jump)
5954

  
5955
    create_card = CreateCarddataWorkflowStatusItem()
5956
    create_card.label = 'Create Card Data'
5957
    create_card.varname = 'mycard'
5958
    create_card.id = '_create'
5959
    create_card.formdef_slug = carddef.url_name
5960
    create_card.mappings = [
5961
        Mapping(field_id='1', expression='Simple String'),
5962
        Mapping(field_id='2', expression='{{ form_var_list_raw }}'),
5963
        Mapping(field_id='3', expression='{{ form_var_date }}'),
5964
    ]
5965
    create_card.parent = st2
5966
    st2.items.append(create_card)
5967

  
5968
    display_message = DisplayMessageWorkflowStatusItem()
5969
    display_message.message = 'Card nr. {{ form_links_mycard_form_number }} created'
5970
    display_message.parent = st2
5971
    st2.items.append(display_message)
5972
    wf.store()
5973

  
5974
    formdef = FormDef()
5975
    formdef.name = 'Source form'
5976
    formdef.workflow_roles = {'_receiver': 1}
5977
    formdef.fields = [
5978
        fields.ItemField(id='1', label='List', items=['item1', 'item2'],
5979
                         varname='list'),
5980
        fields.DateField(id='2', label='Date', varname='date')
5981
    ]
5982
    formdef.workflow_id = wf.id
5983
    formdef.store()
5984

  
5985
    formdata = formdef.data_class()()
5986
    today = time.strptime('2020-01-01', '%Y-%m-%d')
5987
    formdata.data = {
5988
        '1': 'item2',
5989
        '2': today
5990
    }
5991

  
5992
    formdata.user = user
5993
    formdata.just_created()
5994
    formdata.store()
5995
    formdata.perform_workflow()
5996

  
5997
    app = login(get_app(pub))
5998
    resp = app.get(formdata.get_url(backoffice=True))
5999
    resp = resp.form.submit(name='button_createcard').follow()
6000
    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.cards import CreateCarddataWorkflowStatusItem
55 57

  
56 58

  
57 59
from utilities import (create_temporary_pub, MockSubstitutionVariables,
......
4405 4407
    assert len(errors) == 2
4406 4408
    assert any('form_var_toto_string' in (error.exception_message or '') for error in errors)
4407 4409
    assert any('Missing field' in error.summary for error in errors)
4410

  
4411

  
4412
def test_create_carddata(pub):
4413
    CardDef.wipe()
4414
    FormDef.wipe()
4415
    LoggedError.wipe()
4416

  
4417
    carddef = CardDef()
4418
    carddef.name = 'My card'
4419
    carddef.fields = [
4420
        StringField(id='1', label='string'),
4421
        ItemField(id='2', label='List', items=['item1', 'item2'],
4422
                  varname='clist'),
4423
        DateField(id='3', label='Date', varname='cdate')
4424
    ]
4425
    carddef.store()
4426

  
4427
    wf = Workflow(name='create-carddata')
4428
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
4429
    create = CreateCarddataWorkflowStatusItem()
4430
    create.label = 'Create CardDef'
4431
    create.varname = 'mycard'
4432
    create.id = '_create'
4433
    create.formdef_slug = carddef.url_name
4434
    create.mappings = [
4435
        Mapping(field_id='1', expression='=form_var_undefined'),
4436
        Mapping(field_id='2', expression='{{ form_var_list }}'),
4437
        Mapping(field_id='3', expression='{{ form_var_date }}'),
4438
    ]
4439
    create.parent = wf.possible_status[1]
4440
    wf.possible_status[1].items.insert(0, create)
4441
    wf.store()
4442

  
4443
    formdef = FormDef()
4444
    formdef.name = 'source form'
4445
    formdef.fields = [
4446
        ItemField(id='1', label='List', items=['item1', 'item2'],
4447
                  varname='list'),
4448
        DateField(id='2', label='Date', varname='date')
4449
    ]
4450
    formdef.workflow_id = wf.id
4451
    formdef.store()
4452

  
4453
    formdata = formdef.data_class()()
4454
    formdata.data = {}
4455
    formdata.just_created()
4456

  
4457
    assert carddef.data_class().count() == 0
4458

  
4459
    formdata = formdef.data_class()()
4460
    formdata.data = {}
4461

  
4462
    formdata.just_created()
4463
    formdata.perform_workflow()
4464

  
4465
    assert carddef.data_class().count() == 1
4466

  
4467
    errors = LoggedError.select()
4468
    assert len(errors) == 2
4469
    assert any('form_var_undefined' in (error.exception_message or '') for error in errors)
4470
    assert any('invalid date value' in (error.exception_message or '') for error in errors)
4471

  
4472
    formdata = formdef.data_class()()
4473
    today = datetime.date.today()
4474

  
4475
    formdata.data = {'1': 'item1',
4476
                     '1_display': 'item1',
4477
                     '2': today}
4478
    formdata.just_created()
4479
    formdata.perform_workflow()
4480

  
4481
    assert formdata.get_substitution_variables()['form_links_mycard_form_number'] == '1-2'
4482
    carddata = carddef.data_class().get(id=2)
4483
    assert carddata.get_substitution_variables()['form_var_clist'] == 'item1'
4484
    assert carddata.get_substitution_variables()['form_var_cdate'] == today
wcs/wf/cards.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
                                    LazyFormDataLinks)
25

  
26

  
27
class LinkedCardDataEvolutionPart(LinkedFormdataEvolutionPart):
28
    formdef_class = CardDef
29
    form_property_name = 'cards'
30

  
31

  
32
class CardManagement(object):
33

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

  
38

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

  
45
    formdef_class = CardDef
46
    evolution_part_class = LinkedCardDataEvolutionPart
47

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

  
52
    def get_parameters(self):
53
        return ('formdef_slug', 'mappings', 'keep_user', 'varname')
54

  
55

  
56
register_item_class(CreateCarddataWorkflowStatusItem)
wcs/wf/create_formdata.py
136 136
        return {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
137 137

  
138 138
    def __repr__(self):
139
        return '<Link "%s-%s">' % (self.formdef_id, self.formdata_id)
139
        return '<Linked %s "%s-%s">' % (self.formdef_class.__name__,
140
                                        self.formdef_id, self.formdata_id)
140 141

  
141 142
    @classmethod
142 143
    def get_substitution_variables(cls, formdata):
143 144
        d = {}
144 145
        for part in formdata.iter_evolution_parts():
145
            if not isinstance(part, LinkedFormdataEvolutionPart):
146
            if not isinstance(part, cls):
146 147
                continue
147 148
            if part.formdata:
148 149
                d['form_links_%s' % (part.varname or '*')] = part
......
155 156

  
156 157
    def __getattr__(self, varname):
157 158
        for part in self._formdata.iter_evolution_parts():
158
            if not isinstance(part, LinkedFormdataEvolutionPart):
159
                continue
160 159
            if part.varname == varname and part.formdata:
161 160
                return part.formdata.get_substitution_variables()
162 161
        raise AttributeError(varname)
......
172 171
    evolution_part_class = LinkedFormdataEvolutionPart
173 172

  
174 173
    formdef_slug = None
174
    formdef_label = N_('Form')
175
    mappings_label = N_('Mappings to new form fields')
176
    varname_hint = N_('This is used to get linked forms in expressions.')
177

  
175 178
    draft = False
176 179
    backoffice_submission = False
177 180
    keep_user = True
......
202 205
            list_forms = [(None, '---', '')]
203 206
            list_forms += [(x.url_name, x.name, x.url_name) for x in self.formdef_class.select(order_by='name')]
204 207
            form.add(SingleSelectWidget, 'formdef_slug',
205
                     title=_('Form'),
208
                     title=_(self.formdef_label),
206 209
                     value=self.formdef_slug,
207 210
                     options=list_forms)
208 211
        if 'draft' in parameters:
......
228 231
        formdef = self._resolve_formdef_slug(form.get('formdef_slug'))
229 232
        if 'mappings' in parameters and formdef:
230 233
            form.add(MappingsWidget, '%smappings' % prefix,
231
                     title=_('Mappings to new form fields'),
234
                     title=_(self.mappings_label),
232 235
                     to_formdef=formdef,
233 236
                     value=self.mappings)
234 237
        if 'varname' in parameters:
235 238
            form.add(VarnameWidget, '%svarname' % prefix,
236 239
                     title=_('Identifier'), value=self.varname,
237
                     hint=_('This is used to get linked forms in expressions.'),
240
                     hint=_(self.varname_hint),
238 241
                     advanced=not(bool(self.varname)))
239 242

  
240 243
    def submit_admin_form(self, form):
wcs/workflows.py
2912 2912
    from .wf import redirect_to_url
2913 2913
    from .wf import notification
2914 2914
    from .wf import create_formdata
2915
    from .wf import cards
2915 2916

  
2916 2917
from .wf.export_to_model import ExportToModel
2917
-