Newer
Older
pydwiki / accounts / models / custom_user.py
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=True,
        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 = "ユーザー"
        """ 本モデルの名称。 """

        verbose_name_plural = "ユーザー"
        """ 本モデルの複数形の名称 """