Projet

Général

Profil

0001-forms-add-a-datalist-textinput-widget-37884.patch

Paul Marillonnet, 25 février 2020 12:40

Télécharger (3,96 ko)

Voir les différences:

Subject: [PATCH 1/4] forms: add a datalist textinput widget (#37884)

 src/authentic2/forms/widgets.py               | 19 ++++++++++++
 ...dget_datetimepicker.py => test_widgets.py} | 29 +++++++++++++++++--
 2 files changed, 45 insertions(+), 3 deletions(-)
 rename tests/{test_widget_datetimepicker.py => test_widgets.py} (54%)
src/authentic2/forms/widgets.py
30 30
import django
31 31
from django.forms.widgets import DateTimeInput, DateInput, TimeInput, ClearableFileInput
32 32
from django.forms.widgets import PasswordInput as BasePasswordInput
33
from django.forms.widgets import TextInput
33 34
from django.utils.formats import get_language, get_format
34 35
from django.utils.safestring import mark_safe
35 36
from django.utils.translation import ugettext_lazy as _
......
281 282
        attrs = kwargs.pop('attrs', {})
282 283
        attrs['accept'] = 'image/*'
283 284
        super(ProfileImageInput, self).__init__(*args, attrs=attrs, **kwargs)
285

  
286

  
287
class DatalistTextInput(TextInput):
288
    def __init__(self, name, data, attrs=None):
289
        super(DatalistTextInput, self).__init__(attrs)
290
        self.data = data
291
        self.name = 'list__%s' % name
292
        self.attrs.update({'list': self.name})
293

  
294
    def render(self, name, value, attrs=None, renderer=None):
295
        output = super(DatalistTextInput, self).render(
296
                name, value, attrs=attrs, renderer=renderer)
297
        datalist = '<datalist id="%s">' % self.name
298
        for element in self.data:
299
            datalist += '<option value="%s">' % element
300
        datalist += '</datalist>'
301
        output += datalist
302
        return output
tests/test_widget_datetimepicker.py → tests/test_widgets.py
1 1
# authentic2 - versatile identity manager
2
# Copyright (C) 2010-2019 Entr'ouvert
2
# Copyright (C) 2010-2020 Entr'ouvert
3 3
#
4 4
# This program is free software: you can redistribute it and/or modify it
5 5
# under the terms of the GNU Affero General Public License as published
......
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16
# authentic2
17 17

  
18
from pyquery import PyQuery
19

  
18 20
from authentic2.widgets import DateTimeWidget, DateWidget, TimeWidget
21
from authentic2.widgets import DatalistTextInput
19 22

  
20 23

  
21
def test_widgets_init_and_render_no_locale():
24
def test_datetimepicker_init_and_render_no_locale():
22 25
    DateTimeWidget().render('wt', '2019/12/12 12:34:34')
23 26
    DateWidget().render('wt', '2019/12/12')
24 27
    TimeWidget().render('wt', '12:34:34')
25 28

  
26 29

  
27
def test_widgets_init_and_render_fr(french_translation):
30
def test_datetimepicker_init_and_render_fr(french_translation):
28 31
    DateTimeWidget().render('wt', '2019/12/12 12:34:34')
29 32
    DateWidget().render('wt', '2019/12/12')
30 33
    TimeWidget().render('wt', '12:34:34')
34

  
35

  
36
def test_datalisttextinput_init_and_render():
37
    data = ['blue', 'red', 'green']
38
    widget = DatalistTextInput(name='foo', data=data)
39
    html = widget.render(name='bar', value='examplevalue')
40
    query = PyQuery(html)
41

  
42
    textinput = query.find('input')
43
    assert textinput.attr('name') == 'bar'
44
    assert textinput.attr('value') == 'examplevalue'
45
    assert textinput.attr('list') == 'list__foo'
46

  
47
    datalist = query.find('datalist')
48
    assert datalist.attr('id') == 'list__foo'
49
    for option in datalist.find('option'):
50
        assert len(option.values()) == 1
51
        assert option.values()[0] in data
52
        data.remove(option.values()[0])
53
    assert not data
31
-