Merge ~woutervb/django-piston:django2 into django-piston: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)
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)

To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

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.

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
1diff --git a/.gitignore b/.gitignore
2new file mode 100644
3index 0000000..5ec9e22
4--- /dev/null
5+++ b/.gitignore
6@@ -0,0 +1,7 @@
7+.bzr/
8+.tox/
9+*.sqlite3
10+__pycache__/
11+*.egg-info/
12+build/
13+dist/
14diff --git a/demo/settings.py b/demo/settings.py
15index 8fe3b5f..897f821 100644
16--- a/demo/settings.py
17+++ b/demo/settings.py
18@@ -42,23 +42,34 @@ INSTALLED_APPS = (
19 'piston',
20 )
21
22-MIDDLEWARE_CLASSES = [
23+MIDDLEWARE = [
24+ 'django.middleware.security.SecurityMiddleware',
25 'django.contrib.sessions.middleware.SessionMiddleware',
26 'django.middleware.common.CommonMiddleware',
27 'django.middleware.csrf.CsrfViewMiddleware',
28 'django.contrib.auth.middleware.AuthenticationMiddleware',
29- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
30 'django.contrib.messages.middleware.MessageMiddleware',
31 'django.middleware.clickjacking.XFrameOptionsMiddleware',
32 ]
33
34-if django.VERSION < (1, 7):
35- INSTALLED_APPS += ('south',)
36- MIDDLEWARE_CLASSES.remove(
37- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware')
38-
39 ROOT_URLCONF = 'demo.urls'
40
41+TEMPLATES = [
42+ {
43+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
44+ 'DIRS': [],
45+ 'APP_DIRS': True,
46+ 'OPTIONS': {
47+ 'context_processors': [
48+ 'django.template.context_processors.debug',
49+ 'django.template.context_processors.request',
50+ 'django.contrib.auth.context_processors.auth',
51+ 'django.contrib.messages.context_processors.messages',
52+ ],
53+ },
54+ },
55+]
56+
57 WSGI_APPLICATION = 'demo.wsgi.application'
58
59
60diff --git a/demo/urls.py b/demo/urls.py
61index 5c75bae..70a00f1 100644
62--- a/demo/urls.py
63+++ b/demo/urls.py
64@@ -6,5 +6,5 @@ urlpatterns = [
65 # url(r'^$', 'demo.views.home', name='home'),
66 # url(r'^blog/', include('blog.urls')),
67
68- url(r'^admin/', include(admin.site.urls)),
69+ url(r'^admin/', admin.site.urls),
70 ]
71diff --git a/piston/__init__.py b/piston/__init__.py
72index dc7d064..a5ec16b 100644
73--- a/piston/__init__.py
74+++ b/piston/__init__.py
75@@ -1,4 +1,4 @@
76-__version__ = '0.2.5'
77+__version__ = '2.2.5'
78
79
80 def get_version():
81diff --git a/piston/authentication.py b/piston/authentication.py
82index b02638d..f0cf1c6 100644
83--- a/piston/authentication.py
84+++ b/piston/authentication.py
85@@ -1,5 +1,3 @@
86-from __future__ import print_function
87-from __future__ import absolute_import
88 from builtins import object
89 import binascii
90
91@@ -10,7 +8,7 @@ from django.contrib.auth.decorators import login_required
92 from django.template import loader
93 from django.contrib.auth import authenticate
94 from django.conf import settings
95-from django.core.urlresolvers import get_callable
96+from django.urls import get_callable
97 from django.core.exceptions import ImproperlyConfigured
98 from django.shortcuts import render_to_response
99 from django.template import RequestContext
100diff --git a/piston/doc.py b/piston/doc.py
101index a9aa009..d7d21da 100644
102--- a/piston/doc.py
103+++ b/piston/doc.py
104@@ -5,7 +5,7 @@ import inspect
105
106 from piston.handler import HandlerMetaClass, handler_tracker
107
108-from django.core.urlresolvers import get_resolver, get_callable, get_script_prefix
109+from django.urls import get_resolver, get_callable, get_script_prefix
110 from django.shortcuts import render_to_response
111 from django.template import RequestContext
112
113diff --git a/piston/emitters.py b/piston/emitters.py
114index 79e9fb1..826ff12 100644
115--- a/piston/emitters.py
116+++ b/piston/emitters.py
117@@ -1,6 +1,6 @@
118-from __future__ import absolute_import, generators
119-from future import standard_library
120-standard_library.install_aliases()
121+import decimal, re, inspect
122+import copy
123+
124 from builtins import str
125 from past.builtins import basestring
126 from builtins import object
127@@ -18,10 +18,10 @@ except ImportError:
128 yaml = None
129
130 from django.db.models.query import QuerySet
131-from django.db.models import Model, permalink
132+from django.db.models import Model
133 from django.utils.xmlutils import SimplerXMLGenerator
134 from django.utils.encoding import smart_text
135-from django.core.urlresolvers import NoReverseMatch
136+from django.urls import reverse, NoReverseMatch
137 try:
138 from django.core.serializers.json import DjangoJSONEncoder
139 except ImportError:
140@@ -36,7 +36,7 @@ import io as StringIO
141 import pickle as pickle
142
143 # Allow people to change the reverser (default `permalink`).
144-reverser = permalink
145+reverser = reverse
146
147 class Emitter(object):
148 """
149diff --git a/piston/handler.py b/piston/handler.py
150index 12a0540..2b2b11a 100644
151--- a/piston/handler.py
152+++ b/piston/handler.py
153@@ -1,4 +1,3 @@
154-from __future__ import absolute_import
155 from builtins import str
156 from builtins import object
157 import warnings
158diff --git a/piston/migrations/0001_initial.py b/piston/migrations/0001_initial.py
159index e5948ee..97f8ea4 100644
160--- a/piston/migrations/0001_initial.py
161+++ b/piston/migrations/0001_initial.py
162@@ -1,6 +1,4 @@
163 # -*- coding: utf-8 -*-
164-from __future__ import unicode_literals
165-
166 from django.db import models, migrations
167 from django.conf import settings
168 import time
169@@ -22,7 +20,7 @@ class Migration(migrations.Migration):
170 ('key', models.CharField(max_length=18)),
171 ('secret', models.CharField(max_length=32)),
172 ('status', models.CharField(default='pending', max_length=16, choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('canceled', 'Canceled'), ('rejected', 'Rejected')])),
173- ('user', models.ForeignKey(related_name='consumers', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
174+ ('user', models.ForeignKey(related_name='consumers', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
175 ],
176 ),
177 migrations.CreateModel(
178@@ -46,8 +44,8 @@ class Migration(migrations.Migration):
179 ('is_approved', models.BooleanField(default=False)),
180 ('callback', models.CharField(max_length=255, null=True, blank=True)),
181 ('callback_confirmed', models.BooleanField(default=False)),
182- ('consumer', models.ForeignKey(to='piston.Consumer')),
183- ('user', models.ForeignKey(related_name='tokens', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
184+ ('consumer', models.ForeignKey(to='piston.Consumer', on_delete=models.CASCADE)),
185+ ('user', models.ForeignKey(related_name='tokens', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
186 ],
187 ),
188 ]
189diff --git a/piston/models.py b/piston/models.py
190index 4fa1f2c..8df4925 100644
191--- a/piston/models.py
192+++ b/piston/models.py
193@@ -1,6 +1,3 @@
194-from __future__ import absolute_import
195-from future import standard_library
196-standard_library.install_aliases()
197 import time
198 import urllib.request, urllib.parse, urllib.error
199 import urllib.parse
200@@ -45,7 +42,7 @@ class Consumer(models.Model):
201 secret = models.CharField(max_length=SECRET_SIZE)
202
203 status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending')
204- user = models.ForeignKey(User, null=True, blank=True, related_name='consumers')
205+ user = models.ForeignKey(User, null=True, blank=True, related_name='consumers', on_delete=models.CASCADE)
206
207 objects = ConsumerManager()
208
209@@ -86,8 +83,8 @@ class Token(models.Model):
210 timestamp = models.IntegerField(default=time.time)
211 is_approved = models.BooleanField(default=False)
212
213- user = models.ForeignKey(User, null=True, blank=True, related_name='tokens')
214- consumer = models.ForeignKey(Consumer)
215+ user = models.ForeignKey(User, null=True, blank=True, related_name='tokens', on_delete=models.CASCADE)
216+ consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE)
217
218 callback = models.CharField(max_length=255, null=True, blank=True)
219 callback_confirmed = models.BooleanField(default=False)
220diff --git a/piston/resource.py b/piston/resource.py
221index 2a63c27..0470245 100644
222--- a/piston/resource.py
223+++ b/piston/resource.py
224@@ -1,4 +1,3 @@
225-from __future__ import absolute_import
226 from builtins import str
227 from builtins import object
228 import sys
229@@ -337,6 +336,6 @@ class Resource(object):
230 self.email_exception(rep)
231 if self.display_errors:
232 return HttpResponseServerError(
233- format_error('\n'.join(rep.format_exception())))
234+ format_error('\n'.join(rep.get_traceback_data())))
235 else:
236 raise
237diff --git a/piston/signals.py b/piston/signals.py
238index 5d0336c..14fe196 100644
239--- a/piston/signals.py
240+++ b/piston/signals.py
241@@ -1,4 +1,3 @@
242-from __future__ import absolute_import
243 # Piston imports
244 from .utils import send_consumer_mail
245
246diff --git a/piston/store.py b/piston/store.py
247index ea43e63..007a349 100644
248--- a/piston/store.py
249+++ b/piston/store.py
250@@ -1,4 +1,3 @@
251-from __future__ import absolute_import
252 from . import oauth
253
254 from .models import Nonce, Token, Consumer
255@@ -73,4 +72,4 @@ class DataStore(oauth.OAuthDataStore):
256 self.request_token.verifier = generate_random(VERIFIER_SIZE)
257 self.request_token.save()
258 return self.request_token
259- return None
260\ No newline at end of file
261+ return None
262diff --git a/piston/utils.py b/piston/utils.py
263index c952bb9..8e76718 100644
264--- a/piston/utils.py
265+++ b/piston/utils.py
266@@ -1,5 +1,3 @@
267-from __future__ import print_function
268-from __future__ import absolute_import
269 from builtins import str
270 from past.builtins import basestring
271 from builtins import object
272diff --git a/tox.ini b/tox.ini
273index 00bc6ab..f174604 100644
274--- a/tox.ini
275+++ b/tox.ini
276@@ -1,62 +1,9 @@
277 [tox]
278 envlist =
279- 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
280+ py36, py37, py38
281+skip_missing_interpreters = true
282
283 [testenv]
284 commands = python manage.py test piston
285-deps = mock
286-install_command = pip install -i https://pypi.org/simple {opts} {packages}
287-
288-[testenv:py27]
289-basepython = python2.7
290-
291-[testenv:py35]
292-basepython = python3.5
293-
294-[testenv:py27-django1.4]
295-deps =
296- django >= 1.4, < 1.5
297- south==1.0
298- {[testenv]deps}
299-
300-[testenv:py27-django1.5]
301-deps =
302- django >= 1.5, < 1.6
303- south==1.0
304- {[testenv]deps}
305-
306-[testenv:py27-django1.6]
307-deps =
308- django >= 1.6, < 1.7
309- south==1.0
310- {[testenv]deps}
311-
312-[testenv:py27-django1.7]
313-deps =
314- django >= 1.7, < 1.8
315- {[testenv]deps}
316-
317-[testenv:py27-django1.8]
318-deps =
319- django >= 1.8, < 1.9
320- {[testenv]deps}
321-
322-[testenv:py27-django1.9]
323-deps =
324- django >= 1.9, < 1.10
325- {[testenv]deps}
326-
327-[testenv:py27-django1.10]
328-deps =
329- django >= 1.10, < 1.11
330- {[testenv]deps}
331-
332-[testenv:py27-django1.11]
333-deps =
334- django >= 1.11, < 1.12
335- {[testenv]deps}
336-
337-[testenv:py35-django1.11]
338 deps =
339- django >= 1.11, < 1.12
340- {[testenv]deps}
341+ django>=2.2,<3

Subscribers

People subscribed via source and target branches