class Page(db.Document): # type: ignore[name-defined] ''' Page ODM ''' # Document Fields name = db.StringField(required=True, unique=True) filepath = db.StringField(unique=True) status = db.EnumField(PageStatus, default=PageStatus.NULL) # metadata title = db.StringField() description = db.StringField() keywords = db.ListField(db.StringField()) author = db.StringField(default="Tom Hall") slug = db.StringField() link = db.StringField() header_image = db.ReferenceField(Image) layout = db.StringField(default="default") date_created = db.DateTimeField(default=date.today) date_published = db.DateTimeField() # content: define last to leave out of fields property content = db.StringField() meta = {'indexes': ['name']} # Derived data def get_slug(self): if slug := self.slug: return slugify(slug) elif title := self.title: return slugify(title)
class Format(db.EmbeddedDocument): # type: ignore[name-defined] ''' Image format subdocument ''' format = db.StringField() quality = db.IntField(min_value=0, max_value=100, default=55) processing = db.DictField() outputs = db.ListField(db.StringField()) def __str__(self): return self.format def __repr__(self): return f"<Format(format={self.format}), {len(self.outputs)} files>"
class Post(db.DynamicDocument): created_at = db.DateTimeField(default=datetime.datetime.now, required=True) title = db.StringField(max_length=255, required=True) slug = db.StringField(max_length=255, required=True) comments = db.ListField(db.EmbeddedDocumentField('Comment')) def get_absolute_url(self): return url_for('post', kwargs={"slug": self.slug}) def __unicode__(self): return self.title @property def post_type(self): return self.__class__.__name__ meta = { 'allow_inheritance': True, 'indexes': ['-created_at', 'slug'], 'ordering': ['-created_at'] }
class Exhibition(Post): exhibition_name = db.StringField(verbose_name="Exhibition Name", required=True, max_length=255) exhibition_artist = db.StringField(verbose_name="Artist Name", required=True, max_length=255) exhibition_artist = db.StringField(verbose_name="Additionnal Artist name", required=False, max_length=255) exhibition_artist = db.StringField(verbose_name="Additionnal Artist name", required=False, max_length=255) exhibition_key_image_url = db.StringField( verbose_name="Key exhibition image", required=False, max_length=255) body = db.StringField(required=False)
class Image(db.Document): # type: ignore[name-defined] ''' Image ODM ''' class Format(db.EmbeddedDocument): # type: ignore[name-defined] ''' Image format subdocument ''' format = db.StringField() quality = db.IntField(min_value=0, max_value=100, default=55) processing = db.DictField() outputs = db.ListField(db.StringField()) def __str__(self): return self.format def __repr__(self): return f"<Format(format={self.format}), {len(self.outputs)} files>" name = db.StringField(required=True, unique=True) source_format = db.StringField(required=True) filepath = db.StringField(required=True) desc = db.StringField() status = db.EnumField(ImgStatus, default=ImgStatus.NEW) width = db.IntField() height = db.IntField() thumbnail_widths = db.ListField(db.IntField()) formats = db.EmbeddedDocumentListField(Format) meta = {'indexes': ['name', 'filepath']} def __str__(self): return self.name def __repr__(self): return f"<Image(name='{self.name}'), {self.status.name}>" @property def path(self) -> Path: return Path(self.filepath) def check_outputs(self) -> bool: """ verify that listed output files in database match filesystem """ outputs = (Path(path) for format in self.formats for path in format.outputs) # 1 check all listed files exist return all(path.exists for path in outputs) def set_format(self, format: str, quality: int, **params) -> None: try: format_info = self.formats.get(format=format) except DoesNotExist: format_info = self.formats.create(format=format, quality=quality, processing=params) else: format_info.quality = quality format_info.processing = params finally: self.save() def delete_format(self, format: str) -> int: return self.formats.filter(format=format).delete()
class Comment(db.EmbeddedDocument): created_at = db.DateTimeField(default=datetime.datetime.now, required=True) body = db.StringField(verbose_name="Comment", required=True) author = db.StringField(verbose_name="Name", max_length=255, required=True)
class Quote(Post): body = db.StringField(required=True) author = db.StringField(verbose_name="Author Name", required=True, max_length=255)
class Image(Post): image_url = db.StringField(required=True, max_length=255)
class Video(Post): embed_code = db.StringField(required=True)
class BlogPost(Post): body = db.StringField(required=True)