Skip to content

Commit

Permalink
Merge pull request #11 from divar-ir/improve-imports
Browse files Browse the repository at this point in the history
facillate imports
  • Loading branch information
nastaran78 authored Jul 2, 2024
2 parents 5201d9f + c0350f0 commit bca8ee9
Show file tree
Hide file tree
Showing 27 changed files with 846 additions and 667 deletions.
30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,36 @@ pip install Kenar
- [نمونه سرچ آگهی با فیلتر، دریافت اطلاعات یک آگهی، آگهی های کاربر و اطلاعات شماره تلفن کاربر](https://github.com/divar-ir/kenar-api/blob/main/samples/sample_finder.py)
- [نمونه ارسال پیام در چت و اجازه دریافت پیام ها روی یک آگهی](https://github.com/divar-ir/kenar-api/blob/main/samples/sample_chat.py)

به عنوان نمونه ، برای ساخت کلاینت کنار، نیاز است متغیر های محیطی `KENAR_APP_SLUG` (با مقدار برابر با شناسه یکتای برنامه) و `KENAR_API_KEY`(برابر با کلید محرمانه دریافت شده برای برنامه) ، `KENAR_OAUTH_SECRET` (برابر با کلید محرمانه ی OAuth) و `KENAR_OAUTH_REDIRECT_URL` (برابر با لینک بازگشت احراز باز) ست شوند و از طریق نمونه کد زیر کلاینت ساخته شود.


<div dir="ltr">

```python
import os
from kenar import ClientConfig, Client

client_conf = ClientConfig(
app_slug=os.environ.get("KENAR_APP_SLUG"),
api_key=os.environ.get("KENAR_API_KEY"),
oauth_secret=os.environ.get("KENAR_OAUTH_SECRET"),
oauth_redirect_url=os.environ.get("KENAR_OAUTH_REDIRECT_URL"),
)

kenar_client = Client(client_conf)
```
</div>

پس از ساخت کلاینت میتوان از تمام سرویس های نام برده ، با فراخوانی property مربوطه ، استفاده کرد. به عنوان مثال برای آپلود عکس میتوان از کد زیر بهره گرفت:

<div dir="ltr">

```python
rsp = kenar_client.addon.upload_image("PATH_TO_FILE")
```

</div>

## پیشنهادات برای بهبود
پذیرای هر گونه پیشنهادات شما برای بهتر کردن این کتاب‌خانه هستیم. در قسمت [issues](https://github.com/divar-ir/kenar-api/issues) پروژه میتوانید مسائل خود را با ما مطرح کنید.

Expand Down
8 changes: 8 additions & 0 deletions kenar/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from .addon import *
from .app import ClientConfig, Client
from .chatmessage import *
from .finder import *
from .icons import *
from .image import *
from .oauth import *
from .widgets import *
52 changes: 28 additions & 24 deletions kenar/addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ class CreatePostAddonRequest(BaseModel):
token: str

widgets: List[WidgetTypesUnion]
notes: str = ''
notes: str = ""
semantic: Dict[str, str] = {}
semantic_sensitives: List[str] = []

@field_serializer('widgets')
@field_serializer("widgets")
def serialize_widgets(self, widgets, _info):
return {'widget_list': [w.serialize_model() for w in widgets]}
return {"widget_list": [w.serialize_model() for w in widgets]}


class CreatePostAddonResponse(BaseModel):
Expand All @@ -34,10 +34,10 @@ class DeletePostAddonResponse(BaseModel):

class Status(BaseModel):
class Status(str, Enum):
ACTIVE = 'ACTIVE'
INACTIVE = 'INACTIVE'
SUSPENDED = 'SUSPENDED'
DEVELOPMENT = 'DEVELOPMENT'
ACTIVE = "ACTIVE"
INACTIVE = "INACTIVE"
SUSPENDED = "SUSPENDED"
DEVELOPMENT = "DEVELOPMENT"

status: Status

Expand Down Expand Up @@ -71,17 +71,19 @@ class PostAddon(BaseModel):
semantic: Dict[str, str] = None
semantic_sensitives: List[str] = None

@field_validator('widgets', mode='before')
@field_validator("widgets", mode="before")
@classmethod
def deserialize_model(cls, widgets: Dict):
widget_list = widgets.get("widget_list", [])
return [get_widget_class(w['widget_type']).deserialize_model(w) for w in widget_list]
return [
get_widget_class(w["widget_type"]).deserialize_model(w) for w in widget_list
]

@field_serializer('widgets')
@field_serializer("widgets")
def serialize_widgets(self, widgets, _info):
if widgets:
p = [w.serialize_model() for w in widgets]
return {'widget_list': p}
return {"widget_list": p}
return None


Expand All @@ -91,16 +93,16 @@ class GetPostAddonsRequest(BaseModel):

@root_validator(pre=True)
def check_mutually_exclusive(self, values):
id_, token_ = values.get('id'), values.get('token')
id_, token_ = values.get("id"), values.get("token")
if id_ and token_:
raise ValueError('id and token are mutually exclusive.')
raise ValueError("id and token are mutually exclusive.")
if not id_ and not token_:
raise ValueError('One of id or token must be set.')
raise ValueError("One of id or token must be set.")
return values

@model_serializer
def ser_model(self) -> dict:
return {'id': self.id} if self.id is not None else {'token': self.token}
return {"id": self.id} if self.id is not None else {"token": self.token}


class GetPostAddonsResponse(BaseModel):
Expand All @@ -112,18 +114,18 @@ class CreateUserAddonRequest(BaseModel):

semantic: Dict[str, str] = {}
semantic_sensitives: List[str] = []
notes: str = ''
notes: str = ""
phone: str
management_permalink: str = ''
removal_permalink: str = ''
management_permalink: str = ""
removal_permalink: str = ""
categories: List[str]
ticket_uuid: Optional[str] = None
verification_cost: Optional[int] = None

@field_serializer('widgets')
@field_serializer("widgets")
def serialize_widgets(self, widgets, _info):
p = [w.serialize_model() for w in widgets]
return {'widget_list': p}
return {"widget_list": p}


class CreateUserAddonResponse(BaseModel):
Expand Down Expand Up @@ -155,17 +157,19 @@ class UserAddon(BaseModel):

filters: UserAddonFilters

@field_validator('widgets', mode='before')
@field_validator("widgets", mode="before")
@classmethod
def deserialize_model(cls, widgets: Dict):
widget_list = widgets.get("widget_list", [])
return [get_widget_class(w['widget_type']).deserialize_model(w) for w in widget_list]
return [
get_widget_class(w["widget_type"]).deserialize_model(w) for w in widget_list
]

@field_serializer('widgets')
@field_serializer("widgets")
def serialize_widgets(self, widgets, _info):
if widgets:
p = [w.serialize_model() for w in widgets]
return {'widget_list': p}
return {"widget_list": p}
return None


Expand Down
Loading

0 comments on commit bca8ee9

Please sign in to comment.