Files
colio/nocodetools/models.py
2025-12-29 17:46:26 +09:00

86 lines
2.2 KiB
Python

# 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)