PySimpleSocial/orm/media.py

88 lines
2.1 KiB
Python

"""
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)