Merge pull request #168 from bcail/master

Fixed HeavySelect2Widget (incl automated test)
This commit is contained in:
Johannes Hoppe 2015-04-24 11:04:14 +02:00
commit 6092d96aea
5 changed files with 51 additions and 5 deletions

View file

@ -507,6 +507,22 @@ class HeavySelect2Widget(HeavySelect2Mixin, forms.TextInput):
# and we want label and other layout elements.
return False
def render_inner_js_code(self, id_, *args):
field_id = self.field_id if hasattr(self, 'field_id') else id_
fieldset_id = re.sub(r'-\d+-', '_', id_).replace('-', '_')
if '__prefix__' in id_:
return ''
else:
js = '''
window.django_select2.%s = function (selector, fieldID) {
var hashedSelector = "#" + selector;
$(hashedSelector).data("field_id", fieldID);
''' % (fieldset_id)
js += super(HeavySelect2Widget, self).render_inner_js_code(id_, *args)
js += '};'
js += 'django_select2.%s("%s", "%s");' % (fieldset_id, id_, field_id)
return js
class HeavySelect2MultipleWidget(HeavySelect2Mixin, MultipleSelect2HiddenInput):
"""

View file

@ -33,3 +33,18 @@ class TestSelect2Widget(object):
with pytest.raises(NoSuchElementException):
error = driver.find_element_by_xpath('//body[@JSError]')
pytest.fail(error.get_attribute('JSError'))
class TestHeavySelect2Widget(object):
url = reverse('heavy_select2_widget')
def test_heavy_select(self, db, client, live_server, driver):
driver.get(live_server + self.url)
dropdown = driver.find_element_by_css_selector('.select2-results')
assert dropdown.is_displayed() is False
elem = driver.find_element_by_css_selector('.select2-choice')
elem.click()
assert dropdown.is_displayed() is True
with pytest.raises(NoSuchElementException):
error = driver.find_element_by_xpath('//body[@JSError]')
pytest.fail(error.get_attribute('JSError'))

View file

@ -4,7 +4,7 @@ from __future__ import absolute_import, unicode_literals
from django import forms
from django_select2.fields import Select2MultipleWidget
from django_select2.widgets import Select2Widget
from django_select2.widgets import Select2Widget, HeavySelect2Widget
from tests.testapp import models
from . import fields
@ -60,3 +60,6 @@ class Select2WidgetForm(forms.Form):
(3, 'Three'),
(4, 'Four') ]
number = forms.ChoiceField(widget=Select2Widget(), choices=NUMBER_CHOICES)
class HeavySelect2WidgetForm(forms.Form):
heavy_number = forms.ChoiceField(widget=HeavySelect2Widget(data_view='heavy_data'))

View file

@ -3,15 +3,19 @@ from __future__ import absolute_import, unicode_literals
from django.conf.urls import include, patterns, url
from .forms import ArtistForm, Select2WidgetForm
from .views import TemplateFormView
from .forms import ArtistForm, Select2WidgetForm, HeavySelect2WidgetForm
from .views import TemplateFormView, heavy_data
urlpatterns = patterns(
'',
url(r'select2_widget',
url(r'^select2_widget/$',
TemplateFormView.as_view(form_class=Select2WidgetForm), name='select2_widget'),
url(r'single_value_model_field',
url(r'^heavy_select2_widget/$',
TemplateFormView.as_view(form_class=HeavySelect2WidgetForm), name='heavy_select2_widget'),
url(r'^single_value_model_field/$',
TemplateFormView.as_view(form_class=ArtistForm), name='single_value_model_field'),
url(r'^heavy_data/$',
heavy_data, name='heavy_data'),
url(r'^select2/', include('django_select2.urls')),
)

View file

@ -1,8 +1,16 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import json
from django.views.generic import FormView
from django.http import HttpResponse
class TemplateFormView(FormView):
template_name = 'form.html'
def heavy_data(request):
numbers = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five']
results = [{'id': index, 'text': value} for (index, value) in enumerate(numbers)]
return HttpResponse(json.dumps({'err': 'nil', 'results': results}), content_type='application/json')