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
diff --git a/.gitignore b/.gitignore
0new file mode 1006440new file mode 100644
index 0000000..5ec9e22
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
1.bzr/
2.tox/
3*.sqlite3
4__pycache__/
5*.egg-info/
6build/
7dist/
diff --git a/demo/settings.py b/demo/settings.py
index 8fe3b5f..897f821 100644
--- a/demo/settings.py
+++ b/demo/settings.py
@@ -42,23 +42,34 @@ INSTALLED_APPS = (
42 'piston',42 'piston',
43)43)
4444
45MIDDLEWARE_CLASSES = [45MIDDLEWARE = [
46 'django.middleware.security.SecurityMiddleware',
46 'django.contrib.sessions.middleware.SessionMiddleware',47 'django.contrib.sessions.middleware.SessionMiddleware',
47 'django.middleware.common.CommonMiddleware',48 'django.middleware.common.CommonMiddleware',
48 'django.middleware.csrf.CsrfViewMiddleware',49 'django.middleware.csrf.CsrfViewMiddleware',
49 'django.contrib.auth.middleware.AuthenticationMiddleware',50 'django.contrib.auth.middleware.AuthenticationMiddleware',
50 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
51 'django.contrib.messages.middleware.MessageMiddleware',51 'django.contrib.messages.middleware.MessageMiddleware',
52 'django.middleware.clickjacking.XFrameOptionsMiddleware',52 'django.middleware.clickjacking.XFrameOptionsMiddleware',
53]53]
5454
55if django.VERSION < (1, 7):
56 INSTALLED_APPS += ('south',)
57 MIDDLEWARE_CLASSES.remove(
58 'django.contrib.auth.middleware.SessionAuthenticationMiddleware')
59
60ROOT_URLCONF = 'demo.urls'55ROOT_URLCONF = 'demo.urls'
6156
57TEMPLATES = [
58 {
59 'BACKEND': 'django.template.backends.django.DjangoTemplates',
60 'DIRS': [],
61 'APP_DIRS': True,
62 'OPTIONS': {
63 'context_processors': [
64 'django.template.context_processors.debug',
65 'django.template.context_processors.request',
66 'django.contrib.auth.context_processors.auth',
67 'django.contrib.messages.context_processors.messages',
68 ],
69 },
70 },
71]
72
62WSGI_APPLICATION = 'demo.wsgi.application'73WSGI_APPLICATION = 'demo.wsgi.application'
6374
6475
diff --git a/demo/urls.py b/demo/urls.py
index 5c75bae..70a00f1 100644
--- a/demo/urls.py
+++ b/demo/urls.py
@@ -6,5 +6,5 @@ urlpatterns = [
6 # url(r'^$', 'demo.views.home', name='home'),6 # url(r'^$', 'demo.views.home', name='home'),
7 # url(r'^blog/', include('blog.urls')),7 # url(r'^blog/', include('blog.urls')),
88
9 url(r'^admin/', include(admin.site.urls)),9 url(r'^admin/', admin.site.urls),
10]10]
diff --git a/piston/__init__.py b/piston/__init__.py
index dc7d064..a5ec16b 100644
--- a/piston/__init__.py
+++ b/piston/__init__.py
@@ -1,4 +1,4 @@
1__version__ = '0.2.5'1__version__ = '2.2.5'
22
33
4def get_version():4def get_version():
diff --git a/piston/authentication.py b/piston/authentication.py
index b02638d..f0cf1c6 100644
--- a/piston/authentication.py
+++ b/piston/authentication.py
@@ -1,5 +1,3 @@
1from __future__ import print_function
2from __future__ import absolute_import
3from builtins import object1from builtins import object
4import binascii2import binascii
53
@@ -10,7 +8,7 @@ from django.contrib.auth.decorators import login_required
10from django.template import loader8from django.template import loader
11from django.contrib.auth import authenticate9from django.contrib.auth import authenticate
12from django.conf import settings10from django.conf import settings
13from django.core.urlresolvers import get_callable11from django.urls import get_callable
14from django.core.exceptions import ImproperlyConfigured12from django.core.exceptions import ImproperlyConfigured
15from django.shortcuts import render_to_response13from django.shortcuts import render_to_response
16from django.template import RequestContext14from django.template import RequestContext
diff --git a/piston/doc.py b/piston/doc.py
index a9aa009..d7d21da 100644
--- a/piston/doc.py
+++ b/piston/doc.py
@@ -5,7 +5,7 @@ import inspect
55
6from piston.handler import HandlerMetaClass, handler_tracker6from piston.handler import HandlerMetaClass, handler_tracker
77
8from django.core.urlresolvers import get_resolver, get_callable, get_script_prefix8from django.urls import get_resolver, get_callable, get_script_prefix
9from django.shortcuts import render_to_response9from django.shortcuts import render_to_response
10from django.template import RequestContext10from django.template import RequestContext
1111
diff --git a/piston/emitters.py b/piston/emitters.py
index 79e9fb1..826ff12 100644
--- a/piston/emitters.py
+++ b/piston/emitters.py
@@ -1,6 +1,6 @@
1from __future__ import absolute_import, generators1import decimal, re, inspect
2from future import standard_library2import copy
3standard_library.install_aliases()3
4from builtins import str4from builtins import str
5from past.builtins import basestring5from past.builtins import basestring
6from builtins import object6from builtins import object
@@ -18,10 +18,10 @@ except ImportError:
18 yaml = None18 yaml = None
1919
20from django.db.models.query import QuerySet20from django.db.models.query import QuerySet
21from django.db.models import Model, permalink21from django.db.models import Model
22from django.utils.xmlutils import SimplerXMLGenerator22from django.utils.xmlutils import SimplerXMLGenerator
23from django.utils.encoding import smart_text23from django.utils.encoding import smart_text
24from django.core.urlresolvers import NoReverseMatch24from django.urls import reverse, NoReverseMatch
25try:25try:
26 from django.core.serializers.json import DjangoJSONEncoder26 from django.core.serializers.json import DjangoJSONEncoder
27except ImportError:27except ImportError:
@@ -36,7 +36,7 @@ import io as StringIO
36import pickle as pickle36import pickle as pickle
3737
38# Allow people to change the reverser (default `permalink`).38# Allow people to change the reverser (default `permalink`).
39reverser = permalink39reverser = reverse
4040
41class Emitter(object):41class Emitter(object):
42 """42 """
diff --git a/piston/handler.py b/piston/handler.py
index 12a0540..2b2b11a 100644
--- a/piston/handler.py
+++ b/piston/handler.py
@@ -1,4 +1,3 @@
1from __future__ import absolute_import
2from builtins import str1from builtins import str
3from builtins import object2from builtins import object
4import warnings3import warnings
diff --git a/piston/migrations/0001_initial.py b/piston/migrations/0001_initial.py
index e5948ee..97f8ea4 100644
--- a/piston/migrations/0001_initial.py
+++ b/piston/migrations/0001_initial.py
@@ -1,6 +1,4 @@
1# -*- coding: utf-8 -*-1# -*- coding: utf-8 -*-
2from __future__ import unicode_literals
3
4from django.db import models, migrations2from django.db import models, migrations
5from django.conf import settings3from django.conf import settings
6import time4import time
@@ -22,7 +20,7 @@ class Migration(migrations.Migration):
22 ('key', models.CharField(max_length=18)),20 ('key', models.CharField(max_length=18)),
23 ('secret', models.CharField(max_length=32)),21 ('secret', models.CharField(max_length=32)),
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')])),
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)),
26 ],24 ],
27 ),25 ),
28 migrations.CreateModel(26 migrations.CreateModel(
@@ -46,8 +44,8 @@ class Migration(migrations.Migration):
46 ('is_approved', models.BooleanField(default=False)),44 ('is_approved', models.BooleanField(default=False)),
47 ('callback', models.CharField(max_length=255, null=True, blank=True)),45 ('callback', models.CharField(max_length=255, null=True, blank=True)),
48 ('callback_confirmed', models.BooleanField(default=False)),46 ('callback_confirmed', models.BooleanField(default=False)),
49 ('consumer', models.ForeignKey(to='piston.Consumer')),47 ('consumer', models.ForeignKey(to='piston.Consumer', on_delete=models.CASCADE)),
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)),
51 ],49 ],
52 ),50 ),
53 ]51 ]
diff --git a/piston/models.py b/piston/models.py
index 4fa1f2c..8df4925 100644
--- a/piston/models.py
+++ b/piston/models.py
@@ -1,6 +1,3 @@
1from __future__ import absolute_import
2from future import standard_library
3standard_library.install_aliases()
4import time1import time
5import urllib.request, urllib.parse, urllib.error2import urllib.request, urllib.parse, urllib.error
6import urllib.parse3import urllib.parse
@@ -45,7 +42,7 @@ class Consumer(models.Model):
45 secret = models.CharField(max_length=SECRET_SIZE)42 secret = models.CharField(max_length=SECRET_SIZE)
4643
47 status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending')44 status = models.CharField(max_length=16, choices=CONSUMER_STATES, default='pending')
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)
4946
50 objects = ConsumerManager()47 objects = ConsumerManager()
51 48
@@ -86,8 +83,8 @@ class Token(models.Model):
86 timestamp = models.IntegerField(default=time.time)83 timestamp = models.IntegerField(default=time.time)
87 is_approved = models.BooleanField(default=False)84 is_approved = models.BooleanField(default=False)
88 85
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)
90 consumer = models.ForeignKey(Consumer)87 consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE)
91 88
92 callback = models.CharField(max_length=255, null=True, blank=True)89 callback = models.CharField(max_length=255, null=True, blank=True)
93 callback_confirmed = models.BooleanField(default=False)90 callback_confirmed = models.BooleanField(default=False)
diff --git a/piston/resource.py b/piston/resource.py
index 2a63c27..0470245 100644
--- a/piston/resource.py
+++ b/piston/resource.py
@@ -1,4 +1,3 @@
1from __future__ import absolute_import
2from builtins import str1from builtins import str
3from builtins import object2from builtins import object
4import sys3import sys
@@ -337,6 +336,6 @@ class Resource(object):
337 self.email_exception(rep)336 self.email_exception(rep)
338 if self.display_errors:337 if self.display_errors:
339 return HttpResponseServerError(338 return HttpResponseServerError(
340 format_error('\n'.join(rep.format_exception())))339 format_error('\n'.join(rep.get_traceback_data())))
341 else:340 else:
342 raise341 raise
diff --git a/piston/signals.py b/piston/signals.py
index 5d0336c..14fe196 100644
--- a/piston/signals.py
+++ b/piston/signals.py
@@ -1,4 +1,3 @@
1from __future__ import absolute_import
2# Piston imports1# Piston imports
3from .utils import send_consumer_mail2from .utils import send_consumer_mail
43
diff --git a/piston/store.py b/piston/store.py
index ea43e63..007a349 100644
--- a/piston/store.py
+++ b/piston/store.py
@@ -1,4 +1,3 @@
1from __future__ import absolute_import
2from . import oauth1from . import oauth
32
4from .models import Nonce, Token, Consumer3from .models import Nonce, Token, Consumer
@@ -73,4 +72,4 @@ class DataStore(oauth.OAuthDataStore):
73 self.request_token.verifier = generate_random(VERIFIER_SIZE)72 self.request_token.verifier = generate_random(VERIFIER_SIZE)
74 self.request_token.save()73 self.request_token.save()
75 return self.request_token74 return self.request_token
76 return None
77\ No newline at end of file75\ No newline at end of file
76 return None
diff --git a/piston/utils.py b/piston/utils.py
index c952bb9..8e76718 100644
--- a/piston/utils.py
+++ b/piston/utils.py
@@ -1,5 +1,3 @@
1from __future__ import print_function
2from __future__ import absolute_import
3from builtins import str1from builtins import str
4from past.builtins import basestring2from past.builtins import basestring
5from builtins import object3from builtins import object
diff --git a/tox.ini b/tox.ini
index 00bc6ab..f174604 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,62 +1,9 @@
1[tox]1[tox]
2envlist =2envlist =
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.113 py36, py37, py38
4skip_missing_interpreters = true
45
5[testenv]6[testenv]
6commands = python manage.py test piston7commands = python manage.py test piston
7deps = mock
8install_command = pip install -i https://pypi.org/simple {opts} {packages}
9
10[testenv:py27]
11basepython = python2.7
12
13[testenv:py35]
14basepython = python3.5
15
16[testenv:py27-django1.4]
17deps =
18 django >= 1.4, < 1.5
19 south==1.0
20 {[testenv]deps}
21
22[testenv:py27-django1.5]
23deps =
24 django >= 1.5, < 1.6
25 south==1.0
26 {[testenv]deps}
27
28[testenv:py27-django1.6]
29deps =
30 django >= 1.6, < 1.7
31 south==1.0
32 {[testenv]deps}
33
34[testenv:py27-django1.7]
35deps =
36 django >= 1.7, < 1.8
37 {[testenv]deps}
38
39[testenv:py27-django1.8]
40deps =
41 django >= 1.8, < 1.9
42 {[testenv]deps}
43
44[testenv:py27-django1.9]
45deps =
46 django >= 1.9, < 1.10
47 {[testenv]deps}
48
49[testenv:py27-django1.10]
50deps =
51 django >= 1.10, < 1.11
52 {[testenv]deps}
53
54[testenv:py27-django1.11]
55deps =
56 django >= 1.11, < 1.12
57 {[testenv]deps}
58
59[testenv:py35-django1.11]
60deps =8deps =
61 django >= 1.11, < 1.129 django>=2.2,<3
62 {[testenv]deps}

Subscribers

People subscribed via source and target branches