Giter VIP home page Giter VIP logo

amocrm_api's People

Contributors

alex-msk avatar alex-msk-2 avatar andrejgorodnij avatar colcefer avatar dinodigital avatar edelwi avatar gitter-badger avatar icegreg avatar karik741 avatar kfcaio avatar knqzx avatar krukov avatar lavr avatar n-litened avatar radiosterne avatar rolldeep avatar warnabas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amocrm_api's Issues

Новая версия

В связи с большими изменениями во взаимодействии с AmoCrm и популярности этой платформы появились планы реанимировать библиотеку.
В планах

  • Реализовать авторизацию по Oauth2 (с api для хранения токенов)
  • Сделать api более прозрачным и простым
  • Добавить недостающий функционал

выдает Invalid audience при любом запросе.

При попытке получить любые сущности выдает jwt.exceptions.InvalidAudienceError: Invalid audience. Токены в файл записались. Посдкажите, пожалуйста, что я делаю не так.

Не работает пример из документации (example.py)

# -*- coding: utf-8 -*-
## HIGH level API
from amocrm import BaseContact, amo_settings, fields

amo_settings.set('[email protected]', 'myapikey', 'myprojectaname')

class Contact(BaseContact):
    position = fields.CustomField('Должность')
    site = fields.CustomField('Сайт')
    phone = fields.CustomField('Телефон', enum='WORK')

new_contact = Contact(name='Example2', company='ExampleCorp2', position='QA', phone='0001')
new_contact.site = 'http://example.com'
new_contact.save()

Ошибка:

Traceback (most recent call last):
  File "test2.py", line 7, in <module>
    class Contact(BaseContact):
  File "test2.py", line 10, in Contact
    phone = fields.CustomField('Телефон', enum='WORK')
TypeError: __init__() got an unexpected keyword argument 'enum'

Как обойти ошибку amocrm.v2.exceptions.AmoApiException: Connection aborted?

Здравствуйте! Делаю выгрузку из events log, используя Event from amocrm.v2 – код здесь. Иногда выгрузка отваливается с ошибкой # Sometimes Connection aborted. amocrm.v2.exceptions.AmoApiException: Connection aborted. Я пробовала варьирование продолжительности задержки и размеров батчей – ничего не помогает. Как обойти описанную выше проблему?

Mapping fields to Amo

Amocrm api got new ability - manage custom fields, create, change and delete https://developers.amocrm.ru/rest_api/fields_set.php.
We can automagically map all custom fields to amocrm itself

class Lead(BaseLead):
    target = fields.CustomField(u'Цели', type=MULTILIST_TYPE, origin=ANY)
    spend =  fields.CustomField(u'Потрачено', type=NUMBER_TYPE)

Lead.objects.map_fields()
# Custom field 'Цели' successfully created
# Custom field 'Потрачено' successfully created

Ловлю jwt.exceptions.InvalidAudienceError: Invalid audience. Как быть?

Здравствуй!
Когда пытаюсь достать или создать Lead, получаю такую ошибку.
Помоги, пожалуйста :3

Traceback (most recent call last):
  File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/__main__.py", line 3, in <module>
    main()
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 990, in main
    cli.main(args=sys.argv[1:])
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 596, in main
    return super().main(*args, **kwargs)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1062, in main
    rv = self.invoke(ctx)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1668, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 763, in invoke
    return __callback(*args, **kwargs)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 763, in invoke
    return __callback(*args, **kwargs)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 845, in run_command
    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 321, in __init__
    self._load_unlocked()
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 346, in _load_unlocked
    self._app = rv = self.loader()
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 402, in load_app
    app = locate_app(self, import_name, name)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 256, in locate_app
    __import__(module_name)
  File "/mnt/8A2C66EE2C66D4AB/PyCharmProjects/dialogflow/app.py", line 35, in <module>
    add_lead("TEST", "+79999999999", "[email protected]", "10.06.2023", "13:37")
  File "/mnt/8A2C66EE2C66D4AB/PyCharmProjects/dialogflow/app.py", line 33, in add_lead
    Lead.save(Lead(name = name, number = number, email = email, date = date, time = time))
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/model.py", line 23, in __init__
    setattr(self, attr, value)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 147, in __set__
    self._check(instance)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 99, in _check
    field = self._find(instance)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 91, in _find
    for field in CustomFieldModel.get_for(instance):
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/manager.py", line 27, in filter
    for data in self._interaction.get_all(*args, include=self._model._get_embedded_fields(), **kwargs):
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 112, in get_all
    for data in self._all(self._get_path(), include=include, query=query, filters=filters, order=order):
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 77, in _all
    response, _ = self._list(
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 72, in _list
    return self.request("get", path, params=params, include=include)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 57, in request
    return self._request(method, path, data=data, params=params, headers=headers)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 36, in _request
    headers.update(self.get_headers())
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 25, in get_headers
    headers.update(self._get_auth_headers())
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 29, in _get_auth_headers
    return {"Authorization": "Bearer " + self._token_manager.get_access_token()}
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/tokens.py", line 154, in get_access_token
    if self._is_expire(token):
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/tokens.py", line 161, in _is_expire
    token_data = jwt.decode(token, options={"verify_signature": False})
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 104, in decode
    self._validate_claims(payload, merged_options, **kwargs)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 140, in _validate_claims
    self._validate_aud(payload, audience)
  File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 189, in _validate_aud
    raise InvalidAudienceError('Invalid audience')
jwt.exceptions.InvalidAudienceError: Invalid audience

Конфигурация токенов, как в примере:

tokens.default_token_manager(
    client_id = app.config['AMOCRM_INTEGRATION_ID'],
    client_secret = app.config['AMOCRM_SECRET'],
    subdomain = app.config['AMOCRM_DOMAIN'],
    redirect_url = 'https://36434e2604eb.ngrok.io',
    storage = tokens.FileTokensStorage()
)
tokens.default_token_manager.init(
    code = app.config['AMOCRM_AUTH'],
    skip_error = True
)

Слетает авторизация

Авторизируюсь как указано в примере, сутки все работает а потом слетает авторизация пока не укажу новый код авторизации. Подскажите, в чем может быть проблема?

Удаляются контакты в полях EnumCustomField с множественным значениями

Дано:
Контакт, у которого есть несколько "Рабочих" адресов и один "Личный".
Нужно изменить первый из них.

class Contact(BaseContact):
	email=fields.EnumCustomField(u'Email', enum='WORK')

Получаем список контактов.

contact=Contact.objects.get(id=12345)
print(contact.email)
# ['[email protected]', '[email protected]']

В массиве только "Рабочие" адреса. Пытаемся поменять первый рабочий адрес.

if isinstance(contact.email , list):
    tmp_mails=contact.email
    tmp_mails[0]='[email protected]'
    contact.email = tmp_mails
contact.save()

В результате, все "Рабочие" контакты сохраняются корректно в CRM, а "Личные" просто удаляются. Подскажите, может неправильно пользуюсь библиотекой?

Создание сущностей

Здравствуйте, не могу созадть сущность, токен возвращает. но сущность не создается
from amocrm.v2.entity.contact import Contact
from amocrm.v2 import tokens
value = tokens.FileTokensStorage()
print(value.get_access_token())
print(value.get_refresh_token())

Contact.objects.create(name = "test_009")

Ошибка =>
Traceback (most recent call last):
File "C:\Users\Nikol\OneDrive\Рабочий стол\амоапи\345678.py", line 22, in
Contact.objects.create(name = "Залупа")
File "D:\успех\lib\site-packages\amocrm\v2\manager.py", line 16, in create
return self._model(data=self._interaction.create(data=data or kwargs))
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 123, in create
response, status = self.request("post", self._get_path(), data=[data])
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 57, in request
return self._request(method, path, data=data, params=params, headers=headers)
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 36, in _request
headers.update(self.get_headers())
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 25, in get_headers
headers.update(self._get_auth_headers())
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 29, in _get_auth_headers
return {"Authorization": "Bearer " + self._token_manager.get_access_token()}
File "D:\успех\lib\site-packages\amocrm\v2\tokens.py", line 151, in get_access_token
token = self._storage.get_access_token()
AttributeError: 'NoneType' object has no attribute 'get_access_token'

Подскажите, пожалуйста, в чем может быть проблема?

Работа с TaskLead

Дело такое. Создаю lead на основе BaseLead модели.
lead = BaseLead(name=u'some name')
lead.save()
task = LeadTask(lead=lead, text='123', type=u'Звонок')
task.save()

А дальше трейс:
Суть в том, что в _request словарь method выглядит так:
{u'container': [u'add'],
u'method': u'post',
u'path': u'set',
u'result': [u'add', 0, u'id']}
И когда в _modify_response происходит магия:
response = response[key]
Где keys строятся на основе 'result' подставляется 0 в dict как целое и ... IndexError.

P.S.: Может я конечно совсе где-то не прав, тогда дико каюсь.

Как получить список всех телефонов или e-mail?

В модели написано что то вроде

telefon = custom_field.ContactPhoneField("Телефон", field_id=496001, code="PHONE")
Модель сгенерирована через pyamogen

При обращении к contact.telefon, возвращается строка, которая содержит только один номер телефона.

Как получить ВСЕ номера телефонов, которые привязаны к карточке(рабочие, мобильные, личные)?
Как быть если, к примеру у контакта несколько рабочих телефонов?

Фильтр сделок

Добрый день

Подскажите пожалуйста, как пользоваться Lead.objects.filter() ??? Как задавать параметры? Пытаюсь выбрать все лиды в статусе = " Успешно завершено"

Не обрабатывается ошибка сохранения

Пытаемся сохранить изменения в сделке:

lead.save()

Класс _BaseAmoManager делает post-запрос:

https://xxx.amocrm.ru/private/api/v2/json/leads/set 

получает ответ (со статусом 200):

{"response":{"leads":{"update":{"errors":{"17207117":"Last modified date is older than in database"}}},"server_time":1513160837}}

но считает, что всё прошло хорошо.

Ожидаемое поведение: библиотека сообщает об ошибке при сохранении сделки.

requirements

Для корректной работы генерации файла с готовым мапингом требуется библиотека https://github.com/un33k/python-slugify или любая другая с подобным функционалом/сигнатурой, прошу обновить зависимости

Удаётся забрать только первые 50 событий из Event

Раньше все хорошо работало, но теперь при любой попытке забрать Event любым способом, выдаётся только 50
Пробовал так:
events = list(Event.objects.filter( filters=[ filters.DateRangeFilter("created_at")(now-timedelta(days=7), now), filters.SingleFilter("type")("lead_status_changed") ] ))
и так:
events = list(Event.objects.all())

Как привязать контакт к сделке?

Добрый день. Не могу найти как привязать контакт к сделке. Отдельно создаю контакт, затем сделку, а дальше не понятно. Подскажите, пожалуйста, я новичок в этом деле.

IndexError: list index out of range при парсинге данных Event

Возникает на разных свойствах, ['note'], ['link'] и т.д при переборе и выводе каждого элемента списка событий в консоль.

Traceback (most recent call last):
File "/home/rusty/Client-projects/AmoCrmDB/another_wrap.py", line 137, in
print(i)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 40, in repr
fields = [
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 41, in
"{} = {}".format(field.name, getattr(self, attr))
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/fields.py", line 33, in get
return self.on_get_instance(instance, data)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/entity/events.py", line 93, in on_get_instance
return value[0]["note"]["id"]
IndexError: list index out of range

Traceback (most recent call last):
File "/home/rusty/Client-projects/AmoCrmDB/another_wrap.py", line 133, in
print(i)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 40, in repr
fields = [
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 41, in
"{} = {}".format(field.name, getattr(self, attr))
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/fields.py", line 33, in get
return self.on_get_instance(instance, data)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/entity/events.py", line 103, in on_get_instance
return value[0]["link"]["entity"]
IndexError: list index out of range

amocrm.v2.exceptions.NoToken: You need to init tokens with code by 'init' method

Пытаюсь подключиться к api, но не получается

from amocrm.v2 import tokens
from amocrm.v2 import Contact, Company, Lead
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
tokens.default_token_manager(
    client_id="***",
    client_secret="***",
    subdomain="***",
    redirect_url="https://google.com/",
    storage=tokens.FileTokensStorage(directory_path=dir_path),  # by default FileTokensStorage
)
print(dir_path)
tokens.default_token_manager.init(code="***", skip_error=False)
leads = Lead.objects.all()
for lead in leads:
    print(lead)

raise exceptions.NoToken("You need to init tokens with code by 'init' method")
amocrm.v2.exceptions.NoToken: You need to init tokens with code by 'init' method

KeyError: '_links' при попытке забрать все статусы из воронки


KeyError Traceback (most recent call last)
Input In [6], in
----> 1 list(Status.get_for("4483554").filter())

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/manager.py:27, in Manager.filter(self, *args, **kwargs)
26 def filter(self, *args, **kwargs):
---> 27 for data in self._interaction.get_all(*args, include=self._model._get_embedded_fields(), **kwargs):
28 yield self._model(data=data)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/entity/pipeline.py:17, in StatusesInteraction.get_all(self, include, query, filters, order)
16 def get_all(self, include=None, query=None, filters=(), order=None):
---> 17 for data in self._all(self._get_path(), include=include, query=None, filters=filters, order=order):
18 for status_data in data[self._get_field()]:
19 if not query or status_data["name"].lower() == query.lower():

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/interaction.py:83, in BaseInteraction._all(self, path, include, query, filters, order, limit)
81 return
82 yield response["_embedded"]
---> 83 if "next" not in response["_links"]:
84 return
85 page += 1

KeyError: '_links'

FiltersByPipelineAndStatus

подскажите пожалуйста как могу использовать FiltersByPipelineAndStatus фильтр что то не могу понять (я новичек) спасибо заранее

Pipeline

Не пойму как получить pipeline сделки
<generator object Manager.filter at 0x000001BA10750F20>
Как распаковать этот ответ?

leadget1 = Pipeline.objects.filter(pipeline_id=45884164)
вот так собственно я ищу просто pipeline. пробовал с разных сторон заходить. Уже два дня бьюсь. Мб потому что не особо опытен

Короче, я просто хочу получить все сделки в определенном pipeline =(

ModuleNotFoundError: No module named 'amocrm.v2'; 'amocrm' is not a package

Установил pip install amocrm_api
Создал простой файл.

from amocrm.v2 import tokens, Contact

tokens.default_token_manager(
client_id="xxx-xxx-xxxx-xxxx-xxxxxxx",
client_secret="xxxx",
subdomain="subdomain",
redirect_url="https://xxxx/xx",
storage=tokens.FileTokensStorage(), # by default FileTokensStorage
)
tokens.default_token_manager.init(code="..very long code...", skip_error=True)
contacts = Contact.objects.all()
print(contacts)

И запуститл, в ответ ошибка

root@67d3abe17a1b:/backend# python data/amocrm.py
Traceback (most recent call last):
File "/backend/data/amocrm.py", line 1, in
from amocrm.v2 import tokens, Contact
File "/backend/data/amocrm.py", line 1, in
from amocrm.v2 import tokens, Contact
ModuleNotFoundError: No module named 'amocrm.v2'; 'amocrm' is not a package

Создание сделки в статусе неразобранное

Пытаюсь создать неразобранную сделку:

Lead.objects.create(name='Нераз.Сделка', status_id=48692119, pipeline_id=5503552)

Получаю ошибку:

amocrm.v2.exceptions.ValidationError: {'validation-errors': [{'request_id': '0', 'errors': [{'code': 'NotSupportedChoice', 'path': 'status_id', 'detail': 'The value you selected is not a valid choice.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'}

ID шники статуса и pipeline перепроверял:

Status(color = #c1c1c1, id = 48692119, is_editable = False, name = Неразобранное, sort = 10, type = 1)

Каков правильный путь для создания неразобранной сделки?

ValidationError, FieldNotExpected при сохранении кастомных полей

Есть такое поле

class Contact(_Contact):
    class LANG_ENUMS:
        ru = custom_field.SelectValue(id=1227515, value='Рус')
        en = custom_field.SelectValue(id=1227517, value='Англ')
    lang = custom_field.SelectCustomField("Язык", field_id=1152165, enums=LANG_ENUMS)

Делаю так:

lang_enum_ru = crm_inst.LANG_ENUMS.ru
crm_inst.lang = lang_enum_ru

или

crm_inst.lang = 'Рус'

затем

crm_inst.save()

и получаю Exception:

ValidationError({'validation-errors': [{'request_id': '0', 'errors': [{'code': 'FieldNotExpected', 'path': 'custom_fields_values.5.values.0.enum_code', 'detail': 'This field was not expected.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'})

Причем такое почти при любом сохранении полей кроме стандартных(в смысле при сохранении custom_fields).
в чем может быть проблема?

celeryworker_1  | Traceback (most recent call last):
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 451, in trace_task
celeryworker_1  |     R = retval = fun(*args, **kwargs)
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 734, in __protected_call__
celeryworker_1  |     return self.run(*args, **kwargs)
celeryworker_1  |   File "/app/amo/tasks.py", line 246, in validate_person
celeryworker_1  |     raise self.retry(exc=e)
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/celery/app/task.py", line 717, in retry
celeryworker_1  |     raise_with_context(exc)
celeryworker_1  |   File "/app/amo/tasks.py", line 242, in validate_person
celeryworker_1  |     crm_inst.save()
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/amocrm/v2/model.py", line 49, in save
celeryworker_1  |     self.update()
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/amocrm/v2/model.py", line 63, in update
celeryworker_1  |     self._manager.update(self.id, self._get_updated_data())
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/amocrm/v2/manager.py", line 19, in update
celeryworker_1  |     return self._interaction.update(object_id=object_id, data=data or kwargs)
celeryworker_1  |   File "/usr/local/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 132, in update
celeryworker_1  |     raise exceptions.ValidationError(response)
celeryworker_1  | amocrm.v2.exceptions.ValidationError: {'validation-errors': [{'request_id': '0', 'errors': [{'code': 'FieldNotExpected', 'path': 'custom_fields_values.5.values.0.enum_code', 'detail': 'This field was not expected.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'}

Не понимаю, как использовать filter

Не понятно, как использовать фильтры, какие бы параметры я не вводил (в виде словарей, просто аргументов итд) выдает TypeError: GenericInteraction.get_all() got multiple values for argument 'include'
Можно какой-то пример, как этими фильтрами можно пользоваться?
Спасибо заранее

BaseCompany.tasks always returns nothing

I've found out that BaseCompany.tasks returns empty collection, even when there are tasks assigned.
I've also found a way to make it work after playing with AmoCRM developer console.

The original code:

class CompanyTask(_AbstractTaskModel):
    company = fields.ForeignField(BaseCompany, 'element_id')
    _element_type = fields._ConstantField('element_type',
                                         _BaseModel._ELEMENT_TYPES['company'])
    objects = TasksManager(object_type='contact')

If we remove object_type (make it objects = TasksManager()) it works. Also the object_type can be removed from ContactTask and LeadTask class without changing the way they work (they work either way).

I am not sure that's the right way to do it though for this wrapper, since maybe AmoCRM's behavior will change in the future again.

How to get messages from whatsapp integration?

Hi,

I'm looking for a way to retrieve messages from whatsapp integration . That integration is set on a phone I don't have access, so it'd be great if I could work around it.

I have access to leads and other entities mapped, but I'm clueless about how to interact with integrations and widgets, is it possible? If so, what is a viable way to do that? I'm open to contribute : )

My use case is quite simple: I don't have access to individual whatsapp notifications. In other words, I have to check each lead in order to know if he/she answers my message or dive into notifications (I'm not able to filter only my clients). I want to interact problematically with chat messages.

Проблема при авторизации

Содержимое main.py файла:

from amocrm.v2 import tokens, Lead

tokens.default_token_manager(
    client_id="xxx",
    client_secret="xxxx",
    subdomain="xxx",
    redirect_url="https://example.com",
    storage=tokens.FileTokensStorage(),
)

tokens.default_token_manager.init(code="code", skip_error=False)

при запуске python main.py получаю в ответ это:

{
    'title': 'Некорректный клиент', 
    'type': 'https://developers.amocrm.ru/v3/errors/OAuthProblemJson', 
    'status': 401, 
    'detail': 'Авторизация клиента не прошла'
}

Интеграция в аккаунте:
image

Не могу понять в чем проблема, можете подсказать?

List index out of range при попытке забрать Event

Привет @Krukov!
У меня возникает вышеозначенная ошибка, когда я пытаюсь забрать Event из амо

events = list(Event.objects.filter(filters=[filters.DateRangeFilter("created_at")(now-timedelta(days=1), now)]))
events

Причем та же ошибка возникает, если просто делать, хотя раньше возвращало просто последнее событие:

Event.objects.get()

Мб бага какая?

Сотрудничество

Мы хотим написать интеграцию amocrm + bizon + getcourse и ищем программиста на Python. Если у Вас есть время и желание поучавствовать в проекте, пишите на почту [email protected]

Заранее спасибо.

Использование фильтров

Добрый день! Подскажите как использовать правильно запрос фильтр.
data = {"created_at":yyyy-mm-dd}
Lead.objects.filter(**data)
Ошибка отсутствует именнованный параметр "created_at"

User.objects.all() возвращает пустой генератор

При вызове метода User.objects.all() возвращается генератор (<generator object Manager.filter at 0x7f9c104aa270>), но при прокрутке пустота:

users = User.objects.all()

for u in users:
    print(u)

При этом если запрашивать юзеров через BaseInteraction().request("get", path="users"), то всё приходит.

Нужна помощь в интеграции с Django

Библиотека отличная! С документацией поработать и вообще супер!
Инициализацию я поставил в apps.py, потому что если ставить в settings.py выдаст ошибку, видимо settings.py выполняется 2 раза:

class SiteSettingsConfig(AppConfig):
    name = 'site_settings'

    def ready(self):
        # AMOCRM MAIN SETTINGS
        # Authorization
        from amocrm.v2 import tokens  # noqa: E402
        tokens.default_token_manager(
            client_id="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
            client_secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            subdomain="xxxxxxxx",
            redirect_url="https://xxxxxx.ngrok.io",
            storage=tokens.FileTokensStorage()
        )

        # if not pathlib.File(os.path.join(settings.BASE_DIR, 'refresh_token.txt')).is_file():
        tokens.default_token_manager.init(
            code="...code...",
            skip_error=False
        )

Теперь пробую после отправки формы создать Lead вот так: lead = Lead(name="Форма") и потом lead.save(). На это почему-то возвращает amocrm.v2.exceptions.UnAuthorizedException(неверный логин и пароль если быть точным)...

Файлы refresh_token.txt и access_token.txt создает, и все вроде нормально.

Очень нужна помощь, заранее спасибо!

И если не сложно еще вопросик: Как мне создать Lead в определенном pipeline и добавить responsible user? Я пытался вот так Lead(name="Форма", responsible_user_id=6591718, group_id=0, pipeline_id=36854932), но не вышло... Я так понял надо найти пользователя - main_user = User.objects.get(1) и в аргументы поставить responsible_user=main_user, но чтобы это понять мне сначала надо решить первую проблему, она появляется при любом запросе...

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.