From 2b80b714692605a0347a2a1b163cdba83ce83abc Mon Sep 17 00:00:00 2001 From: nastaran78 Date: Thu, 4 Jul 2024 15:22:54 +0330 Subject: [PATCH] add assets --- kenar/app.py | 276 +++++++++++++++++++++++++++++++++++++------------ kenar/asset.py | 67 ++++++++++++ 2 files changed, 278 insertions(+), 65 deletions(-) create mode 100644 kenar/asset.py diff --git a/kenar/app.py b/kenar/app.py index 3ad56a6..cb63345 100644 --- a/kenar/app.py +++ b/kenar/app.py @@ -1,13 +1,11 @@ import base64 import urllib.parse from importlib.metadata import version -from typing import List, Optional +from typing import List, Optional, Literal import httpx from pydantic import BaseModel -from kenar.oauth import Scope, SendChatMessageResourceIdParams - from kenar.addon import ( CreateUserAddonRequest, CreateUserAddonResponse, @@ -21,6 +19,9 @@ GetPostAddonsResponse, DeletePostAddonResponse, ) +from kenar.asset import GetCategoriesResponse, GetCitiesResponse, GetDistrictsResponse, GetBrandModelsResponse, \ + GetMobileInternalStoragesResponse, GetMobileRamMemoriesResponse, \ + GetLightBodyStatusResponse from kenar.chatmessage import ( SetNotifyChatPostConversationsRequest, SendMessageV2Request, @@ -39,6 +40,7 @@ ) from kenar.image import UploadImageResponse from kenar.oauth import OAuthAccessTokenRequest, AccessTokenResponse +from kenar.oauth import Scope, SendChatMessageResourceIdParams from kenar.request import retry ACCESS_TOKEN_HEADER_NAME = "x-access-token" @@ -56,11 +58,11 @@ def __init__(self, client: httpx.Client): self._client = client def set_notify_chat_post_conversations( - self, - access_token: str, - data: SetNotifyChatPostConversationsRequest, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: SetNotifyChatPostConversationsRequest, + max_retry=3, + retry_delay=1, ) -> SetNotifyChatPostConversationsResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -74,11 +76,11 @@ def send_request(): return SetNotifyChatPostConversationsResponse() def send_message( - self, - access_token: str, - data: SendMessageV2Request, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: SendMessageV2Request, + max_retry=3, + retry_delay=1, ) -> SendMessageV2Response: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -97,10 +99,10 @@ def __init__(self, client: httpx.Client): self._client = client def search_post( - self, - data: SearchPostRequest, - max_retry=3, - retry_delay=1, + self, + data: SearchPostRequest, + max_retry=3, + retry_delay=1, ) -> SearchPostResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -112,10 +114,10 @@ def send_request(): return SearchPostResponse(**rsp.json()) def get_post( - self, - data: GetPostRequest, - max_retry=3, - retry_delay=1, + self, + data: GetPostRequest, + max_retry=3, + retry_delay=1, ) -> GetPostResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -129,11 +131,11 @@ def send_request(): return GetPostResponse(**rsp.json()) def get_user( - self, - access_token: str, - data: GetUserRequest = None, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: GetUserRequest = None, + max_retry=3, + retry_delay=1, ): @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -147,11 +149,11 @@ def send_request(): return GetUserResponse(**rsp.json()) def get_user_posts( - self, - access_token: str, - data: Optional[GetUserPostsRequest] = None, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: Optional[GetUserPostsRequest] = None, + max_retry=3, + retry_delay=1, ): @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -170,11 +172,11 @@ def __init__(self, client: httpx.Client): self._client = client def create_user_addon( - self, - access_token: str, - data: CreateUserAddonRequest, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: CreateUserAddonRequest, + max_retry=3, + retry_delay=1, ) -> CreateUserAddonResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -188,10 +190,10 @@ def send_request(): return CreateUserAddonResponse(**rsp.json()) def delete_user_addon( - self, - data: DeleteUserAddonRequest, - max_retry=3, - retry_delay=1, + self, + data: DeleteUserAddonRequest, + max_retry=3, + retry_delay=1, ) -> DeletePostAddonResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -204,10 +206,10 @@ def send_request(): return DeletePostAddonResponse() def get_user_addons( - self, - data: GetUserAddonsRequest, - max_retry=3, - retry_delay=1, + self, + data: GetUserAddonsRequest, + max_retry=3, + retry_delay=1, ) -> GetUserAddonsResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -220,11 +222,11 @@ def send_request(): return GetUserAddonsResponse(**rsp.json()) def create_post_addon( - self, - access_token: str, - data: CreatePostAddonRequest, - max_retry=3, - retry_delay=1, + self, + access_token: str, + data: CreatePostAddonRequest, + max_retry=3, + retry_delay=1, ) -> CreatePostAddonResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -238,10 +240,10 @@ def send_request(): return CreatePostAddonResponse() def delete_post_addon( - self, - data: DeletePostAddonRequest, - max_retry=3, - retry_delay=1, + self, + data: DeletePostAddonRequest, + max_retry=3, + retry_delay=1, ) -> DeletePostAddonResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -254,10 +256,10 @@ def send_request(): return DeletePostAddonResponse() def upload_image( - self, - path: str, - max_retry=3, - retry_delay=1, + self, + path: str, + max_retry=3, + retry_delay=1, ) -> UploadImageResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -273,10 +275,10 @@ def send_request(): return UploadImageResponse(**rsp.json()) def get_post_addons( - self, - data: GetPostAddonsRequest, - max_retry=3, - retry_delay=1, + self, + data: GetPostAddonsRequest, + max_retry=3, + retry_delay=1, ) -> GetPostAddonsResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -289,6 +291,149 @@ def send_request(): return GetPostAddonsResponse(**rsp.json()) +class AssetService: + def __init__(self, client): + self._client = client + + def get_categories( + self, + max_retry=3, + retry_delay=1, + ) -> GetCategoriesResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/category", + ) + + rsp = send_request() + return GetCategoriesResponse(**rsp.json()) + + def get_cities( + self, + max_retry=3, + retry_delay=1, + ) -> GetCitiesResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/city", + ) + + rsp = send_request() + return GetCitiesResponse(**rsp.json()) + + def get_districts( + self, + max_retry=3, + retry_delay=1, + ) -> GetDistrictsResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/district", + ) + + rsp = send_request() + return GetDistrictsResponse(**rsp.json()) + + def get_city_districts( + self, + city: str, + max_retry=3, + retry_delay=1, + ) -> GetDistrictsResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url=f"https://api.divar.ir/v1/open-platform/assets/district/{city}", + ) + + rsp = send_request() + return GetDistrictsResponse(**rsp.json()) + + def get_brand_models( + self, + category: Literal["light", "mobile-phones"], + max_retry=3, + retry_delay=1, + ) -> GetBrandModelsResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url=f"https://api.divar.ir/v1/open-platform/assets/brand-model/{category}", + ) + + rsp = send_request() + return GetBrandModelsResponse(**rsp.json()) + + def get_colors( + self, + category: Literal["light", "mobile-phones"], + max_retry=3, + retry_delay=1, + ) -> GetBrandModelsResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url=f"https://api.divar.ir/v1/open-platform/assets/color/{category}", + ) + + rsp = send_request() + return GetBrandModelsResponse(**rsp.json()) + + def get_mobile_internal_storages( + self, + max_retry=3, + retry_delay=1, + ) -> GetMobileInternalStoragesResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/internal-storage", + ) + + rsp = send_request() + return GetMobileInternalStoragesResponse(**rsp.json()) + + def get_mobile_ram_memories( + self, + max_retry=3, + retry_delay=1, + ) -> GetMobileRamMemoriesResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/ram-memory", + ) + + rsp = send_request() + return GetMobileRamMemoriesResponse(**rsp.json()) + + def get_light_body_status( + self, + max_retry=3, + retry_delay=1, + ) -> GetLightBodyStatusResponse: + @retry(max_retries=max_retry, delay=retry_delay) + def send_request(): + return self._client.request( + method="GET", + url="https://api.divar.ir/v1/open-platform/assets/body-status", + ) + + rsp = send_request() + return GetLightBodyStatusResponse(**rsp.json()) + + class OAuthService: def __init__(self, client, app_slug, oauth_redirect_url, oauth_secret): self._app_slug = app_slug @@ -314,10 +459,10 @@ def get_oauth_redirect(self, scopes: List[Scope], state: str) -> str: ) def get_access_token( - self, - authorization_token: str, - max_retry=3, - retry_delay=1, + self, + authorization_token: str, + max_retry=3, + retry_delay=1, ) -> AccessTokenResponse: @retry(max_retries=max_retry, delay=retry_delay) def send_request(): @@ -375,6 +520,7 @@ def __init__(self, conf: ClientConfig): self._finder = FinderService(self._client) self._chat = ChatService(self._client) self._addon = AddonService(self._client) + self._asset = AssetService(self._client) @property def chat(self): diff --git a/kenar/asset.py b/kenar/asset.py new file mode 100644 index 0000000..89ae9f4 --- /dev/null +++ b/kenar/asset.py @@ -0,0 +1,67 @@ +from typing import List, Literal + +from pydantic import BaseModel + + +class GetCategoriesResponse(BaseModel): + class Category(BaseModel): + display: str + slug: str + + categories: List[Category] + + +class GetCitiesResponse(BaseModel): + class City(BaseModel): + display: str + slug: str + + cities: List[City] + + +class GetDistrictsResponse(BaseModel): + class District(BaseModel): + display: str + slug: str + + districts: List[District] + + +class GetBrandModelsResponse(BaseModel): + class BrandModel(BaseModel): + display: str + slug: str + + brand_models: List[BrandModel] + + +class GetColorsResponse(BaseModel): + class Color(BaseModel): + display: str + slug: str + + colors: List[Color] + + +class GetMobileInternalStoragesResponse(BaseModel): + class InternalStorage(BaseModel): + display: str + slug: str + + internal_storages: List[InternalStorage] + + +class GetMobileRamMemoriesResponse(BaseModel): + class InternalStorage(BaseModel): + display: str + slug: str + + ram_memories: List[InternalStorage] + + +class GetLightBodyStatusResponse(BaseModel): + class BodyStatus(BaseModel): + display: str + slug: str + + body_status: List[BodyStatus]