Skip to content

Commit

Permalink
This fix issue #1
Browse files Browse the repository at this point in the history
  • Loading branch information
djk2 committed Mar 7, 2017
1 parent 13208e1 commit 30f9d5f
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 92 deletions.
70 changes: 38 additions & 32 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,37 +1,43 @@
sudo: false
language: python
env:
- TOXENV=py27-dj_1.8-bootstrap_7.0.0-crispy_1.5.0-tests
- TOXENV=py27-dj_1.8-bootstrap_7.0.0-crispy_1.5.1-tests
- TOXENV=py34-dj_1.8-bootstrap_7.0.0-crispy_1.5.0-tests
- TOXENV=py34-dj_1.8-bootstrap_7.0.0-crispy_1.5.1-tests
- TOXENV=py27-dj_1.9-bootstrap_7.1.0-crispy_1.6.0-tests
- TOXENV=py27-dj_1.9-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.9-bootstrap_7.0.0-crispy_1.6.0-tests
- TOXENV=py27-dj_1.9-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.9-bootstrap_8.1.0-crispy_1.6.0-tests
- TOXENV=py27-dj_1.9-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.9-bootstrap_7.1.0-crispy_1.6.0-tests
- TOXENV=py34-dj_1.9-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.9-bootstrap_7.0.0-crispy_1.6.0-tests
- TOXENV=py34-dj_1.9-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.9-bootstrap_8.1.0-crispy_1.6.0-tests
- TOXENV=py34-dj_1.9-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py27-dj_1.10-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_7.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_7.0.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py34-dj_1.10-bootstrap_8.1.0-crispy_1.6.1-tests
- TOXENV=py27-flake
- TOXENV=py34-flake
- TOXENV=py34-isort

matrix:
include:
- { python: 2.7, env: TOXENV=py27-dj_1.8-bootstrap_7.1-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.8-bootstrap_7.1-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_7.1-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_7.1-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_8.1-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_8.1-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_8.2-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.9-bootstrap_8.2-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_7.1-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_7.1-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_8.1-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_8.1-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_8.2-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.9-bootstrap_8.2-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_7.1-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_7.1-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_8.1-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_8.1-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_8.2-crispy_1.5-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.10-bootstrap_8.2-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_7.1-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_7.1-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_8.1-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_8.1-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_8.2-crispy_1.5-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.10-bootstrap_8.2-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-dj_1.11-bootstrap_8.2-crispy_1.6-tests }
- { python: 3.4, env: TOXENV=py34-dj_1.11-bootstrap_8.2-crispy_1.6-tests }
- { python: 2.7, env: TOXENV=py27-flake }
- { python: 3.4, env: TOXENV=py34-flake }
- { python: 3.4, env: TOXENV=py34-isort }

allow_failures:
- env: TOXENV=py27-dj_1.11-bootstrap_8.2-crispy_1.6-tests
- env: TOXENV=py34-dj_1.11-bootstrap_8.2-crispy_1.6-tests

install:
- pip install tox>=2.5.0
Expand Down
20 changes: 12 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
# CHANGELOG for django-popup-view-field

## 0.3.0 (2017-03-07)

* Support for Django 1.11

## 0.2.0 (2017-02-20)

* Remove PopupViewField from django_popup_view_field.__init__,
now you must import PopupViewField from django_popup_view_field.fields
* Remove PopupViewField from django_popup_view_field.__init__,
now you must import PopupViewField from django_popup_view_field.fields

* Sorting imports using isort
* Sorting imports using isort

* Checking the order of imports in the tox
* Checking the order of imports in the tox

* Checking support for django-bootstrap3 v8.1.0
* Checking support for django-bootstrap3 v8.1.0

* Added django-bootstrap3 v8.1.0 to tox
* Added django-bootstrap3 v8.1.0 to tox

* Adding version in django_popup_view_field.__init__
* Adding version in django_popup_view_field.__init__

## 0.1 (2016-12-27)

* Initial version + tests + Travis CI
* Initial version + tests + Travis CI
2 changes: 1 addition & 1 deletion django_popup_view_field/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
VERSION = (0, 2, 0)
VERSION = (0, 3, 0)
__version__ = ".".join(str(i) for i in VERSION)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% spaceless %}
<div class="input-group">
<input
type="{{ widget.type }}"
name="{{ widget.name }}"
{% if widget.value != None and widget.value != "" %}
value="{{ widget.value }}"
{% endif %}
{% for name, value in widget.attrs.items %}
{% if value != False %}
{{ name }}{% if value != True %}="{{ value }}"{% endif %}
{% endif %}
{% endfor %}
/>

<div class="input-group-addon btn popup-view-btn-clear" data-target="{{ widget.attrs.id }}">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</div>

<div
class="input-group-addon btn popup-view-btn-load"
data-target="{{ widget.attrs.id }}"
data-popup-dialog-title="{{ widget.popup_dialog_title }}"
data-url = "{{ widget.url }}"
>
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</div>
</div>
{% endspaceless %}
2 changes: 0 additions & 2 deletions django_popup_view_field/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ def test_status(self):
def test_get_response(self):
response = self.client.get(self.url)
html = response.content.decode("utf-8")
# print("*******************")
# print(html)
self.assertTrue(response.context['form'] is not None)
self.assertInHTML("<title>View 1</title>", html)
assert html.find('''class="input-group-addon btn popup-view-btn-load"''') != -1
Expand Down
91 changes: 53 additions & 38 deletions django_popup_view_field/widgets.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import django
from django import forms
from django.core.urlresolvers import reverse
from django.forms.utils import flatatt
from django.template import loader
from django.utils.encoding import force_text
from django.utils.html import format_html

Expand All @@ -9,58 +11,71 @@ class PopupViewWidget(forms.TextInput):
"""
Widget is compatible with crispy forms and django-bootstrap3
Render input field with two buttons:
first button for clear field
second button for call popup dialog
first button for clean field
second button to call popup dialog
"""

template_name = 'django_popup_view_field/popup_view_widget.html'

def __init__(self, view_class_name, popup_dialog_title, attrs=None):
self.view_class_name = view_class_name
self.popup_dialog_title = popup_dialog_title

# compability for Django v1.11
if attrs is not None:
self.attrs = attrs.copy()
else:
self.attrs = {}
super(PopupViewWidget, self).__init__(attrs=attrs)

def get_view_url(self):
"""Return url for ajax to view for render dialog content"""
url = reverse("django_popup_view_field:get_popup_view", args=(self.view_class_name,))
return url

def render(self, name, value, attrs=None):
if value is None:
value = ''
def get_context(self, name, value, attrs=None):

# For Django >= 1.11
try:
context = super(PopupViewWidget, self).get_context(name, value, attrs)

# For Django < 1.11
except AttributeError:
attrs = self.build_attrs(attrs)
context = {
'widget': {
'name': name,
'is_hidden': self.is_hidden,
'type': self.input_type,
'attrs': self.build_attrs(attrs),
'template_name': self.template_name
}
}

# Only add the 'value' attribute if a value is non-empty.
# This code come from django
if value != '':
context['widget']['value'] = force_text(self._format_value(value))

final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
# Extra attrs for popup
context['widget']['popup_dialog_title'] = self.popup_dialog_title
context['widget']['url'] = self.get_view_url()

# Add to input css class 'form-control'
css_class = final_attrs.get("class", "").split()
css_class = context['widget']['attrs'].get("class", "").split()
if "form-control" not in css_class:
css_class.append("form-control")
css_class = " ".join(css_class)
final_attrs['class'] = css_class

if value != '':
final_attrs['value'] = force_text(self._format_value(value))

html = '''
<div class="input-group">
<input {attrs}/>
<div class="input-group-addon btn popup-view-btn-clear" data-target="{target_input_id}">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</div>
<div
class="input-group-addon btn popup-view-btn-load"
data-target="{target_input_id}"
data-popup-dialog-title="{popup_dialog_title}"
data-url = "{url}"
>
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</div>
</div>
'''.format(
attrs=flatatt(final_attrs), # Default attrs for text input
target_input_id=final_attrs.get("id", ""), # id target - place where value from dialog will be insert
popup_dialog_title=self.popup_dialog_title, # title for dialog
url=self.get_view_url()
)

return format_html(html)
context['widget']['attrs']['class'] = " ".join(set(css_class))

return context

def render(self, name, value, attrs=None, **kwargs):
value = value or ''
context = self.get_context(name, value, attrs)

if django.VERSION < (1, 11):
template = loader.get_template(self.template_name)
return template.render(context).strip()

else:
return super(PopupViewWidget, self).render(name, value, attrs, **kwargs)
2 changes: 1 addition & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Django==1.10.5
Django==1.11b1
tox>=2.5.0
django-bootstrap3
django-crispy-forms
Expand Down
20 changes: 10 additions & 10 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[tox]
minversion = 1.8
envlist=
{py27,py34}-dj_1.8-bootstrap_7.0.0-crispy_{1.5.0,1.5.1}-tests,
{py27,py34}-dj_1.9-bootstrap_{7.1.0,7.0.0,8.1.0}-crispy_{1.6.0,1.6.1}-tests,
{py27,py34}-dj_1.10-bootstrap_{7.1.0,7.0.0,8.1.0}-crispy_{1.6.1,1.6.1}-tests,
{py27,py34}-dj_1.8-bootstrap_7.1-crispy_1.5-tests,
{py27,py34}-dj_1.9-bootstrap_{7.1,8.1,8.2}-crispy_{1.5,1.6}-tests,
{py27,py34}-dj_1.10-bootstrap_{7.1,8.1,8.2}-crispy_{1.5,1.6}-tests,
{py27,py34}-dj_1.11-bootstrap_{8.2}-crispy_{1.6}-tests,
{py27,py34}-flake,
py34-isort

Expand All @@ -20,13 +21,12 @@ deps =
dj_1.8: Django>=1.8,<1.9
dj_1.9: Django>=1.9,<1.10
dj_1.10: Django>=1.9,<1.11
crispy_1.5.0: django-crispy-forms==1.5.0
crispy_1.5.1: django-crispy-forms==1.5.1
crispy_1.6.0: django-crispy-forms==1.6.0
crispy_1.6.1: django-crispy-forms==1.6.1
bootstrap_7.0.0: django-bootstrap3==7.0.0
bootstrap_7.1.0: django-bootstrap3==7.1.0
bootstrap_8.1.0: django-bootstrap3==8.1.0
dj_1.11: Django==1.11b1
crispy_1.5: django-crispy-forms==1.5.1
crispy_1.6: django-crispy-forms==1.6.1
bootstrap_7.1: django-bootstrap3==7.1.0
bootstrap_8.1: django-bootstrap3==8.1.0
bootstrap_8.2: django-bootstrap3==8.2.1

commands =
tests: ./run_test.py
Expand Down

0 comments on commit 30f9d5f

Please sign in to comment.