import logging from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.core.validators import RegexValidator from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ from log_manager.trace_log import trace_log from .custom_user_manager import CustomUserManager logger = logging.getLogger(__name__) class CustomUser(AbstractBaseUser, PermissionsMixin): """カスタムユーザー。""" objects = CustomUserManager() """ カスタムユーザー管理。 """ login_id = models.CharField( unique=True, blank=False, null=False, max_length=256, verbose_name=_("Login ID"), help_text=_( "It must be 256 characters or less, and " "only alphanumeric characters and @/./-/_ are allowed." ), validators=[ RegexValidator( regex=r"^[a-zA-Z0-9@_.-]+$", message=_("Only alphanumeric characters and @/./-/_ are allowed."), code="invalid_login_id", ), ], ) """ ログインID。 """ username = models.CharField( unique=False, blank=False, null=False, max_length=256, verbose_name=_("User Name") ) """ ユーザー名。 """ _email = models.EmailField(verbose_name=_("Email")) """ メールアドレス。 createsuperuser, createusr の設定用変数としてのみ使用。 ``REQUIRED_FIELDS`` を参照。 """ is_active = models.BooleanField( default=True, verbose_name=_("Active"), ) """ 有効/無効。 """ is_staff = models.BooleanField( default=False, verbose_name=_("Staff"), ) """ スタッフか否か。 """ is_superuser = models.BooleanField( default=False, verbose_name=_("Super User"), ) """ 管理者か否か。 """ date_joined = models.DateTimeField( default=timezone.now, verbose_name=_("Joined"), ) """ アカウント作成日時 """ password_changed = models.BooleanField( default=False, verbose_name=_("Password changed"), ) """ パスワード変更済みか否か """ password_changed_date = models.DateTimeField( blank=True, null=True, verbose_name=_("Password changed date"), ) """ 最終パスワード変更日時 """ is_mfa_enabled = models.BooleanField( default=False, verbose_name=_("MFA"), ) """ MFA 有効/無効 """ USERNAME_FIELD = "login_id" """ ログインID を認証用のID として使用する。""" REQUIRED_FIELDS = ["username", "_email"] """ createsuperuser にてプロンプトが表示されるフィールドリスト。 """ @trace_log def get_primary_email(self): primary_email = self.emails.filter(is_primary=True).first() return primary_email.email if primary_email else None """ プライマリメールアドレスを取得します。 Return: プライマリのメールアドレス。 """ def get_full_name(self): """Full Name を取得します。 Return: Full Name (=username) を返します。 """ return self.username def get_short_name(self): """Short Name を取得します。 Return: Short Name (=username) を返します。 """ return self.username def __str__(self): """文字列表現を返します。 Return: 本モデルの文字列表現 """ return self.username class Meta: verbose_name = _("USER") """ 本モデルの名称。 """ verbose_name_plural = _("USER") """ 本モデルの複数形の名称 """