Giter VIP home page Giter VIP logo

api-client-python's Introduction

Build Status Coverage PyPI PyPI - Python Version

RetailCRM python API client

This is Python RetailCRM API client. This library allows to use all available API versions.

Install

pip3 install retailcrm

Usage

API version 3 order create

# coding utf-8

import retailcrm


client = retailcrm.v3('https://demo.retailcrm.pro', 'uLxXKBwjQteE9NkO3cJAqTXNwvKktaTc')

order = {
  'firstName': 'John',
  'lastName': 'Doe',
  'phone': '+79000000000',
  'email': '[email protected]',
  'orderMethod': 'call-request',
}

result = client.order_create(order)

API version 4 customers history

# coding utf-8

import retailcrm


client = retailcrm.v4('https://demo.retailcrm.pro', 'uLxXKBwjQteE9NkO3cJAqTXNwvKktaTc')

result = client.customers_history(filters={'sinceId': '1500', 'startDate': '2018-03-01'})

print(result['pagination']['totalCount'])

API version 5 task create

# coding utf-8

import retailcrm


client = retailcrm.v5('https://demo.retailcrm.pro', 'uLxXKBwjQteE9NkO3cJAqTXNwvKktaTc')
site = 'example-com'
task = {
  'text': 'Product availability problem',
  'commentary': 'Take a look ASAP',
  'order': {
    'externalId': '100500'
  },
  'performerId': 1
}

result = client.task_create(task, site)

api-client-python's People

Contributors

alkalit avatar customr avatar dependabot[bot] avatar gwinn avatar muxx avatar tikijian avatar yhx07 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

api-client-python's Issues

Readme bug

There is a mistake on the main page, in code example:
result = client.customers_history(filter={'sinceId': '1500', 'startDate': '2018-03-01'})

client.customers_history (and all methods of client) doesn't has parameter filter. It has filters!

Неправильная проверка отсутствия ошибок в ответе

В ходе тестирования от сервера пришел такой ответ

{'success': False, 'errorMsg': 'Not found'}

Что вызвало ошибку в коде:

... # Очень длинный стектрейс
  File "/Users/alkalit/.virtualenvs/flowershop/flowershop/retailcrm_integration/signals.py", line 67, in handler
    logger.error('CRM out synchronization error: %s', response.get_error_msg(), extra={'errors': response.get_errors(), 'order_id': instance.id})
  File "/Users/alkalit/.virtualenvs/flowershop/lib/python3.7/site-packages/retailcrm/response.py", line 45, in get_errors
    errors = {} if not self.__response_body['errors'] else self.__response_body['errors']
KeyError: 'errors'

Неочевидное self.parameters

Доброго времени суток!
Долго не мог понять, из-за чего некоторые запросы вызывали ошибку
При одном и том же наборе данных ошибка то вызывалась, то нет
И как оказалось, некоторые параметры с прошлых запросов по API-клиенту могут попасть в параметры других запросов, где они не нужны и соответственно могут вызвать ошибки
Обратите внимание на self.parameters, он никогда не опустошается, а лишь дополняются новыми данными
Сам метод запроса API:

def post(self, url, version=True):
    """
    Post request
    :return: Response
    """
    base_url = self.api_url + '/' + self.api_version if version else self.api_url
    requests_url = base_url + url
    response = requests.post(requests_url, data=self.parameters, headers={
        'X-API-KEY': self.api_key})
    
    return Response(response.status_code, response.json())

Пример метода API-клиента, где нет параметра "filter":

def order_create(self, order, site=None):
    """
    :param order: object
    :param site: string
    :return: Response
    """
    self.parameters['order'] = json.dumps(order)

    if site is not None:
        self.parameters['site'] = site

    return self.post('/orders/create')

Пример метода API-клиента, где есть параметр "filter":

def orders(self, filters=None, limit=20, page=1):
    """
    :param filters: object
    :param limit: integer
    :param page: integer
    :return: Response
    """
    self.parameters['filter'] = filters
    self.parameters['limit'] = limit
    self.parameters['page'] = page

    return self.get('/orders')

Соответственно если изначально вызвать метод orders, self.parameters будет содержать в себе поля filter, limit, page
Затем если вызвать order_create, помимо полей order и site, которые там необходимы, там будут еще и содержаться поля filter, limit, page.
Из-за чего и вызывается ошибка, как правило "Not found", которая не очень информативна для дебага :)

API v4

В документации API v3 значится устаревшим. До v4 планируется обновление?

File upload bug

is not JSON serializable error.

According to API documentation post request needs file object. That means "json.dumps" is not needed here.

I've made fork, to fix that (here it is), but could not make pull request.

Merge that please.

Json encoding error

Вызывал метод orders(limit=20, page=1)
Вернул ошибку requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0).
Версия клиента v5.

Снимок экрана от 2023-03-18 22-28-56

Ошибка при обновлении данных платежа заказа.

Ах, 10 часов вечера. Чем бы заняться? Посмотреть кино? Сходить с девушкой в ресторан? Нет, это для слабых духом. Для тех в ком, как было сказано в одном известном советском фильме, пропал дух авантюризма. Настоящие мужики выискивают баги в клиентах коммерчиских црм.

Короткий пример сессии из ipython:

client = retailcrm.v5(settings.RETAIL_CRM['crm_url'], settings.RETAIL_CRM['api_key']) 
data = {'externalId': '53184', 'status': 'paid'} 
resp = client.order_payment_edit(data) 
print(resp.get_response())   
# {'success': False, 'errorMsg': 'Payment not found'}

После примерно часа биения головой об стену и вдумчивого чтения доков этого "прекрасно спроектированного" апи, а именн строчки "Изменение payment[externalId] доступно только при обращении к платежу по id (by=id), в противном случае (by=externalId) переданное значение будет проигнорировано. "

решил заглянуть в исходники клиента. Годы опыта не подвели:

if uid_type != 'externalId':

client.parameters  # {'payment': '{"externalId": "53184", "status": "paid"}'}
client.parameters['by'] = 'externalId' 
resp = client.post('/orders/payments/' + str(order.pk) + '/edit') 
resp.get_response()  # {'success': True, 'id': 291}

Баг при вызове integration_module_edit()

файл v5.py строка 391

return self.post('/integration-modules/' + str(configuration['code'])) + '/edit'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/bogdanstratila/Desktop/PostFiles/limo-app/venv/lib/python3.8/site-packages/retailcrm/versions/v5.py", line 391, in integration_module_edit
    return self.post('/integration-modules/' + str(configuration['code'])) + '/edit'
TypeError: unsupported operand type(s) for +: 'Response' and 'str'

Async

Добрый день, будет ли асинхронная версия?

Методы через POST отдают 404

Добрый день.
Столкнулся с тем, что метод telephony_calls_upload для версии 5 возвращает 404. Судя по всему в requests_url для requests.post() не подставляется /v5

After calling functions parameters remain for the next request

Если создать один объект retailcrm.v5 и сделать два запроса (к примеру, функцией orders, а потом order_edit), то параметры от первого запроса будут фигурировать и во втором. В нашем примере мы при первом запросе передаем filter, limit и page. Если сделать запрос вторым методом, то там окажутся, помимо нужных order, by и site ещё параметры filter, limit и page от первого запроса. Причина в том, что в классе Client (https://github.com/retailcrm/api-client-python/blob/v5.1.0/retailcrm/versions/v5.py) в каждой отдельной функции делается запрос, но self.parameters остаются на месте. Я это пофиксил, делая self.parameters.clear() в самом начале функции. Возможно, есть более изящные решения.

If you create a single object retailcrm.v5 and sending 2 requests (for example using functions orders, and then order_edit). parameters of the first request stay in the object. So as an example we send request using orders, which contains parameters filter, limit и page, and then using function order_edit, which contains order, by и site and filter, limit и page remaining after first request. The reason for this behaviour is that in the class Client (https://github.com/retailcrm/api-client-python/blob/v5.1.0/retailcrm/versions/v5.py) each function makes a request but self.parameters are not cleared. I fixed it by using self.parameters.clear() at the begining of each function but easier solution might also exist (for example, using parameters not as parameter of the class but as local variable inside the function, not sure about this one).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.