Newer
Older
pydwiki / accounts / serializers.py
from django.utils import timezone
from rest_framework import serializers

from log_manager.trace_log import trace_log

from .models import CustomUser, EmailAddress


class EmailAddressSerializer(serializers.ModelSerializer):
    """メールアドレスシリアライザ。"""

    class Meta:
        model = EmailAddress
        """ 対象モデル """

        fields = [
            "id",
            "user",
            "email",
            "is_primary",
        ]
        """ 対象フィールド """


class CustomUserSerializer(serializers.ModelSerializer):
    """カスタムユーザーシリアライザ。"""

    emails = EmailAddressSerializer(many=True, read_only=True)
    """ メールアドレス。(Read Only) """

    class Meta:

        model = CustomUser
        """ 対象モデル。 """

        fields = [
            "id",
            "login_id",
            "username",
            "is_staff",
            "is_active",
            "is_superuser",
            "password_changed",
            "password_changed_date",
            "is_mfa_enabled",
            "emails",
            "password",
        ]
        """ 対象フィールド。 """

        extra_kwargs = {
            "is_staff": {
                "required": False,
                "default": True,
            },
            "is_active": {
                "required": False,
                "default": True,
            },
            "is_superuser": {
                "required": False,
                "default": False,
            },
            "is_mfa_enabled": {
                "required": False,
                "default": False,
            },
            "password": {
                "write_only": True,
                "required": False,
            },
        }

    @trace_log
    def create(self, validated_data):
        """生成時に呼び出されます。

        Arguments:
            validated_data: 検証されたデータ

        Return:
            生成したユーザー
        """
        password = validated_data.pop("password", None)
        if password:
            user = CustomUser.objects.create(**validated_data)
            user.set_password(password)
            user.password_changed = False
            user.password_changed_date = None
            user.save()
            return user
        return super().create(validated_data)

    @trace_log
    def update(self, instance, validated_data):
        """更新時に呼び出されます。

        Arguments:
            instance: インスタンス
            validated_data: 検証されたデータ

        Return:
            インスタンス
        """
        password = validated_data.pop("password", None)
        if password:
            instance.set_password(password)
            instance.password_changed = True
            instance.password_changed_date = timezone.now()
        return super().update(instance, validated_data)