Projet

Général

Profil

0001-backoffice-duplicate-page-and-subfields-57036.patch

Lauréline Guérin, 08 octobre 2021 10:58

Télécharger (8,6 ko)

Voir les différences:

Subject: [PATCH] backoffice: duplicate page and subfields (#57036)

 tests/admin_pages/test_form.py | 117 ++++++++++++++++++++++++++++++++-
 wcs/admin/fields.py            |  59 ++++++++++++++++-
 2 files changed, 173 insertions(+), 3 deletions(-)
tests/admin_pages/test_form.py
1414 1414
    formdef.store()
1415 1415

  
1416 1416
    app = login(get_app(pub))
1417
    resp = app.get('/backoffice/forms/1/')
1418
    resp = resp.click(href='fields/')
1417
    resp = app.get('/backoffice/forms/1/fields/')
1419 1418
    assert '1st field' in resp.text
1420 1419

  
1421 1420
    resp = resp.click(href='1/duplicate')
......
1426 1425
    assert FormDef.get(1).fields[1].label == '1st field'
1427 1426

  
1428 1427

  
1428
def test_form_duplicate_page_field(pub):
1429
    create_superuser(pub)
1430
    create_role(pub)
1431

  
1432
    FormDef.wipe()
1433
    formdef = FormDef()
1434
    formdef.name = 'form title'
1435
    formdef.fields = [
1436
        fields.PageField(id='0', label='1st page', type='page'),
1437
        fields.StringField(id='1', label='1st field', type='string', varname='foobar'),
1438
        fields.PageField(id='2', label='2nd page', type='page'),
1439
        fields.StringField(id='3', label='2nd field', type='string', varname='baz'),
1440
    ]
1441
    formdef.store()
1442

  
1443
    app = login(get_app(pub))
1444
    resp = app.get('/backoffice/forms/1/fields/')
1445

  
1446
    # duplicate 1st page only
1447
    resp = resp.click(href='0/duplicate')
1448
    assert 'Also duplicate all fields of the page' in resp.text
1449
    resp = resp.form.submit().follow()
1450
    assert [f.label for f in FormDef.get(1).fields] == [
1451
        '1st page',
1452
        '1st field',
1453
        '1st page',
1454
        '2nd page',
1455
        '2nd field',
1456
    ]
1457
    assert [str(f.id) for f in FormDef.get(1).fields] == ['0', '1', '4', '2', '3']
1458

  
1459
    # duplicate 1st page and fields
1460
    resp = resp.click(href='0/duplicate')
1461
    assert 'Also duplicate all fields of the page' in resp.text
1462
    resp.form['duplicate_fields'] = True
1463
    resp = resp.form.submit().follow()
1464
    assert [f.label for f in FormDef.get(1).fields] == [
1465
        '1st page',
1466
        '1st field',
1467
        '1st page',
1468
        '1st field',
1469
        '1st page',
1470
        '2nd page',
1471
        '2nd field',
1472
    ]
1473
    assert [str(f.id) for f in FormDef.get(1).fields] == ['0', '1', '5', '6', '4', '2', '3']
1474

  
1475
    # duplicate copy of 1st page without fields
1476
    resp = resp.click(href='4/duplicate')
1477
    assert 'Also duplicate all fields of the page' not in resp.text
1478
    resp = resp.form.submit().follow()
1479
    assert [f.label for f in FormDef.get(1).fields] == [
1480
        '1st page',
1481
        '1st field',
1482
        '1st page',
1483
        '1st field',
1484
        '1st page',
1485
        '1st page',
1486
        '2nd page',
1487
        '2nd field',
1488
    ]
1489
    assert [str(f.id) for f in FormDef.get(1).fields] == ['0', '1', '5', '6', '4', '7', '2', '3']
1490

  
1491
    # duplicate last page and fields
1492
    resp = resp.click(href='2/duplicate')
1493
    assert 'Also duplicate all fields of the page' in resp.text
1494
    resp.form['duplicate_fields'] = True
1495
    resp = resp.form.submit().follow()
1496
    assert [f.label for f in FormDef.get(1).fields] == [
1497
        '1st page',
1498
        '1st field',
1499
        '1st page',
1500
        '1st field',
1501
        '1st page',
1502
        '1st page',
1503
        '2nd page',
1504
        '2nd field',
1505
        '2nd page',
1506
        '2nd field',
1507
    ]
1508
    assert [str(f.id) for f in FormDef.get(1).fields] == ['0', '1', '5', '6', '4', '7', '2', '3', '8', '9']
1509

  
1510
    # duplicate last page only
1511
    resp = resp.click(href='8/duplicate')
1512
    assert 'Also duplicate all fields of the page' in resp.text
1513
    resp = resp.form.submit().follow()
1514
    assert [f.label for f in FormDef.get(1).fields] == [
1515
        '1st page',
1516
        '1st field',
1517
        '1st page',
1518
        '1st field',
1519
        '1st page',
1520
        '1st page',
1521
        '2nd page',
1522
        '2nd field',
1523
        '2nd page',
1524
        '2nd field',
1525
        '2nd page',
1526
    ]
1527
    assert [str(f.id) for f in FormDef.get(1).fields] == [
1528
        '0',
1529
        '1',
1530
        '5',
1531
        '6',
1532
        '4',
1533
        '7',
1534
        '2',
1535
        '3',
1536
        '8',
1537
        '9',
1538
        '10',
1539
    ]
1540

  
1541

  
1429 1542
def test_form_duplicate_file_field(pub):
1430 1543
    create_superuser(pub)
1431 1544
    create_role(pub)
wcs/admin/fields.py
185 185
            return self.redirect_field_anchor(above_field)
186 186

  
187 187
    def duplicate(self):
188
        if self.field.type == 'page':
189
            return self.duplicate_page()
188 190
        field_pos = self.objectdef.fields.index(self.field)
189 191
        fields = self.objectdef.fields
190 192
        new_field = copy.deepcopy(self.field)
......
194 196
        self.objectdef.store(comment=_('Duplication of field "%s"') % self.field.unhtmled_label)
195 197
        return self.redirect_field_anchor(new_field)
196 198

  
199
    def duplicate_page(self):
200
        form = Form(enctype='multipart/form-data')
201
        ellipsized_field_label = misc.ellipsize(self.field.unhtmled_label, 60)
202
        duplicate_top_title = _('Duplicate Page')
203
        duplicate_title = _('Duplicating Page: %s') % ellipsized_field_label
204
        duplicate_message = _("You are about to duplicate the \"%s\" page.") % ellipsized_field_label
205
        form.widgets.append(HtmlWidget('<p>%s</p>' % duplicate_message))
206
        current_field_index = self.objectdef.fields.index(self.field)
207
        page_fields = []
208
        # get fields of the page
209
        for index in range(current_field_index + 1, len(self.objectdef.fields)):
210
            field = self.objectdef.fields[index]
211
            if field.type == 'page':
212
                # next page found; break
213
                break
214
            page_fields.append(field)
215
        # add duplicate_fields checkbox only if the page has fields
216
        if page_fields:
217
            form.add(CheckboxWidget, 'duplicate_fields', title=_('Also duplicate all fields of the page'))
218
        form.add_submit('delete', _('Submit'))
219
        form.add_submit("cancel", _("Cancel"))
220
        if form.get_widget('cancel').parse():
221
            return self.redirect_field_anchor(self.field)
222
        if not form.is_submitted() or form.has_errors():
223
            get_response().breadcrumb.append(('duplicate', _('Duplicate')))
224
            self.html_top(title=duplicate_top_title)
225
            r = TemplateIO(html=True)
226
            r += htmltext('<h2>%s</h2>') % duplicate_title
227
            r += form.render()
228
            return r.getvalue()
229
        else:
230
            duplicate_fields = form.get_widget('duplicate_fields')
231
            to_be_duplicated = [self.field]
232
            if duplicate_fields and duplicate_fields.parse():
233
                # duplicate page fields if requested
234
                to_be_duplicated += page_fields
235
            new_fields = []
236
            # duplicate fields
237
            for field in to_be_duplicated:
238
                new_field = copy.deepcopy(field)
239
                # allocate a new id
240
                new_field.id = self.objectdef.get_new_field_id()
241
                new_fields.append(new_field)
242
            # insert new fields
243
            last_duplicated_field_index = self.objectdef.fields.index(([self.field] + page_fields)[-1])
244
            self.objectdef.fields = (
245
                self.objectdef.fields[: last_duplicated_field_index + 1]
246
                + new_fields
247
                + self.objectdef.fields[last_duplicated_field_index + 1 :]
248
            )
249
            # and store them
250
            self.objectdef.store(comment=_('Duplication of field "%s"') % self.field.ellipsized_label)
251
            # redirect to the new page field
252
            return self.redirect_field_anchor(new_fields[0])
253

  
197 254

  
198 255
class FieldsPagesDirectory(Directory):
199 256
    def __init__(self, parent):
......
340 397
                        )
341 398
                    r += command_icon('%s/' % field.id, 'edit')
342 399
                if not self.objectdef.is_readonly():
343
                    r += command_icon('%s/duplicate' % field.id, 'duplicate')
400
                    r += command_icon('%s/duplicate' % field.id, 'duplicate', popup=(field.type == 'page'))
344 401
                    r += command_icon('%s/delete' % field.id, 'remove', popup=True)
345 402
                r += htmltext('</p></li>')
346 403
            r += htmltext('</ul>')
347
-