diyalgo/diyalgo/models/status.py

89 lines
3.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_id: Optional[int] = Field(
foreign_key='status.id',
default=None,
nullable=True
)
reblog: Optional['Status'] = Relationship(
back_populates='reblogged_by',
sa_relationship_kwargs = {
'remote_side': 'Status.id'
}
)
reblogged_by: Optional[List['Status']] = Relationship(back_populates='reblog')
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: Optional[str] = None
visibility: str #Literal['public', 'unlisted', 'private', 'direct']
@property
def soup(self) -> BeautifulSoup:
return BeautifulSoup(self.content)
def __init__(self, *args, **kwargs):
from diyalgo.models import Account, MediaAttachment, Tag, CustomEmoji, Poll
#kwargs['account'] = Account(**kwargs['account'])
kwargs['account_id'] = kwargs['account']['id']
del kwargs['account']
kwargs['emojis'] = [CustomEmoji(**e) for e in kwargs['emojis']]
kwargs['media_attachments'] = [MediaAttachment(**a) for a in kwargs['media_attachments']]
kwargs['mentions'] = [Mention(**m) for m in kwargs['mentions']]
kwargs['tags'] = [Tag(**t) for t in kwargs['tags']]
super(Status, self).__init__(*args, **kwargs)
class Config:
extra='ignore'