0001-admin-option-to-move-fields-when-a-page-is-moved-495.patch
tests/admin_pages/test_form.py | ||
---|---|---|
2033 | 2033 |
formdef.store() |
2034 | 2034 | |
2035 | 2035 |
app = login(get_app(pub)) |
2036 |
app.get('/backoffice/forms/%s/fields/update_order?order=0;3;1;2;' % formdef.id) |
|
2036 | ||
2037 |
# missing element in params: do nothing |
|
2038 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=0;3;1;2;' % formdef.id) |
|
2039 |
assert resp.json == {'success': 'ko'} |
|
2040 |
# missing order in params: do nothing |
|
2041 |
resp = app.get('/backoffice/forms/%s/fields/update_order?element=0' % formdef.id) |
|
2042 |
assert resp.json == {'success': 'ko'} |
|
2043 | ||
2044 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=0;3;1;2;&element=3' % formdef.id) |
|
2045 |
assert resp.json == {'success': 'ok'} |
|
2037 | 2046 |
formdef = FormDef.get(formdef.id) |
2038 | 2047 |
assert [x.id for x in formdef.fields] == ['0', '3', '1', '2'] |
2039 | 2048 | |
2040 | 2049 |
# unknown id: ignored |
2041 |
app.get('/backoffice/forms/%s/fields/update_order?order=0;1;2;3;4;' % formdef.id) |
|
2050 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=0;1;2;3;4;&element=3' % formdef.id) |
|
2051 |
assert resp.json == {'success': 'ok'} |
|
2042 | 2052 |
formdef = FormDef.get(formdef.id) |
2043 | 2053 |
assert [x.id for x in formdef.fields] == ['0', '1', '2', '3'] |
2044 | 2054 |
# missing id: do nothing |
2045 |
app.get('/backoffice/forms/%s/fields/update_order?order=0;3;1;' % formdef.id) |
|
2055 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=0;3;1;&element=3' % formdef.id) |
|
2056 |
assert resp.json == {'success': 'ko'} |
|
2057 |
formdef = FormDef.get(formdef.id) |
|
2058 |
assert [x.id for x in formdef.fields] == ['0', '1', '2', '3'] |
|
2059 | ||
2060 |
# move a page |
|
2061 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=2;0;1;3;&element=2' % formdef.id) |
|
2062 |
assert resp.json == {'success': 'ok', 'additional-action': { |
|
2063 |
'message': 'Also move the fields of the page?', 'url': 'move_page_fields?fields=3&page=2'}} |
|
2064 |
# reset |
|
2065 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=0;1;2;3;&element=2' % formdef.id) |
|
2066 |
assert resp.json == {'success': 'ok'} |
|
2067 |
# move the first page |
|
2068 |
resp = app.get('/backoffice/forms/%s/fields/update_order?order=1;2;3;0;&element=0' % formdef.id) |
|
2069 |
assert resp.json == {'success': 'ok', 'additional-action': { |
|
2070 |
'message': 'Also move the fields of the page?', 'url': 'move_page_fields?fields=1&page=0'}} |
|
2071 | ||
2072 | ||
2073 |
def test_form_move_page_fields(pub): |
|
2074 |
create_superuser(pub) |
|
2075 |
create_role() |
|
2076 | ||
2077 |
FormDef.wipe() |
|
2078 |
formdef = FormDef() |
|
2079 |
formdef.name = 'form title' |
|
2080 |
formdef.fields = [ |
|
2081 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
2082 |
fields.PageField(id='0', label='1st page', type='page'), |
|
2083 |
fields.StringField(id='1', label='string', type='string'), |
|
2084 |
fields.StringField(id='3', label='string 2', type='string') |
|
2085 |
] |
|
2086 |
formdef.store() |
|
2087 | ||
2088 |
app = login(get_app(pub)) |
|
2089 |
# missing element in params: do nothing |
|
2090 |
app.get('/backoffice/forms/%s/fields/move_page_fields?fields=3' % formdef.id) |
|
2091 |
formdef = FormDef.get(formdef.id) |
|
2092 |
assert [x.id for x in formdef.fields] == ['2', '0', '1', '3'] |
|
2093 |
# missing order in params: do nothing |
|
2094 |
app.get('/backoffice/forms/%s/fields/move_page_fields?page=2' % formdef.id) |
|
2095 |
formdef = FormDef.get(formdef.id) |
|
2096 |
assert [x.id for x in formdef.fields] == ['2', '0', '1', '3'] |
|
2097 | ||
2098 |
# unknown id: do nothing |
|
2099 |
app.get('/backoffice/forms/%s/fields/move_page_fields?fields=4&page=2' % formdef.id) |
|
2100 |
formdef = FormDef.get(formdef.id) |
|
2101 |
assert [x.id for x in formdef.fields] == ['2', '0', '1', '3'] |
|
2102 | ||
2103 |
# move the fields of the page |
|
2104 |
app.get('/backoffice/forms/%s/fields/move_page_fields?fields=3&page=2' % formdef.id) |
|
2105 |
formdef = FormDef.get(formdef.id) |
|
2106 |
assert [x.id for x in formdef.fields] == ['2', '3', '0', '1'] |
|
2107 | ||
2108 |
# move the new first page |
|
2109 |
app.get('/backoffice/forms/%s/fields/update_order?order=3;0;1;2&element=2' % formdef.id) |
|
2110 |
formdef = FormDef.get(formdef.id) |
|
2111 |
assert [x.id for x in formdef.fields] == ['3', '0', '1', '2'] |
|
2112 |
# and the fields |
|
2113 |
app.get('/backoffice/forms/%s/fields/move_page_fields?fields=3&page=2' % formdef.id) |
|
2046 | 2114 |
formdef = FormDef.get(formdef.id) |
2047 | 2115 |
assert [x.id for x in formdef.fields] == ['0', '1', '2', '3'] |
2048 | 2116 |
wcs/admin/fields.py | ||
---|---|---|
17 | 17 |
# along with this program; if not, see <http://www.gnu.org/licenses/>. |
18 | 18 | |
19 | 19 |
import copy |
20 |
import json |
|
20 | 21 | |
21 | 22 |
from quixote import redirect |
22 | 23 |
from quixote.directory import Directory |
... | ... | |
212 | 213 | |
213 | 214 | |
214 | 215 |
class FieldsDirectory(Directory): |
215 |
_q_exports = ['', 'update_order', 'new', 'pages'] |
|
216 |
_q_exports = ['', 'update_order', 'move_page_fields', 'new', 'pages']
|
|
216 | 217 |
field_def_page_class = FieldDefPage |
217 | 218 |
blacklisted_types = [] |
218 | 219 |
page_id = None |
... | ... | |
393 | 394 |
pass |
394 | 395 | |
395 | 396 |
def update_order(self): |
397 |
get_response().set_content_type('application/json') |
|
396 | 398 |
request = get_request() |
399 | ||
400 |
if 'element' not in request.form: |
|
401 |
return json.dumps({'success': 'ko'}) |
|
402 |
if 'order' not in request.form: |
|
403 |
return json.dumps({'success': 'ko'}) |
|
404 | ||
405 |
dropped_element = request.form['element'] |
|
406 |
dropped_page_index = None |
|
407 | ||
397 | 408 |
new_order = request.form['order'].strip(';').split(';') |
398 | 409 |
new_fields = [] |
410 | ||
411 |
# build new ordered field list |
|
399 | 412 |
for y in new_order: |
400 |
for x in self.objectdef.fields: |
|
401 |
if x.id == y: |
|
402 |
new_fields.append(x) |
|
413 |
for i, x in enumerate(self.objectdef.fields): |
|
414 |
if x.id != y: |
|
415 |
continue |
|
416 |
new_fields.append(x) |
|
417 |
# if dropped field is a page, keep it's old index |
|
418 |
if x.id == dropped_element and x.type == 'page': |
|
419 |
dropped_page_index = i |
|
420 |
break |
|
421 | ||
422 |
# get the list of dropped page fields from old field list |
|
423 |
page_field_ids = [] |
|
424 |
if dropped_page_index is not None: |
|
425 |
for field in self.objectdef.fields[dropped_page_index + 1:]: |
|
426 |
if field.type == 'page': |
|
427 |
# next page found; break |
|
403 | 428 |
break |
429 |
page_field_ids.append(field.id) |
|
430 | ||
431 |
# check new field list composition |
|
432 |
if set(self.objectdef.fields) != set(new_fields): |
|
433 |
return json.dumps({'success': 'ko'}) |
|
434 | ||
435 |
self.objectdef.fields = new_fields |
|
436 |
self.objectdef.store(comment=_('Change in order of fields')) |
|
437 | ||
438 |
if not page_field_ids: |
|
439 |
return json.dumps({'success': 'ok'}) |
|
440 | ||
441 |
# propose to move also page fields |
|
442 |
return json.dumps({ |
|
443 |
'success': 'ok', |
|
444 |
'additional-action': { |
|
445 |
'message': _('Also move the fields of the page?'), |
|
446 |
'url': 'move_page_fields?fields=%s&page=%s' % (';'.join(page_field_ids), dropped_element) |
|
447 |
} |
|
448 |
}) |
|
449 | ||
450 |
def move_page_fields(self): |
|
451 |
request = get_request() |
|
452 | ||
453 |
if 'fields' not in request.form: |
|
454 |
return redirect('.') |
|
455 |
if 'page' not in request.form: |
|
456 |
return redirect('.') |
|
457 | ||
458 |
field_ids = request.form['fields'].strip(';').split(';') |
|
459 |
# keep all fields except page fields |
|
460 |
new_fields = [f for f in self.objectdef.fields if f.id not in field_ids] |
|
461 |
# find page fields |
|
462 |
page_fields = [f for f in self.objectdef.fields if f.id in field_ids] |
|
463 |
# find page in new fields, and insert page_fields |
|
464 |
for i, field in enumerate(new_fields): |
|
465 |
if field.id != request.form['page']: |
|
466 |
continue |
|
467 |
new_fields = new_fields[:i+1] + page_fields + new_fields[i+1:] |
|
468 |
break |
|
469 | ||
470 |
# check new field list composition |
|
404 | 471 |
if set(self.objectdef.fields) != set(new_fields): |
405 |
return 'ko' |
|
472 |
return redirect('.') |
|
473 | ||
406 | 474 |
self.objectdef.fields = new_fields |
407 | 475 |
self.objectdef.store(comment=_('Change in order of fields')) |
408 |
return 'ok' |
|
476 | ||
477 |
return redirect('.') |
|
409 | 478 | |
410 | 479 |
def new(self): |
411 | 480 |
form = Form(enctype='multipart/form-data', action = 'new') |
wcs/qommon/static/js/biglist.js | ||
---|---|---|
35 | 35 |
page_index += 1; |
36 | 36 |
} |
37 | 37 |
} |
38 |
$('.move-page-fields').remove(); |
|
38 | 39 |
var order_function = $(this).data('order-function') || 'update_order'; |
39 |
$.post(order_function, {'order': result}); |
|
40 |
$.post(order_function, {'order': result, 'element': $(ui.item)[0].id.substr(7, 50)}) |
|
41 |
.done(function(data) { |
|
42 |
if (data['success'] != "ok") return; |
|
43 |
if (!data['additional-action']) return; |
|
44 |
$div = $('<div class="move-page-fields"></div>'); |
|
45 |
$div.append('<a href="' + data['additional-action']['url'] + '">' + data['additional-action']['message'] + '</a>') |
|
46 |
$div.dialog({ |
|
47 |
position: { my: "left top", at: "left bottom", of: $(ui.item) }, |
|
48 |
}); |
|
49 |
}); |
|
40 | 50 |
}, |
41 | 51 |
} |
42 | 52 |
); |
43 |
- |