Кодогенератор (Codegen)
Обзор
Кастомные поля AmoCRM имеют числовые ID и произвольные названия, часто на русском языке.
Кодогенератор автоматически создаёт типизированные подклассы DTO (MyLead, MyContact,
MyCompany) с named-свойствами для каждого кастомного поля, что позволяет обращаться к ним
как к обычным атрибутам Python вместо get_cf_value(123).
Имена свойств автоматически транслитерируются из кириллицы в латиницу и приводятся к
snake_case: Источник трафика → istochnik_trafika.
Быстрый старт
from amocrm import OAuthConfig, DjangoTokenStorage
from amocrm.codegen import generate_custom_fields_dto
oauth = OAuthConfig(
client_id="...",
client_secret="...",
redirect_uri="https://yourapp.com/oauth/callback",
storage=DjangoTokenStorage(my_settings_obj),
)
generate_custom_fields_dto("mycompany", oauth, output_file="my_models.py")
Функция подключится к AmoCRM, загрузит определения кастомных полей и запишет
готовый Python-код в файл my_models.py.
Пример сгенерированного файла
Для каждого кастомного поля генерируются и геттер, и сеттер — можно читать и записывать значение через стандартный property-синтаксис:
# Generated by amocrm-sdk codegen. DO NOT EDIT.
# Regenerate: from amocrm.codegen import generate_custom_fields_dto
from __future__ import annotations
from amocrm import Lead, Contact, Company
class MyLead(Lead):
"""Типизированные кастомные поля для сделок."""
@property
def istochnik_trafika(self) -> str | None:
"""Источник трафика (text, id=101)"""
return self.get_cf_value(101)
@istochnik_trafika.setter
def istochnik_trafika(self, value: str | None) -> None:
self.set_cf_value(101, value)
@property
def byudzhet(self) -> float | None:
"""Бюджет (numeric, id=102)"""
return self.get_cf_value(102)
@byudzhet.setter
def byudzhet(self, value: float | None) -> None:
self.set_cf_value(102, value)
...
Подключение к клиенту через configure_dto
После генерации подключите классы к клиенту. Все методы get, list,
create, update начнут возвращать экземпляры вашего подкласса:
from amocrm.manager import get_client
from my_models import MyLead, MyContact, MyCompany
client = get_client(subdomain="mycompany", oauth=oauth)
client.configure_dto(leads=MyLead, contacts=MyContact, companies=MyCompany)
lead = client.leads.get(123) # → MyLead
print(lead.istochnik_trafika) # → str | None (геттер)
lead.istochnik_trafika = "SEO" # сеттер — записывает в custom_fields_values
client.leads.update([lead]) # сохраняет изменения в AmoCRM
for lead in client.leads.list(): # → Iterator[MyLead]
print(lead.byudzhet)
Параметры configure_dto — все необязательны, можно подменить только часть ресурсов:
client.configure_dto(leads=MyLead) # contacts и companies остаются стандартными
Примечание
Вложенные объекты внутри Lead (lead.contacts, lead.company) остаются
стандартными классами Contact / Company. Чтобы и они были вашими подклассами,
переопределите from_dict в MyLead.
Транслитерация имён
Названия кастомных полей на кириллице автоматически транслитерируются перед преобразованием в snake_case. Это позволяет использовать имена свойств как стандартные Python-атрибуты.
Примеры транслитерации:
Оригинал |
Результат |
|---|---|
|
|
|
|
|
|
|
|
Таблица транслитерации (кириллица → латиница):
Символ |
Транслит |
|---|---|
а, б, в, г, д |
a, b, v, g, d |
е, ё, ж, з, и |
e, yo, zh, z, i |
й, к, л, м, н |
j, k, l, m, n |
о, п, р, с, т |
o, p, r, s, t |
у, ф, х, ц, ч |
u, f, kh, ts, ch |
ш, щ, ъ, ы, ь |
sh, shch, (пусто), y, (пусто) |
э, ю, я |
e, yu, ya |
Запись значений через сеттеры
Каждое сгенерированное property имеет сеттер. Тип аргумента совпадает с типом геттера:
lead = client.leads.get(123)
# Обычные скалярные поля (text, numeric, integer, …)
lead.email = "new@example.com"
lead.byudzhet = 150000.0
# Multiselect — передаётся список значений
lead.uslugi = ["SEO", "Контекст"]
# Сброс значения поля
lead.email = None
client.leads.update([lead])
Под капотом сеттер вызывает методы CustomFieldsMixin:
Тип поля AmoCRM |
Сеттер в миксине |
|---|---|
text, numeric, integer, select, phone, email, url, checkbox, bool, date, … |
|
multiselect |
|
smart_address |
|
Конфигурация
generate_custom_fields_dto принимает следующие параметры:
Параметр |
По умолчанию |
Описание |
|---|---|---|
|
— |
Поддомен аккаунта AmoCRM (например, |
|
— |
Объект |
|
|
Список сущностей для генерации |
|
|
Модуль, из которого импортируются базовые классы |
|
|
Путь к выходному файлу; если |
Использование без записи в файл
Если output_file не передан, код выводится в stdout:
generate_custom_fields_dto("mycompany", oauth)
Это удобно для просмотра результата перед сохранением или для использования вывода в пайплайне.
Генерация только для части сущностей:
generate_custom_fields_dto(
"mycompany", oauth,
entities=["leads"],
output_file="lead_models.py",
)
API-справочник
- amocrm.codegen.generate_custom_fields_dto(subdomain, oauth, entities=None, base_module='amocrm', output_file=None)[исходный код]
Подключиться к AmoCRM, получить кастомные поля и записать Python-код.
Создаёт клиент, загружает определения кастомных полей и генерирует типизированные подклассы DTO для использования в проекте.
- Параметры:
subdomain (str) – Поддомен аккаунта AmoCRM (например,
"mycompany").oauth (OAuthConfig) – Конфигурация OAuth с реквизитами и хранилищем токенов.
entities (list[str] | None) – Список сущностей для обработки. По умолчанию
["leads", "contacts", "companies"].base_module (str) – Имя модуля для импорта базовых классов. По умолчанию
"amocrm".output_file (str | None) – Путь к файлу для записи. Если
None— вывод в stdout.
- Тип результата:
None
Example:
from amocrm import OAuthConfig, DjangoTokenStorage from amocrm.codegen import generate_custom_fields_dto oauth = OAuthConfig( client_id="...", client_secret="...", redirect_uri="...", storage=DjangoTokenStorage(my_settings_obj), ) generate_custom_fields_dto("mycompany", oauth, output_file="my_models.py")
- amocrm.codegen.generate_and_print(client, entities=None, base_module='amocrm', output_file=None)[исходный код]
Получить кастомные поля и вывести/записать сгенерированный Python-код.
- Параметры:
- Тип результата:
None
- amocrm.codegen.fetch_custom_fields(client, entities=None)[исходный код]
Загрузить определения кастомных полей из AmoCRM для заданных сущностей.
- amocrm.codegen.generate_custom_models(fields_by_entity, base_module='amocrm')[исходный код]
Сгенерировать Python-код типизированных подклассов DTO.
- Параметры:
fields_by_entity (dict[str, list[CustomFieldDefinition]]) – Словарь
{entity: [CustomFieldDefinition, ...]}, полученный изfetch_custom_fields().base_module (str) – Имя модуля, из которого импортируются базовые классы. По умолчанию
"amocrm".
- Результат:
Строка с Python-кодом, готовая к записи в файл.
- Тип результата: