From eb83c724ccdec7c67bfa911c11be66bc3d3c1e0f Mon Sep 17 00:00:00 2001 From: Rationess Date: Wed, 4 Feb 2026 11:15:19 +0300 Subject: [PATCH 1/2] =?UTF-8?q?restore=20=D0=B8=20like=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - itd/client.py | 39 ++++++++++++++++++++++++++++++++++++--- itd/models/post.py | 6 +++++- itd/routes/posts.py | 10 ++++++++-- tests/__init__.py | 0 tests/settings.py | 1 + tests/test_like.py | 26 ++++++++++++++++++++++++++ 7 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/settings.py create mode 100644 tests/test_like.py diff --git a/.gitignore b/.gitignore index ddc7b0c..16b0b1f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -test.py venv/ __pycache__/ dist diff --git a/itd/client.py b/itd/client.py index 714f5cd..927230f 100644 --- a/itd/client.py +++ b/itd/client.py @@ -9,7 +9,7 @@ from itd.routes.etc import get_top_clans, get_who_to_follow, get_platform_status from itd.routes.comments import get_comments, add_comment, delete_comment, like_comment, unlike_comment, add_reply_comment from itd.routes.hashtags import get_hastags, get_posts_by_hastag from itd.routes.notifications import get_notifications, mark_as_read, mark_all_as_read, get_unread_notifications_count -from itd.routes.posts import create_post, get_posts, get_post, edit_post, delete_post, pin_post, repost, view_post, get_liked_posts +from itd.routes.posts import create_post, get_posts, get_post, edit_post, delete_post, pin_post, repost, view_post, get_liked_posts, restore_post, like_post, delete_like_post from itd.routes.reports import report from itd.routes.search import search from itd.routes.files import upload_file @@ -18,7 +18,7 @@ from itd.routes.verification import verificate, get_verification_status from itd.models.comment import Comment from itd.models.notification import Notification -from itd.models.post import Post, NewPost +from itd.models.post import Post, NewPost, LikePostResponse from itd.models.clan import Clan from itd.models.hashtag import Hashtag from itd.models.user import User, UserProfileUpdate, UserPrivacy, UserFollower, UserWhoToFollow @@ -662,4 +662,37 @@ class Client: def update_banner(self, name: str) -> UserProfileUpdate: id = self.upload_file(name, cast(BufferedReader, open(name, 'rb')))['id'] - return self.update_profile(banner_id=id) \ No newline at end of file + return self.update_profile(banner_id=id) + + @refresh_on_error + def restore_post(self, post_id: UUID) -> None: + """Восстановить удалённый пост + + Args: + post_id: UUID поста + """ + restore_post(self.token, post_id) + + @refresh_on_error + def like_post(self, post_id: UUID) -> LikePostResponse: + """Поставить лайк на пост + + Args: + post_id: UUID поста + """ + res = like_post(self.token, post_id) + if res.status_code == 404: + raise NotFound("Post not found") + return LikePostResponse.model_validate(res.json()) + + @refresh_on_error + def delete_like_post(self, post_id: UUID) -> LikePostResponse: + """Убрать лайк с поста + + Args: + post_id: UUID поста + """ + res = delete_like_post(self.token, post_id) + if res.status_code == 404: + raise NotFound("Post not found") + return LikePostResponse.model_validate(res.json()) diff --git a/itd/models/post.py b/itd/models/post.py index f07c36c..3343242 100644 --- a/itd/models/post.py +++ b/itd/models/post.py @@ -1,6 +1,6 @@ from uuid import UUID -from pydantic import Field +from pydantic import Field, BaseModel from itd.models.user import UserPost, UserNewPost from itd.models._text import TextObject @@ -45,3 +45,7 @@ class Post(_Post, PostShort): class NewPost(_Post): author: UserNewPost + +class LikePostResponse(BaseModel): + liked: bool + likes_count: int = Field(alias="likesCount") diff --git a/itd/routes/posts.py b/itd/routes/posts.py index 97edcd2..60e23bc 100644 --- a/itd/routes/posts.py +++ b/itd/routes/posts.py @@ -46,5 +46,11 @@ def view_post(token: str, id: UUID): def get_liked_posts(token: str, username: str, limit: int = 20, cursor: int = 0): return fetch(token, 'get', f'posts/user/{username}/liked', {'limit': limit, 'cursor': cursor}) -# todo post restore -# todo post like \ No newline at end of file +def restore_post(token: str, post_id: UUID): + return fetch(token, "post", f"posts/{post_id}/restore",) + +def like_post(token: str, post_id: UUID): + return fetch(token, "post", f"posts/{post_id}/like") + +def delete_like_post(token: str, post_id: UUID): + return fetch(token, "delete", f"posts/{post_id}/like") diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/settings.py b/tests/settings.py new file mode 100644 index 0000000..fad677d --- /dev/null +++ b/tests/settings.py @@ -0,0 +1 @@ +cookies = 'Сюда вставить куки' \ No newline at end of file diff --git a/tests/test_like.py b/tests/test_like.py new file mode 100644 index 0000000..602524e --- /dev/null +++ b/tests/test_like.py @@ -0,0 +1,26 @@ +from itd import ITDClient +from itd.models.post import LikePostResponse +from itd.exceptions import NotFound +import unittest +from . import settings + +class TestLike(unittest.TestCase): + def test_like(self): + c = ITDClient(None, settings.cookies) + + post = c.create_post("post_for_test_like") + + self.assertEqual(c.like_post(post.id), LikePostResponse(liked=True, likesCount=1)) # Лайк на пост без лайка + self.assertEqual(c.like_post(post.id), LikePostResponse(liked=True, likesCount=1)) # Лайк на пост с уже поставленным лайком + + self.assertEqual(c.delete_like_post(post.id), LikePostResponse(liked=False, likesCount=0)) # Убрать лайк с поста с уже поставленным лайком + self.assertEqual(c.delete_like_post(post.id), LikePostResponse(liked=False, likesCount=0)) # Убрать лайк с поста без лайков + + c.delete_post(str(post.id)) + + self.assertRaises(NotFound, c.like_post, post.id) # лайк на удалённый пост + self.assertRaises(NotFound, c.delete_like_post, post.id) # Убрать лайк с удалённого поста + + +if __name__ == "__main__": + unittest.main() From 38805156bff64bd25110ca73f58f92d26fdcb5e0 Mon Sep 17 00:00:00 2001 From: EpsilonRationes <148639079+EpsilonRationes@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:40:10 +0300 Subject: [PATCH 2/2] Delete tests/__init__.py --- tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000