Advertisement
stoyanove

profitliga client api

Jan 25th, 2021
756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.69 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #coding:utf8
  3. from __future__ import unicode_literals, print_function, division
  4. import six
  5. import requests
  6. import json
  7. import logging
  8. from datetime import datetime, timedelta
  9.  
  10. mylog = logging.getLogger(__name__)
  11.  
  12.  
  13. class CartError(Exception):
  14.     pass
  15.  
  16.  
  17. class Client(object):
  18.     """
  19.    Клиент сервиса профит Лиги.
  20.    Обеспечение основных возможностей транспорта.
  21.  
  22.    https://pr-lg.ru/api/main/docs
  23.    """
  24.     version = '1.4'
  25.  
  26.     def __init__(self, key):
  27.         self.key = key
  28.         self.url = 'https://pr-lg.ru'
  29.         self.timeout = 60
  30.  
  31.     def _url(self, value):
  32.         return "{}{}".format(self.url, value)
  33.  
  34.     def get(self, url, **params):
  35.         """
  36.  
  37.        :param action: AnyStr
  38.        :param data: dict
  39.        :return:
  40.        """
  41.         params['secret'] = self.key
  42.         con = requests.get(self._url(url), params, timeout=self.timeout)
  43.         try:
  44.             jdata = con.json()
  45.         finally:
  46.             con.close()
  47.         return jdata
  48.  
  49.     def post(self, url, **params):
  50.         params['secret'] = self.key
  51.         con = requests.post(self._url(url), data=params, timeout=self.timeout)
  52.         try:
  53.             jdata = con.json()
  54.         finally:
  55.             con.close()
  56.         return jdata
  57.  
  58.     @property
  59.     def warehouses(self):
  60.         """
  61.        Список поставщиков
  62.        :return:
  63.        """
  64.         return self.get('/api/search/warehouses', action="list")
  65.  
  66.     def warehouse_by_id(self, id):
  67.         houses = getattr(self, '_warehouses', None)
  68.         if houses is None:
  69.             self._warehouses = self.warehouses
  70.         for house in self._warehouses:
  71.             if house["id"] == id:
  72.                 return house
  73.         return {}
  74.  
  75.     def products(self, article):
  76.         """
  77.        поиск товара по артикулу
  78.  
  79.        :param article:
  80.        :return:
  81.        """
  82.         return self.get('/api/search/products', article=article)
  83.  
  84.     def items(self, article):
  85.         """
  86.        Возвращает массив доступных товаров по запрошенному артикулу с наличием на складах
  87.  
  88.        :param article: Артикул искомого товара (обязательный параметр)
  89.        :return:
  90.            id  Число (@int)   ID-товара во внутренней системе<br>
  91.            article    Строка (@string)    Артикул товара<br>
  92.            brand    Строка (@string)    Наименование бренда<br>
  93.            description    Строка (@string)    Наименование товара<br>
  94.            brand_warranty    Число (@int)    Присутствует гарантия на бренд<br>
  95.            original    Число (@int)    (0/1) Оригинальный бренд<br>
  96.            <b>products</b>    Массив (@array)    Массив товаров распределенный по складам:<br><hr>
  97.                article_id - ID-товара во внутренней системе<br>
  98.                warehouse_id - ID-поставщика во внутренней системе<br>
  99.                description - описание товара в прайсе поставщика<br>
  100.                product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
  101.                multi - кратность товара (мин. кол. в заказе)<br>
  102.                quantity - количество товара на складе<br>
  103.                price - цена товара за 1 ед.<br>
  104.                sale - уцененный товар (0/1)<br>
  105.                comment - причина уцененного товара<br>
  106.                incart - количество товара которое уже находится в корзине<br>
  107.                custom_warehouse_name - Наименование поставщика<br>
  108.                show_date - информация о сроке поставки на склад Профит-Лига<br>
  109.                delivery_time - срок поставки в часах (используется для расчета динамических сроков поставки)<br>
  110.                sort - порядок сортировки склада при выдаче<br>
  111.                waitings - ожидаемое количество товара на склад от поставщика<br>
  112.                allow_return - разрешение на возврат товара (0/1)<br>
  113.                delivery_probability - вероятность поставки склада (%)<br>
  114.        """
  115.         return self.get('/api/search/items', article=article)
  116.  
  117.     def crosses(self, article, brand, replaces=0):
  118.         """
  119.        Возвращает массив списка товаров с заменами по артикулу и бренду
  120.  
  121.        :param article: Артикул искомого товара (обязательный параметр)
  122.        :param brand: Бренд искомого товара (обязательный параметр)
  123.        :param replaces: Возвращать с заменами искомого товара (0/1)
  124.        :return:
  125.            id  Число (@int)   ID-товара во внутренней системе<br>
  126.            article    Строка (@string)    Артикул товара<br>
  127.            brand    Строка (@string)    Наименование бренда<br>
  128.            description    Строка (@string)    Наименование товара<br>
  129.            brand_warranty    Число (@int)    Присутствует гарантия на бренд<br>
  130.            original    Число (@int)    (0/1) Оригинальный бренд<br>
  131.            <b>products</b>    Массив (@array)    Массив товаров распределенный по складам:<br><hr>
  132.                article_id - ID-товара во внутренней системе<br>
  133.                warehouse_id - ID-поставщика во внутренней системе<br>
  134.                description - описание товара в прайсе поставщика<br>
  135.                product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
  136.                multi - кратность товара (мин. кол. в заказе)<br>
  137.                quantity - количество товара на складе<br>
  138.                price - цена товара за 1 ед.<br>
  139.                sale - уцененный товар (0/1)<br>
  140.                comment - причина уцененного товара<br>
  141.                incart - количество товара которое уже находится в корзине<br>
  142.                custom_warehouse_name - Наименование поставщика<br>
  143.                show_date - информация о сроке поставки на склад Профит-Лига<br>
  144.                delivery_time - срок поставки в часах (используется для расчета динамических сроков поставки)<br>
  145.                sort - порядок сортировки склада при выдаче<br>
  146.                waitings - ожидаемое количество товара на склад от поставщика<br>
  147.                allow_return - разрешение на возврат товара (0/1)<br>
  148.                delivery_probability - вероятность поставки склада (%)<br>
  149.        """
  150.         return self.get('/api/search/crosses', article=article, brand=brand, replaces=replaces)
  151.  
  152.     def cart_add(self, _id, warehouse, quantity, code, comment=''):
  153.         """
  154.        Размещение товаров в корзине
  155.        может вернуть
  156.        {u'status': False, u'count': 0, u'total': None}
  157.  
  158.        :param _id: ID-товара во внутренней системе
  159.        :param warehouse: ID-поставщика во внутренней системе (обязательный параметр)
  160.        :param quantity: Количество добавляемое в корзину (обязательный параметр)
  161.        :param code: Системный Код товара во внутренней системе (используется для обмена с 1С) (обязательный параметр)
  162.        :param comment: Комментарий к товару (максимум 255 символов)
  163.        :return:
  164.            status  Строка (@string)  Статус выполнения:
  165.                success - успешно добавлено
  166.                no-quantity - указаное количество превышает наличие на складе
  167.                less - указаное количество меньше, либо равно нулю
  168.                error - ошибка добавления в корзину (товар неопределен, несоответствует кратность, ошибка записи)
  169.            total   Дробное число (@float)  Сумма товаров в корзине
  170.            count   Число (@int)    Общее количество всех товаров в корзине
  171.  
  172.        https://pr-lg.ru/account/cart/add/id/9981451/warehouse/447
  173.        {"status":"success","total":"2 396.60","count":1,"widget":"
  174.        """
  175.         ret = self.post('/api/cart/add', id=_id, warehouse=warehouse, quantity=quantity, code=code, comment=comment)
  176.         if ret['status'] == 'no-quantity':
  177.             raise CartError('Недостаточно количества')
  178.         if ret['status'] == 'less':
  179.             raise CartError('Недостаточно количества, меньше или ноль')
  180.         if ret['status'] == 'error':
  181.             raise CartError('Ошибка добавления')
  182.  
  183.         if float(ret['count']) == 0:
  184.             mylog.warning(repr(ret))
  185.             raise CartError('Ничего не добавилось в корзину')
  186.         elif quantity != float(ret['count']):
  187.             #ToDo надо отменять уже добавленное кол-во. Мы заказываем только все или ничего
  188.             try:
  189.                 self.cart_remove(_id, warehouse)
  190.             finally:
  191.                 raise CartError('Количество заказанного не совпадает {} != {}'.format(quantity, ret['count']))
  192.         return ret
  193.  
  194.     def cart_remove(self, _id, warehouse):
  195.         """
  196.        Удаление товара из корзины
  197.        {u'status': False, u'count': 0, u'total': None}
  198.  
  199.        :param _id: ID-товара во внутренней системе
  200.        :param warehouse: ID-поставщика во внутренней системе (обязательный параметр)
  201.        :return:
  202.  
  203.        https://pr-lg.ru/account/newcart/delete/id/600e8e7149ec3b1a3992d175
  204.        {"status":"success","total":"0.00","count":0,"sum":null,"widget":"
  205.        """
  206.         return self.post('/api/cart/remove', id=_id, warehouse=warehouse)
  207.  
  208.     def cart_list(self):
  209.         """
  210.        Товары в корзине
  211.    
  212.        :return:
  213.            article    Строка (@string)    Артикул товара
  214.            brand    Строка (@string)    Бренд товара
  215.            description    Строка (@string)    Наименование товара
  216.            article_id    Число (@int)    ID-товара во внутренней системе
  217.            warehouse_id    Число (@int)    ID-поставщика во внутренней системе
  218.            product_code    Число (@int)    Системный Код товара во внутренней системе (используется для обмена с 1С)
  219.            multi    Число (@int)    Кратность товара (мин. кол. в заказе)
  220.            quantity    Число (@int)    Количество товара на складе
  221.            price    Дробное число (@float)    Цена товара за 1 ед.
  222.            sale    Число (@int)    Уцененный товар (0-нет, 1-да)
  223.            comment    Строка (@string)    Причина уцененного товара
  224.            incart    Число (@int)    Количество товара которое уже находится в корзине
  225.            warehouse    Строка (@string)    Наименование поставщика
  226.            show_date    Строка (@string)    Информация о сроке поставки на склад Профит-Лига
  227.            sort    Число (@int)    порядок сортировки склада при выдаче
  228.            allow_return    Число (@int)    Возможен возврат товара поставщику (1-да, 0-нет)
  229.        """
  230.         return self.get('/api/cart/list')
  231.  
  232.     def order_params(self):
  233.         """
  234.        Возвращает массив настроек для передачи при создании заказа
  235.  
  236.        :return:
  237.            methods    Массив (@array)    Список способов получения товара:
  238.            id - ID способа доставки
  239.            name - Наименование способа доставки
  240.            points    Массив (@array)    Список доступных адресов доставки:
  241.            code - Код торговой точки в системе
  242.            point - Наименование торговой точки в системе
  243.            address - Фактический адрес торговой точки
  244.            pickup_points    Массив (@array)    Список доступных адресов самовывоза:
  245.            code - Код точки самовывоза в системе
  246.            name - Наименование точки самовывоза в системе
  247.            address - Фактический адрес точки самовывоза
  248.            payment    Массив (@array)    Список способов оплаты:
  249.            id - ID способа оплаты
  250.            name - Наименование способа оплаты
  251.            statuses    Массив (@array)    Список статусов заказа:
  252.            id - ID статуса
  253.            name - Наименование статуса
  254.            description - Расшифровка статуса
  255.        """
  256.         return self.get('/api/cart/params')
  257.  
  258.     def order_add(self, method, payment, point, address, pickup_point):
  259.         """
  260.        Возвращает массив настроек для передачи при создании заказа
  261.        Внимание! Все товары добавленные в корзину разбиваются по складам при создании заказа.
  262.  
  263.         :param method: Число (@int)    ID способа доставки (обязательный параметр)
  264.         :param payment: Число (@int)   ID способа оплаты (обязательный параметр)
  265.         :param point: Строка (@string)    Код торговой точки из массива настроек (обязателен при доставке)
  266.         :param address: Строка (@string)  Фактический адрес торговой точки из массива настроек (обязателен при доставке)
  267.         :param pickup_point: Строка (@string) Код точки самовывоза из массива настроек (обязателен при выборе в качетве доставки самовывоз)
  268.        :return:
  269.        """
  270.         return self.post('/api/cart/order', method=method, payment=payment, point=point, address=address, pickup_point=pickup_point)
  271.  
  272.     def order_list(self, page, order_id, status_id, date_start, date_end):
  273.         """
  274.        Возвращает постраничный массив заказов с позициями товаров
  275.  
  276.        :param page: Число (@int)   Номер страницы
  277.        :param order_id: Строка (@string)   Номер заказа. Можно указать несколько заказов через запятую (максимум 3 заказа в одном запросе)
  278.        :param status_id: Число (@int)  ID статуса заказа. Список статусов можно получить с помощью получения параметров заказа /api/cart/params
  279.        :param date_start: Строка (@string) Фильтр даты начала списка. Формат даты "YYYY-MM-DD"
  280.        :param date_end: Строка (@string)   Фильтр даты окончания списка. Формат даты "YYYY-MM-DD"
  281.        :return:
  282.            pages    Строка (@int)    Общее кол-во страниц<br>
  283.            currentPage    Строка (@int)    Текущая страница<br>
  284.            pageSize    Строка (@int)    Элементов на странице<br>
  285.            data    Массив (@array)    Массив заказов:<br>
  286.            order_id - ID (номер) заказа<br>
  287.            comment - Комментарий к заказу<br>
  288.            datetime - Дата и время формирования заказа<br>
  289.            delivery_date - Срок доставки до торговой точки<br>
  290.            point_code - Системный код торговой точки во внутренней системе (используется для обмена с 1С)<br>
  291.            delivery_point_id - ID торговой точки доставки<br>
  292.            point_name - Название тороговой точки<br>
  293.            point_delivery_address - Адрес доставки<br>
  294.            delivery_name - Тип доставки<br>
  295.            delivery_method_id - ID типа доставки<br>
  296.            payment_id - Тип оплаты<br>
  297.            payment_name - Название типа оплаты<br>
  298.            products - Массив товаров заказа:<br>
  299.                id - ID (номер) товара в заказе во внутренней системе<br>
  300.                article_id - ID-товара во внутренней системе<br>
  301.                product_code - Системный Код товара во внутренней системе (используется для обмена с 1С)<br>
  302.                price - Цена (руб.)<br>
  303.                quantity - Кол-во<br>
  304.                comment - Комментарий к товару в заказе<br>
  305.                article - Артикул товара<br>
  306.                brand - Производитель<br>
  307.                description - Наименование<br>
  308.                status_id - ID (номер) статуса товара в заказе<br>
  309.                status - Статус товара в заказе<br>
  310.                status_description - Расшифровка статуса<br>
  311.                status_update - Дата обновления статуса<br>
  312.                custom_warehouse_name - Наименование поставщика<br>
  313.                show_date - информация о сроке поставки на склад Профит-Лига<br>
  314.                sale - уцененный товар (0/1)
  315.        """
  316.         return self.get('/api/orders/list', page=page, order_id=order_id, status_id=status_id,
  317.                         date_start=self._date_as_str(date_start), date_end=self._date_as_str(date_end))
  318.  
  319.     def order_list_last(self, days=10):
  320.         return self.order_list(1, "", "", datetime.today() - timedelta(days=days), datetime.today())
  321.  
  322.     def _date_as_str(self, value):
  323.         """
  324.        Формат даты "YYYY-MM-DD"
  325.        :param value: дата или строка
  326.        :return: представление в нужном формате
  327.        """
  328.         if type(value) in (datetime,):
  329.             return value.strftime('%Y-%m-%d')
  330.         return value
  331.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement