Projet

Général

Profil

0001-admin-option-to-move-fields-when-a-page-is-moved-495.patch

Lauréline Guérin, 07 janvier 2021 14:43

Télécharger (9,95 ko)

Voir les différences:

Subject: [PATCH] admin: option to move fields when a page is moved (#49585)

 tests/admin_pages/test_form.py  | 74 ++++++++++++++++++++++++++++--
 wcs/admin/fields.py             | 81 ++++++++++++++++++++++++++++++---
 wcs/qommon/static/js/biglist.js | 12 ++++-
 3 files changed, 157 insertions(+), 10 deletions(-)
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
-