0001-forms-add-a-datalist-textinput-widget-37884.patch
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 |
- |