86 lines
2.2 KiB
Python
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)
|