From 5fc80c24b629a926276272a7b6f5ed1531f66563 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 7 Jul 2017 11:03:11 +0200 Subject: [PATCH] Fixed custom User model. see #1165 --- .../migrations/0013_auto_20170707_1058.py | 31 +++++++++++ modoboa/core/models.py | 52 ++----------------- 2 files changed, 34 insertions(+), 49 deletions(-) create mode 100644 modoboa/core/migrations/0013_auto_20170707_1058.py diff --git a/modoboa/core/migrations/0013_auto_20170707_1058.py b/modoboa/core/migrations/0013_auto_20170707_1058.py new file mode 100644 index 000000000..934a30898 --- /dev/null +++ b/modoboa/core/migrations/0013_auto_20170707_1058.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-07-07 08:58 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0012_auto_20170215_1034'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='date_joined', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined'), + ), + migrations.AlterField( + model_name='user', + name='first_name', + field=models.CharField(blank=True, max_length=30, verbose_name='first name'), + ), + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=30, verbose_name='last name'), + ), + ] diff --git a/modoboa/core/models.py b/modoboa/core/models.py index baba71d07..3bdaa7a22 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -7,17 +7,13 @@ import re from django.core.urlresolvers import reverse from django.db import models -from django.utils import timezone from django.utils.encoding import ( python_2_unicode_compatible, smart_bytes, smart_text, force_str, force_text ) from django.utils.functional import cached_property from django.utils.translation import ugettext as _, ugettext_lazy -from django.contrib.auth.hashers import make_password, is_password_usable -from django.contrib.auth.models import ( - UserManager, Group, PermissionsMixin -) +from django.contrib.auth.models import Group, AbstractUser from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -42,7 +38,7 @@ except ImportError: @python_2_unicode_compatible -class User(PermissionsMixin): +class User(AbstractUser): """Custom User model. @@ -52,15 +48,11 @@ class User(PermissionsMixin): It also adds new attributes and methods. """ + username = models.CharField(max_length=254, unique=True) - first_name = models.CharField( - ugettext_lazy("First name"), max_length=30, blank=True) - last_name = models.CharField( - ugettext_lazy("Last name"), max_length=30, blank=True) email = models.EmailField(max_length=254, blank=True, db_index=True) is_staff = models.BooleanField(default=False, db_index=True) is_active = models.BooleanField(default=True, db_index=True) - date_joined = models.DateTimeField(default=timezone.now) is_local = models.BooleanField(default=True, db_index=True) master_user = models.BooleanField( ugettext_lazy("Allow mailboxes access"), default=False, @@ -69,9 +61,6 @@ class User(PermissionsMixin): ) ) password = models.CharField(ugettext_lazy("password"), max_length=256) - last_login = models.DateTimeField( - ugettext_lazy('last login'), blank=True, null=True - ) language = models.CharField( ugettext_lazy("language"), @@ -90,11 +79,6 @@ class User(PermissionsMixin): ) _parameters = jsonfield.JSONField(default={}) - objects = UserManager() - - USERNAME_FIELD = 'username' - REQUIRED_FIELDS = ['email'] - class Meta(object): ordering = ["username"] index_together = [ @@ -161,39 +145,9 @@ class User(PermissionsMixin): hasher = get_password_hasher(scheme) return hasher().verify(raw_value, val2) - def get_username(self): - "Return the identifying username for this User" - return getattr(self, self.USERNAME_FIELD) - def __str__(self): return smart_text(self.get_username()) - def natural_key(self): - return (self.get_username(),) - - @property - def is_anonymous(self): - """Always returns False. - - This is a way of comparing User objects to anonymous users. - """ - return False - - @property - def is_authenticated(self): - """ - Always return True. This is a way to tell if the user has been - authenticated in templates. - """ - return True - - def set_unusable_password(self): - # Sets a value that will never be a valid hash - self.password = make_password(None) - - def has_usable_password(self): - return is_password_usable(self.password) - def get_absolute_url(self): """Return detail url for this user.""" return reverse("admin:account_detail", args=[self.pk])