from rest_framework import serializers from .models import Code, Page, Element # from datetime import datetime, timezone from django.utils import timezone # from zoneinfo import ZoneInfo # KST = ZoneInfo("Asia/Seoul") class ElementSerializer(serializers.Serializer): element_id = serializers.CharField(required=False) element_type = serializers.CharField() content = serializers.CharField(allow_blank=True) css = serializers.DictField() class PageSerializer(serializers.Serializer): cut = serializers.IntegerField() elements = ElementSerializer(many=True) class CodeSerializer(serializers.Serializer): id = serializers.SerializerMethodField() pages = PageSerializer(many=True, required=False) created_at = serializers.SerializerMethodField() updated_at = serializers.SerializerMethodField() def get_created_at(self, obj): return timezone.localtime(obj.created_at).isoformat(timespec="seconds") def get_updated_at(self, obj): return timezone.localtime(obj.updated_at).isoformat(timespec="seconds") def get_id(self, obj): return str(obj.id) def create(self, validated_data): pages_data = validated_data.pop('pages') pages = [ Page( cut=page['cut'], elements=[Element(**el) for el in page['elements']] ) for page in pages_data ] code = Code(pages=pages, **validated_data) code.save() return code def update(self, instance, validated_data): update_pages_data = validated_data.get('pages', []) existing = {p.cut: p for p in instance.pages} for page in update_pages_data: cut = page.get('cut') if cut and cut in existing: page_obj = existing[cut] page_obj.elements = [Element(**el) for el in page["elements"]] else: instance.pages.append( Page( cut=cut, elements=[Element(**el) for el in page["elements"]] ) ) instance.save() return instance