Skip to content

Commit 9b4742d

Browse files
author
Grzegorz Tężycki
committed
Close issue #5
1 parent 4d59604 commit 9b4742d

18 files changed

+94
-139
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG for django-popup-view-field
22

3+
## 0.4.0 (2018-10-04)
4+
5+
* Added `callback_data` attribute to PopupViewField (read more in README)
6+
37
## 0.3.0 (2017-03-07)
48

59
* Support for Django 1.11

README.rst

+41-2
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,49 @@ Create typical FormView
340340
</form>
341341

342342

343+
callback_data attribute
344+
------------------------
345+
If you want pass extra parameters to your popup view, you should use `callback_data`
346+
attribute for PopupViewField. This argument should be dictionary or OrderedDict.
347+
This dictionary containing yours parameters will be encoded to ASCII text string and
348+
added to url address. In your popup view You can take this parameters from `request.GET`.
349+
350+
*popups.py* ::
351+
352+
from django.views.generic import View
353+
from django_popup_view_field.registry import registry_popup_view
354+
355+
class FooPopupView(View):
356+
def get(self, request):
357+
print(request.GET['extra_param']) # --> will be "Foo Bar"
358+
print(request.GET['my_pk']) # --> will be 666
359+
....
360+
361+
# REGISTER IS IMPORTANT
362+
registry_popup_view.register(FooPopupView)
363+
364+
*forms.py* ::
365+
366+
from django import forms
367+
from django_popup_view_field.fields import PopupViewField
368+
369+
class FooForm(forms.Form):
370+
371+
some_field = PopupViewField(
372+
view_class=FooPopupView,
373+
callback_data={
374+
'extra_param': 'Foo Bar',
375+
'my_pk': 666
376+
}
377+
)
378+
379+
380+
343381
Advanced Example
344382
------------------------
345383

346-
Advanced Example use django-bootstrap3. Dialog is interactive, all links and forms will be send via Ajax and response will be loaded in dialog.
384+
Advanced Example use django-bootstrap3.
385+
Dialog is interactive, all links and forms will be send via Ajax and response will be loaded in dialog.
347386

348387
.. image:: https://raw.githubusercontent.com/djk2/django-popup-view-field/master/doc/static/advanced_example.png
349388
:alt: Advanced Example - screenshot
@@ -371,7 +410,7 @@ PopupView
371410
Reverse order
372411
</a>
373412

374-
*popups.py* ::
413+
**popups.py* ::
375414

376415
from django.views.generic import TemplateView
377416
from django_popup_view_field.registry import registry_popup_view

demo/db.sqlite3

-5 KB
Binary file not shown.

demo/demo/forms.py

+1-18
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
from django_popup_view_field.fields import PopupViewField
55

6-
from .popups import ColorPopupView, CountryPopupView, SexPopupView, SelectionReasonPopUpViews
7-
from .models import APReview
6+
from .popups import ColorPopupView, CountryPopupView, SexPopupView
87

98

109
class DemoForm(forms.Form):
@@ -26,19 +25,3 @@ class DemoForm(forms.Form):
2625
def __init__(self, *args, **kwargs):
2726
super(DemoForm, self).__init__(*args, **kwargs)
2827
self.helper = FormHelper()
29-
30-
class APReviewForm(forms.ModelForm):
31-
class Meta:
32-
model=APReview
33-
fields=['rating', 'selectionReason', ]
34-
35-
def __init__(self, *args, **kwargs):
36-
super(APReviewForm, self).__init__(*args, **kwargs)
37-
self.helper = FormHelper()
38-
self.fields['selectionReason']=PopupViewField(
39-
view_class=SelectionReasonPopUpViews,
40-
popup_dialog_title="Please select a reason for",
41-
callback_data={'my_id':'APid_1', 'other_param': 'xxx'},
42-
required=True,
43-
44-
)

demo/demo/migrations/0002_ap_apreview.py

-36
This file was deleted.

demo/demo/models.py

-19
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,3 @@
44
class Country(models.Model):
55
code = models.CharField(max_length=2, primary_key=True)
66
name = models.CharField(max_length=256)
7-
8-
9-
class AP(models.Model):
10-
name=models.CharField(max_length=200)
11-
APid=models.CharField(max_length=200)
12-
description1= models.CharField(max_length=200)
13-
description2= models.CharField(max_length=200)
14-
description3= models.CharField(max_length=200)
15-
16-
17-
RATING_CHOICES = (
18-
(1, 1),
19-
(2, 2)
20-
)
21-
22-
class APReview(models.Model):
23-
atPat=models.ForeignKey(AP, on_delete=models.CASCADE)
24-
rating = models.IntegerField(choices=RATING_CHOICES)
25-
selectionReason=models.CharField(max_length=200)

demo/demo/popups.py

+3-22
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
from django import forms
44
from django.http import HttpResponse
5-
from django.views.generic import FormView, TemplateView, DetailView
6-
from django.shortcuts import get_object_or_404
5+
from django.views.generic import FormView, TemplateView
6+
77
from django_popup_view_field.registry import registry_popup_view
88

9-
from .models import Country, AP
9+
from .models import Country
1010

1111

1212
class SexPopupView(TemplateView):
@@ -41,26 +41,7 @@ def get_context_data(self, **kwargs):
4141
return context
4242

4343

44-
class SelectionReasonPopUpViews(DetailView):
45-
template_name = 'popups/selectionReason.html'
46-
model = AP
47-
context_object_name = 'attackpattern'
48-
49-
def get(self, request, *args, **kwargs):
50-
return super(SelectionReasonPopUpViews, self).get(request, *args, **kwargs)
51-
52-
def get_object(self):
53-
#I would like to pass the APiD of AP to myID
54-
#This should just get a specific AP based on the myID value
55-
my_id = self.request.GET.get("my_id")
56-
other_param = self.request.GET.get("other_param")
57-
obj = get_object_or_404(AP, APid=my_id)
58-
return obj
59-
60-
61-
6244
# Register popup views
6345
registry_popup_view.register(SexPopupView)
6446
registry_popup_view.register(ColorPopupView)
6547
registry_popup_view.register(CountryPopupView)
66-
registry_popup_view.register(SelectionReasonPopUpViews)

demo/demo/templates/demo/APReview_new.html

-17
This file was deleted.

demo/demo/templates/popups/selectionReason.html

-5
This file was deleted.

demo/demo/urls.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from django.conf.urls import include, url
22
from django.contrib import admin
33

4-
from .views import Index, APReviewCreateView
4+
from .views import Index
55

66
urlpatterns = [
77
url(r'^admin/', admin.site.urls),
88
url(r'^$', Index.as_view(), name="index"),
9-
url(r'^ap/$', APReviewCreateView.as_view(), name="ap"),
109

1110
# django-popup-view-field
1211
url(r'^django_popup_view_field/', include('django_popup_view_field.urls')),

demo/demo/views.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.http import HttpResponse
2-
from django.views.generic import TemplateView, CreateView
2+
from django.views.generic import CreateView, TemplateView
33

4-
from .forms import DemoForm, APReviewForm
4+
from .forms import DemoForm
55

66

77
class Index(TemplateView):
@@ -35,9 +35,3 @@ def get_context_data(self, **kwargs):
3535
context["form_2"] = self.form_2
3636
context["form_3"] = self.form_3
3737
return context
38-
39-
40-
class APReviewCreateView(CreateView):
41-
form_class = APReviewForm
42-
template_name = 'demo/APReview_new.html'
43-
success_url = 'success'

django_popup_view_field/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
VERSION = (0, 3, 0)
1+
VERSION = (0, 4, 0)
22
__version__ = ".".join(str(i) for i in VERSION)

django_popup_view_field/fields.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import urllib
2+
13
from django.forms.fields import CharField
24
from django.utils.translation import ugettext_lazy as _
35
from django.views.generic import View
46

57
from .exceptions import PopupViewIsNotSubclassView
68
from .widgets import PopupViewWidget
7-
import urllib
89

910

1011
class PopupViewField(CharField):

django_popup_view_field/tests/test_field.py

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# encoding: utf-8
2+
from collections import OrderedDict
3+
24
from django import VERSION, forms
35
from django.forms.fields import CharField
46
from django.test import TestCase
@@ -50,7 +52,7 @@ class Form(forms.Form):
5052
assert html.find('''class="input-group-addon btn popup-view-btn-load"''') != -1
5153
assert html.find('''data-target="id_popup_view_field"''') != -1
5254
assert html.find('''data-popup-dialog-title="Popup Dialog: Select value"''') != -1
53-
assert html.find('''data-url = "/django_popup_view_field/PopupView/"''') != -1
55+
assert html.find('''data-url = "/django_popup_view_field/PopupView/?"''') != -1
5456

5557
class Form(forms.Form):
5658
popup_view_field = PopupViewField(
@@ -63,3 +65,34 @@ class Form(forms.Form):
6365
html = form.as_p()
6466
assert html.find('''data-popup-dialog-title="Foo Bar Title Window"''') != -1
6567
self.assertInHTML('''<span class="helptext">Test help text</span>''', html)
68+
69+
def test_callback_data_type_error(self):
70+
71+
class PopupView(View):
72+
pass
73+
74+
with self.assertRaises(AttributeError):
75+
PopupViewField(view_class=PopupView, callback_data="wrong type")
76+
77+
def test_callback_data(self):
78+
79+
class PopupView(View):
80+
pass
81+
82+
class Form(forms.Form):
83+
popup_view_field = PopupViewField(
84+
view_class=PopupView,
85+
callback_data=OrderedDict([
86+
('pk', 1),
87+
('name', "Some name"),
88+
('utf', "ąść"),
89+
('escape', '&?')
90+
])
91+
)
92+
93+
form = Form()
94+
html = form.as_p()
95+
assert (
96+
'"/django_popup_view_field/PopupView/'
97+
'?pk=1&amp;name=Some+name&amp;utf=%C4%85%C5%9B%C4%87&amp;escape=%26%3F"'
98+
) in html

django_popup_view_field/tests/test_views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_get_response(self):
3434
assert html.find('''class="input-group-addon btn popup-view-btn-load"''') != -1
3535
assert html.find('''data-target="id_field"''') != -1
3636
assert html.find('''data-popup-dialog-title="Test PopupView1 Title"''') != -1
37-
assert html.find('''data-url = "/django_popup_view_field/PopupView1/"''') != -1
37+
assert html.find('''data-url = "/django_popup_view_field/PopupView1/?"''') != -1
3838

3939
def test_post_response(self):
4040
response = self.client.post(self.url, {"field": "Test Value"})

django_popup_view_field/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ def get(self, request, *args, **kwargs):
1212
raise ValueError("view_class_name must be pass")
1313
else:
1414
view_class = registry_popup_view.get(view_class_name)
15-
return view_class.as_view()(request=request, **kwargs)
15+
return view_class.as_view()(request=request, *args, **kwargs)

setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# encoding:utf-8
2-
from setuptools import setup, find_packages
2+
from setuptools import find_packages, setup
3+
34
from django_popup_view_field import __version__ as version
45

56

tox.ini

+1-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ envlist=
55
{py27,py34}-dj_1.9-bootstrap_{7.1,8.1,8.2}-crispy_{1.5,1.6}-tests,
66
{py27,py34}-dj_1.10-bootstrap_{7.1,8.1,8.2}-crispy_{1.5,1.6}-tests,
77
{py27,py34}-dj_1.11-bootstrap_{8.2}-crispy_{1.6}-tests,
8-
{py27,py34}-flake,
9-
py34-isort
8+
{py27,py34}-flake
109

1110
[testenv]
1211
basepython =
@@ -17,7 +16,6 @@ pip_pre = true
1716

1817
deps =
1918
flake8
20-
isort
2119
dj_1.8: Django>=1.8,<1.9
2220
dj_1.9: Django>=1.9,<1.10
2321
dj_1.10: Django>=1.9,<1.11
@@ -31,4 +29,3 @@ deps =
3129
commands =
3230
tests: ./run_test.py
3331
flake: flake8
34-
isort: isort -rc -w80 -m3 -tc -c -df django_popup_view_field run_test.py

0 commit comments

Comments
 (0)