# models.py from django.utils import timezone import mongoengine as me class NodeType(me.EmbeddedDocument): """ "type": { "resolvedName": "CraftFrame" } 형태 """ resolvedName = me.StringField(required=True) class CraftNode(me.EmbeddedDocument): """ CraftJS node 1개(값) 스키마 """ type = me.EmbeddedDocumentField(NodeType, required=True) isCanvas = me.BooleanField(default=False) # props/custom/linkedNodes는 구조가 유동적이므로 dict로 저장 props = me.DictField(default=dict) displayName = me.StringField() custom = me.DictField(default=dict) hidden = me.BooleanField(default=False) # 자식 노드 id 리스트 nodes = me.ListField(me.StringField(), default=list) # linkedNodes: { "ROOT-background": "mBIaZ3L5VU" } 같은 맵 linkedNodes = me.DictField(default=dict) # 일부 노드에 존재 ("parent": "ROOT") parent = me.StringField() class Page(me.EmbeddedDocument): """ pages[*] 구조: { "page_id": 1, "title": "...", "data": { "ROOT": {...}, "mBIaZ3L5VU": {...}, ... } } """ page_id = me.IntField(required=True) title = me.StringField(required=True) # data는 nodeId -> CraftNode 맵 data = me.MapField(me.EmbeddedDocumentField(CraftNode), default=dict) class Code(me.Document): """ 최상위 구조: { "keyword": [...], "description": "...", "pages": [...] } + (기존에 쓰던 object_type/object_id 유지) """ pages = me.EmbeddedDocumentListField(Page, default=list) keyword = me.ListField(me.StringField(max_length=50), default=list) description = me.StringField(default="") object_type = me.StringField(choices=("portfolio", "project"), required=True) object_id = me.StringField(required=True) created_at = me.DateTimeField(default=timezone.now) updated_at = me.DateTimeField(default=timezone.now) meta = { "collection": "codes", "indexes": [ ("object_type", "object_id"), "created_at", "updated_at", ], } def save(self, *args, **kwargs): self.updated_at = timezone.now() return super().save(*args, **kwargs)