✨ Feat: [#64] code CRUD serializer 구현
This commit is contained in:
67
nocodetools/serializers.py
Normal file
67
nocodetools/serializers.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user