diff --git a/nocodetools/serializers.py b/nocodetools/serializers.py new file mode 100644 index 0000000..293b271 --- /dev/null +++ b/nocodetools/serializers.py @@ -0,0 +1,67 @@ +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