88 lines
2.1 KiB
Python
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)
|