69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
import http
|
|
import os
|
|
from urllib.parse import urljoin
|
|
|
|
import requests
|
|
from django.conf import settings
|
|
from requests import Request
|
|
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'poizonstore.settings')
|
|
|
|
|
|
class CDEKClient:
|
|
AUTH_ENDPOINT = 'oauth/token'
|
|
ORDER_INFO_ENDPOINT = 'orders'
|
|
CALCULATOR_TARIFF_ENDPOINT = 'calculator/tariff'
|
|
|
|
MAX_RETRIES = 2
|
|
|
|
def __init__(self, client_id, client_secret, grant_type='client_credentials'):
|
|
self.api_url = 'https://api.cdek.ru/v2/'
|
|
self.client_id = client_id
|
|
self.client_secret = client_secret
|
|
self.grant_type = grant_type
|
|
|
|
self.session = requests.Session()
|
|
|
|
def request(self, method, url, *args, **kwargs):
|
|
joined_url = urljoin(self.api_url, url)
|
|
request = Request(method, joined_url, *args, **kwargs)
|
|
|
|
retries = 0
|
|
while retries < self.MAX_RETRIES:
|
|
prepared = self.session.prepare_request(request)
|
|
r = self.session.send(prepared)
|
|
|
|
# TODO: handle/log errors
|
|
if r.status_code == http.HTTPStatus.UNAUTHORIZED:
|
|
self.authorize()
|
|
continue
|
|
return r
|
|
|
|
def authorize(self):
|
|
params = {
|
|
'client_id': self.client_id,
|
|
'client_secret': self.client_secret,
|
|
'grant_type': self.grant_type
|
|
}
|
|
r = self.request('POST', self.AUTH_ENDPOINT, params=params)
|
|
if r:
|
|
data = r.json()
|
|
token = data['access_token']
|
|
self.session.headers.update({'Authorization': f'Bearer {token}'})
|
|
|
|
def get_order_info(self, im_number):
|
|
params = {
|
|
'im_number': str(im_number)
|
|
}
|
|
return self.request('GET', self.ORDER_INFO_ENDPOINT, params=params)
|
|
|
|
def create_order(self, order_data):
|
|
return self.request('POST', self.ORDER_INFO_ENDPOINT, json=order_data)
|
|
|
|
def calculate_tariff(self, data):
|
|
return self.request('POST', self.CALCULATOR_TARIFF_ENDPOINT, json=data)
|
|
|
|
|
|
client = CDEKClient(settings.CDEK_CLIENT_ID, settings.CDEK_CLIENT_SECRET)
|
|
client.authorize()
|