From 6702de359bcff016cb2f9497f80776d6af01e01a Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Sun, 9 Mar 2025 15:21:12 +0100 Subject: [PATCH] Add custom user model --- src/servala/core/models/__init__.py | 2 ++ src/servala/core/models/user.py | 38 +++++++++++++++++++++++++++++ src/servala/settings.py | 1 + 3 files changed, 41 insertions(+) create mode 100644 src/servala/core/models/user.py diff --git a/src/servala/core/models/__init__.py b/src/servala/core/models/__init__.py index 28a75be..110d9d7 100644 --- a/src/servala/core/models/__init__.py +++ b/src/servala/core/models/__init__.py @@ -14,6 +14,7 @@ from .service import ( ServiceOfferingPlan, ServiceProvider, ) +from .user import User __all__ = [ "BillingEntity", @@ -28,4 +29,5 @@ __all__ = [ "ServiceOffering", "ServiceOfferingPlan", "ServiceProvider", + "User", ] diff --git a/src/servala/core/models/user.py b/src/servala/core/models/user.py new file mode 100644 index 0000000..a514420 --- /dev/null +++ b/src/servala/core/models/user.py @@ -0,0 +1,38 @@ +from django.contrib.auth.models import AbstractBaseUser +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class User(AbstractBaseUser): + """The Django model provides a password and last_login field.""" + + email = models.EmailField(unique=True, verbose_name=_("Email address")) + first_name = models.CharField( + max_length=30, blank=True, verbose_name=_("First name") + ) + last_name = models.CharField(max_length=30, blank=True, verbose_name=_("Last name")) + company = models.CharField(max_length=100, blank=True, verbose_name=_("Company")) + + is_staff = models.BooleanField( + default=False, + verbose_name=_("Is staff"), + help_text=_("Staff users can log into this admin site."), + ) + is_superuser = models.BooleanField( + default=False, + verbose_name=_("Is superuser"), + help_text=_( + "Superusers have all permissions without explicitly assigning them. Use with caution." + ), + ) + + EMAIL_FIELD = "email" + USERNAME_FIELD = "email" + + def __str__(self): + if self.first_name and self.last_name: + return f"{self.first_name} {self.last_name}" + return self.email + + def normalize_username(self, username): + return super().normalize_username(username).strip().lower() diff --git a/src/servala/settings.py b/src/servala/settings.py index f4a84f9..507d890 100644 --- a/src/servala/settings.py +++ b/src/servala/settings.py @@ -107,6 +107,7 @@ TEMPLATES = [ }, ] +AUTH_USER_MODEL = "core.User" AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"