from typing import Optional, Literal, List, TYPE_CHECKING from datetime import datetime from sqlmodel import Field, SQLModel, Relationship from bs4 import BeautifulSoup from diyalgo.models.links import TagStatusLink, EmojiStatusLink if TYPE_CHECKING: from diyalgo.models import Account, MediaAttachment, Tag, CustomEmoji, Poll class Mention(SQLModel, table=True): mention_id: Optional[int] = Field(primary_key=True, default=None) acct: str id: int url: str username: str status_id: Optional[int] = Field(default=None, foreign_key='status.id') status: 'Status' = Relationship(back_populates='mentions') class Status(SQLModel, table=True): """ Model of a toot on mastodon See: https://mastodonpy.readthedocs.io/en/stable/#toot-dicts """ id: int = Field(primary_key=True) # application: Optional[dict] = None account_id: Optional[int] = Field(default=None, foreign_key='account.id') account: 'Account' = Relationship(back_populates='statuses') bookmarked: Optional[bool] = None content: str created_at: datetime edited_at: Optional[datetime] = None emojis: List['CustomEmoji'] = Relationship(back_populates='statuses', link_model=EmojiStatusLink) favourited: Optional[bool] = None favourites_count: int filtered: List[str] = Field(default_factory=list) in_reply_to_id: Optional[int] = None in_reply_to_account_id: Optional[int] = None language: Optional[str] = None media_attachments: List['MediaAttachment'] = Relationship(back_populates='status') mentions: List[Mention] = Relationship(back_populates='status') muted: Optional[bool] = None pinned: Optional[bool] = None # poll: Optional['Poll'] = Relationship(back_populates='status') reblog: Optional[bool] = None reblogged: Optional[bool] = None reblogs_count: int replies_count: int sensitive: bool spoiler_text: str tags: List['Tag'] = Relationship(back_populates='statuses', link_model=TagStatusLink) text: Optional[str] = None uri: str url: str visibility: str #Literal['public', 'unlisted', 'private', 'direct'] @property def soup(self) -> BeautifulSoup: return BeautifulSoup(self.content) class Config: extra='ignore'