Krukov / amocrm_api

Python amocrm API wrapper
MIT License
104 stars 55 forks source link

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

Closed alex-msk closed 2 years ago

alex-msk commented 3 years ago

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

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

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

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

Krukov commented 3 years ago

Сори за долгий ответ, круто что кто то пользуется pyamogen ))

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

Я пока закинул меррж реквест https://github.com/Krukov/amocrm_api/pull/46 - может он поможет как-то. Суть в том что можно будет передать enums=ALL и получить все номера.

Мне сейчас не на чем проверить реализацию - если будет возможность скопировать и проверить буду благодарен

alex-msk commented 3 years ago

Pyamogen очень удобен.

Пока что создал кучу полей с телефонами с разными значениями enum=. Но чувствую, что какая то часть телефонов и имейлов проходит мимо меня, особенно в случаях когда у контакта указано, к примеру, несколько рабочих телефонов или e-mail'ов.

А так как те, кто вносит информацию в CRM не особо заморачивается над выборрм тира телефона(оставляя это поле по-умолчанию), есть ощущение, что через библиотеку не вижу многого.

Попробую протестить с этим обновлением. По итогу напишу.

alex-msk commented 3 years ago

Перестало работать то, что было написано ранее.

Сделал как то так:

class Contact(_Contact):
    dolzhnost = custom_field.TextCustomField("Должность", field_id=495999, code="POSITION")
    # Номера телефонов
    phone_personal = custom_field.ContactPhoneField("Телефон", field_id=496001, code="PHONE", enum_code="PRIV")
    phone_work = custom_field.ContactPhoneField("Телефон", field_id=496001, code="PHONE", enum_code="WORK")
    phone_other = custom_field.ContactPhoneField("Телефон", field_id=496001, code="PHONE", enum_code="OTHER")
    allphones = custom_field.ContactPhoneField("Телефоны", code="PHONE", enums="ALL")

потом

c=Contact.objects.get(object_id=id)
print(c.phone_personal)
print(c.allphones)

В итоге получаю:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 412, in trace_task
     R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 704, in __protected_call__
     return self.run(*args, **kwargs)
   File "/app/amo/tasks.py", line 27, in sync_contact
     print(c.phone_personal)
   File "/usr/local/lib/python3.9/site-packages/amocrm/v2/fields.py", line 35, in __get__
    return self.on_get_instance(instance, data)
  File "/usr/local/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 119, in on_get_instance
    return self.on_get(field_data["values"])
  File "/usr/local/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 268, in on_get
     return result[0]
 IndexError: list index out of range

А раньше этот код работал (по крайней мере print(c.phone_personal) )

Может что то не так делаю?

alex-msk commented 3 years ago

Понял. Такое появляется если в поле с телефоном ничего не указано(раньше просто возвращался None). Если в поле что то указано, то все работает штатно.

bkmz commented 3 years ago

У меня что-то ни одно кастомное поле получить не удалось. Везде выдает AttributeError, хотя models.py сгенерирвоал, все ок

Krukov commented 3 years ago

@bkmz А можешь полный трейсбек скинуть?

bkmz commented 3 years ago

@Krukov Начал смотреть Trace и понял, что я неправильно заимпортировал models.py.. Спасибо :)

было

import models

стало

from models import Contact

alex-msk commented 3 years ago

Добавил pull request. Не уверен, что сделал все правильно(вижу, что есть type=MULTITEXT, по названию, вроде, предполагает изменения на более глубоком уровне, но не разобрался где)