Ticket #5612: 5612.diff
File 5612.diff, 7.1 KB (added by , 15 years ago) |
---|
-
django/contrib/auth/__init__.py
diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py index 169ae01..2d6511d 100644
a b import datetime 2 2 from warnings import warn 3 3 from django.core.exceptions import ImproperlyConfigured 4 4 from django.utils.importlib import import_module 5 from django.contrib.auth import signals 5 6 6 7 SESSION_KEY = '_auth_user_id' 7 8 BACKEND_SESSION_KEY = '_auth_user_backend' … … def login(request, user): 65 66 if user is None: 66 67 user = request.user 67 68 # TODO: It would be nice to support different login methods, like signed cookies. 68 user.last_login = datetime.datetime.now()69 user.save()69 signals.user_logged_in.send(sender=user.__class__, request=request, 70 user=user) 70 71 71 72 if SESSION_KEY in request.session: 72 73 if request.session[SESSION_KEY] != user.id: … … def logout(request): 86 87 Removes the authenticated user's ID from the request and flushes their 87 88 session data. 88 89 """ 90 # Dispatch the signal before the user is logged out so the receivers have a 91 # chance to find out *who* logged out. 92 user = getattr(request, 'user', None) 93 if hasattr(user, 'is_authenticated') and not user.is_authenticated(): 94 user = None 95 signals.user_logged_out.send(sender=user.__class__, request=request, 96 user=user) 97 89 98 request.session.flush() 90 99 if hasattr(request, 'user'): 91 100 from django.contrib.auth.models import AnonymousUser -
django/contrib/auth/models.py
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index 681cf14..551410c 100644
a b import datetime 2 2 import urllib 3 3 4 4 from django.contrib import auth 5 from django.contrib.auth import signals 5 6 from django.core.exceptions import ImproperlyConfigured 6 7 from django.db import models 7 8 from django.db.models.manager import EmptyManager -
new file django/contrib/auth/signals.py
diff --git a/django/contrib/auth/signals.py b/django/contrib/auth/signals.py new file mode 100644 index 0000000..ae66b6d
- + 1 import datetime 2 import django.dispatch 3 4 user_logged_in = django.dispatch.Signal(providing_args=['request', 'user']) 5 user_logged_out = django.dispatch.Signal(providing_args=['request', 'user']) 6 7 8 def update_last_login(sender, user, **kwargs): 9 """ 10 A signal receiver which updates the last_login date for the user logging 11 in. 12 13 """ 14 user.last_login = datetime.datetime.now() 15 user.save() 16 17 18 user_logged_in.connect(update_last_login) -
django/contrib/auth/tests/__init__.py
diff --git a/django/contrib/auth/tests/__init__.py b/django/contrib/auth/tests/__init__.py index 965ea2d..226c284 100644
a b from django.contrib.auth.tests.forms import FORM_TESTS 5 5 from django.contrib.auth.tests.remote_user \ 6 6 import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest 7 7 from django.contrib.auth.tests.models import ProfileTestCase 8 from django.contrib.auth.tests.signals import SignalTestCase 8 9 from django.contrib.auth.tests.tokens import TOKEN_GENERATOR_TESTS 9 10 from django.contrib.auth.tests.views \ 10 11 import PasswordResetTest, ChangePasswordTest, LoginTest, LogoutTest -
new file django/contrib/auth/tests/signals.py
diff --git a/django/contrib/auth/tests/signals.py b/django/contrib/auth/tests/signals.py new file mode 100644 index 0000000..3806021
- + 1 from django.test import TestCase 2 from django.contrib.auth import signals 3 4 5 class SignalTestCase(TestCase): 6 urls = 'django.contrib.auth.tests.urls' 7 fixtures = ['authtestdata.json'] 8 9 def listener_login(self, user, **kwargs): 10 self.logged_in.append(user) 11 12 def listener_logout(self, user, **kwargs): 13 self.logged_out.append(user) 14 15 def setUp(self): 16 """Set up the listeners and reset the logged in/logged out counters""" 17 self.logged_in = [] 18 self.logged_out = [] 19 signals.user_logged_in.connect(self.listener_login) 20 signals.user_logged_out.connect(self.listener_logout) 21 22 def tearDown(self): 23 """Disconnect the listeners""" 24 signals.user_logged_in.disconnect(self.listener_login) 25 signals.user_logged_out.disconnect(self.listener_logout) 26 27 def test_login(self): 28 # Only a successful login will trigger the signal. 29 self.client.login(username='testclient', password='bad') 30 self.assertEqual(len(self.logged_in), 0) 31 # Like this: 32 self.client.login(username='testclient', password='password') 33 self.assertEqual(len(self.logged_in), 1) 34 self.assertEqual(self.logged_in[0].username, 'testclient') 35 36 def test_logout_anonymous(self): 37 # The log_out function will still trigger the signal for anonymous 38 # users. 39 self.client.get('/logout/next_page/') 40 self.assertEqual(len(self.logged_out), 1) 41 self.assertEqual(self.logged_out[0], None) 42 43 def test_logout(self): 44 self.client.login(username='testclient', password='password') 45 self.client.get('/logout/next_page/') 46 self.assertEqual(len(self.logged_out), 1) 47 self.assertEqual(self.logged_out[0].username, 'testclient') -
docs/ref/signals.txt
diff --git a/docs/ref/signals.txt b/docs/ref/signals.txt index d79232e..290acf7 100644
a b A list of all the signals that Django sends. 14 14 The :ref:`comment framework <ref-contrib-comments-index>` sends a :ref:`set 15 15 of comment-related signals <ref-contrib-comments-signals>`. 16 16 17 The :ref:`authentication framework <topics-auth>` sends :ref:`signals when 18 a user is logged in / out <topics-auth-signals>`. 19 17 20 Model signals 18 21 ============= 19 22 -
docs/topics/auth.txt
diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt index d796625..f8f19d7 100644
a b How to log a user out 667 667 immediately after logging out, do that *after* calling 668 668 :func:`django.contrib.auth.logout()`. 669 669 670 .. _topics-auth-signals: 671 672 Login and logout signals 673 ------------------------ 674 675 The auth framework uses two :ref:`signals <topic-signals>` that can be used for 676 notification when a user logs in or out. 677 678 **:data:`django.contrib.auth.signals.user_logged_in`** 679 680 Sent when a user logs in successfully. 681 682 Arguments sent with this signal: 683 684 ``sender`` 685 As above: the class of the user that just logged in. 686 687 ``request`` 688 The current :class:`~django.http.HttpRequest` instance. 689 690 ``user`` 691 The user instance that just logged in. 692 693 **:data:`django.contrib.auth.signals.user_logged_out`** 694 695 Sent when the logout method is called. 696 697 ``sender`` 698 As above: the class of the user that just logged out or ``None`` 699 if the user was not authenticated. 700 701 ``request`` 702 The current :class:`~django.http.HttpRequest` instance. 703 704 ``user`` 705 The user instance that just logged out or ``None`` if the 706 user was not authenticated. 707 670 708 Limiting access to logged-in users 671 709 ---------------------------------- 672 710