Projet

Général

Profil

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

Serghei Mihai (congés, retour 15/05), 20 février 2020 14:10

Télécharger (14,1 ko)

Voir les différences:

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

 tests/test_backoffice_pages.py | 79 ++++++++++++++++++++++++++++++++++
 tests/test_workflows.py        | 78 +++++++++++++++++++++++++++++++++
 wcs/variables.py               |  5 +++
 wcs/wf/cards.py                | 61 ++++++++++++++++++++++++++
 wcs/wf/create_formdata.py      | 22 +++++++---
 wcs/workflows.py               |  1 +
 6 files changed, 239 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 CardAddWorkflowStatusItem
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 = CardAddWorkflowStatusItem()
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_cards_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 CardAddWorkflowStatusItem
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 = CardAddWorkflowStatusItem()
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_cards_mycard_form_number'] == '1-2'
4482
    carddata = carddef.data_class().get(id=2)
4483
    assert carddata.get_substitution_variables()['form_var_cdate'] == today
4484
    print(carddata.get_substitution_variables()['form_var_clist'])
4485
    assert carddata.get_substitution_variables()['form_var_clist'] == 'item1'
wcs/variables.py
421 421

  
422 422
        return LazyFormDataLinks(self._formdata)
423 423

  
424
    @property
425
    def cards(self):
426
        from .wf.cards import LazyCardDataLinks
427
        return LazyCardDataLinks(self._formdata)
428

  
424 429
    def export_to_json(self, include_files=True):
425 430
        # this gets used to generate an email attachment :/
426 431
        return self._formdata.export_to_json(include_files=include_files)
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 ..qommon import _
20
from wcs.workflows import register_item_class
21
from wcs.carddef import CardDef
22

  
23
from wcs.wf.create_formdata import (CreateFormdataWorkflowStatusItem,
24
                                    LinkedFormdataEvolutionPart,
25
                                    LazyFormDataLinks)
26

  
27

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

  
32

  
33
class LazyCardDataLinks(LazyFormDataLinks):
34
    evolution_part_class = LinkedCardDataEvolutionPart
35

  
36

  
37
class CardManagement(object):
38

  
39
    @classmethod
40
    def is_available(cls, workflow=None):
41
        return get_publisher().has_site_option('studio')
42

  
43

  
44
class CardAddWorkflowStatusItem(CardManagement, CreateFormdataWorkflowStatusItem):
45
    description = N_('Add Card')
46
    key = 'add-card'
47
    category = 'formdata-action'
48
    ok_in_global_action = True
49

  
50
    formdef_class = CardDef
51
    evolution_part_class = LinkedCardDataEvolutionPart
52

  
53
    formdef_label = N_('Card')
54
    mappings_label = N_('Mappings to card fields')
55
    varname_hint = N_('Used to get linked card in expressions.')
56

  
57
    def get_parameters(self):
58
        return ('formdef_slug', 'mappings', 'keep_user', 'varname')
59

  
60

  
61
register_item_class(CardAddWorkflowStatusItem)
wcs/wf/create_formdata.py
111 111

  
112 112
class LinkedFormdataEvolutionPart(object):
113 113
    formdef_class = FormDef
114
    form_property_name = 'links'
114 115

  
115 116
    def __init__(self, formdata, varname=None):
116 117
        self._formdef = formdata.formdef
......
136 137
        return {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
137 138

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

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

  
151 153

  
152 154
class LazyFormDataLinks(object):
155
    evolution_part_class = LinkedFormdataEvolutionPart
156

  
153 157
    def __init__(self, formdata):
154 158
        self._formdata = formdata
155 159

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

  
174 178
    formdef_slug = None
179
    formdef_label = _('Form')
180
    mappings_label = _('Mappings to new form fields')
181
    varname_hint = _('This is used to get linked forms in expressions.')
182

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

  
240 248
    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
-