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)