from piccolo.table import Table, Column from piccolo.columns import ( BigSerial, UUID, Boolean, Timestamptz, OnDelete, OnUpdate, ForeignKey, Varchar, ) from piccolo.columns.defaults.timestamptz import TimestamptzNow from piccolo.utils.pydantic import create_pydantic_model from orm.users import User, PublicUserModel from orm.media import Media, PublicMediaModel from config import MAX_CAPTION_LENGTH class Post(Table, tablename="posts"): internal_id = BigSerial() public_id = UUID(primary_key=True) created_by = ForeignKey( references=User, on_update=OnUpdate.cascade, on_delete=OnDelete.cascade, null=False, ) creation_date = Timestamptz(default=TimestamptzNow(), null=False) media = ForeignKey( references=Media, on_update=OnUpdate.cascade, on_delete=OnDelete.cascade, null=False, ) caption = Varchar(length=MAX_CAPTION_LENGTH) flagged = Boolean(default=False) deleted = Boolean(default=False) PostModel = create_pydantic_model(Post, nested=True) PrivatePostModelInternal = create_pydantic_model(Post, nested=True, exclude_columns=(Post.flagged, Post.internal_id)) PublicPostModelInternal = create_pydantic_model( Post, nested=True, exclude_columns=(Post.flagged, Post.deleted, Post.internal_id) ) class PrivatePostModel(PrivatePostModelInternal): created_by: PublicUserModel content: PublicMediaModel class PublicPostModel(PublicPostModelInternal): created_by: PublicUserModel content: PublicMediaModel