Merge lp:~ricardokirkner/django-openid-auth/py35-support into lp:django-openid-auth

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 133
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: lp:~ricardokirkner/django-openid-auth/py35-support
Merge into: lp:django-openid-auth
Diff against target: 859 lines (+178/-92)
14 files modified
django_openid_auth/__init__.py (+3/-0)
django_openid_auth/admin.py (+8/-2)
django_openid_auth/auth.py (+2/-1)
django_openid_auth/forms.py (+10/-2)
django_openid_auth/store.py (+9/-3)
django_openid_auth/teams.py (+4/-3)
django_openid_auth/tests/test_auth.py (+6/-4)
django_openid_auth/tests/test_store.py (+6/-3)
django_openid_auth/tests/test_views.py (+78/-50)
django_openid_auth/views.py (+14/-6)
example_consumer/urls.py (+1/-1)
setup.cfg (+0/-2)
setup.py (+12/-5)
tox.ini (+25/-10)
To merge this branch: bzr merge lp:~ricardokirkner/django-openid-auth/py35-support
Reviewer Review Type Date Requested Status
Matias Bordese (community) Approve
Review via email: mp+321603@code.launchpad.net

Commit message

support python 2.7 and 3.5

To post a comment you must log in.
Revision history for this message
Matias Bordese (matiasb) wrote :

LGTM, nice.

review: Approve
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Matias Bordese (matiasb) wrote :

Makes sense.

review: Approve
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
133. By Ricardo Kirkner

fixed typo in env name

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'django_openid_auth/__init__.py'
2--- django_openid_auth/__init__.py 2015-04-23 20:02:39 +0000
3+++ django_openid_auth/__init__.py 2017-04-03 12:33:16 +0000
4@@ -26,3 +26,6 @@
5 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
6 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
7 # POSSIBILITY OF SUCH DAMAGE.
8+import sys
9+
10+PY3 = sys.version_info.major >= 3
11
12=== modified file 'django_openid_auth/admin.py'
13--- django_openid_auth/admin.py 2015-09-21 14:32:58 +0000
14+++ django_openid_auth/admin.py 2017-04-03 12:33:16 +0000
15@@ -29,8 +29,11 @@
16
17 from __future__ import unicode_literals
18
19-from urllib import urlencode
20-from urlparse import parse_qsl, urlparse
21+try:
22+ from urllib.parse import parse_qsl, urlencode, urlparse
23+except ImportError:
24+ from urllib import urlencode
25+ from urlparse import parse_qsl, urlparse
26
27 from django.conf import settings
28 from django.contrib import admin
29@@ -50,6 +53,7 @@
30 self.message_user(request, "%d expired nonces removed" % count)
31 cleanup_nonces.short_description = "Clean up expired nonces"
32
33+
34 admin.site.register(Nonce, NonceAdmin)
35
36
37@@ -65,6 +69,7 @@
38 self.message_user(request, "%d expired associations removed" % count)
39 cleanup_associations.short_description = "Clean up expired associations"
40
41+
42 admin.site.register(Association, AssociationAdmin)
43
44
45@@ -73,6 +78,7 @@
46 list_display = ('user', 'claimed_id')
47 search_fields = ('claimed_id',)
48
49+
50 admin.site.register(UserOpenID, UserOpenIDAdmin)
51
52
53
54=== modified file 'django_openid_auth/auth.py'
55--- django_openid_auth/auth.py 2017-01-23 14:26:49 +0000
56+++ django_openid_auth/auth.py 2017-04-03 12:33:16 +0000
57@@ -408,7 +408,8 @@
58 teams_mapping[lp_team] for lp_team in teams_response.is_member
59 if lp_team in teams_mapping]
60 user_groups = UserGroup.objects.filter(user=user)
61- matching_groups = user_groups.filter(group__name__in=teams_mapping.values())
62+ matching_groups = user_groups.filter(
63+ group__name__in=teams_mapping.values())
64 current_groups = set(
65 user_group.group for user_group in matching_groups)
66 desired_groups = set(Group.objects.filter(name__in=mapping))
67
68=== modified file 'django_openid_auth/forms.py'
69--- django_openid_auth/forms.py 2015-04-23 20:39:02 +0000
70+++ django_openid_auth/forms.py 2017-04-03 12:33:16 +0000
71@@ -38,6 +38,8 @@
72
73 from openid.yadis import xri
74
75+from django_openid_auth import PY3
76+
77
78 def teams_new_unicode(self):
79 """
80@@ -52,8 +54,13 @@
81 else:
82 return name
83
84-Group.unicode_before_teams = Group.__unicode__
85-Group.__unicode__ = teams_new_unicode
86+
87+if PY3:
88+ Group.unicode_before_teams = Group.__str__
89+ Group.__str__ = teams_new_unicode
90+else:
91+ Group.unicode_before_teams = Group.__unicode__
92+ Group.__unicode__ = teams_new_unicode
93
94
95 class UserChangeFormWithTeamRestriction(UserChangeForm):
96@@ -72,6 +79,7 @@
97 "You cannot assign it manually." % group.name)
98 return data
99
100+
101 UserAdmin.form = UserChangeFormWithTeamRestriction
102
103
104
105=== modified file 'django_openid_auth/store.py'
106--- django_openid_auth/store.py 2015-04-23 20:39:02 +0000
107+++ django_openid_auth/store.py 2017-04-03 12:33:16 +0000
108@@ -36,6 +36,7 @@
109 from openid.store.interface import OpenIDStore
110 from openid.store.nonce import SKEW
111
112+from django_openid_auth import PY3
113 from django_openid_auth.models import Association, Nonce
114
115
116@@ -75,10 +76,15 @@
117 expired = []
118 for assoc in assocs:
119 association = OIDAssociation(
120- assoc.handle, base64.decodestring(assoc.secret), assoc.issued,
121- assoc.lifetime, assoc.assoc_type
122+ assoc.handle,
123+ base64.decodestring(assoc.secret.encode('utf-8')),
124+ assoc.issued, assoc.lifetime, assoc.assoc_type
125 )
126- if association.getExpiresIn() == 0:
127+ if PY3:
128+ expires_in = association.expiresIn
129+ else:
130+ expires_in = association.getExpiresIn()
131+ if expires_in == 0:
132 expired.append(assoc)
133 else:
134 associations.append((association.issued, association))
135
136=== modified file 'django_openid_auth/teams.py'
137--- django_openid_auth/teams.py 2015-04-23 20:39:02 +0000
138+++ django_openid_auth/teams.py 2017-04-03 12:33:16 +0000
139@@ -72,6 +72,7 @@
140 registerNamespaceAlias,
141 NamespaceAliasRegistrationError,
142 )
143+from six import string_types
144
145 __all__ = [
146 'TeamsRequest',
147@@ -84,7 +85,7 @@
148
149 try:
150 registerNamespaceAlias(ns_uri, 'lp')
151-except NamespaceAliasRegistrationError, e:
152+except NamespaceAliasRegistrationError as e:
153 oidutil.log(
154 'registerNamespaceAlias(%r, %r) failed: %s' % (ns_uri, 'lp', str(e)))
155
156@@ -139,7 +140,7 @@
157 # There is no alias, so try to add one. (OpenID version 1)
158 try:
159 message.namespaces.addAlias(ns_uri, 'lp')
160- except KeyError, why:
161+ except KeyError as why:
162 # An alias for the string 'lp' already exists, but it's
163 # defined for something other than Launchpad teams
164 raise TeamsNamespaceError(why[0])
165@@ -287,7 +288,7 @@
166 @raise ValueError: when a team requested is not a string
167 or strict is set and a team was requested more than once
168 """
169- if isinstance(query_membership, basestring):
170+ if isinstance(query_membership, string_types):
171 raise TypeError('Teams should be passed as a list of '
172 'strings (not %r)' % (type(query_membership),))
173
174
175=== modified file 'django_openid_auth/tests/test_auth.py'
176--- django_openid_auth/tests/test_auth.py 2017-01-20 14:28:12 +0000
177+++ django_openid_auth/tests/test_auth.py 2017-04-03 12:33:16 +0000
178@@ -29,15 +29,16 @@
179 from __future__ import unicode_literals
180
181 import re
182-from urlparse import urljoin
183+try:
184+ from urllib.parse import urljoin
185+except ImportError:
186+ from urlparse import urljoin
187
188 from django.conf import settings
189 from django.contrib.auth.models import Group, Permission, User
190 from django.core.exceptions import ImproperlyConfigured
191-from django.db import models
192 from django.test import TestCase
193 from django.test.utils import override_settings
194-from mock import patch
195 from openid.consumer.consumer import (
196 CancelResponse,
197 FailureResponse,
198@@ -160,7 +161,8 @@
199 perm_label = '%s.%s' % (permission.content_type.app_label,
200 permission.codename)
201 # Always invalidate the per-request perm cache
202- for attr in user.__dict__.keys():
203+ attrs = list(user.__dict__.keys())
204+ for attr in attrs:
205 if attr.endswith('_perm_cache'):
206 delattr(user, attr)
207
208
209=== modified file 'django_openid_auth/tests/test_store.py'
210--- django_openid_auth/tests/test_store.py 2015-04-23 20:39:02 +0000
211+++ django_openid_auth/tests/test_store.py 2017-04-03 12:33:16 +0000
212@@ -28,6 +28,7 @@
213
214 from __future__ import unicode_literals
215
216+import base64
217 import time
218
219 from django.test import TestCase
220@@ -52,7 +53,8 @@
221 server_url='server-url', handle='handle')
222 self.assertEquals(dbassoc.server_url, 'server-url')
223 self.assertEquals(dbassoc.handle, 'handle')
224- self.assertEquals(dbassoc.secret, 'secret'.encode('base-64'))
225+ self.assertEquals(
226+ dbassoc.secret, base64.encodestring(b'secret').decode('utf-8'))
227 self.assertEquals(dbassoc.issued, 42)
228 self.assertEquals(dbassoc.lifetime, 600)
229 self.assertEquals(dbassoc.assoc_type, 'HMAC-SHA1')
230@@ -66,7 +68,8 @@
231 self.store.storeAssociation('server-url', assoc)
232 dbassoc = Association.objects.get(
233 server_url='server-url', handle='handle')
234- self.assertEqual(dbassoc.secret, 'secret2'.encode('base-64'))
235+ self.assertEqual(
236+ dbassoc.secret, base64.encodestring(b'secret2').decode('utf-8'))
237 self.assertEqual(dbassoc.issued, 420)
238 self.assertEqual(dbassoc.lifetime, 900)
239 self.assertEqual(dbassoc.assoc_type, 'HMAC-SHA256')
240@@ -80,7 +83,7 @@
241 self.assertTrue(isinstance(assoc, OIDAssociation))
242
243 self.assertEquals(assoc.handle, 'handle')
244- self.assertEquals(assoc.secret, 'secret')
245+ self.assertEquals(assoc.secret, b'secret')
246 self.assertEquals(assoc.issued, timestamp)
247 self.assertEquals(assoc.lifetime, 600)
248 self.assertEquals(assoc.assoc_type, 'HMAC-SHA1')
249
250=== modified file 'django_openid_auth/tests/test_views.py'
251--- django_openid_auth/tests/test_views.py 2017-01-16 15:05:26 +0000
252+++ django_openid_auth/tests/test_views.py 2017-04-03 12:33:16 +0000
253@@ -31,7 +31,10 @@
254
255 import cgi
256
257-from urlparse import parse_qs
258+try:
259+ from urllib.parse import parse_qs
260+except ImportError:
261+ from urlparse import parse_qs
262
263 from django.conf import settings
264 from django.contrib.auth.models import User, Group, Permission
265@@ -125,8 +128,8 @@
266 def parseFormPost(self, content):
267 """Parse an HTML form post to create an OpenID request."""
268 # Hack to make the javascript XML compliant ...
269- content = content.replace('i < elements.length',
270- 'i &lt; elements.length')
271+ content = content.replace(
272+ 'i < elements.length', 'i &lt; elements.length')
273 tree = ET.XML(content)
274 form = tree.find('.//form')
275 assert form is not None, 'No form in document'
276@@ -137,8 +140,7 @@
277 for input in form.findall('input'):
278 if input.get('type') != 'hidden':
279 continue
280- query[input.get('name').encode('UTF-8')] = \
281- input.get('value').encode('UTF-8')
282+ query[input.get('name')] = input.get('value')
283 self.last_request = self.server.decodeRequest(query)
284 return self.last_request
285
286@@ -236,7 +238,8 @@
287 response = self.client.post(self.login_url, self.openid_req)
288 self.assertContains(response, 'OpenID transaction in progress')
289
290- openid_request = self.provider.parseFormPost(response.content)
291+ openid_request = self.provider.parseFormPost(
292+ response.content.decode('utf-8'))
293 self.assertEqual(openid_request.mode, 'checkid_setup')
294 self.assertTrue(openid_request.return_to.startswith(
295 'http://testserver/openid/complete/'))
296@@ -248,7 +251,7 @@
297
298 # And they are now logged in:
299 response = self.client.get('/getuser/')
300- self.assertEqual(response.content, 'someuser')
301+ self.assertEqual(response.content.decode('utf-8'), 'someuser')
302
303 def test_login_with_nonascii_return_to(self):
304 """Ensure non-ascii characters can be used for the 'next' arg."""
305@@ -270,7 +273,8 @@
306
307 self.assertContains(response, 'OpenID transaction in progress')
308
309- openid_request = self.provider.parseFormPost(response.content)
310+ openid_request = self.provider.parseFormPost(
311+ response.content.decode('utf-8'))
312 self.assertEqual(openid_request.mode, 'checkid_setup')
313 self.assertTrue(openid_request.return_to.startswith(
314 'http://testserver/openid/complete/'))
315@@ -297,7 +301,8 @@
316 self.assertEqual(response.status_code, 200)
317 self.assertContains(response, 'OpenID transaction in progress')
318
319- openid_request = self.provider.parseFormPost(response.content)
320+ openid_request = self.provider.parseFormPost(
321+ response.content.decode('utf-8'))
322 self.assertEqual(openid_request.mode, 'checkid_setup')
323 self.assertTrue(openid_request.return_to.startswith(
324 'http://testserver/openid/complete/'))
325@@ -309,7 +314,7 @@
326
327 # And they are now logged in:
328 response = self.client.get('/getuser/')
329- self.assertEqual(response.content, 'someuser')
330+ self.assertEqual(response.content.decode('utf-8'), 'someuser')
331
332 def test_login_create_users(self):
333 # Create a user with the same name as we'll pass back via sreg.
334@@ -321,7 +326,8 @@
335
336 # Complete the request, passing back some simple registration
337 # data. The user is redirected to the next URL.
338- openid_request = self.provider.parseFormPost(response.content)
339+ openid_request = self.provider.parseFormPost(
340+ response.content.decode('utf-8'))
341 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
342 openid_response = openid_request.answer(True)
343 sreg_response = sreg.SRegResponse.extractResponse(
344@@ -335,7 +341,7 @@
345 # And they are now logged in as a new user (they haven't taken
346 # over the existing "someuser" user).
347 response = self.client.get('/getuser/')
348- self.assertEqual(response.content, 'someuser2')
349+ self.assertEqual(response.content.decode('utf-8'), 'someuser2')
350
351 # Check the details of the new user.
352 user = User.objects.get(username='someuser2')
353@@ -359,7 +365,8 @@
354
355 # Complete the request, passing back some simple registration
356 # data. The user is redirected to the next URL.
357- openid_request = self.provider.parseFormPost(response.content)
358+ openid_request = self.provider.parseFormPost(
359+ response.content.decode('utf-8'))
360 return openid_request
361
362 def _get_login_response(self, openid_request, resp_data, use_sreg,
363@@ -383,7 +390,8 @@
364 self.provider.type_uris.append(pape.ns_uri)
365
366 response = self.client.post(self.login_url, self.openid_req)
367- openid_request = self.provider.parseFormPost(response.content)
368+ openid_request = self.provider.parseFormPost(
369+ response.content.decode('utf-8'))
370
371 request_auth = openid_request.message.getArg(
372 'http://specs.openid.net/extensions/pape/1.0',
373@@ -431,7 +439,7 @@
374 query['openid.pape.auth_policies'], [preferred_auth])
375
376 response = self.client.get('/getuser/')
377- self.assertEqual(response.content, 'testuser')
378+ self.assertEqual(response.content.decode('utf-8'), 'testuser')
379
380 @override_settings(OPENID_PHYSICAL_MULTIFACTOR_REQUIRED=True)
381 def test_login_physical_multifactor_not_provided(self):
382@@ -547,10 +555,11 @@
383 response = self.client.get('/getuser/')
384
385 # username defaults to 'openiduser'
386- self.assertEqual(response.content, 'openiduser')
387+ username = response.content.decode('utf-8')
388+ self.assertEqual(username, 'openiduser')
389
390 # The user's full name and email have been updated.
391- user = User.objects.get(username=response.content)
392+ user = User.objects.get(username=username)
393 self.assertEqual(user.first_name, 'Openid')
394 self.assertEqual(user.last_name, 'User')
395 self.assertEqual(user.email, 'foo@example.com')
396@@ -565,7 +574,7 @@
397 response = self.client.get('/getuser/')
398
399 # username defaults to a munged version of the email
400- self.assertEqual(response.content, 'fooexamplecom')
401+ self.assertEqual(response.content.decode('utf-8'), 'fooexamplecom')
402
403 def test_login_duplicate_username_numbering(self):
404 # Setup existing user who's name we're going to conflict with
405@@ -582,7 +591,7 @@
406
407 # Since this username is already taken by someone else, we go through
408 # the process of adding +i to it, and get testuser2.
409- self.assertEqual(response.content, 'testuser2')
410+ self.assertEqual(response.content.decode('utf-8'), 'testuser2')
411
412 def test_login_duplicate_username_numbering_with_conflicts(self):
413 # Setup existing user who's name we're going to conflict with
414@@ -602,7 +611,7 @@
415 # the process of adding +i to it starting with the count of users with
416 # username starting with 'testuser', of which there are 2. i should
417 # start at 3, which already exists, so it should skip to 4.
418- self.assertEqual(response.content, 'testuser4')
419+ self.assertEqual(response.content.decode('utf-8'), 'testuser4')
420
421 def test_login_duplicate_username_numbering_with_holes(self):
422 # Setup existing user who's name we're going to conflict with
423@@ -625,7 +634,7 @@
424 # the process of adding +i to it starting with the count of users with
425 # username starting with 'testuser', of which there are 5. i should
426 # start at 6, and increment until it reaches 9.
427- self.assertEqual(response.content, 'testuser9')
428+ self.assertEqual(response.content.decode('utf-8'), 'testuser9')
429
430 def test_login_duplicate_username_numbering_with_nonsequential_matches(
431 self):
432@@ -646,7 +655,7 @@
433 # the process of adding +i to it starting with the count of users with
434 # username starting with 'testuser', of which there are 2. i should
435 # start at 3, which will be available.
436- self.assertEqual(response.content, 'testuser3')
437+ self.assertEqual(response.content.decode('utf-8'), 'testuser3')
438
439 def test_login_follow_rename(self):
440 user = User.objects.create_user('testuser', 'someone@example.com')
441@@ -666,10 +675,11 @@
442
443 # If OPENID_FOLLOW_RENAMES, they are logged in as
444 # someuser (the passed in nickname has changed the username)
445- self.assertEqual(response.content, 'someuser')
446+ username = response.content.decode('utf-8')
447+ self.assertEqual(username, 'someuser')
448
449 # The user's full name and email have been updated.
450- user = User.objects.get(username=response.content)
451+ user = User.objects.get(username=username)
452 self.assertEqual(user.first_name, 'Some')
453 self.assertEqual(user.last_name, 'User')
454 self.assertEqual(user.email, 'foo@example.com')
455@@ -691,10 +701,11 @@
456 response = self.client.get('/getuser/')
457
458 # Username should not have changed
459- self.assertEqual(response.content, 'testuser')
460+ username = response.content.decode('utf-8')
461+ self.assertEqual(username, 'testuser')
462
463 # The user's full name and email have been updated.
464- user = User.objects.get(username=response.content)
465+ user = User.objects.get(username=username)
466 self.assertEqual(user.first_name, 'Some')
467 self.assertEqual(user.last_name, 'User')
468 self.assertEqual(user.email, 'foo@example.com')
469@@ -730,10 +741,11 @@
470 # If OPENID_FOLLOW_RENAMES, attempt to change username to 'testuser'
471 # but since that username is already taken by someone else, we go
472 # through the process of adding +i to it, and get testuser2.
473- self.assertEqual(response.content, 'testuser2')
474+ username = response.content.decode('utf-8')
475+ self.assertEqual(username, 'testuser2')
476
477 # The user's full name and email have been updated.
478- user = User.objects.get(username=response.content)
479+ user = User.objects.get(username=username)
480 self.assertEqual(user.first_name, 'Rename')
481 self.assertEqual(user.last_name, 'User')
482 self.assertEqual(user.email, 'rename@example.com')
483@@ -772,10 +784,11 @@
484 # the username follows the nickname+i scheme, it has non-numbers in the
485 # suffix, so it's not an auto-generated one. The regular process of
486 # renaming to 'testuser' has a conflict, so we get +2 at the end.
487- self.assertEqual(response.content, 'testuser2')
488+ username = response.content.decode('utf-8')
489+ self.assertEqual(username, 'testuser2')
490
491 # The user's full name and email have been updated.
492- user = User.objects.get(username=response.content)
493+ user = User.objects.get(username=username)
494 self.assertEqual(user.first_name, 'Rename')
495 self.assertEqual(user.last_name, 'User')
496 self.assertEqual(user.email, 'rename@example.com')
497@@ -812,10 +825,11 @@
498 # but since that username is already taken by someone else, we go
499 # through the process of adding +i to it. Since the user for this
500 # identity url already has a name matching that pattern, check if first
501- self.assertEqual(response.content, 'testuser2000')
502+ username = response.content.decode('utf-8')
503+ self.assertEqual(username, 'testuser2000')
504
505 # The user's full name and email have been updated.
506- user = User.objects.get(username=response.content)
507+ user = User.objects.get(username=username)
508 self.assertEqual(user.first_name, 'Rename')
509 self.assertEqual(user.last_name, 'User')
510 self.assertEqual(user.email, 'rename@example.com')
511@@ -842,10 +856,11 @@
512
513 # If OPENID_FOLLOW_RENAMES, username should be changed to 'testuser'
514 # because it wasn't currently taken
515- self.assertEqual(response.content, 'testuser')
516+ username = response.content.decode('utf-8')
517+ self.assertEqual(username, 'testuser')
518
519 # The user's full name and email have been updated.
520- user = User.objects.get(username=response.content)
521+ user = User.objects.get(username=username)
522 self.assertEqual(user.first_name, 'Same')
523 self.assertEqual(user.last_name, 'User')
524 self.assertEqual(user.email, 'same@example.com')
525@@ -860,7 +875,8 @@
526
527 # Complete the request, passing back some simple registration
528 # data. The user is redirected to the next URL.
529- openid_request = self.provider.parseFormPost(response.content)
530+ openid_request = self.provider.parseFormPost(
531+ response.content.decode('utf-8'))
532 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
533 openid_response = openid_request.answer(True)
534 sreg_response = sreg.SRegResponse.extractResponse(
535@@ -898,7 +914,8 @@
536
537 # Complete the request, passing back some simple registration
538 # data. The user is redirected to the next URL.
539- openid_request = self.provider.parseFormPost(response.content)
540+ openid_request = self.provider.parseFormPost(
541+ response.content.decode('utf-8'))
542 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
543 openid_response = openid_request.answer(True)
544 sreg_response = sreg.SRegResponse.extractResponse(
545@@ -927,7 +944,8 @@
546
547 # Complete the request, passing back some simple registration
548 # data. The user is redirected to the next URL.
549- openid_request = self.provider.parseFormPost(response.content)
550+ openid_request = self.provider.parseFormPost(
551+ response.content.decode('utf-8'))
552 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
553 openid_response = openid_request.answer(True)
554 sreg_response = sreg.SRegResponse.extractResponse(
555@@ -969,7 +987,8 @@
556
557 # Complete the request, passing back some simple registration
558 # data. The user is redirected to the next URL.
559- openid_request = self.provider.parseFormPost(response.content)
560+ openid_request = self.provider.parseFormPost(
561+ response.content.decode('utf-8'))
562 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
563 openid_response = openid_request.answer(True)
564 sreg_response = sreg.SRegResponse.extractResponse(
565@@ -992,7 +1011,8 @@
566
567 # Complete the request, passing back some simple registration
568 # data. The user is redirected to the next URL.
569- openid_request = self.provider.parseFormPost(response.content)
570+ openid_request = self.provider.parseFormPost(
571+ response.content.decode('utf-8'))
572 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
573 openid_response = openid_request.answer(True)
574 sreg_response = sreg.SRegResponse.extractResponse(
575@@ -1028,10 +1048,11 @@
576 self._do_user_login(self.openid_req, self.openid_resp)
577 response = self.client.get('/getuser/')
578
579- self.assertEqual(response.content, 'testuser')
580+ username = response.content.decode('utf-8')
581+ self.assertEqual(username, 'testuser')
582
583 # The user's full name and email have been updated.
584- user = User.objects.get(username=response.content)
585+ user = User.objects.get(username=username)
586 self.assertEqual(user.first_name, 'Some')
587 self.assertEqual(user.last_name, 'User')
588 self.assertEqual(user.email, 'foo@example.com')
589@@ -1047,7 +1068,8 @@
590 with self.settings(OPENID_SREG_EXTRA_FIELDS=('language',)):
591 response = self.client.post(self.login_url, self.openid_req)
592
593- openid_request = self.provider.parseFormPost(response.content)
594+ openid_request = self.provider.parseFormPost(
595+ response.content.decode('utf-8'))
596 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
597 for field in ('email', 'fullname', 'nickname', 'language'):
598 self.assertTrue(field in sreg_request)
599@@ -1064,7 +1086,8 @@
600 with self.settings(OPENID_SREG_REQUIRED_FIELDS=('email', 'language')):
601 response = self.client.post(self.login_url, self.openid_req)
602
603- openid_request = self.provider.parseFormPost(response.content)
604+ openid_request = self.provider.parseFormPost(
605+ response.content.decode('utf-8'))
606 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
607
608 self.assertEqual(['email', 'language'], sreg_request.required)
609@@ -1086,7 +1109,8 @@
610
611 # The resulting OpenID request uses the Attribute Exchange
612 # extension rather than the Simple Registration extension.
613- openid_request = self.provider.parseFormPost(response.content)
614+ openid_request = self.provider.parseFormPost(
615+ response.content.decode('utf-8'))
616 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
617 self.assertEqual(sreg_request.required, [])
618 self.assertEqual(sreg_request.optional, [])
619@@ -1132,7 +1156,7 @@
620 assert not settings.OPENID_FOLLOW_RENAMES, (
621 'OPENID_FOLLOW_RENAMES must be False')
622 response = self.client.get('/getuser/')
623- self.assertEqual(response.content, 'testuser')
624+ self.assertEqual(response.content.decode('utf-8'), 'testuser')
625
626 # The user's full name and email have been updated.
627 user = User.objects.get(username='testuser')
628@@ -1216,7 +1240,8 @@
629 self.assertContains(response, 'OpenID transaction in progress')
630
631 # Complete the request
632- openid_request = self.provider.parseFormPost(response.content)
633+ openid_request = self.provider.parseFormPost(
634+ response.content.decode('utf-8'))
635 openid_response = openid_request.answer(True)
636 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)
637 teams_response = teams.TeamsResponse.extractResponse(
638@@ -1231,7 +1256,7 @@
639
640 # And they are now logged in as testuser
641 response = self.client.get('/getuser/')
642- self.assertEqual(response.content, 'testuser')
643+ self.assertEqual(response.content.decode('utf-8'), 'testuser')
644
645 # The user's groups have been updated.
646 User.objects.get(username='testuser')
647@@ -1263,7 +1288,8 @@
648 OPENID_LAUNCHPAD_TEAMS_MAPPING=mapping,
649 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO=True,
650 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO_BLACKLIST=blacklist):
651- openid_request = self.provider.parseFormPost(response.content)
652+ openid_request = self.provider.parseFormPost(
653+ response.content.decode('utf-8'))
654 openid_request.answer(True)
655 teams.TeamsRequest.fromOpenIDRequest(openid_request)
656
657@@ -1316,7 +1342,8 @@
658 response = self.client.post(self.login_url, self.openid_req_no_next)
659
660 # Complete the request
661- openid_request = self.provider.parseFormPost(response.content)
662+ openid_request = self.provider.parseFormPost(
663+ response.content.decode('utf-8'))
664 openid_response = openid_request.answer(True)
665 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)
666 teams_response = teams.TeamsResponse.extractResponse(
667@@ -1335,7 +1362,8 @@
668 display_id='http://example.com/identity')
669
670 response = self.client.post(self.login_url, self.openid_req_no_next)
671- openid_request = self.provider.parseFormPost(response.content)
672+ openid_request = self.provider.parseFormPost(
673+ response.content.decode('utf-8'))
674 openid_response = openid_request.answer(True)
675 # Use a closure to test whether the signal handler was called.
676 self.signal_handler_called = False
677
678=== modified file 'django_openid_auth/views.py'
679--- django_openid_auth/views.py 2017-01-16 14:34:06 +0000
680+++ django_openid_auth/views.py 2017-04-03 12:33:16 +0000
681@@ -30,8 +30,11 @@
682 from __future__ import unicode_literals
683
684 import re
685-import urllib
686-from urlparse import urlsplit
687+try:
688+ from urllib.parse import urlencode, urlsplit
689+except ImportError:
690+ from urllib import urlencode
691+ from urlparse import urlsplit
692
693 from django.conf import settings
694 from django.contrib.auth import (
695@@ -177,7 +180,10 @@
696 # Invalid or no form data:
697 if openid_url is None:
698 context = RequestContext(request)
699- context.update({'form': login_form, redirect_field_name: redirect_to})
700+ context.update({
701+ 'form': login_form,
702+ redirect_field_name: redirect_to,
703+ })
704 return render_to_response(template_name, context)
705
706 consumer = make_consumer(request)
707@@ -274,7 +280,7 @@
708 # Django gives us Unicode, which is great. We must encode URI.
709 # urllib enforces str. We can't trust anything about the default
710 # encoding inside str(foo) , so we must explicitly make foo a str.
711- return_to += urllib.urlencode(
712+ return_to += urlencode(
713 {redirect_field_name: redirect_to.encode("UTF-8")})
714
715 return render_openid_request(request, openid_request, return_to)
716@@ -297,8 +303,9 @@
717 if openid_response.status == SUCCESS:
718 try:
719 user = authenticate(openid_response=openid_response)
720- except DjangoOpenIDException, e:
721- return render_failure(request, e.message, exception=e)
722+ except DjangoOpenIDException as e:
723+ return render_failure(
724+ request, getattr(e, 'message', str(e)), exception=e)
725
726 if user is not None:
727 if user.is_active:
728@@ -332,6 +339,7 @@
729 OPENID_LOGO_BASE_64.decode('base64'), mimetype='image/gif'
730 )
731
732+
733 # Logo from http://openid.net/login-bg.gif
734 # Embedded here for convenience; you should serve this as a static file
735 OPENID_LOGO_BASE_64 = """
736
737=== modified file 'example_consumer/urls.py'
738--- example_consumer/urls.py 2017-01-16 12:22:28 +0000
739+++ example_consumer/urls.py 2017-04-03 12:33:16 +0000
740@@ -31,7 +31,7 @@
741 from django.contrib import admin
742 from django.contrib.auth import views as auth_views
743
744-import views
745+from example_consumer import views
746
747
748 admin.autodiscover()
749
750=== removed file 'setup.cfg'
751--- setup.cfg 2017-01-23 15:23:51 +0000
752+++ setup.cfg 1970-01-01 00:00:00 +0000
753@@ -1,2 +0,0 @@
754-[wheel]
755-universal = True
756
757=== modified file 'setup.py'
758--- setup.py 2017-01-20 20:25:07 +0000
759+++ setup.py 2017-04-03 12:33:16 +0000
760@@ -39,21 +39,28 @@
761 info.
762 """
763
764+import sys
765+
766 from setuptools import find_packages, setup
767
768+PY3 = sys.version_info.major >= 3
769+
770
771 description, long_description = __doc__.split('\n\n', 1)
772-VERSION = '0.13'
773+VERSION = '0.14'
774+
775+install_requires = ['django>=1.6', 'six']
776+if PY3:
777+ install_requires.append('python3-openid')
778+else:
779+ install_requires.append('python-openid>=2.2.0')
780
781 setup(
782 name='django-openid-auth',
783 version=VERSION,
784
785 packages=find_packages(),
786- install_requires=[
787- 'django>=1.6',
788- 'python-openid>=2.2.0',
789- ],
790+ install_requires=install_requires,
791 package_data={
792 'django_openid_auth': ['templates/openid/*.html'],
793 },
794
795=== modified file 'tox.ini'
796--- tox.ini 2017-01-20 20:31:51 +0000
797+++ tox.ini 2017-04-03 12:33:16 +0000
798@@ -1,36 +1,51 @@
799 [tox]
800-envlist = py27-django1.6,py27-django1.7,py27-django1.8,py27-django1.9,py27-django1.10
801+envlist =
802+ py27-django1.6,py27-django1.7,py27-django1.8,py27-django1.9,py27-django1.10,py3-django1.10
803
804 [testenv]
805 commands = python manage.py test django_openid_auth
806-basepython =
807- python2.7
808-deps=
809+deps =
810 mock
811+
812+[testenv:py27]
813+basepython = python2.7
814+deps =
815 python-openid
816+ {[testenv]deps}
817+
818+[testenv:py3]
819+basepython = python3
820+deps =
821+ python3-openid
822+ {[testenv]deps}
823
824 [testenv:py27-django1.6]
825 deps =
826 django == 1.6.11
827 south
828- {[testenv]deps}
829+ {[testenv:py27]deps}
830
831 [testenv:py27-django1.7]
832 deps =
833 django == 1.7.11
834- {[testenv]deps}
835+ {[testenv:py27]deps}
836
837 [testenv:py27-django1.8]
838 deps =
839 django == 1.8.17
840- {[testenv]deps}
841+ {[testenv:py27]deps}
842
843 [testenv:py27-django1.9]
844 deps =
845 django == 1.9.12
846- {[testenv]deps}
847+ {[testenv:py27]deps}
848
849 [testenv:py27-django1.10]
850 deps =
851- django == 1.10.5
852- {[testenv]deps}
853+ django == 1.10.6
854+ {[testenv:py27]deps}
855+
856+[testenv:py3-django1.10]
857+deps =
858+ django == 1.10.6
859+ {[testenv:py3]deps}

Subscribers

People subscribed via source and target branches