From 6edc40308a3e45817b282125499c3f5ed1c7a55e Mon Sep 17 00:00:00 2001 From: firedotguy Date: Fri, 13 Feb 2026 22:38:28 +0300 Subject: [PATCH] feat: add profiel required exception; add spans to post --- itd/exceptions.py | 6 +++++- itd/models/post.py | 20 ++++++++++++++------ itd/request.py | 4 +++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/itd/exceptions.py b/itd/exceptions.py index e545c7a..22767f2 100644 --- a/itd/exceptions.py +++ b/itd/exceptions.py @@ -129,4 +129,8 @@ class NotMultipleChoice(Exception): class EmptyOptions(Exception): def __str__(self) -> str: - return 'Options cannot be empty (pre-validation)' \ No newline at end of file + return 'Options cannot be empty (pre-validation)' + +class ProfileRequired(Exception): + def __str__(self) -> str: + return 'No profile. Please create your profile first' \ No newline at end of file diff --git a/itd/models/post.py b/itd/models/post.py index b6ad7f0..5a8eaa1 100644 --- a/itd/models/post.py +++ b/itd/models/post.py @@ -54,22 +54,30 @@ class Poll(_Poll): return datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f') -class _PostShort(TextObject): +class Span(BaseModel): + length: int + offset: int + type: SpanType + + +class _PostCounts(TextObject): likes_count: int = Field(0, alias='likesCount') comments_count: int = Field(0, alias='commentsCount') reposts_count: int = Field(0, alias='repostsCount') views_count: int = Field(0, alias='viewsCount') + spans: list[Span] = [] -class PostShort(_PostShort): + +class _PostAuthor(_PostCounts): author: UserPost -class OriginalPost(PostShort): +class OriginalPost(_PostAuthor): is_deleted: bool = Field(False, alias='isDeleted') -class _Post(_PostShort): +class _Post(_PostCounts): is_liked: bool = Field(False, alias='isLiked') is_reposted: bool = Field(False, alias='isReposted') is_viewed: bool = Field(False, alias='isViewed') @@ -79,13 +87,13 @@ class _Post(_PostShort): attachments: list[PostAttach] = [] comments: list[Comment] = [] - original_post: OriginalPost | None = None + original_post: OriginalPost | None = None # for reposts wall_recipient_id: UUID | None = Field(None, alias='wallRecipientId') wall_recipient: UserPost | None = Field(None, alias='wallRecipient') -class Post(_Post, PostShort): +class Post(_Post, _PostAuthor): poll: Poll | None = None diff --git a/itd/request.py b/itd/request.py index df888fc..391025c 100644 --- a/itd/request.py +++ b/itd/request.py @@ -3,7 +3,7 @@ from _io import BufferedReader from requests import Session from requests.exceptions import JSONDecodeError -from itd.exceptions import InvalidToken, InvalidCookie, RateLimitExceeded, Unauthorized, AccountBanned +from itd.exceptions import InvalidToken, InvalidCookie, RateLimitExceeded, Unauthorized, AccountBanned, ProfileRequired s = Session() @@ -41,6 +41,8 @@ def fetch(token: str, method: str, url: str, params: dict = {}, files: dict[str, raise Unauthorized() if res.json().get('error', {}).get('code') == 'ACCOUNT_BANNED': raise AccountBanned() + if res.json().get('error', {}).get('code') == 'PROFILE_REQUIRED': + raise ProfileRequired() except (JSONDecodeError, AttributeError): pass # todo