2025-10-03 16:44:25 -07:00
|
|
|
from grung.types import BackReference, Collection, Field, Record
|
2025-09-24 01:28:23 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class User(Record):
|
2025-09-28 14:14:16 -07:00
|
|
|
@classmethod
|
|
|
|
|
def fields(cls):
|
|
|
|
|
return [*super().fields(), Field("name"), Field("email", unique=True)]
|
2025-09-24 22:03:30 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Group(Record):
|
2025-09-28 14:14:16 -07:00
|
|
|
@classmethod
|
|
|
|
|
def fields(cls):
|
|
|
|
|
return [*super().fields(), Field("name", unique=True), Collection("users", User)]
|
2025-09-25 22:31:37 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Page(Record):
|
2025-09-28 14:14:16 -07:00
|
|
|
@classmethod
|
|
|
|
|
def fields(cls):
|
|
|
|
|
return [
|
|
|
|
|
*super().fields(),
|
2025-10-03 16:44:25 -07:00
|
|
|
Field("uri", unique=True),
|
|
|
|
|
Field("stub"),
|
2025-09-28 14:14:16 -07:00
|
|
|
Field("title"),
|
|
|
|
|
Field("body"),
|
|
|
|
|
Collection("pages", Page),
|
2025-10-03 16:44:25 -07:00
|
|
|
BackReference("parent", value_type=Page),
|
2025-09-28 14:14:16 -07:00
|
|
|
]
|
|
|
|
|
|
2025-10-03 16:44:25 -07:00
|
|
|
def before_insert(self, db):
|
|
|
|
|
super().before_insert(db)
|
|
|
|
|
|
2025-09-28 14:14:16 -07:00
|
|
|
if not self.stub and not self.title:
|
|
|
|
|
raise Exception("Must provide either a stub or a title!")
|
|
|
|
|
if not self.stub:
|
|
|
|
|
self.stub = self.title.title().replace(" ", "")
|
|
|
|
|
if not self.title:
|
2025-10-03 16:44:25 -07:00
|
|
|
self.title = self.stub
|
|
|
|
|
|
|
|
|
|
self.uri = (self.parent.uri + "/" if self.parent and self.parent.uri != "/" else "") + self.stub
|
|
|
|
|
|
|
|
|
|
def after_insert(self, db):
|
|
|
|
|
super().after_insert(db)
|
|
|
|
|
for child in self.pages:
|
|
|
|
|
obj = BackReference.dereference(child, db)
|
|
|
|
|
obj.uri = f"{self.uri}/{obj.stub}"
|
|
|
|
|
child = db.save(obj)
|
|
|
|
|
|
|
|
|
|
def get_child(self, obj: Record):
|
|
|
|
|
for page in self.pages:
|
|
|
|
|
if page.uid == obj.uid:
|
|
|
|
|
return page
|
|
|
|
|
return None
|