Merge ~woutervb/django-piston:django2 into django-piston:master
- Git
- lp:~woutervb/django-piston
- django2
- Merge into master
Proposed by
Wouter van Bommel
Status: | Merged |
---|---|
Approved by: | Wouter van Bommel |
Approved revision: | dca08f3f9530ef878d2af27dfaba6e604e98dbb2 |
Merge reported by: | Otto Co-Pilot |
Merged at revision: | not available |
Proposed branch: | ~woutervb/django-piston:django2 |
Merge into: | django-piston:master |
Diff against target: |
341 lines (+46/-94) 15 files modified
.gitignore (+7/-0) demo/settings.py (+18/-7) demo/urls.py (+1/-1) piston/__init__.py (+1/-1) piston/authentication.py (+1/-3) piston/doc.py (+1/-1) piston/emitters.py (+6/-6) piston/handler.py (+0/-1) piston/migrations/0001_initial.py (+3/-5) piston/models.py (+3/-6) piston/resource.py (+1/-2) piston/signals.py (+0/-1) piston/store.py (+1/-2) piston/utils.py (+0/-2) tox.ini (+3/-56) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Natalia Bidart (community) | Approve | ||
Review via email: mp+391980@code.launchpad.net |
Commit message
Implement the changes so that django-piston is compatible with django2.
We will need out own version, as the one found on internet / github does not include the migrations (and has other changes which might not be compatible)
Description of the change
To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote : | # |
review:
Needs Information
Revision history for this message
Wouter van Bommel (woutervb) wrote : | # |
Hi Natalia,
Some responses inline.
1 - will look into that, I did not run the demo and the unittest did not pick this up
2 - same
3 - Can make that change, is probably cleaner
Revision history for this message
Natalia Bidart (nataliabidart) wrote : | # |
Thanks Wouter, overall looks good but I wonder about the tox min version, in xenial we get as new as 2.3.1, is it 3.13 really needed?
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/.gitignore b/.gitignore | |||
2 | 0 | new file mode 100644 | 0 | new file mode 100644 |
3 | index 0000000..5ec9e22 | |||
4 | --- /dev/null | |||
5 | +++ b/.gitignore | |||
6 | @@ -0,0 +1,7 @@ | |||
7 | 1 | .bzr/ | ||
8 | 2 | .tox/ | ||
9 | 3 | *.sqlite3 | ||
10 | 4 | __pycache__/ | ||
11 | 5 | *.egg-info/ | ||
12 | 6 | build/ | ||
13 | 7 | dist/ | ||
14 | diff --git a/demo/settings.py b/demo/settings.py | |||
15 | index 8fe3b5f..897f821 100644 | |||
16 | --- a/demo/settings.py | |||
17 | +++ b/demo/settings.py | |||
18 | @@ -42,23 +42,34 @@ INSTALLED_APPS = ( | |||
19 | 42 | 'piston', | 42 | 'piston', |
20 | 43 | ) | 43 | ) |
21 | 44 | 44 | ||
23 | 45 | MIDDLEWARE_CLASSES = [ | 45 | MIDDLEWARE = [ |
24 | 46 | 'django.middleware.security.SecurityMiddleware', | ||
25 | 46 | 'django.contrib.sessions.middleware.SessionMiddleware', | 47 | 'django.contrib.sessions.middleware.SessionMiddleware', |
26 | 47 | 'django.middleware.common.CommonMiddleware', | 48 | 'django.middleware.common.CommonMiddleware', |
27 | 48 | 'django.middleware.csrf.CsrfViewMiddleware', | 49 | 'django.middleware.csrf.CsrfViewMiddleware', |
28 | 49 | 'django.contrib.auth.middleware.AuthenticationMiddleware', | 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', |
29 | 50 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | ||
30 | 51 | 'django.contrib.messages.middleware.MessageMiddleware', | 51 | 'django.contrib.messages.middleware.MessageMiddleware', |
31 | 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', | 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', |
32 | 53 | ] | 53 | ] |
33 | 54 | 54 | ||
34 | 55 | if django.VERSION < (1, 7): | ||
35 | 56 | INSTALLED_APPS += ('south',) | ||
36 | 57 | MIDDLEWARE_CLASSES.remove( | ||
37 | 58 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware') | ||
38 | 59 | |||
39 | 60 | ROOT_URLCONF = 'demo.urls' | 55 | ROOT_URLCONF = 'demo.urls' |
40 | 61 | 56 | ||
41 | 57 | TEMPLATES = [ | ||
42 | 58 | { | ||
43 | 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||
44 | 60 | 'DIRS': [], | ||
45 | 61 | 'APP_DIRS': True, | ||
46 | 62 | 'OPTIONS': { | ||
47 | 63 | 'context_processors': [ | ||
48 | 64 | 'django.template.context_processors.debug', | ||
49 | 65 | 'django.template.context_processors.request', | ||
50 | 66 | 'django.contrib.auth.context_processors.auth', | ||
51 | 67 | 'django.contrib.messages.context_processors.messages', | ||
52 | 68 | ], | ||
53 | 69 | }, | ||
54 | 70 | }, | ||
55 | 71 | ] | ||
56 | 72 | |||
57 | 62 | WSGI_APPLICATION = 'demo.wsgi.application' | 73 | WSGI_APPLICATION = 'demo.wsgi.application' |
58 | 63 | 74 | ||
59 | 64 | 75 | ||
60 | diff --git a/demo/urls.py b/demo/urls.py | |||
61 | index 5c75bae..70a00f1 100644 | |||
62 | --- a/demo/urls.py | |||
63 | +++ b/demo/urls.py | |||
64 | @@ -6,5 +6,5 @@ urlpatterns = [ | |||
65 | 6 | # url(r'^$', 'demo.views.home', name='home'), | 6 | # url(r'^$', 'demo.views.home', name='home'), |
66 | 7 | # url(r'^blog/', include('blog.urls')), | 7 | # url(r'^blog/', include('blog.urls')), |
67 | 8 | 8 | ||
69 | 9 | url(r'^admin/', include(admin.site.urls)), | 9 | url(r'^admin/', admin.site.urls), |
70 | 10 | ] | 10 | ] |
71 | diff --git a/piston/__init__.py b/piston/__init__.py | |||
72 | index dc7d064..a5ec16b 100644 | |||
73 | --- a/piston/__init__.py | |||
74 | +++ b/piston/__init__.py | |||
75 | @@ -1,4 +1,4 @@ | |||
77 | 1 | __version__ = '0.2.5' | 1 | __version__ = '2.2.5' |
78 | 2 | 2 | ||
79 | 3 | 3 | ||
80 | 4 | def get_version(): | 4 | def get_version(): |
81 | diff --git a/piston/authentication.py b/piston/authentication.py | |||
82 | index b02638d..f0cf1c6 100644 | |||
83 | --- a/piston/authentication.py | |||
84 | +++ b/piston/authentication.py | |||
85 | @@ -1,5 +1,3 @@ | |||
86 | 1 | from __future__ import print_function | ||
87 | 2 | from __future__ import absolute_import | ||
88 | 3 | from builtins import object | 1 | from builtins import object |
89 | 4 | import binascii | 2 | import binascii |
90 | 5 | 3 | ||
91 | @@ -10,7 +8,7 @@ from django.contrib.auth.decorators import login_required | |||
92 | 10 | from django.template import loader | 8 | from django.template import loader |
93 | 11 | from django.contrib.auth import authenticate | 9 | from django.contrib.auth import authenticate |
94 | 12 | from django.conf import settings | 10 | from django.conf import settings |
96 | 13 | from django.core.urlresolvers import get_callable | 11 | from django.urls import get_callable |
97 | 14 | from django.core.exceptions import ImproperlyConfigured | 12 | from django.core.exceptions import ImproperlyConfigured |
98 | 15 | from django.shortcuts import render_to_response | 13 | from django.shortcuts import render_to_response |
99 | 16 | from django.template import RequestContext | 14 | from django.template import RequestContext |
100 | diff --git a/piston/doc.py b/piston/doc.py | |||
101 | index a9aa009..d7d21da 100644 | |||
102 | --- a/piston/doc.py | |||
103 | +++ b/piston/doc.py | |||
104 | @@ -5,7 +5,7 @@ import inspect | |||
105 | 5 | 5 | ||
106 | 6 | from piston.handler import HandlerMetaClass, handler_tracker | 6 | from piston.handler import HandlerMetaClass, handler_tracker |
107 | 7 | 7 | ||
109 | 8 | from django.core.urlresolvers import get_resolver, get_callable, get_script_prefix | 8 | from django.urls import get_resolver, get_callable, get_script_prefix |
110 | 9 | from django.shortcuts import render_to_response | 9 | from django.shortcuts import render_to_response |
111 | 10 | from django.template import RequestContext | 10 | from django.template import RequestContext |
112 | 11 | 11 | ||
113 | diff --git a/piston/emitters.py b/piston/emitters.py | |||
114 | index 79e9fb1..826ff12 100644 | |||
115 | --- a/piston/emitters.py | |||
116 | +++ b/piston/emitters.py | |||
117 | @@ -1,6 +1,6 @@ | |||
121 | 1 | from __future__ import absolute_import, generators | 1 | import decimal, re, inspect |
122 | 2 | from future import standard_library | 2 | import copy |
123 | 3 | standard_library.install_aliases() | 3 | |
124 | 4 | from builtins import str | 4 | from builtins import str |
125 | 5 | from past.builtins import basestring | 5 | from past.builtins import basestring |
126 | 6 | from builtins import object | 6 | from builtins import object |
127 | @@ -18,10 +18,10 @@ except ImportError: | |||
128 | 18 | yaml = None | 18 | yaml = None |
129 | 19 | 19 | ||
130 | 20 | from django.db.models.query import QuerySet | 20 | from django.db.models.query import QuerySet |
132 | 21 | from django.db.models import Model, permalink | 21 | from django.db.models import Model |
133 | 22 | from django.utils.xmlutils import SimplerXMLGenerator | 22 | from django.utils.xmlutils import SimplerXMLGenerator |
134 | 23 | from django.utils.encoding import smart_text | 23 | from django.utils.encoding import smart_text |
136 | 24 | from django.core.urlresolvers import NoReverseMatch | 24 | from django.urls import reverse, NoReverseMatch |
137 | 25 | try: | 25 | try: |
138 | 26 | from django.core.serializers.json import DjangoJSONEncoder | 26 | from django.core.serializers.json import DjangoJSONEncoder |
139 | 27 | except ImportError: | 27 | except ImportError: |
140 | @@ -36,7 +36,7 @@ import io as StringIO | |||
141 | 36 | import pickle as pickle | 36 | import pickle as pickle |
142 | 37 | 37 | ||
143 | 38 | # Allow people to change the reverser (default `permalink`). | 38 | # Allow people to change the reverser (default `permalink`). |
145 | 39 | reverser = permalink | 39 | reverser = reverse |
146 | 40 | 40 | ||
147 | 41 | class Emitter(object): | 41 | class Emitter(object): |
148 | 42 | """ | 42 | """ |
149 | diff --git a/piston/handler.py b/piston/handler.py | |||
150 | index 12a0540..2b2b11a 100644 | |||
151 | --- a/piston/handler.py | |||
152 | +++ b/piston/handler.py | |||
153 | @@ -1,4 +1,3 @@ | |||
154 | 1 | from __future__ import absolute_import | ||
155 | 2 | from builtins import str | 1 | from builtins import str |
156 | 3 | from builtins import object | 2 | from builtins import object |
157 | 4 | import warnings | 3 | import warnings |
158 | diff --git a/piston/migrations/0001_initial.py b/piston/migrations/0001_initial.py | |||
159 | index e5948ee..97f8ea4 100644 | |||
160 | --- a/piston/migrations/0001_initial.py | |||
161 | +++ b/piston/migrations/0001_initial.py | |||
162 | @@ -1,6 +1,4 @@ | |||
163 | 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
164 | 2 | from __future__ import unicode_literals | ||
165 | 3 | |||
166 | 4 | from django.db import models, migrations | 2 | from django.db import models, migrations |
167 | 5 | from django.conf import settings | 3 | from django.conf import settings |
168 | 6 | import time | 4 | import time |
169 | @@ -22,7 +20,7 @@ class Migration(migrations.Migration): | |||
170 | 22 | ('key', models.CharField(max_length=18)), | 20 | ('key', models.CharField(max_length=18)), |
171 | 23 | ('secret', models.CharField(max_length=32)), | 21 | ('secret', models.CharField(max_length=32)), |
172 | 24 | ('status', models.CharField(default='pending', max_length=16, choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('canceled', 'Canceled'), ('rejected', 'Rejected')])), | 22 | ('status', models.CharField(default='pending', max_length=16, choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('canceled', 'Canceled'), ('rejected', 'Rejected')])), |
174 | 25 | ('user', models.ForeignKey(related_name='consumers', blank=True, to=settings.AUTH_USER_MODEL, null=True)), | 23 | ('user', models.ForeignKey(related_name='consumers', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), |
175 | 26 | ], | 24 | ], |
176 | 27 | ), | 25 | ), |
177 | 28 | migrations.CreateModel( | 26 | migrations.CreateModel( |
178 | @@ -46,8 +44,8 @@ class Migration(migrations.Migration): | |||
179 | 46 | ('is_approved', models.BooleanField(default=False)), | 44 | ('is_approved', models.BooleanField(default=False)), |
180 | 47 | ('callback', models.CharField(max_length=255, null=True, blank=True)), | 45 | ('callback', models.CharField(max_length=255, null=True, blank=True)), |
181 | 48 | ('callback_confirmed', models.BooleanField(default=False)), | 46 | ('callback_confirmed', models.BooleanField(default=False)), |
184 | 49 | ('consumer', models.ForeignKey(to='piston.Consumer')), | 47 | ('consumer', models.ForeignKey(to='piston.Consumer', on_delete=models.CASCADE)), |
185 | 50 | ('user', models.ForeignKey(related_name='tokens', blank=True, to=settings.AUTH_USER_MODEL, null=True)), | 48 | ('user', models.ForeignKey(related_name='tokens', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), |
186 | 51 | ], | 49 | ], |
187 | 52 | ), | 50 | ), |
188 | 53 | ] | 51 | ] |
189 | diff --git a/piston/models.py b/piston/models.py | |||
190 | index 4fa1f2c..8df4925 100644 | |||
191 | --- a/piston/models.py | |||
192 | +++ b/piston/models.py | |||
193 | @@ -1,6 +1,3 @@ | |||
194 | 1 | from __future__ import absolute_import | ||
195 | 2 | from future import standard_library | ||
196 | 3 | standard_library.install_aliases() | ||
197 | 4 | import time | 1 | import time |
198 | 5 | import urllib.request, urllib.parse, urllib.error | 2 | import urllib.request, urllib.parse, urllib.error |
199 | 6 | import urllib.parse | 3 | import urllib.parse |
200 | @@ -45,7 +42,7 @@ class Consumer(models.Model): | |||
201 | 45 | secret = models.CharField(max_length=SECRET_SIZE) | 42 | secret = models.CharField(max_length=SECRET_SIZE) |
202 | 46 | 43 | ||
203 | 47 | status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending') | 44 | status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending') |
205 | 48 | user = models.ForeignKey(User, null=True, blank=True, related_name='consumers') | 45 | user = models.ForeignKey(User, null=True, blank=True, related_name='consumers', on_delete=models.CASCADE) |
206 | 49 | 46 | ||
207 | 50 | objects = ConsumerManager() | 47 | objects = ConsumerManager() |
208 | 51 | 48 | ||
209 | @@ -86,8 +83,8 @@ class Token(models.Model): | |||
210 | 86 | timestamp = models.IntegerField(default=time.time) | 83 | timestamp = models.IntegerField(default=time.time) |
211 | 87 | is_approved = models.BooleanField(default=False) | 84 | is_approved = models.BooleanField(default=False) |
212 | 88 | 85 | ||
215 | 89 | user = models.ForeignKey(User, null=True, blank=True, related_name='tokens') | 86 | user = models.ForeignKey(User, null=True, blank=True, related_name='tokens', on_delete=models.CASCADE) |
216 | 90 | consumer = models.ForeignKey(Consumer) | 87 | consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE) |
217 | 91 | 88 | ||
218 | 92 | callback = models.CharField(max_length=255, null=True, blank=True) | 89 | callback = models.CharField(max_length=255, null=True, blank=True) |
219 | 93 | callback_confirmed = models.BooleanField(default=False) | 90 | callback_confirmed = models.BooleanField(default=False) |
220 | diff --git a/piston/resource.py b/piston/resource.py | |||
221 | index 2a63c27..0470245 100644 | |||
222 | --- a/piston/resource.py | |||
223 | +++ b/piston/resource.py | |||
224 | @@ -1,4 +1,3 @@ | |||
225 | 1 | from __future__ import absolute_import | ||
226 | 2 | from builtins import str | 1 | from builtins import str |
227 | 3 | from builtins import object | 2 | from builtins import object |
228 | 4 | import sys | 3 | import sys |
229 | @@ -337,6 +336,6 @@ class Resource(object): | |||
230 | 337 | self.email_exception(rep) | 336 | self.email_exception(rep) |
231 | 338 | if self.display_errors: | 337 | if self.display_errors: |
232 | 339 | return HttpResponseServerError( | 338 | return HttpResponseServerError( |
234 | 340 | format_error('\n'.join(rep.format_exception()))) | 339 | format_error('\n'.join(rep.get_traceback_data()))) |
235 | 341 | else: | 340 | else: |
236 | 342 | raise | 341 | raise |
237 | diff --git a/piston/signals.py b/piston/signals.py | |||
238 | index 5d0336c..14fe196 100644 | |||
239 | --- a/piston/signals.py | |||
240 | +++ b/piston/signals.py | |||
241 | @@ -1,4 +1,3 @@ | |||
242 | 1 | from __future__ import absolute_import | ||
243 | 2 | # Piston imports | 1 | # Piston imports |
244 | 3 | from .utils import send_consumer_mail | 2 | from .utils import send_consumer_mail |
245 | 4 | 3 | ||
246 | diff --git a/piston/store.py b/piston/store.py | |||
247 | index ea43e63..007a349 100644 | |||
248 | --- a/piston/store.py | |||
249 | +++ b/piston/store.py | |||
250 | @@ -1,4 +1,3 @@ | |||
251 | 1 | from __future__ import absolute_import | ||
252 | 2 | from . import oauth | 1 | from . import oauth |
253 | 3 | 2 | ||
254 | 4 | from .models import Nonce, Token, Consumer | 3 | from .models import Nonce, Token, Consumer |
255 | @@ -73,4 +72,4 @@ class DataStore(oauth.OAuthDataStore): | |||
256 | 73 | self.request_token.verifier = generate_random(VERIFIER_SIZE) | 72 | self.request_token.verifier = generate_random(VERIFIER_SIZE) |
257 | 74 | self.request_token.save() | 73 | self.request_token.save() |
258 | 75 | return self.request_token | 74 | return self.request_token |
259 | 76 | return None | ||
260 | 77 | \ No newline at end of file | 75 | \ No newline at end of file |
261 | 76 | return None | ||
262 | diff --git a/piston/utils.py b/piston/utils.py | |||
263 | index c952bb9..8e76718 100644 | |||
264 | --- a/piston/utils.py | |||
265 | +++ b/piston/utils.py | |||
266 | @@ -1,5 +1,3 @@ | |||
267 | 1 | from __future__ import print_function | ||
268 | 2 | from __future__ import absolute_import | ||
269 | 3 | from builtins import str | 1 | from builtins import str |
270 | 4 | from past.builtins import basestring | 2 | from past.builtins import basestring |
271 | 5 | from builtins import object | 3 | from builtins import object |
272 | diff --git a/tox.ini b/tox.ini | |||
273 | index 00bc6ab..f174604 100644 | |||
274 | --- a/tox.ini | |||
275 | +++ b/tox.ini | |||
276 | @@ -1,62 +1,9 @@ | |||
277 | 1 | [tox] | 1 | [tox] |
278 | 2 | envlist = | 2 | envlist = |
280 | 3 | py27-django1.4, py27-django1.5, py27-django1.6, py27-django1.7, py27-django1.8, py27-django1.9, py27-django1.10, py27-django1.11, py35-django1.11 | 3 | py36, py37, py38 |
281 | 4 | skip_missing_interpreters = true | ||
282 | 4 | 5 | ||
283 | 5 | [testenv] | 6 | [testenv] |
284 | 6 | commands = python manage.py test piston | 7 | commands = python manage.py test piston |
285 | 7 | deps = mock | ||
286 | 8 | install_command = pip install -i https://pypi.org/simple {opts} {packages} | ||
287 | 9 | |||
288 | 10 | [testenv:py27] | ||
289 | 11 | basepython = python2.7 | ||
290 | 12 | |||
291 | 13 | [testenv:py35] | ||
292 | 14 | basepython = python3.5 | ||
293 | 15 | |||
294 | 16 | [testenv:py27-django1.4] | ||
295 | 17 | deps = | ||
296 | 18 | django >= 1.4, < 1.5 | ||
297 | 19 | south==1.0 | ||
298 | 20 | {[testenv]deps} | ||
299 | 21 | |||
300 | 22 | [testenv:py27-django1.5] | ||
301 | 23 | deps = | ||
302 | 24 | django >= 1.5, < 1.6 | ||
303 | 25 | south==1.0 | ||
304 | 26 | {[testenv]deps} | ||
305 | 27 | |||
306 | 28 | [testenv:py27-django1.6] | ||
307 | 29 | deps = | ||
308 | 30 | django >= 1.6, < 1.7 | ||
309 | 31 | south==1.0 | ||
310 | 32 | {[testenv]deps} | ||
311 | 33 | |||
312 | 34 | [testenv:py27-django1.7] | ||
313 | 35 | deps = | ||
314 | 36 | django >= 1.7, < 1.8 | ||
315 | 37 | {[testenv]deps} | ||
316 | 38 | |||
317 | 39 | [testenv:py27-django1.8] | ||
318 | 40 | deps = | ||
319 | 41 | django >= 1.8, < 1.9 | ||
320 | 42 | {[testenv]deps} | ||
321 | 43 | |||
322 | 44 | [testenv:py27-django1.9] | ||
323 | 45 | deps = | ||
324 | 46 | django >= 1.9, < 1.10 | ||
325 | 47 | {[testenv]deps} | ||
326 | 48 | |||
327 | 49 | [testenv:py27-django1.10] | ||
328 | 50 | deps = | ||
329 | 51 | django >= 1.10, < 1.11 | ||
330 | 52 | {[testenv]deps} | ||
331 | 53 | |||
332 | 54 | [testenv:py27-django1.11] | ||
333 | 55 | deps = | ||
334 | 56 | django >= 1.11, < 1.12 | ||
335 | 57 | {[testenv]deps} | ||
336 | 58 | |||
337 | 59 | [testenv:py35-django1.11] | ||
338 | 60 | deps = | 8 | deps = |
341 | 61 | django >= 1.11, < 1.12 | 9 | django>=2.2,<3 |
340 | 62 | {[testenv]deps} |
Hey Wouter, thanks for this work. A few suggestions/ comments:
1- the demo/settings.py needs modernizing for the TEMPLATE_DEBUG setting
2- it seems like the demo/urls.py hasn't been migrated to Django2, did you happen to confirm that demo project works?
3- any reason to import json as simplejson instead of just migrating references to simplesjson->json?
And I added a few inline commnets below.