""" Media relation """ from piccolo.table import Table from piccolo.utils.pydantic import create_pydantic_model from piccolo.columns import ( Text, Boolean, Date, SmallInt, Varchar, Column, ForeignKey, OnUpdate, OnDelete, ) from piccolo.columns.defaults.date import DateNow from enum import Enum, auto from typing import Any class MediaType(Enum): """ Represents a media type """ URL: int = auto() BLOB: int = auto() FILE: int = auto() class Media(Table): """ A piece of media on a CDN """ media_id = Varchar(length=64, primary_key=True) media_type = SmallInt(null=False, choices=MediaType, secret=True) content = Text(null=False) content_type = Varchar(length=32, null=False) flagged = Boolean(default=False, null=False, secret=True) deleted = Boolean(default=False, null=False, secret=True) creation_date = Date(default=DateNow(), null=False) MediaModel = create_pydantic_model(Media) PublicMediaModel = create_pydantic_model(Media, exclude_columns=(Media.flagged, Media.deleted, Media.media_type)) async def get_media_by_column( column: Column, data: Any, include_secrets: bool = False, flagged_ok: bool = False, deleted_ok: bool = False, ) -> MediaModel | None: """ Retrieves a media object by a given criteria. Returns None if the media doesn't exist or if it's restricted/deleted (unless flagged_ok and deleted_ok are set accordingly) """ media = ( await Media.select( *Media.all_columns(), exclude_secrets=not include_secrets, ) .where(column == data) .first() ) if media: # Performs validation media = MediaModel(**media) if (media.deleted and not deleted_ok) or (media.flagged and not flagged_ok): return return media return async def get_media_by_id(media_id: str, *args, **kwargs) -> MediaModel: """ Retrieves a media object by its ID """ return await get_media_by_column(Media.media_id, media_id, *args, **kwargs)