Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- #coding:utf8
- from __future__ import unicode_literals, print_function, division
- import six
- import requests
- import json
- import logging
- from datetime import datetime, timedelta
- mylog = logging.getLogger(__name__)
- class CartError(Exception):
- pass
- class Client(object):
- """
- Клиент сервиса профит Лиги.
- Обеспечение основных возможностей транспорта.
- https://pr-lg.ru/api/main/docs
- """
- version = '1.4'
- def __init__(self, key):
- self.key = key
- self.url = 'https://pr-lg.ru'
- self.timeout = 60
- def _url(self, value):
- return "{}{}".format(self.url, value)
- def get(self, url, **params):
- """
- :param action: AnyStr
- :param data: dict
- :return:
- """
- params['secret'] = self.key
- con = requests.get(self._url(url), params, timeout=self.timeout)
- try:
- jdata = con.json()
- finally:
- con.close()
- return jdata
- def post(self, url, **params):
- params['secret'] = self.key
- con = requests.post(self._url(url), data=params, timeout=self.timeout)
- try:
- jdata = con.json()
- finally:
- con.close()
- return jdata
- @property
- def warehouses(self):
- """
- Список поставщиков
- :return:
- """
- return self.get('/api/search/warehouses', action="list")
- def warehouse_by_id(self, id):
- houses = getattr(self, '_warehouses', None)
- if houses is None:
- self._warehouses = self.warehouses
- for house in self._warehouses:
- if house["id"] == id:
- return house
- return {}
- def products(self, article):
- """
- поиск товара по артикулу
- :param article:
- :return:
- """
- return self.get('/api/search/products', article=article)
- def items(self, article):
- """
- Возвращает массив доступных товаров по запрошенному артикулу с наличием на складах
- :param article: Артикул искомого товара (обязательный параметр)
- :return:
- id Число (@int) ID-товара во внутренней системе<br>
- article Строка (@string) Артикул товара<br>
- brand Строка (@string) Наименование бренда<br>
- description Строка (@string) Наименование товара<br>
- brand_warranty Число (@int) Присутствует гарантия на бренд<br>
- original Число (@int) (0/1) Оригинальный бренд<br>
- <b>products</b> Массив (@array) Массив товаров распределенный по складам:<br><hr>
- article_id - ID-товара во внутренней системе<br>
- warehouse_id - ID-поставщика во внутренней системе<br>
- description - описание товара в прайсе поставщика<br>
- product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
- multi - кратность товара (мин. кол. в заказе)<br>
- quantity - количество товара на складе<br>
- price - цена товара за 1 ед.<br>
- sale - уцененный товар (0/1)<br>
- comment - причина уцененного товара<br>
- incart - количество товара которое уже находится в корзине<br>
- custom_warehouse_name - Наименование поставщика<br>
- show_date - информация о сроке поставки на склад Профит-Лига<br>
- delivery_time - срок поставки в часах (используется для расчета динамических сроков поставки)<br>
- sort - порядок сортировки склада при выдаче<br>
- waitings - ожидаемое количество товара на склад от поставщика<br>
- allow_return - разрешение на возврат товара (0/1)<br>
- delivery_probability - вероятность поставки склада (%)<br>
- """
- return self.get('/api/search/items', article=article)
- def crosses(self, article, brand, replaces=0):
- """
- Возвращает массив списка товаров с заменами по артикулу и бренду
- :param article: Артикул искомого товара (обязательный параметр)
- :param brand: Бренд искомого товара (обязательный параметр)
- :param replaces: Возвращать с заменами искомого товара (0/1)
- :return:
- id Число (@int) ID-товара во внутренней системе<br>
- article Строка (@string) Артикул товара<br>
- brand Строка (@string) Наименование бренда<br>
- description Строка (@string) Наименование товара<br>
- brand_warranty Число (@int) Присутствует гарантия на бренд<br>
- original Число (@int) (0/1) Оригинальный бренд<br>
- <b>products</b> Массив (@array) Массив товаров распределенный по складам:<br><hr>
- article_id - ID-товара во внутренней системе<br>
- warehouse_id - ID-поставщика во внутренней системе<br>
- description - описание товара в прайсе поставщика<br>
- product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
- multi - кратность товара (мин. кол. в заказе)<br>
- quantity - количество товара на складе<br>
- price - цена товара за 1 ед.<br>
- sale - уцененный товар (0/1)<br>
- comment - причина уцененного товара<br>
- incart - количество товара которое уже находится в корзине<br>
- custom_warehouse_name - Наименование поставщика<br>
- show_date - информация о сроке поставки на склад Профит-Лига<br>
- delivery_time - срок поставки в часах (используется для расчета динамических сроков поставки)<br>
- sort - порядок сортировки склада при выдаче<br>
- waitings - ожидаемое количество товара на склад от поставщика<br>
- allow_return - разрешение на возврат товара (0/1)<br>
- delivery_probability - вероятность поставки склада (%)<br>
- """
- return self.get('/api/search/crosses', article=article, brand=brand, replaces=replaces)
- def cart_add(self, _id, warehouse, quantity, code, comment=''):
- """
- Размещение товаров в корзине
- может вернуть
- {u'status': False, u'count': 0, u'total': None}
- :param _id: ID-товара во внутренней системе
- :param warehouse: ID-поставщика во внутренней системе (обязательный параметр)
- :param quantity: Количество добавляемое в корзину (обязательный параметр)
- :param code: Системный Код товара во внутренней системе (используется для обмена с 1С) (обязательный параметр)
- :param comment: Комментарий к товару (максимум 255 символов)
- :return:
- status Строка (@string) Статус выполнения:
- success - успешно добавлено
- no-quantity - указаное количество превышает наличие на складе
- less - указаное количество меньше, либо равно нулю
- error - ошибка добавления в корзину (товар неопределен, несоответствует кратность, ошибка записи)
- total Дробное число (@float) Сумма товаров в корзине
- count Число (@int) Общее количество всех товаров в корзине
- https://pr-lg.ru/account/cart/add/id/9981451/warehouse/447
- {"status":"success","total":"2 396.60","count":1,"widget":"
- """
- ret = self.post('/api/cart/add', id=_id, warehouse=warehouse, quantity=quantity, code=code, comment=comment)
- if ret['status'] == 'no-quantity':
- raise CartError('Недостаточно количества')
- if ret['status'] == 'less':
- raise CartError('Недостаточно количества, меньше или ноль')
- if ret['status'] == 'error':
- raise CartError('Ошибка добавления')
- if float(ret['count']) == 0:
- mylog.warning(repr(ret))
- raise CartError('Ничего не добавилось в корзину')
- elif quantity != float(ret['count']):
- #ToDo надо отменять уже добавленное кол-во. Мы заказываем только все или ничего
- try:
- self.cart_remove(_id, warehouse)
- finally:
- raise CartError('Количество заказанного не совпадает {} != {}'.format(quantity, ret['count']))
- return ret
- def cart_remove(self, _id, warehouse):
- """
- Удаление товара из корзины
- {u'status': False, u'count': 0, u'total': None}
- :param _id: ID-товара во внутренней системе
- :param warehouse: ID-поставщика во внутренней системе (обязательный параметр)
- :return:
- https://pr-lg.ru/account/newcart/delete/id/600e8e7149ec3b1a3992d175
- {"status":"success","total":"0.00","count":0,"sum":null,"widget":"
- """
- return self.post('/api/cart/remove', id=_id, warehouse=warehouse)
- def cart_list(self):
- """
- Товары в корзине
- :return:
- article Строка (@string) Артикул товара
- brand Строка (@string) Бренд товара
- description Строка (@string) Наименование товара
- article_id Число (@int) ID-товара во внутренней системе
- warehouse_id Число (@int) ID-поставщика во внутренней системе
- product_code Число (@int) Системный Код товара во внутренней системе (используется для обмена с 1С)
- multi Число (@int) Кратность товара (мин. кол. в заказе)
- quantity Число (@int) Количество товара на складе
- price Дробное число (@float) Цена товара за 1 ед.
- sale Число (@int) Уцененный товар (0-нет, 1-да)
- comment Строка (@string) Причина уцененного товара
- incart Число (@int) Количество товара которое уже находится в корзине
- warehouse Строка (@string) Наименование поставщика
- show_date Строка (@string) Информация о сроке поставки на склад Профит-Лига
- sort Число (@int) порядок сортировки склада при выдаче
- allow_return Число (@int) Возможен возврат товара поставщику (1-да, 0-нет)
- """
- return self.get('/api/cart/list')
- def order_params(self):
- """
- Возвращает массив настроек для передачи при создании заказа
- :return:
- methods Массив (@array) Список способов получения товара:
- id - ID способа доставки
- name - Наименование способа доставки
- points Массив (@array) Список доступных адресов доставки:
- code - Код торговой точки в системе
- point - Наименование торговой точки в системе
- address - Фактический адрес торговой точки
- pickup_points Массив (@array) Список доступных адресов самовывоза:
- code - Код точки самовывоза в системе
- name - Наименование точки самовывоза в системе
- address - Фактический адрес точки самовывоза
- payment Массив (@array) Список способов оплаты:
- id - ID способа оплаты
- name - Наименование способа оплаты
- statuses Массив (@array) Список статусов заказа:
- id - ID статуса
- name - Наименование статуса
- description - Расшифровка статуса
- """
- return self.get('/api/cart/params')
- def order_add(self, method, payment, point, address, pickup_point):
- """
- Возвращает массив настроек для передачи при создании заказа
- Внимание! Все товары добавленные в корзину разбиваются по складам при создании заказа.
- :param method: Число (@int) ID способа доставки (обязательный параметр)
- :param payment: Число (@int) ID способа оплаты (обязательный параметр)
- :param point: Строка (@string) Код торговой точки из массива настроек (обязателен при доставке)
- :param address: Строка (@string) Фактический адрес торговой точки из массива настроек (обязателен при доставке)
- :param pickup_point: Строка (@string) Код точки самовывоза из массива настроек (обязателен при выборе в качетве доставки самовывоз)
- :return:
- """
- return self.post('/api/cart/order', method=method, payment=payment, point=point, address=address, pickup_point=pickup_point)
- def order_list(self, page, order_id, status_id, date_start, date_end):
- """
- Возвращает постраничный массив заказов с позициями товаров
- :param page: Число (@int) Номер страницы
- :param order_id: Строка (@string) Номер заказа. Можно указать несколько заказов через запятую (максимум 3 заказа в одном запросе)
- :param status_id: Число (@int) ID статуса заказа. Список статусов можно получить с помощью получения параметров заказа /api/cart/params
- :param date_start: Строка (@string) Фильтр даты начала списка. Формат даты "YYYY-MM-DD"
- :param date_end: Строка (@string) Фильтр даты окончания списка. Формат даты "YYYY-MM-DD"
- :return:
- pages Строка (@int) Общее кол-во страниц<br>
- currentPage Строка (@int) Текущая страница<br>
- pageSize Строка (@int) Элементов на странице<br>
- data Массив (@array) Массив заказов:<br>
- order_id - ID (номер) заказа<br>
- comment - Комментарий к заказу<br>
- datetime - Дата и время формирования заказа<br>
- delivery_date - Срок доставки до торговой точки<br>
- point_code - Системный код торговой точки во внутренней системе (используется для обмена с 1С)<br>
- delivery_point_id - ID торговой точки доставки<br>
- point_name - Название тороговой точки<br>
- point_delivery_address - Адрес доставки<br>
- delivery_name - Тип доставки<br>
- delivery_method_id - ID типа доставки<br>
- payment_id - Тип оплаты<br>
- payment_name - Название типа оплаты<br>
- products - Массив товаров заказа:<br>
- id - ID (номер) товара в заказе во внутренней системе<br>
- article_id - ID-товара во внутренней системе<br>
- product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
- price - Цена (руб.)<br>
- quantity - Кол-во<br>
- comment - Комментарий к товару в заказе<br>
- article - Артикул товара<br>
- brand - Производитель<br>
- description - Наименование<br>
- status_id - ID (номер) статуса товара в заказе<br>
- status - Статус товара в заказе<br>
- status_description - Расшифровка статуса<br>
- status_update - Дата обновления статуса<br>
- custom_warehouse_name - Наименование поставщика<br>
- show_date - информация о сроке поставки на склад Профит-Лига<br>
- sale - уцененный товар (0/1)
- """
- return self.get('/api/orders/list', page=page, order_id=order_id, status_id=status_id,
- date_start=self._date_as_str(date_start), date_end=self._date_as_str(date_end))
- def order_list_last(self, days=10):
- return self.order_list(1, "", "", datetime.today() - timedelta(days=days), datetime.today())
- def _date_as_str(self, value):
- """
- Формат даты "YYYY-MM-DD"
- :param value: дата или строка
- :return: представление в нужном формате
- """
- if type(value) in (datetime,):
- return value.strftime('%Y-%m-%d')
- return value
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement