Newer
Older
pydwiki / accounts / models / email_address.py
from django.contrib.auth import get_user_model
from django.core.validators import EmailValidator
from django.db import models
from django.utils.translation import gettext_lazy as _

from log_manager.trace_log import trace_log


class EmailAddress(models.Model):
    """メールアドレス"""

    user = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
        related_name="emails",
        verbose_name=_("User"),
    )
    """ ユーザー。 """

    email = models.EmailField(unique=True, validators=[EmailValidator()], verbose_name=_("Email"))
    """ メールアドレス。 """

    is_primary = models.BooleanField(default=False, verbose_name=_("Primary"))
    """ プライマリー。 """

    created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at"))
    """ 生成日時 """

    @trace_log
    def save(self, *args, **kwargs):
        """保存の際呼び出されます。
        is_primary=True が指定されている場合、 対象ユーザーの他の is_primary を全て False にします。
        ※最後に is_primary=True を指定されたメールアドレスを唯一のプライマリとする。(ユーザー毎)
        """
        if self.is_primary:
            EmailAddress.objects.filter(user=self.user, is_primary=True).update(is_primary=False)
        super().save(*args, **kwargs)

    @trace_log
    def __str__(self):
        """文字列表現を返します。

        Return:
            本モデルの文字列表現
        """
        add_info = "primary" if self.is_primary else ""
        return f"{self.email} ({add_info})"

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=["user"], condition=models.Q(is_primary=True), name="unique_primary_email"
            )
        ]

        verbose_name = _("EMAIL")
        """ 本モデルの名称。 """

        verbose_name_plural = _("EMAIL")
        """ 本モデルの複数形の名称 """