vtt/src/ttfrog/schema.py

53 lines
1.5 KiB
Python
Raw Normal View History

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)]
class Page(Record):
2025-09-28 14:14:16 -07:00
@classmethod
def fields(cls):
return [
*super().fields(),
Field("uri", unique=True),
Field("stub"),
2025-09-28 14:14:16 -07:00
Field("title"),
Field("body"),
Collection("pages", Page),
BackReference("parent", value_type=Page),
2025-09-28 14:14:16 -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:
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