Projet

Général

Profil

0001-admin-use-new-dynamic-display-js-possibility-in-pref.patch

Frédéric Péters, 12 février 2016 10:24

Télécharger (7,94 ko)

Voir les différences:

Subject: [PATCH] admin: use new dynamic-display js possibility in prefill
 widgets (#9559)

 tests/test_admin_pages.py      | 13 ++----
 wcs/fields.py                  | 90 ++++++++++++++++++++++++------------------
 wcs/qommon/static/js/qommon.js |  3 +-
 3 files changed, 57 insertions(+), 49 deletions(-)
tests/test_admin_pages.py
840 840
    assert resp.forms[0]['label'].value == '1st field'
841 841
    assert '<legend>Additional parameters</legend>' in resp.body
842 842
    assert '<label for="form_prefill">Prefill</label>' in resp.body
843
    # hceck the "prefill" field is under additional parameters
843
    # check the "prefill" field is under additional parameters
844 844
    assert resp.body.index('<legend>Additional parameters</legend>') < \
845 845
            resp.body.index('<label for="form_prefill">Prefill</label>')
846 846

  
847
    # start filling the "prefill" field
847
    # complete the "prefill" field
848 848
    resp.forms[0]['prefill$type'] = 'String'
849
    resp = resp.forms[0].submit('prefill$apply')
850

  
851
    # it should now appear before the additional parameters section
852
    assert resp.body.index('<legend>Additional parameters</legend>') > \
853
            resp.body.index('<label for="form_prefill">Prefill</label>')
854

  
855
    # complete it
856
    resp.forms[0]['prefill$value'] = 'test'
849
    resp.forms[0]['prefill$value_string'] = 'test'
857 850
    resp = resp.forms[0].submit('submit')
858 851
    assert resp.location == 'http://example.net/backoffice/forms/1/fields/'
859 852
    resp = resp.follow()
wcs/fields.py
20 20
import re
21 21
import base64
22 22
import xml.etree.ElementTree as ET
23
import collections
23 24

  
24 25
from quixote import get_request, get_publisher
25 26
from quixote.html import htmltext, TemplateIO
......
50 51
        if kwargs.get('map'):
51 52
            options = [('none', _('None')), ('geolocation', _('Geolocation')),]
52 53

  
53
        self.add(SingleSelectWidget, 'type', options = options, value = value.get('type'))
54
        self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'),
55
                 attrs={'data-dynamic-display-parent': 'true'})
54 56

  
55 57
        self.parse()
56 58
        if not self.value:
57 59
            self.value = {}
58 60

  
59
        if self.value.get('type') in ('string', 'formula'):
60
            self.add(StringWidget, 'value', value = value.get('value'), size=80)
61
        elif self.value.get('type') == 'user':
62
            formdef = get_publisher().user_class.get_formdef()
63
            users_cfg = get_cfg('users', {})
64
            if formdef:
65
                user_fields = []
66
                for field in formdef.fields:
67
                    if field.label in [x[1] for x in user_fields]:
68
                        # do not allow duplicated field names
69
                        continue
70
                    user_fields.append((field.id, field.label))
71
                if not users_cfg.get('field_email'):
72
                    user_fields.append(('email', _('Email (builtin)')))
73
            else:
74
                user_fields = [('name', _('Name')), ('email', _('Email'))]
61
        prefill_types = collections.OrderedDict(options)
62
        self.add(StringWidget, 'value_string', size=80,
63
                 value=value.get('value') if value.get('type') == 'string' else None,
64
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
65
                        'data-dynamic-display-value': prefill_types.get('string')})
66
        self.add(StringWidget, 'value_formula', size=80,
67
                 value=value.get('value') if value.get('type') == 'formula' else None,
68
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
69
                        'data-dynamic-display-value': prefill_types.get('formula')})
70

  
71
        formdef = get_publisher().user_class.get_formdef()
72
        users_cfg = get_cfg('users', {})
73
        if formdef:
74
            user_fields = []
75
            for field in formdef.fields:
76
                if field.label in [x[1] for x in user_fields]:
77
                    # do not allow duplicated field names
78
                    continue
79
                user_fields.append((field.id, field.label))
80
            if not users_cfg.get('field_email'):
81
                user_fields.append(('email', _('Email (builtin)')))
82
        else:
83
            user_fields = [('name', _('Name')), ('email', _('Email'))]
84
        self.add(SingleSelectWidget, 'value_user',
85
                 value=value.get('value') if value.get('type') == 'user' else None,
86
                 options=user_fields,
87
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
88
                        'data-dynamic-display-value': prefill_types.get('user')})
75 89

  
76
            self.add(SingleSelectWidget, 'value', value = value.get('value'),
77
                    options = user_fields)
78
        elif self.value.get('type') == 'geolocation':
79
            if kwargs.get('map'):
80
                geoloc_fields = [('position', _('Position'))]
81
            else:
82
                geoloc_fields = [
83
                    ('house', _('Number')),
84
                    ('road', _('Street')),
85
                    ('number-and-street', _('Number and street')),
86
                    ('postcode', _('Post Code')),
87
                    ('city', _('City')),
88
                    ('country', _('Country')),
89
                    ]
90
            self.add(SingleSelectWidget, 'value', value=value.get('value'),
91
                    options=geoloc_fields)
92

  
93
        self.add(SubmitWidget, 'apply', value = _('Apply'))
90
        if kwargs.get('map'):
91
            geoloc_fields = [('position', _('Position'))]
92
        else:
93
            geoloc_fields = [
94
                ('house', _('Number')),
95
                ('road', _('Street')),
96
                ('number-and-street', _('Number and street')),
97
                ('postcode', _('Post Code')),
98
                ('city', _('City')),
99
                ('country', _('Country')),
100
            ]
101
        self.add(SingleSelectWidget, 'value_geolocation',
102
                 value=value.get('value') if value.get('type') == 'geolocation' else None,
103
                 options=geoloc_fields,
104
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
105
                        'data-dynamic-display-value': prefill_types.get('geolocation')})
94 106

  
95 107
        self._parsed = False
96 108

  
97 109

  
98 110
    def _parse(self, request):
99 111
        values = {}
100
        for name in ('type', 'value'):
101
            value = self.get(name)
112
        type_ = self.get('type')
113
        if type_:
114
            values['type'] = type_
115
            value = self.get('value_%s' % type_)
102 116
            if value:
103
                values[name] = value
117
                values['value'] = value
104 118
        self.value = values or None
105 119
        if values and values['type'] == 'formula' and values.get('value'):
106 120
            try:
wcs/qommon/static/js/qommon.js
9 9
            error: function(error) { windows.console && console.log('bouh', error); }
10 10
           });
11 11
  });
12
  $('[data-dynamic-display-parent]').change(function() {
12
  $('[data-dynamic-display-parent]').on('change keyup', function() {
13 13
    var sel1 = '[data-dynamic-display-child-of="' + $(this).attr('name') + '"]';
14 14
    var sel2 = '[data-dynamic-display-value="' + $(this).val() + '"]';
15 15
    $(sel1).hide();
16 16
    $(sel1 + sel2).show();
17 17
  });
18 18
  $('[data-dynamic-display-child-of]').hide();
19
  $('select[data-dynamic-display-parent]').trigger('change');
19 20
  $('[data-dynamic-display-parent]:checked').trigger('change');
20 21
});
21
-