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) keyword = serializers.ListField(child=serializers.CharField(), required=False, allow_empty=True) description = serializers.CharField(allow_blank=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): request = self.context['request'] validated_data['object_type'] = request.query_params.get('type') validated_data['object_id'] = request.query_params.get('id') 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"]] ) ) if 'keyword' in validated_data: instance.keyword = validated_data['keyword'] if 'description' in validated_data: instance.description = validated_data['description'] instance.save() return instance