0001-backoffice-duplicate-page-and-subfields-57036.patch
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('submit', _('Duplicate')) |
|
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): |
... | ... | |
342 | 399 |
) |
343 | 400 |
r += command_icon('%s/' % field.id, 'edit') |
344 | 401 |
if not self.objectdef.is_readonly(): |
345 |
r += command_icon('%s/duplicate' % field.id, 'duplicate') |
|
402 |
r += command_icon('%s/duplicate' % field.id, 'duplicate', popup=(field.type == 'page'))
|
|
346 | 403 |
r += command_icon('%s/delete' % field.id, 'remove', popup=True) |
347 | 404 |
r += htmltext('</p></li>') |
348 | 405 |
r += htmltext('</ul>') |
349 |
- |