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
=== modified file 'django_openid_auth/__init__.py'
--- django_openid_auth/__init__.py 2015-04-23 20:02:39 +0000
+++ django_openid_auth/__init__.py 2017-04-03 12:33:16 +0000
@@ -26,3 +26,6 @@
26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE27# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.28# POSSIBILITY OF SUCH DAMAGE.
29import sys
30
31PY3 = sys.version_info.major >= 3
2932
=== modified file 'django_openid_auth/admin.py'
--- django_openid_auth/admin.py 2015-09-21 14:32:58 +0000
+++ django_openid_auth/admin.py 2017-04-03 12:33:16 +0000
@@ -29,8 +29,11 @@
2929
30from __future__ import unicode_literals30from __future__ import unicode_literals
3131
32from urllib import urlencode32try:
33from urlparse import parse_qsl, urlparse33 from urllib.parse import parse_qsl, urlencode, urlparse
34except ImportError:
35 from urllib import urlencode
36 from urlparse import parse_qsl, urlparse
3437
35from django.conf import settings38from django.conf import settings
36from django.contrib import admin39from django.contrib import admin
@@ -50,6 +53,7 @@
50 self.message_user(request, "%d expired nonces removed" % count)53 self.message_user(request, "%d expired nonces removed" % count)
51 cleanup_nonces.short_description = "Clean up expired nonces"54 cleanup_nonces.short_description = "Clean up expired nonces"
5255
56
53admin.site.register(Nonce, NonceAdmin)57admin.site.register(Nonce, NonceAdmin)
5458
5559
@@ -65,6 +69,7 @@
65 self.message_user(request, "%d expired associations removed" % count)69 self.message_user(request, "%d expired associations removed" % count)
66 cleanup_associations.short_description = "Clean up expired associations"70 cleanup_associations.short_description = "Clean up expired associations"
6771
72
68admin.site.register(Association, AssociationAdmin)73admin.site.register(Association, AssociationAdmin)
6974
7075
@@ -73,6 +78,7 @@
73 list_display = ('user', 'claimed_id')78 list_display = ('user', 'claimed_id')
74 search_fields = ('claimed_id',)79 search_fields = ('claimed_id',)
7580
81
76admin.site.register(UserOpenID, UserOpenIDAdmin)82admin.site.register(UserOpenID, UserOpenIDAdmin)
7783
7884
7985
=== modified file 'django_openid_auth/auth.py'
--- django_openid_auth/auth.py 2017-01-23 14:26:49 +0000
+++ django_openid_auth/auth.py 2017-04-03 12:33:16 +0000
@@ -408,7 +408,8 @@
408 teams_mapping[lp_team] for lp_team in teams_response.is_member408 teams_mapping[lp_team] for lp_team in teams_response.is_member
409 if lp_team in teams_mapping]409 if lp_team in teams_mapping]
410 user_groups = UserGroup.objects.filter(user=user)410 user_groups = UserGroup.objects.filter(user=user)
411 matching_groups = user_groups.filter(group__name__in=teams_mapping.values())411 matching_groups = user_groups.filter(
412 group__name__in=teams_mapping.values())
412 current_groups = set(413 current_groups = set(
413 user_group.group for user_group in matching_groups)414 user_group.group for user_group in matching_groups)
414 desired_groups = set(Group.objects.filter(name__in=mapping))415 desired_groups = set(Group.objects.filter(name__in=mapping))
415416
=== modified file 'django_openid_auth/forms.py'
--- django_openid_auth/forms.py 2015-04-23 20:39:02 +0000
+++ django_openid_auth/forms.py 2017-04-03 12:33:16 +0000
@@ -38,6 +38,8 @@
3838
39from openid.yadis import xri39from openid.yadis import xri
4040
41from django_openid_auth import PY3
42
4143
42def teams_new_unicode(self):44def teams_new_unicode(self):
43 """45 """
@@ -52,8 +54,13 @@
52 else:54 else:
53 return name55 return name
5456
55Group.unicode_before_teams = Group.__unicode__57
56Group.__unicode__ = teams_new_unicode58if PY3:
59 Group.unicode_before_teams = Group.__str__
60 Group.__str__ = teams_new_unicode
61else:
62 Group.unicode_before_teams = Group.__unicode__
63 Group.__unicode__ = teams_new_unicode
5764
5865
59class UserChangeFormWithTeamRestriction(UserChangeForm):66class UserChangeFormWithTeamRestriction(UserChangeForm):
@@ -72,6 +79,7 @@
72 "You cannot assign it manually." % group.name)79 "You cannot assign it manually." % group.name)
73 return data80 return data
7481
82
75UserAdmin.form = UserChangeFormWithTeamRestriction83UserAdmin.form = UserChangeFormWithTeamRestriction
7684
7785
7886
=== modified file 'django_openid_auth/store.py'
--- django_openid_auth/store.py 2015-04-23 20:39:02 +0000
+++ django_openid_auth/store.py 2017-04-03 12:33:16 +0000
@@ -36,6 +36,7 @@
36from openid.store.interface import OpenIDStore36from openid.store.interface import OpenIDStore
37from openid.store.nonce import SKEW37from openid.store.nonce import SKEW
3838
39from django_openid_auth import PY3
39from django_openid_auth.models import Association, Nonce40from django_openid_auth.models import Association, Nonce
4041
4142
@@ -75,10 +76,15 @@
75 expired = []76 expired = []
76 for assoc in assocs:77 for assoc in assocs:
77 association = OIDAssociation(78 association = OIDAssociation(
78 assoc.handle, base64.decodestring(assoc.secret), assoc.issued,79 assoc.handle,
79 assoc.lifetime, assoc.assoc_type80 base64.decodestring(assoc.secret.encode('utf-8')),
81 assoc.issued, assoc.lifetime, assoc.assoc_type
80 )82 )
81 if association.getExpiresIn() == 0:83 if PY3:
84 expires_in = association.expiresIn
85 else:
86 expires_in = association.getExpiresIn()
87 if expires_in == 0:
82 expired.append(assoc)88 expired.append(assoc)
83 else:89 else:
84 associations.append((association.issued, association))90 associations.append((association.issued, association))
8591
=== modified file 'django_openid_auth/teams.py'
--- django_openid_auth/teams.py 2015-04-23 20:39:02 +0000
+++ django_openid_auth/teams.py 2017-04-03 12:33:16 +0000
@@ -72,6 +72,7 @@
72 registerNamespaceAlias,72 registerNamespaceAlias,
73 NamespaceAliasRegistrationError,73 NamespaceAliasRegistrationError,
74)74)
75from six import string_types
7576
76__all__ = [77__all__ = [
77 'TeamsRequest',78 'TeamsRequest',
@@ -84,7 +85,7 @@
8485
85try:86try:
86 registerNamespaceAlias(ns_uri, 'lp')87 registerNamespaceAlias(ns_uri, 'lp')
87except NamespaceAliasRegistrationError, e:88except NamespaceAliasRegistrationError as e:
88 oidutil.log(89 oidutil.log(
89 'registerNamespaceAlias(%r, %r) failed: %s' % (ns_uri, 'lp', str(e)))90 'registerNamespaceAlias(%r, %r) failed: %s' % (ns_uri, 'lp', str(e)))
9091
@@ -139,7 +140,7 @@
139 # There is no alias, so try to add one. (OpenID version 1)140 # There is no alias, so try to add one. (OpenID version 1)
140 try:141 try:
141 message.namespaces.addAlias(ns_uri, 'lp')142 message.namespaces.addAlias(ns_uri, 'lp')
142 except KeyError, why:143 except KeyError as why:
143 # An alias for the string 'lp' already exists, but it's144 # An alias for the string 'lp' already exists, but it's
144 # defined for something other than Launchpad teams145 # defined for something other than Launchpad teams
145 raise TeamsNamespaceError(why[0])146 raise TeamsNamespaceError(why[0])
@@ -287,7 +288,7 @@
287 @raise ValueError: when a team requested is not a string288 @raise ValueError: when a team requested is not a string
288 or strict is set and a team was requested more than once289 or strict is set and a team was requested more than once
289 """290 """
290 if isinstance(query_membership, basestring):291 if isinstance(query_membership, string_types):
291 raise TypeError('Teams should be passed as a list of '292 raise TypeError('Teams should be passed as a list of '
292 'strings (not %r)' % (type(query_membership),))293 'strings (not %r)' % (type(query_membership),))
293294
294295
=== modified file 'django_openid_auth/tests/test_auth.py'
--- django_openid_auth/tests/test_auth.py 2017-01-20 14:28:12 +0000
+++ django_openid_auth/tests/test_auth.py 2017-04-03 12:33:16 +0000
@@ -29,15 +29,16 @@
29from __future__ import unicode_literals29from __future__ import unicode_literals
3030
31import re31import re
32from urlparse import urljoin32try:
33 from urllib.parse import urljoin
34except ImportError:
35 from urlparse import urljoin
3336
34from django.conf import settings37from django.conf import settings
35from django.contrib.auth.models import Group, Permission, User38from django.contrib.auth.models import Group, Permission, User
36from django.core.exceptions import ImproperlyConfigured39from django.core.exceptions import ImproperlyConfigured
37from django.db import models
38from django.test import TestCase40from django.test import TestCase
39from django.test.utils import override_settings41from django.test.utils import override_settings
40from mock import patch
41from openid.consumer.consumer import (42from openid.consumer.consumer import (
42 CancelResponse,43 CancelResponse,
43 FailureResponse,44 FailureResponse,
@@ -160,7 +161,8 @@
160 perm_label = '%s.%s' % (permission.content_type.app_label,161 perm_label = '%s.%s' % (permission.content_type.app_label,
161 permission.codename)162 permission.codename)
162 # Always invalidate the per-request perm cache163 # Always invalidate the per-request perm cache
163 for attr in user.__dict__.keys():164 attrs = list(user.__dict__.keys())
165 for attr in attrs:
164 if attr.endswith('_perm_cache'):166 if attr.endswith('_perm_cache'):
165 delattr(user, attr)167 delattr(user, attr)
166168
167169
=== modified file 'django_openid_auth/tests/test_store.py'
--- django_openid_auth/tests/test_store.py 2015-04-23 20:39:02 +0000
+++ django_openid_auth/tests/test_store.py 2017-04-03 12:33:16 +0000
@@ -28,6 +28,7 @@
2828
29from __future__ import unicode_literals29from __future__ import unicode_literals
3030
31import base64
31import time32import time
3233
33from django.test import TestCase34from django.test import TestCase
@@ -52,7 +53,8 @@
52 server_url='server-url', handle='handle')53 server_url='server-url', handle='handle')
53 self.assertEquals(dbassoc.server_url, 'server-url')54 self.assertEquals(dbassoc.server_url, 'server-url')
54 self.assertEquals(dbassoc.handle, 'handle')55 self.assertEquals(dbassoc.handle, 'handle')
55 self.assertEquals(dbassoc.secret, 'secret'.encode('base-64'))56 self.assertEquals(
57 dbassoc.secret, base64.encodestring(b'secret').decode('utf-8'))
56 self.assertEquals(dbassoc.issued, 42)58 self.assertEquals(dbassoc.issued, 42)
57 self.assertEquals(dbassoc.lifetime, 600)59 self.assertEquals(dbassoc.lifetime, 600)
58 self.assertEquals(dbassoc.assoc_type, 'HMAC-SHA1')60 self.assertEquals(dbassoc.assoc_type, 'HMAC-SHA1')
@@ -66,7 +68,8 @@
66 self.store.storeAssociation('server-url', assoc)68 self.store.storeAssociation('server-url', assoc)
67 dbassoc = Association.objects.get(69 dbassoc = Association.objects.get(
68 server_url='server-url', handle='handle')70 server_url='server-url', handle='handle')
69 self.assertEqual(dbassoc.secret, 'secret2'.encode('base-64'))71 self.assertEqual(
72 dbassoc.secret, base64.encodestring(b'secret2').decode('utf-8'))
70 self.assertEqual(dbassoc.issued, 420)73 self.assertEqual(dbassoc.issued, 420)
71 self.assertEqual(dbassoc.lifetime, 900)74 self.assertEqual(dbassoc.lifetime, 900)
72 self.assertEqual(dbassoc.assoc_type, 'HMAC-SHA256')75 self.assertEqual(dbassoc.assoc_type, 'HMAC-SHA256')
@@ -80,7 +83,7 @@
80 self.assertTrue(isinstance(assoc, OIDAssociation))83 self.assertTrue(isinstance(assoc, OIDAssociation))
8184
82 self.assertEquals(assoc.handle, 'handle')85 self.assertEquals(assoc.handle, 'handle')
83 self.assertEquals(assoc.secret, 'secret')86 self.assertEquals(assoc.secret, b'secret')
84 self.assertEquals(assoc.issued, timestamp)87 self.assertEquals(assoc.issued, timestamp)
85 self.assertEquals(assoc.lifetime, 600)88 self.assertEquals(assoc.lifetime, 600)
86 self.assertEquals(assoc.assoc_type, 'HMAC-SHA1')89 self.assertEquals(assoc.assoc_type, 'HMAC-SHA1')
8790
=== modified file 'django_openid_auth/tests/test_views.py'
--- django_openid_auth/tests/test_views.py 2017-01-16 15:05:26 +0000
+++ django_openid_auth/tests/test_views.py 2017-04-03 12:33:16 +0000
@@ -31,7 +31,10 @@
3131
32import cgi32import cgi
3333
34from urlparse import parse_qs34try:
35 from urllib.parse import parse_qs
36except ImportError:
37 from urlparse import parse_qs
3538
36from django.conf import settings39from django.conf import settings
37from django.contrib.auth.models import User, Group, Permission40from django.contrib.auth.models import User, Group, Permission
@@ -125,8 +128,8 @@
125 def parseFormPost(self, content):128 def parseFormPost(self, content):
126 """Parse an HTML form post to create an OpenID request."""129 """Parse an HTML form post to create an OpenID request."""
127 # Hack to make the javascript XML compliant ...130 # Hack to make the javascript XML compliant ...
128 content = content.replace('i < elements.length',131 content = content.replace(
129 'i &lt; elements.length')132 'i < elements.length', 'i &lt; elements.length')
130 tree = ET.XML(content)133 tree = ET.XML(content)
131 form = tree.find('.//form')134 form = tree.find('.//form')
132 assert form is not None, 'No form in document'135 assert form is not None, 'No form in document'
@@ -137,8 +140,7 @@
137 for input in form.findall('input'):140 for input in form.findall('input'):
138 if input.get('type') != 'hidden':141 if input.get('type') != 'hidden':
139 continue142 continue
140 query[input.get('name').encode('UTF-8')] = \143 query[input.get('name')] = input.get('value')
141 input.get('value').encode('UTF-8')
142 self.last_request = self.server.decodeRequest(query)144 self.last_request = self.server.decodeRequest(query)
143 return self.last_request145 return self.last_request
144146
@@ -236,7 +238,8 @@
236 response = self.client.post(self.login_url, self.openid_req)238 response = self.client.post(self.login_url, self.openid_req)
237 self.assertContains(response, 'OpenID transaction in progress')239 self.assertContains(response, 'OpenID transaction in progress')
238240
239 openid_request = self.provider.parseFormPost(response.content)241 openid_request = self.provider.parseFormPost(
242 response.content.decode('utf-8'))
240 self.assertEqual(openid_request.mode, 'checkid_setup')243 self.assertEqual(openid_request.mode, 'checkid_setup')
241 self.assertTrue(openid_request.return_to.startswith(244 self.assertTrue(openid_request.return_to.startswith(
242 'http://testserver/openid/complete/'))245 'http://testserver/openid/complete/'))
@@ -248,7 +251,7 @@
248251
249 # And they are now logged in:252 # And they are now logged in:
250 response = self.client.get('/getuser/')253 response = self.client.get('/getuser/')
251 self.assertEqual(response.content, 'someuser')254 self.assertEqual(response.content.decode('utf-8'), 'someuser')
252255
253 def test_login_with_nonascii_return_to(self):256 def test_login_with_nonascii_return_to(self):
254 """Ensure non-ascii characters can be used for the 'next' arg."""257 """Ensure non-ascii characters can be used for the 'next' arg."""
@@ -270,7 +273,8 @@
270273
271 self.assertContains(response, 'OpenID transaction in progress')274 self.assertContains(response, 'OpenID transaction in progress')
272275
273 openid_request = self.provider.parseFormPost(response.content)276 openid_request = self.provider.parseFormPost(
277 response.content.decode('utf-8'))
274 self.assertEqual(openid_request.mode, 'checkid_setup')278 self.assertEqual(openid_request.mode, 'checkid_setup')
275 self.assertTrue(openid_request.return_to.startswith(279 self.assertTrue(openid_request.return_to.startswith(
276 'http://testserver/openid/complete/'))280 'http://testserver/openid/complete/'))
@@ -297,7 +301,8 @@
297 self.assertEqual(response.status_code, 200)301 self.assertEqual(response.status_code, 200)
298 self.assertContains(response, 'OpenID transaction in progress')302 self.assertContains(response, 'OpenID transaction in progress')
299303
300 openid_request = self.provider.parseFormPost(response.content)304 openid_request = self.provider.parseFormPost(
305 response.content.decode('utf-8'))
301 self.assertEqual(openid_request.mode, 'checkid_setup')306 self.assertEqual(openid_request.mode, 'checkid_setup')
302 self.assertTrue(openid_request.return_to.startswith(307 self.assertTrue(openid_request.return_to.startswith(
303 'http://testserver/openid/complete/'))308 'http://testserver/openid/complete/'))
@@ -309,7 +314,7 @@
309314
310 # And they are now logged in:315 # And they are now logged in:
311 response = self.client.get('/getuser/')316 response = self.client.get('/getuser/')
312 self.assertEqual(response.content, 'someuser')317 self.assertEqual(response.content.decode('utf-8'), 'someuser')
313318
314 def test_login_create_users(self):319 def test_login_create_users(self):
315 # Create a user with the same name as we'll pass back via sreg.320 # Create a user with the same name as we'll pass back via sreg.
@@ -321,7 +326,8 @@
321326
322 # Complete the request, passing back some simple registration327 # Complete the request, passing back some simple registration
323 # data. The user is redirected to the next URL.328 # data. The user is redirected to the next URL.
324 openid_request = self.provider.parseFormPost(response.content)329 openid_request = self.provider.parseFormPost(
330 response.content.decode('utf-8'))
325 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)331 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
326 openid_response = openid_request.answer(True)332 openid_response = openid_request.answer(True)
327 sreg_response = sreg.SRegResponse.extractResponse(333 sreg_response = sreg.SRegResponse.extractResponse(
@@ -335,7 +341,7 @@
335 # And they are now logged in as a new user (they haven't taken341 # And they are now logged in as a new user (they haven't taken
336 # over the existing "someuser" user).342 # over the existing "someuser" user).
337 response = self.client.get('/getuser/')343 response = self.client.get('/getuser/')
338 self.assertEqual(response.content, 'someuser2')344 self.assertEqual(response.content.decode('utf-8'), 'someuser2')
339345
340 # Check the details of the new user.346 # Check the details of the new user.
341 user = User.objects.get(username='someuser2')347 user = User.objects.get(username='someuser2')
@@ -359,7 +365,8 @@
359365
360 # Complete the request, passing back some simple registration366 # Complete the request, passing back some simple registration
361 # data. The user is redirected to the next URL.367 # data. The user is redirected to the next URL.
362 openid_request = self.provider.parseFormPost(response.content)368 openid_request = self.provider.parseFormPost(
369 response.content.decode('utf-8'))
363 return openid_request370 return openid_request
364371
365 def _get_login_response(self, openid_request, resp_data, use_sreg,372 def _get_login_response(self, openid_request, resp_data, use_sreg,
@@ -383,7 +390,8 @@
383 self.provider.type_uris.append(pape.ns_uri)390 self.provider.type_uris.append(pape.ns_uri)
384391
385 response = self.client.post(self.login_url, self.openid_req)392 response = self.client.post(self.login_url, self.openid_req)
386 openid_request = self.provider.parseFormPost(response.content)393 openid_request = self.provider.parseFormPost(
394 response.content.decode('utf-8'))
387395
388 request_auth = openid_request.message.getArg(396 request_auth = openid_request.message.getArg(
389 'http://specs.openid.net/extensions/pape/1.0',397 'http://specs.openid.net/extensions/pape/1.0',
@@ -431,7 +439,7 @@
431 query['openid.pape.auth_policies'], [preferred_auth])439 query['openid.pape.auth_policies'], [preferred_auth])
432440
433 response = self.client.get('/getuser/')441 response = self.client.get('/getuser/')
434 self.assertEqual(response.content, 'testuser')442 self.assertEqual(response.content.decode('utf-8'), 'testuser')
435443
436 @override_settings(OPENID_PHYSICAL_MULTIFACTOR_REQUIRED=True)444 @override_settings(OPENID_PHYSICAL_MULTIFACTOR_REQUIRED=True)
437 def test_login_physical_multifactor_not_provided(self):445 def test_login_physical_multifactor_not_provided(self):
@@ -547,10 +555,11 @@
547 response = self.client.get('/getuser/')555 response = self.client.get('/getuser/')
548556
549 # username defaults to 'openiduser'557 # username defaults to 'openiduser'
550 self.assertEqual(response.content, 'openiduser')558 username = response.content.decode('utf-8')
559 self.assertEqual(username, 'openiduser')
551560
552 # The user's full name and email have been updated.561 # The user's full name and email have been updated.
553 user = User.objects.get(username=response.content)562 user = User.objects.get(username=username)
554 self.assertEqual(user.first_name, 'Openid')563 self.assertEqual(user.first_name, 'Openid')
555 self.assertEqual(user.last_name, 'User')564 self.assertEqual(user.last_name, 'User')
556 self.assertEqual(user.email, 'foo@example.com')565 self.assertEqual(user.email, 'foo@example.com')
@@ -565,7 +574,7 @@
565 response = self.client.get('/getuser/')574 response = self.client.get('/getuser/')
566575
567 # username defaults to a munged version of the email576 # username defaults to a munged version of the email
568 self.assertEqual(response.content, 'fooexamplecom')577 self.assertEqual(response.content.decode('utf-8'), 'fooexamplecom')
569578
570 def test_login_duplicate_username_numbering(self):579 def test_login_duplicate_username_numbering(self):
571 # Setup existing user who's name we're going to conflict with580 # Setup existing user who's name we're going to conflict with
@@ -582,7 +591,7 @@
582591
583 # Since this username is already taken by someone else, we go through592 # Since this username is already taken by someone else, we go through
584 # the process of adding +i to it, and get testuser2.593 # the process of adding +i to it, and get testuser2.
585 self.assertEqual(response.content, 'testuser2')594 self.assertEqual(response.content.decode('utf-8'), 'testuser2')
586595
587 def test_login_duplicate_username_numbering_with_conflicts(self):596 def test_login_duplicate_username_numbering_with_conflicts(self):
588 # Setup existing user who's name we're going to conflict with597 # Setup existing user who's name we're going to conflict with
@@ -602,7 +611,7 @@
602 # the process of adding +i to it starting with the count of users with611 # the process of adding +i to it starting with the count of users with
603 # username starting with 'testuser', of which there are 2. i should612 # username starting with 'testuser', of which there are 2. i should
604 # start at 3, which already exists, so it should skip to 4.613 # start at 3, which already exists, so it should skip to 4.
605 self.assertEqual(response.content, 'testuser4')614 self.assertEqual(response.content.decode('utf-8'), 'testuser4')
606615
607 def test_login_duplicate_username_numbering_with_holes(self):616 def test_login_duplicate_username_numbering_with_holes(self):
608 # Setup existing user who's name we're going to conflict with617 # Setup existing user who's name we're going to conflict with
@@ -625,7 +634,7 @@
625 # the process of adding +i to it starting with the count of users with634 # the process of adding +i to it starting with the count of users with
626 # username starting with 'testuser', of which there are 5. i should635 # username starting with 'testuser', of which there are 5. i should
627 # start at 6, and increment until it reaches 9.636 # start at 6, and increment until it reaches 9.
628 self.assertEqual(response.content, 'testuser9')637 self.assertEqual(response.content.decode('utf-8'), 'testuser9')
629638
630 def test_login_duplicate_username_numbering_with_nonsequential_matches(639 def test_login_duplicate_username_numbering_with_nonsequential_matches(
631 self):640 self):
@@ -646,7 +655,7 @@
646 # the process of adding +i to it starting with the count of users with655 # the process of adding +i to it starting with the count of users with
647 # username starting with 'testuser', of which there are 2. i should656 # username starting with 'testuser', of which there are 2. i should
648 # start at 3, which will be available.657 # start at 3, which will be available.
649 self.assertEqual(response.content, 'testuser3')658 self.assertEqual(response.content.decode('utf-8'), 'testuser3')
650659
651 def test_login_follow_rename(self):660 def test_login_follow_rename(self):
652 user = User.objects.create_user('testuser', 'someone@example.com')661 user = User.objects.create_user('testuser', 'someone@example.com')
@@ -666,10 +675,11 @@
666675
667 # If OPENID_FOLLOW_RENAMES, they are logged in as676 # If OPENID_FOLLOW_RENAMES, they are logged in as
668 # someuser (the passed in nickname has changed the username)677 # someuser (the passed in nickname has changed the username)
669 self.assertEqual(response.content, 'someuser')678 username = response.content.decode('utf-8')
679 self.assertEqual(username, 'someuser')
670680
671 # The user's full name and email have been updated.681 # The user's full name and email have been updated.
672 user = User.objects.get(username=response.content)682 user = User.objects.get(username=username)
673 self.assertEqual(user.first_name, 'Some')683 self.assertEqual(user.first_name, 'Some')
674 self.assertEqual(user.last_name, 'User')684 self.assertEqual(user.last_name, 'User')
675 self.assertEqual(user.email, 'foo@example.com')685 self.assertEqual(user.email, 'foo@example.com')
@@ -691,10 +701,11 @@
691 response = self.client.get('/getuser/')701 response = self.client.get('/getuser/')
692702
693 # Username should not have changed703 # Username should not have changed
694 self.assertEqual(response.content, 'testuser')704 username = response.content.decode('utf-8')
705 self.assertEqual(username, 'testuser')
695706
696 # The user's full name and email have been updated.707 # The user's full name and email have been updated.
697 user = User.objects.get(username=response.content)708 user = User.objects.get(username=username)
698 self.assertEqual(user.first_name, 'Some')709 self.assertEqual(user.first_name, 'Some')
699 self.assertEqual(user.last_name, 'User')710 self.assertEqual(user.last_name, 'User')
700 self.assertEqual(user.email, 'foo@example.com')711 self.assertEqual(user.email, 'foo@example.com')
@@ -730,10 +741,11 @@
730 # If OPENID_FOLLOW_RENAMES, attempt to change username to 'testuser'741 # If OPENID_FOLLOW_RENAMES, attempt to change username to 'testuser'
731 # but since that username is already taken by someone else, we go742 # but since that username is already taken by someone else, we go
732 # through the process of adding +i to it, and get testuser2.743 # through the process of adding +i to it, and get testuser2.
733 self.assertEqual(response.content, 'testuser2')744 username = response.content.decode('utf-8')
745 self.assertEqual(username, 'testuser2')
734746
735 # The user's full name and email have been updated.747 # The user's full name and email have been updated.
736 user = User.objects.get(username=response.content)748 user = User.objects.get(username=username)
737 self.assertEqual(user.first_name, 'Rename')749 self.assertEqual(user.first_name, 'Rename')
738 self.assertEqual(user.last_name, 'User')750 self.assertEqual(user.last_name, 'User')
739 self.assertEqual(user.email, 'rename@example.com')751 self.assertEqual(user.email, 'rename@example.com')
@@ -772,10 +784,11 @@
772 # the username follows the nickname+i scheme, it has non-numbers in the784 # the username follows the nickname+i scheme, it has non-numbers in the
773 # suffix, so it's not an auto-generated one. The regular process of785 # suffix, so it's not an auto-generated one. The regular process of
774 # renaming to 'testuser' has a conflict, so we get +2 at the end.786 # renaming to 'testuser' has a conflict, so we get +2 at the end.
775 self.assertEqual(response.content, 'testuser2')787 username = response.content.decode('utf-8')
788 self.assertEqual(username, 'testuser2')
776789
777 # The user's full name and email have been updated.790 # The user's full name and email have been updated.
778 user = User.objects.get(username=response.content)791 user = User.objects.get(username=username)
779 self.assertEqual(user.first_name, 'Rename')792 self.assertEqual(user.first_name, 'Rename')
780 self.assertEqual(user.last_name, 'User')793 self.assertEqual(user.last_name, 'User')
781 self.assertEqual(user.email, 'rename@example.com')794 self.assertEqual(user.email, 'rename@example.com')
@@ -812,10 +825,11 @@
812 # but since that username is already taken by someone else, we go825 # but since that username is already taken by someone else, we go
813 # through the process of adding +i to it. Since the user for this826 # through the process of adding +i to it. Since the user for this
814 # identity url already has a name matching that pattern, check if first827 # identity url already has a name matching that pattern, check if first
815 self.assertEqual(response.content, 'testuser2000')828 username = response.content.decode('utf-8')
829 self.assertEqual(username, 'testuser2000')
816830
817 # The user's full name and email have been updated.831 # The user's full name and email have been updated.
818 user = User.objects.get(username=response.content)832 user = User.objects.get(username=username)
819 self.assertEqual(user.first_name, 'Rename')833 self.assertEqual(user.first_name, 'Rename')
820 self.assertEqual(user.last_name, 'User')834 self.assertEqual(user.last_name, 'User')
821 self.assertEqual(user.email, 'rename@example.com')835 self.assertEqual(user.email, 'rename@example.com')
@@ -842,10 +856,11 @@
842856
843 # If OPENID_FOLLOW_RENAMES, username should be changed to 'testuser'857 # If OPENID_FOLLOW_RENAMES, username should be changed to 'testuser'
844 # because it wasn't currently taken858 # because it wasn't currently taken
845 self.assertEqual(response.content, 'testuser')859 username = response.content.decode('utf-8')
860 self.assertEqual(username, 'testuser')
846861
847 # The user's full name and email have been updated.862 # The user's full name and email have been updated.
848 user = User.objects.get(username=response.content)863 user = User.objects.get(username=username)
849 self.assertEqual(user.first_name, 'Same')864 self.assertEqual(user.first_name, 'Same')
850 self.assertEqual(user.last_name, 'User')865 self.assertEqual(user.last_name, 'User')
851 self.assertEqual(user.email, 'same@example.com')866 self.assertEqual(user.email, 'same@example.com')
@@ -860,7 +875,8 @@
860875
861 # Complete the request, passing back some simple registration876 # Complete the request, passing back some simple registration
862 # data. The user is redirected to the next URL.877 # data. The user is redirected to the next URL.
863 openid_request = self.provider.parseFormPost(response.content)878 openid_request = self.provider.parseFormPost(
879 response.content.decode('utf-8'))
864 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)880 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
865 openid_response = openid_request.answer(True)881 openid_response = openid_request.answer(True)
866 sreg_response = sreg.SRegResponse.extractResponse(882 sreg_response = sreg.SRegResponse.extractResponse(
@@ -898,7 +914,8 @@
898914
899 # Complete the request, passing back some simple registration915 # Complete the request, passing back some simple registration
900 # data. The user is redirected to the next URL.916 # data. The user is redirected to the next URL.
901 openid_request = self.provider.parseFormPost(response.content)917 openid_request = self.provider.parseFormPost(
918 response.content.decode('utf-8'))
902 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)919 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
903 openid_response = openid_request.answer(True)920 openid_response = openid_request.answer(True)
904 sreg_response = sreg.SRegResponse.extractResponse(921 sreg_response = sreg.SRegResponse.extractResponse(
@@ -927,7 +944,8 @@
927944
928 # Complete the request, passing back some simple registration945 # Complete the request, passing back some simple registration
929 # data. The user is redirected to the next URL.946 # data. The user is redirected to the next URL.
930 openid_request = self.provider.parseFormPost(response.content)947 openid_request = self.provider.parseFormPost(
948 response.content.decode('utf-8'))
931 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)949 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
932 openid_response = openid_request.answer(True)950 openid_response = openid_request.answer(True)
933 sreg_response = sreg.SRegResponse.extractResponse(951 sreg_response = sreg.SRegResponse.extractResponse(
@@ -969,7 +987,8 @@
969987
970 # Complete the request, passing back some simple registration988 # Complete the request, passing back some simple registration
971 # data. The user is redirected to the next URL.989 # data. The user is redirected to the next URL.
972 openid_request = self.provider.parseFormPost(response.content)990 openid_request = self.provider.parseFormPost(
991 response.content.decode('utf-8'))
973 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)992 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
974 openid_response = openid_request.answer(True)993 openid_response = openid_request.answer(True)
975 sreg_response = sreg.SRegResponse.extractResponse(994 sreg_response = sreg.SRegResponse.extractResponse(
@@ -992,7 +1011,8 @@
9921011
993 # Complete the request, passing back some simple registration1012 # Complete the request, passing back some simple registration
994 # data. The user is redirected to the next URL.1013 # data. The user is redirected to the next URL.
995 openid_request = self.provider.parseFormPost(response.content)1014 openid_request = self.provider.parseFormPost(
1015 response.content.decode('utf-8'))
996 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)1016 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
997 openid_response = openid_request.answer(True)1017 openid_response = openid_request.answer(True)
998 sreg_response = sreg.SRegResponse.extractResponse(1018 sreg_response = sreg.SRegResponse.extractResponse(
@@ -1028,10 +1048,11 @@
1028 self._do_user_login(self.openid_req, self.openid_resp)1048 self._do_user_login(self.openid_req, self.openid_resp)
1029 response = self.client.get('/getuser/')1049 response = self.client.get('/getuser/')
10301050
1031 self.assertEqual(response.content, 'testuser')1051 username = response.content.decode('utf-8')
1052 self.assertEqual(username, 'testuser')
10321053
1033 # The user's full name and email have been updated.1054 # The user's full name and email have been updated.
1034 user = User.objects.get(username=response.content)1055 user = User.objects.get(username=username)
1035 self.assertEqual(user.first_name, 'Some')1056 self.assertEqual(user.first_name, 'Some')
1036 self.assertEqual(user.last_name, 'User')1057 self.assertEqual(user.last_name, 'User')
1037 self.assertEqual(user.email, 'foo@example.com')1058 self.assertEqual(user.email, 'foo@example.com')
@@ -1047,7 +1068,8 @@
1047 with self.settings(OPENID_SREG_EXTRA_FIELDS=('language',)):1068 with self.settings(OPENID_SREG_EXTRA_FIELDS=('language',)):
1048 response = self.client.post(self.login_url, self.openid_req)1069 response = self.client.post(self.login_url, self.openid_req)
10491070
1050 openid_request = self.provider.parseFormPost(response.content)1071 openid_request = self.provider.parseFormPost(
1072 response.content.decode('utf-8'))
1051 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)1073 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
1052 for field in ('email', 'fullname', 'nickname', 'language'):1074 for field in ('email', 'fullname', 'nickname', 'language'):
1053 self.assertTrue(field in sreg_request)1075 self.assertTrue(field in sreg_request)
@@ -1064,7 +1086,8 @@
1064 with self.settings(OPENID_SREG_REQUIRED_FIELDS=('email', 'language')):1086 with self.settings(OPENID_SREG_REQUIRED_FIELDS=('email', 'language')):
1065 response = self.client.post(self.login_url, self.openid_req)1087 response = self.client.post(self.login_url, self.openid_req)
10661088
1067 openid_request = self.provider.parseFormPost(response.content)1089 openid_request = self.provider.parseFormPost(
1090 response.content.decode('utf-8'))
1068 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)1091 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
10691092
1070 self.assertEqual(['email', 'language'], sreg_request.required)1093 self.assertEqual(['email', 'language'], sreg_request.required)
@@ -1086,7 +1109,8 @@
10861109
1087 # The resulting OpenID request uses the Attribute Exchange1110 # The resulting OpenID request uses the Attribute Exchange
1088 # extension rather than the Simple Registration extension.1111 # extension rather than the Simple Registration extension.
1089 openid_request = self.provider.parseFormPost(response.content)1112 openid_request = self.provider.parseFormPost(
1113 response.content.decode('utf-8'))
1090 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)1114 sreg_request = sreg.SRegRequest.fromOpenIDRequest(openid_request)
1091 self.assertEqual(sreg_request.required, [])1115 self.assertEqual(sreg_request.required, [])
1092 self.assertEqual(sreg_request.optional, [])1116 self.assertEqual(sreg_request.optional, [])
@@ -1132,7 +1156,7 @@
1132 assert not settings.OPENID_FOLLOW_RENAMES, (1156 assert not settings.OPENID_FOLLOW_RENAMES, (
1133 'OPENID_FOLLOW_RENAMES must be False')1157 'OPENID_FOLLOW_RENAMES must be False')
1134 response = self.client.get('/getuser/')1158 response = self.client.get('/getuser/')
1135 self.assertEqual(response.content, 'testuser')1159 self.assertEqual(response.content.decode('utf-8'), 'testuser')
11361160
1137 # The user's full name and email have been updated.1161 # The user's full name and email have been updated.
1138 user = User.objects.get(username='testuser')1162 user = User.objects.get(username='testuser')
@@ -1216,7 +1240,8 @@
1216 self.assertContains(response, 'OpenID transaction in progress')1240 self.assertContains(response, 'OpenID transaction in progress')
12171241
1218 # Complete the request1242 # Complete the request
1219 openid_request = self.provider.parseFormPost(response.content)1243 openid_request = self.provider.parseFormPost(
1244 response.content.decode('utf-8'))
1220 openid_response = openid_request.answer(True)1245 openid_response = openid_request.answer(True)
1221 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)1246 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)
1222 teams_response = teams.TeamsResponse.extractResponse(1247 teams_response = teams.TeamsResponse.extractResponse(
@@ -1231,7 +1256,7 @@
12311256
1232 # And they are now logged in as testuser1257 # And they are now logged in as testuser
1233 response = self.client.get('/getuser/')1258 response = self.client.get('/getuser/')
1234 self.assertEqual(response.content, 'testuser')1259 self.assertEqual(response.content.decode('utf-8'), 'testuser')
12351260
1236 # The user's groups have been updated.1261 # The user's groups have been updated.
1237 User.objects.get(username='testuser')1262 User.objects.get(username='testuser')
@@ -1263,7 +1288,8 @@
1263 OPENID_LAUNCHPAD_TEAMS_MAPPING=mapping,1288 OPENID_LAUNCHPAD_TEAMS_MAPPING=mapping,
1264 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO=True,1289 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO=True,
1265 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO_BLACKLIST=blacklist):1290 OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO_BLACKLIST=blacklist):
1266 openid_request = self.provider.parseFormPost(response.content)1291 openid_request = self.provider.parseFormPost(
1292 response.content.decode('utf-8'))
1267 openid_request.answer(True)1293 openid_request.answer(True)
1268 teams.TeamsRequest.fromOpenIDRequest(openid_request)1294 teams.TeamsRequest.fromOpenIDRequest(openid_request)
12691295
@@ -1316,7 +1342,8 @@
1316 response = self.client.post(self.login_url, self.openid_req_no_next)1342 response = self.client.post(self.login_url, self.openid_req_no_next)
13171343
1318 # Complete the request1344 # Complete the request
1319 openid_request = self.provider.parseFormPost(response.content)1345 openid_request = self.provider.parseFormPost(
1346 response.content.decode('utf-8'))
1320 openid_response = openid_request.answer(True)1347 openid_response = openid_request.answer(True)
1321 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)1348 teams_request = teams.TeamsRequest.fromOpenIDRequest(openid_request)
1322 teams_response = teams.TeamsResponse.extractResponse(1349 teams_response = teams.TeamsResponse.extractResponse(
@@ -1335,7 +1362,8 @@
1335 display_id='http://example.com/identity')1362 display_id='http://example.com/identity')
13361363
1337 response = self.client.post(self.login_url, self.openid_req_no_next)1364 response = self.client.post(self.login_url, self.openid_req_no_next)
1338 openid_request = self.provider.parseFormPost(response.content)1365 openid_request = self.provider.parseFormPost(
1366 response.content.decode('utf-8'))
1339 openid_response = openid_request.answer(True)1367 openid_response = openid_request.answer(True)
1340 # Use a closure to test whether the signal handler was called.1368 # Use a closure to test whether the signal handler was called.
1341 self.signal_handler_called = False1369 self.signal_handler_called = False
13421370
=== modified file 'django_openid_auth/views.py'
--- django_openid_auth/views.py 2017-01-16 14:34:06 +0000
+++ django_openid_auth/views.py 2017-04-03 12:33:16 +0000
@@ -30,8 +30,11 @@
30from __future__ import unicode_literals30from __future__ import unicode_literals
3131
32import re32import re
33import urllib33try:
34from urlparse import urlsplit34 from urllib.parse import urlencode, urlsplit
35except ImportError:
36 from urllib import urlencode
37 from urlparse import urlsplit
3538
36from django.conf import settings39from django.conf import settings
37from django.contrib.auth import (40from django.contrib.auth import (
@@ -177,7 +180,10 @@
177 # Invalid or no form data:180 # Invalid or no form data:
178 if openid_url is None:181 if openid_url is None:
179 context = RequestContext(request)182 context = RequestContext(request)
180 context.update({'form': login_form, redirect_field_name: redirect_to})183 context.update({
184 'form': login_form,
185 redirect_field_name: redirect_to,
186 })
181 return render_to_response(template_name, context)187 return render_to_response(template_name, context)
182188
183 consumer = make_consumer(request)189 consumer = make_consumer(request)
@@ -274,7 +280,7 @@
274 # Django gives us Unicode, which is great. We must encode URI.280 # Django gives us Unicode, which is great. We must encode URI.
275 # urllib enforces str. We can't trust anything about the default281 # urllib enforces str. We can't trust anything about the default
276 # encoding inside str(foo) , so we must explicitly make foo a str.282 # encoding inside str(foo) , so we must explicitly make foo a str.
277 return_to += urllib.urlencode(283 return_to += urlencode(
278 {redirect_field_name: redirect_to.encode("UTF-8")})284 {redirect_field_name: redirect_to.encode("UTF-8")})
279285
280 return render_openid_request(request, openid_request, return_to)286 return render_openid_request(request, openid_request, return_to)
@@ -297,8 +303,9 @@
297 if openid_response.status == SUCCESS:303 if openid_response.status == SUCCESS:
298 try:304 try:
299 user = authenticate(openid_response=openid_response)305 user = authenticate(openid_response=openid_response)
300 except DjangoOpenIDException, e:306 except DjangoOpenIDException as e:
301 return render_failure(request, e.message, exception=e)307 return render_failure(
308 request, getattr(e, 'message', str(e)), exception=e)
302309
303 if user is not None:310 if user is not None:
304 if user.is_active:311 if user.is_active:
@@ -332,6 +339,7 @@
332 OPENID_LOGO_BASE_64.decode('base64'), mimetype='image/gif'339 OPENID_LOGO_BASE_64.decode('base64'), mimetype='image/gif'
333 )340 )
334341
342
335# Logo from http://openid.net/login-bg.gif343# Logo from http://openid.net/login-bg.gif
336# Embedded here for convenience; you should serve this as a static file344# Embedded here for convenience; you should serve this as a static file
337OPENID_LOGO_BASE_64 = """345OPENID_LOGO_BASE_64 = """
338346
=== modified file 'example_consumer/urls.py'
--- example_consumer/urls.py 2017-01-16 12:22:28 +0000
+++ example_consumer/urls.py 2017-04-03 12:33:16 +0000
@@ -31,7 +31,7 @@
31from django.contrib import admin31from django.contrib import admin
32from django.contrib.auth import views as auth_views32from django.contrib.auth import views as auth_views
3333
34import views34from example_consumer import views
3535
3636
37admin.autodiscover()37admin.autodiscover()
3838
=== removed file 'setup.cfg'
--- setup.cfg 2017-01-23 15:23:51 +0000
+++ setup.cfg 1970-01-01 00:00:00 +0000
@@ -1,2 +0,0 @@
1[wheel]
2universal = True
30
=== modified file 'setup.py'
--- setup.py 2017-01-20 20:25:07 +0000
+++ setup.py 2017-04-03 12:33:16 +0000
@@ -39,21 +39,28 @@
39 info.39 info.
40"""40"""
4141
42import sys
43
42from setuptools import find_packages, setup44from setuptools import find_packages, setup
4345
46PY3 = sys.version_info.major >= 3
47
4448
45description, long_description = __doc__.split('\n\n', 1)49description, long_description = __doc__.split('\n\n', 1)
46VERSION = '0.13'50VERSION = '0.14'
51
52install_requires = ['django>=1.6', 'six']
53if PY3:
54 install_requires.append('python3-openid')
55else:
56 install_requires.append('python-openid>=2.2.0')
4757
48setup(58setup(
49 name='django-openid-auth',59 name='django-openid-auth',
50 version=VERSION,60 version=VERSION,
5161
52 packages=find_packages(),62 packages=find_packages(),
53 install_requires=[63 install_requires=install_requires,
54 'django>=1.6',
55 'python-openid>=2.2.0',
56 ],
57 package_data={64 package_data={
58 'django_openid_auth': ['templates/openid/*.html'],65 'django_openid_auth': ['templates/openid/*.html'],
59 },66 },
6067
=== modified file 'tox.ini'
--- tox.ini 2017-01-20 20:31:51 +0000
+++ tox.ini 2017-04-03 12:33:16 +0000
@@ -1,36 +1,51 @@
1[tox]1[tox]
2envlist = py27-django1.6,py27-django1.7,py27-django1.8,py27-django1.9,py27-django1.102envlist =
3 py27-django1.6,py27-django1.7,py27-django1.8,py27-django1.9,py27-django1.10,py3-django1.10
34
4[testenv]5[testenv]
5commands = python manage.py test django_openid_auth6commands = python manage.py test django_openid_auth
6basepython =7deps =
7 python2.7
8deps=
9 mock8 mock
9
10[testenv:py27]
11basepython = python2.7
12deps =
10 python-openid13 python-openid
14 {[testenv]deps}
15
16[testenv:py3]
17basepython = python3
18deps =
19 python3-openid
20 {[testenv]deps}
1121
12[testenv:py27-django1.6]22[testenv:py27-django1.6]
13deps =23deps =
14 django == 1.6.1124 django == 1.6.11
15 south25 south
16 {[testenv]deps}26 {[testenv:py27]deps}
1727
18[testenv:py27-django1.7]28[testenv:py27-django1.7]
19deps =29deps =
20 django == 1.7.1130 django == 1.7.11
21 {[testenv]deps}31 {[testenv:py27]deps}
2232
23[testenv:py27-django1.8]33[testenv:py27-django1.8]
24deps =34deps =
25 django == 1.8.1735 django == 1.8.17
26 {[testenv]deps}36 {[testenv:py27]deps}
2737
28[testenv:py27-django1.9]38[testenv:py27-django1.9]
29deps =39deps =
30 django == 1.9.1240 django == 1.9.12
31 {[testenv]deps}41 {[testenv:py27]deps}
3242
33[testenv:py27-django1.10]43[testenv:py27-django1.10]
34deps =44deps =
35 django == 1.10.545 django == 1.10.6
36 {[testenv]deps}46 {[testenv:py27]deps}
47
48[testenv:py3-django1.10]
49deps =
50 django == 1.10.6
51 {[testenv:py3]deps}

Subscribers

People subscribed via source and target branches