From af88c09a5937a0b63add75021a9cf995cff7ec97 Mon Sep 17 00:00:00 2001 From: Damian Cugley Date: Wed, 9 Oct 2013 15:19:21 +0100 Subject: [PATCH 1/3] Get user model from settings (required for Django 1.5) --- .travis.yml | 2 +- CHANGES | 3 +++ auth_remember/models.py | 7 ++++--- setup.py | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 502e5ad..95079c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ python: - "2.6" - "2.7" env: - - DJANGO=1.3.1 + - DJANGO=1.5.4 install: - pip install Django==$DJANGO - python setup.py install diff --git a/CHANGES b/CHANGES index 5e9c90c..6df7363 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +0.3.1: +* Django 1.5 support + 0.3: * Fix a bug in the max_age cookie setting * Fix packaging diff --git a/auth_remember/models.py b/auth_remember/models.py index de3d8ae..ae0b1f0 100644 --- a/auth_remember/models.py +++ b/auth_remember/models.py @@ -1,7 +1,8 @@ from datetime import datetime, timedelta from django.db import models -from django.contrib.auth.models import User +from django.utils import timezone +from django.conf import settings as django_settings from auth_remember import settings from auth_remember.auth_utils import check_password @@ -30,10 +31,10 @@ class RememberToken(models.Model): token_hash = models.CharField(max_length=60, blank=False, primary_key=True) created = models.DateTimeField(editable=False, blank=True, - default=datetime.now) + default=timezone.now) created_initial = models.DateTimeField(editable=False, blank=False) - user = models.ForeignKey(User, related_name="remember_me_tokens") + user = models.ForeignKey(django_settings.AUTH_USER_MODEL, related_name="remember_me_tokens") objects = RememberTokenManager() diff --git a/setup.py b/setup.py index 49095aa..e4b5b38 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ install_requires = [ - 'Django>=1.3', + 'Django>=1.5', ] @@ -50,7 +50,7 @@ def finalize_options(self): setup( name='django-auth-remember', - version='0.3', + version='0.3.1', url='https://github.com/ailabs/django-auth-remember/', license='MIT', author='Michael van Tellingen', From f23c02585a4c52781826ca73e98175b280937d50 Mon Sep 17 00:00:00 2001 From: Damian Cugley Date: Wed, 9 Oct 2013 17:34:59 +0100 Subject: [PATCH 2/3] Modifications to work with a custom user model --- auth_remember/backend.py | 6 +++--- auth_remember/models.py | 6 +++--- auth_remember/tests.py | 13 +++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/auth_remember/backend.py b/auth_remember/backend.py index 9cd451f..184e295 100644 --- a/auth_remember/backend.py +++ b/auth_remember/backend.py @@ -1,4 +1,4 @@ -from django.contrib.auth.models import User +from django.contrib.auth import get_user_model from auth_remember import utils from auth_remember.models import RememberToken @@ -26,6 +26,6 @@ def authenticate(self, token_string, request): def get_user(self, user_id): try: - return User.objects.get(pk=user_id) - except User.DoesNotExist: + return get_user_model().objects.get(pk=user_id) + except get_user_model().DoesNotExist: return None diff --git a/auth_remember/models.py b/auth_remember/models.py index ae0b1f0..21ad254 100644 --- a/auth_remember/models.py +++ b/auth_remember/models.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import timedelta from django.db import models from django.utils import timezone @@ -17,13 +17,13 @@ def get_by_string(self, token_string): except ValueError: return - max_age = datetime.now() - timedelta(seconds=settings.COOKIE_AGE) + max_age = timezone.now() - timedelta(seconds=settings.COOKIE_AGE) for token in self.filter(created_initial__gte=max_age, user=user_id): if check_password(token_hash, token.token_hash): return token def clean_remember_tokens(self): - max_age = datetime.now() - timedelta(seconds=settings.COOKIE_AGE) + max_age = timezone.now() - timedelta(seconds=settings.COOKIE_AGE) return self.filter(created_initial__lte=max_age).delete() diff --git a/auth_remember/tests.py b/auth_remember/tests.py index 5e64274..cd1d62b 100644 --- a/auth_remember/tests.py +++ b/auth_remember/tests.py @@ -1,17 +1,19 @@ import time from django.contrib import auth -from django.contrib.auth.models import User, AnonymousUser +from django.contrib.auth.models import AnonymousUser +from django.contrib.auth import get_user_model from django.contrib.sessions.middleware import SessionMiddleware from django.http import HttpResponse from django.test import TestCase from django.test.client import RequestFactory + class TokenCreationTest(TestCase): def setUp(self): - self.user = User(username='test_user') - self.user.save() + junk_params = dict((x, x.upper()) for x in get_user_model().REQUIRED_FIELDS) + self.user = get_user_model().objects.create_user('TEST_USER', password='PASSWORD', **junk_params) def test_create_token_string(self): from auth_remember.utils import create_token_string @@ -44,9 +46,8 @@ def test_create_token_string_token_arg(self): class AuthTest(TestCase): def setUp(self): - self.user = User(username='test_user') - self.user.set_password('secret') - self.user.save() + junk_params = dict((x, x.upper()) for x in get_user_model().REQUIRED_FIELDS) + self.user = get_user_model().objects.create_user('test_user', password='secret', **junk_params) self.factory = RequestFactory() def test_auth_backend(self): From a20315b8ce95ab138dbb8e0940920197844562b2 Mon Sep 17 00:00:00 2001 From: Damian Cugley Date: Wed, 9 Oct 2013 17:37:30 +0100 Subject: [PATCH 3/3] Add section to README about custom user model --- README.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.rst b/README.rst index 6617095..26d467c 100644 --- a/README.rst +++ b/README.rst @@ -56,6 +56,19 @@ indicate if the user session is fresh. The name of the session var can be changed by setting the ``AUTH_REMEMBER_SESSION_KEY`` in you're settings file. +If You Have a Custom User Model +------------------------------- + +From Django 1.5 on wards it is possible to swap a different model in for the +usual auth.user. In this case the migrations included in this module will not +work, since they refer to the default user model. One workaround for this +problem is to copy the ``auth_remember`` directory in to you project and +either delete the ``migrations`` subdirectory (forcing it to rely on +old-fashioned ``syncdb``), or update the migration with this command:: + + ./manage.py schemamigration auth_remember --update --initial + + More information ----------------