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") """ 本モデルの複数形の名称 """