retailcrm / api-client-python Goto Github PK
View Code? Open in Web Editor NEWPython client for retailCRM API
Home Page: http://www.retailcrm.ru
License: MIT License
Python client for retailCRM API
Home Page: http://www.retailcrm.ru
License: MIT License
В документации API v3 значится устаревшим. До v4 планируется обновление?
Если создать один объект 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).
Доброго времени суток!
Долго не мог понять, из-за чего некоторые запросы вызывали ошибку
При одном и том же наборе данных ошибка то вызывалась, то нет
И как оказалось, некоторые параметры с прошлых запросов по 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", которая не очень информативна для дебага :)
for the order GET method there is a field orders[][items][][isCanceled]
in the documentation.
But I do not see in in the Python results of the method.
Добрый день.
Столкнулся с тем, что метод telephony_calls_upload для версии 5 возвращает 404. Судя по всему в requests_url для requests.post() не подставляется /v5
Добрый день, будет ли асинхронная версия?
файл 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'
Ах, 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) переданное значение будет проигнорировано. "
решил заглянуть в исходники клиента. Годы опыта не подвели:
api-client-python/retailcrm/versions/v5.py
Line 491 in d4bed32
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}
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!
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.
В ходе тестирования от сервера пришел такой ответ
{'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'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.