diyalgo/diyalgo/models/status.py

67 lines
2.2 KiB
Python

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'