Ticket #5612: 5612.2.diff
File 5612.2.diff, 7.2 KB (added by , 14 years ago) |
---|
-
django/contrib/auth/__init__.py
diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py index 3d76a42..cca1b70 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): 62 63 if user is None: 63 64 user = request.user 64 65 # TODO: It would be nice to support different login methods, like signed cookies. 65 user.last_login = datetime.datetime.now()66 user.save()66 signals.user_logged_in.send(sender=user.__class__, request=request, 67 user=user) 67 68 68 69 if SESSION_KEY in request.session: 69 70 if request.session[SESSION_KEY] != user.id: … … def logout(request): 83 84 Removes the authenticated user's ID from the request and flushes their 84 85 session data. 85 86 """ 87 # Dispatch the signal before the user is logged out so the receivers have a 88 # chance to find out *who* logged out. 89 user = getattr(request, 'user', None) 90 if hasattr(user, 'is_authenticated') and not user.is_authenticated(): 91 user = None 92 signals.user_logged_out.send(sender=user.__class__, request=request, 93 user=user) 94 86 95 request.session.flush() 87 96 if hasattr(request, 'user'): 88 97 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 16a8b99..e37c5b3 100644
a b import datetime 2 2 import urllib 3 3 4 4 from django.contrib import auth 5 # Import the signals module to register the signal listener. 6 from django.contrib.auth import signals 5 7 from django.core.exceptions import ImproperlyConfigured 6 8 from django.db import models 7 9 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 98061a1..9f8b49f 100644
a b from django.contrib.auth.tests.forms import UserCreationFormTest, Authentication 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 TokenGeneratorTest 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 4c1db33..36ad071 100644
a b A list of all the signals that Django sends. 12 12 The :doc:`comment framework </ref/contrib/comments/index>` sends a :doc:`set 13 13 of comment-related signals </ref/contrib/comments/signals>`. 14 14 15 The :ref:`authentication framework <topics-auth>` sends :ref:`signals when 16 a user is logged in / out <topics-auth-signals>`. 17 15 18 Model signals 16 19 ============= 17 20 -
docs/topics/auth.txt
diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt index e0856e8..d69fd91 100644
a b How to log a user out 664 664 immediately after logging out, do that *after* calling 665 665 :func:`django.contrib.auth.logout()`. 666 666 667 .. _topics-auth-signals: 668 669 Login and logout signals 670 ------------------------ 671 672 The auth framework uses two :ref:`signals <topic-signals>` that can be used for 673 notification when a user logs in or out. 674 675 **:data:`django.contrib.auth.signals.user_logged_in`** 676 677 Sent when a user logs in successfully. 678 679 Arguments sent with this signal: 680 681 ``sender`` 682 As above: the class of the user that just logged in. 683 684 ``request`` 685 The current :class:`~django.http.HttpRequest` instance. 686 687 ``user`` 688 The user instance that just logged in. 689 690 **:data:`django.contrib.auth.signals.user_logged_out`** 691 692 Sent when the logout method is called. 693 694 ``sender`` 695 As above: the class of the user that just logged out or ``None`` 696 if the user was not authenticated. 697 698 ``request`` 699 The current :class:`~django.http.HttpRequest` instance. 700 701 ``user`` 702 The user instance that just logged out or ``None`` if the 703 user was not authenticated. 704 667 705 Limiting access to logged-in users 668 706 ---------------------------------- 669 707