Krukov / amocrm_api

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

Добавить новые объекты Event и EventsFiltersByPipelineAndStatus #60

Closed rolldeep closed 2 years ago

rolldeep commented 2 years ago

WIP

В этом pr хочу добавить объект events и фильтр по событиям, с помощью которого можно будет отфильтровать события по воронке и статусу изменения сделаки пример: (https://www.amocrm.ru/developers/content/crm_platform/events-and-notes#events-filter-params).

rolldeep commented 2 years ago

@Krukov , привет, мог бы подсказать как мне корректно сериализовать value_after/value_before?

Krukov commented 2 years ago

@Krukov , привет, мог бы подсказать как мне корректно сериализовать value_after/value_before?

Речь ведь идет о сериализции ответа от АМО ? Да там достаточно интересные правила - мне нужно время прикинуть ) думаю завтра вечером отвечу

rolldeep commented 2 years ago

@Krukov , привет, мог бы подсказать как мне корректно сериализовать value_after/value_before?

Речь ведь идет о сериализции ответа от АМО ? Да там достаточно интересные правила - мне нужно время прикинуть ) думаю завтра вечером отвечу

Да, сериализация.

Жду тогда твоего ответа. Спасибо.

Пока сам поробую поэкспериментировать 🔬

Krukov commented 2 years ago

@rolldeep тебе спасибо )

Вообщем я подумал и кажется были следующие варианты 1) отдавать как есть. например:

[{"note": {"id": 42743871}}]

2) отдавать чистые значения без всякой чепухи например:

42743871

или

{
    "id": 5233224,
    "pipeline_id": 437642
}

в зависимости от типа события 3) по возможности сериализовать сразу в объект например:

Note(id=5233224)

или

Status(id=5233224, name="В работе")

1 - простой но мне кажется создает лишнюю работу для потребителей - нужно будет постоянно выдергивать нужные значения status_id = event.value_after[0]["lead_status"]["id"] - не удобно 2 - мне больше всего нравиться - простой и сразу дает получить что интересует и запросить что надо уже в зависимости от потребностей 3- слишком сложный в реализации и не думаю что это нужно делать

Вообщем если идти по второму пути то нужно будет определить свою кастомную реализацию _Field примерно так


EVENT_TYPES_WITH_BLANK_VALUE = ("lead_deleted", "lead_restored", "contact_deleted", "contact_restored", "company_deleted", "company_restored", "customer_deleted", "entity_merged", "task_added", "task_deleted", "task_completed")
EVENT_TYPE_LEAD_STATUS_CHANGE = "lead_status_changed"

class _EventValueField(_UnEditableField):
    def on_get_instance(self, instance, value):
        """
        value here is what we have in value_after/value_before field
        For example
        [
            {
                "note": {
                    "id": 42743871
                }
            }
        ],
        """
        if instance.type in EVENT_TYPES_WITH_BLANK_VALUE:
            return None
        if instance.type == EVENT_TYPE_LEAD_STATUS_CHANGE:
            return value[0]["lead_status"]
        ..

class Event:

    value_after = _EventValueField("value_after")
    value_before = _EventValueField("value_before")
rolldeep commented 2 years ago

@Krukov ,

Супер, получил данные по событиям до\после. Думаю, можно даже не делать сериализацию в объект.

1 - простой но мне кажется создает лишнюю работу для потребителей - нужно будет постоянно выдержать нужные значения status_id = event.value_after[0]["lead_status"]["id"] - не удобно

Чтобы тут ты посоветовал для динамической реализации?

Krukov commented 2 years ago

Чтобы тут ты посоветовал для динамической реализации?

не совсем понял что ты имеешь ввиду ?

Krukov commented 2 years ago

В целом то что сейчас есть в MR уже хорошо !

Krukov commented 2 years ago

@rolldeep мержу?

rolldeep commented 2 years ago

@rolldeep мержу?

Привет, давай.

Krukov commented 2 years ago

https://pypi.org/project/amocrm-api/2.4.0/

Добавил недостающие типы событий