Loading django/contrib/auth/migrations/0005_alter_user_last_login_null.py 0 → 100644 +19 −0 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('auth', '0004_alter_user_username_opts'), ] operations = [ migrations.AlterField( model_name='user', name='last_login', field=models.DateTimeField(null=True, verbose_name='last login', blank=True), ), ] django/contrib/auth/models.py +2 −2 Original line number Diff line number Diff line Loading @@ -172,7 +172,7 @@ class UserManager(BaseUserManager): email = self.normalize_email(email) user = self.model(username=username, email=email, is_staff=is_staff, is_active=True, is_superuser=is_superuser, last_login=now, is_superuser=is_superuser, date_joined=now, **extra_fields) user.set_password(password) user.save(using=self._db) Loading @@ -190,7 +190,7 @@ class UserManager(BaseUserManager): @python_2_unicode_compatible class AbstractBaseUser(models.Model): password = models.CharField(_('password'), max_length=128) last_login = models.DateTimeField(_('last login'), default=timezone.now) last_login = models.DateTimeField(_('last login'), blank=True, null=True) is_active = True Loading django/contrib/auth/tests/test_models.py +7 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,13 @@ class AbstractUserTestCase(TestCase): self.assertEqual(message.from_email, "from@domain.com") self.assertEqual(message.to, [abstract_user.email]) def test_last_login_default(self): user1 = User.objects.create(username='user1') self.assertIsNone(user1.last_login) user2 = User.objects.create_user(username='user2') self.assertIsNone(user2.last_login) class IsActiveTestCase(TestCase): """ Loading django/contrib/auth/tokens.py +1 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class PasswordResetTokenGenerator(object): key_salt = "django.contrib.auth.tokens.PasswordResetTokenGenerator" # Ensure results are consistent across DB backends login_timestamp = user.last_login.replace(microsecond=0, tzinfo=None) login_timestamp = '' if user.last_login is None else user.last_login.replace(microsecond=0, tzinfo=None) value = (six.text_type(user.pk) + user.password + six.text_type(login_timestamp) + six.text_type(timestamp)) Loading docs/ref/contrib/auth.txt +6 −2 Original line number Diff line number Diff line Loading @@ -81,8 +81,12 @@ Fields .. attribute:: last_login A datetime of the user's last login. Is set to the current date/time by default. A datetime of the user's last login. .. versionchanged:: 1.8 This field will be ``null`` if the user has never logged in. Previously it was set to the current date/time by default. .. attribute:: date_joined Loading Loading
django/contrib/auth/migrations/0005_alter_user_last_login_null.py 0 → 100644 +19 −0 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('auth', '0004_alter_user_username_opts'), ] operations = [ migrations.AlterField( model_name='user', name='last_login', field=models.DateTimeField(null=True, verbose_name='last login', blank=True), ), ]
django/contrib/auth/models.py +2 −2 Original line number Diff line number Diff line Loading @@ -172,7 +172,7 @@ class UserManager(BaseUserManager): email = self.normalize_email(email) user = self.model(username=username, email=email, is_staff=is_staff, is_active=True, is_superuser=is_superuser, last_login=now, is_superuser=is_superuser, date_joined=now, **extra_fields) user.set_password(password) user.save(using=self._db) Loading @@ -190,7 +190,7 @@ class UserManager(BaseUserManager): @python_2_unicode_compatible class AbstractBaseUser(models.Model): password = models.CharField(_('password'), max_length=128) last_login = models.DateTimeField(_('last login'), default=timezone.now) last_login = models.DateTimeField(_('last login'), blank=True, null=True) is_active = True Loading
django/contrib/auth/tests/test_models.py +7 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,13 @@ class AbstractUserTestCase(TestCase): self.assertEqual(message.from_email, "from@domain.com") self.assertEqual(message.to, [abstract_user.email]) def test_last_login_default(self): user1 = User.objects.create(username='user1') self.assertIsNone(user1.last_login) user2 = User.objects.create_user(username='user2') self.assertIsNone(user2.last_login) class IsActiveTestCase(TestCase): """ Loading
django/contrib/auth/tokens.py +1 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class PasswordResetTokenGenerator(object): key_salt = "django.contrib.auth.tokens.PasswordResetTokenGenerator" # Ensure results are consistent across DB backends login_timestamp = user.last_login.replace(microsecond=0, tzinfo=None) login_timestamp = '' if user.last_login is None else user.last_login.replace(microsecond=0, tzinfo=None) value = (six.text_type(user.pk) + user.password + six.text_type(login_timestamp) + six.text_type(timestamp)) Loading
docs/ref/contrib/auth.txt +6 −2 Original line number Diff line number Diff line Loading @@ -81,8 +81,12 @@ Fields .. attribute:: last_login A datetime of the user's last login. Is set to the current date/time by default. A datetime of the user's last login. .. versionchanged:: 1.8 This field will be ``null`` if the user has never logged in. Previously it was set to the current date/time by default. .. attribute:: date_joined Loading