✨ 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