67 lines
2.2 KiB
Python
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'
|
|
|