Merge lp:~ricardokirkner/django-openid-auth/py35-support into lp:django-openid-auth
- py35-support
- Merge into trunk
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 |
Related bugs: |
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
Description of the change
To post a comment you must log in.
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote : | # |
Running landing tests failed
https:/
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote : | # |
Running landing tests failed
https:/
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote : | # |
Running landing tests failed
https:/
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote : | # |
Running landing tests failed
https:/
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote : | # |
Running landing tests failed
https:/
- 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 < elements.length') |
271 | + content = content.replace( |
272 | + 'i < elements.length', 'i < 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} |
LGTM, nice.