68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
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
|