amochka 0.1.9__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
amochka-0.3.1/PKG-INFO ADDED
@@ -0,0 +1,205 @@
1
+ Metadata-Version: 2.4
2
+ Name: amochka
3
+ Version: 0.3.1
4
+ Summary: Python library for working with amoCRM API with ETL capabilities
5
+ Author-email: Timur <timurdt@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/yourusername/amochka
8
+ Project-URL: Documentation, https://github.com/yourusername/amochka
9
+ Project-URL: Repository, https://github.com/yourusername/amochka
10
+ Project-URL: Bug Tracker, https://github.com/yourusername/amochka/issues
11
+ Keywords: amocrm,crm,api,client,automation,etl
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.6
18
+ Classifier: Programming Language :: Python :: 3.7
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
+ Classifier: Topic :: Internet :: WWW/HTTP
26
+ Requires-Python: >=3.6
27
+ Description-Content-Type: text/markdown
28
+ Requires-Dist: requests>=2.25.0
29
+ Requires-Dist: ratelimit>=2.2.0
30
+ Requires-Dist: psycopg2-binary>=2.9.0
31
+ Requires-Dist: python-dotenv>=1.0.0
32
+
33
+ # amochka
34
+
35
+ Официальная документация API amocrm - https://www.amocrm.ru/developers/content/crm_platform/api-reference
36
+
37
+ **amochka** — библиотека для работы с API amoCRM на Python. Она поддерживает:
38
+ - Получение данных сделок с вложенными сущностями (контакты, компании, теги, и т.д.)
39
+ - Редактирование сделок, включая обновление стандартных и кастомных полей
40
+ - Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
41
+ - Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
42
+ - **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
43
+
44
+ ## Возможности
45
+
46
+ ### API клиент
47
+
48
+ - `get_deal_by_id(deal_id)` — получение детальной информации по сделке
49
+ - `get_pipelines()` — список воронок и статусов
50
+ - `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
51
+
52
+ ### ETL модуль
53
+
54
+ - **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
55
+ - **Transformers**: преобразование в табличный формат для БД
56
+ - **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
57
+ - **Migrations**: автоматическое создание таблиц и схем
58
+ - **Incremental sync**: инкрементальная синхронизация по updated_at
59
+ - Интеграция с **Apache Airflow** для автоматизации ETL процессов
60
+
61
+ ## Требования к окружению
62
+
63
+ Python 3.6 или новее.
64
+
65
+ ## Установка
66
+
67
+ ```bash
68
+ pip install amochka
69
+ ```
70
+
71
+ Для использования ETL модуля установите дополнительные зависимости:
72
+
73
+ ```bash
74
+ pip install amochka psycopg2-binary python-dotenv
75
+ ```
76
+
77
+ ## Кэширование кастомных полей
78
+
79
+ Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
80
+
81
+ ## Примеры использования
82
+
83
+ ### Быстрый старт: выгрузка обновленных сделок
84
+
85
+ ```python
86
+ from datetime import datetime, timedelta
87
+ from amochka import AmoCRMClient, CacheConfig
88
+
89
+ client = AmoCRMClient(
90
+ base_url="https://example.amocrm.ru",
91
+ token_file="token.json",
92
+ cache_config=CacheConfig.disabled(),
93
+ disable_logging=True
94
+ )
95
+
96
+ three_hours_ago = datetime.utcnow() - timedelta(hours=3)
97
+ leads = client.fetch_updated_leads_raw(
98
+ pipeline_id=123456,
99
+ updated_from=three_hours_ago,
100
+ save_to_file="leads.json",
101
+ include_contacts=True
102
+ )
103
+ ```
104
+
105
+ ### ETL: синхронизация в PostgreSQL
106
+
107
+ ```python
108
+ from etl.config import DatabaseConfig, AmoCRMAccount
109
+ from etl.extractors import AmoCRMExtractor
110
+ from etl.loaders import PostgresLoader
111
+ from etl.run_etl import sync_leads_with_contacts
112
+ from datetime import datetime, timezone
113
+
114
+ # Настройка БД
115
+ db_config = DatabaseConfig(
116
+ host="localhost",
117
+ port=5432,
118
+ dbname="amocrm",
119
+ user="postgres",
120
+ password="password",
121
+ schema="public"
122
+ )
123
+
124
+ # Настройка amoCRM аккаунта
125
+ account = AmoCRMAccount(
126
+ id=1,
127
+ name="main",
128
+ base_url="https://example.amocrm.ru",
129
+ token_path="token.json",
130
+ mybi_account_id=1,
131
+ pipeline_ids=[123456]
132
+ )
133
+
134
+ # ETL процесс
135
+ loader = PostgresLoader(db_config)
136
+ extractor = AmoCRMExtractor(account)
137
+
138
+ result = sync_leads_with_contacts(
139
+ extractor=extractor,
140
+ loader=loader,
141
+ mybi_account_id=1,
142
+ updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
143
+ updated_to=datetime.now(timezone.utc),
144
+ pipeline_ids=[123456]
145
+ )
146
+
147
+ print(f"Загружено сделок: {result['leads_count']}")
148
+ print(f"Загружено контактов: {result['contacts_count']}")
149
+ ```
150
+
151
+ ### Пример структуры данных
152
+
153
+ ```json
154
+ [
155
+ {
156
+ "id": 12345678,
157
+ "name": "Сделка: Заявка от клиента",
158
+ "custom_fields_values": [
159
+ {
160
+ "field_name": "utm_source",
161
+ "values": [{"value": "google"}]
162
+ }
163
+ ],
164
+ "_embedded": {
165
+ "tags": [
166
+ {"id": 123, "name": "Приоритетный клиент"}
167
+ ]
168
+ }
169
+ }
170
+ ]
171
+ ```
172
+
173
+ ## Интеграция с Apache Airflow
174
+
175
+ Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
176
+
177
+ ```python
178
+ from airflow.decorators import dag, task
179
+ from etl.config import DatabaseConfig, AmoCRMAccount
180
+ from etl.run_etl import sync_leads_with_contacts
181
+
182
+ @dag(schedule_interval=None)
183
+ def amocrm_sync():
184
+ @task
185
+ def sync_data():
186
+ db_config = DatabaseConfig.from_env()
187
+ account = AmoCRMAccount.from_env()
188
+ # ... ETL процесс
189
+
190
+ amocrm_sync()
191
+ ```
192
+
193
+ ## Тесты
194
+
195
+ Запустить тесты можно командой:
196
+
197
+ ```bash
198
+ pytest -q
199
+ ```
200
+
201
+ Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
202
+
203
+ ## Лицензия
204
+
205
+ MIT
@@ -0,0 +1,173 @@
1
+ # amochka
2
+
3
+ Официальная документация API amocrm - https://www.amocrm.ru/developers/content/crm_platform/api-reference
4
+
5
+ **amochka** — библиотека для работы с API amoCRM на Python. Она поддерживает:
6
+ - Получение данных сделок с вложенными сущностями (контакты, компании, теги, и т.д.)
7
+ - Редактирование сделок, включая обновление стандартных и кастомных полей
8
+ - Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
9
+ - Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
10
+ - **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
11
+
12
+ ## Возможности
13
+
14
+ ### API клиент
15
+
16
+ - `get_deal_by_id(deal_id)` — получение детальной информации по сделке
17
+ - `get_pipelines()` — список воронок и статусов
18
+ - `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
19
+
20
+ ### ETL модуль
21
+
22
+ - **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
23
+ - **Transformers**: преобразование в табличный формат для БД
24
+ - **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
25
+ - **Migrations**: автоматическое создание таблиц и схем
26
+ - **Incremental sync**: инкрементальная синхронизация по updated_at
27
+ - Интеграция с **Apache Airflow** для автоматизации ETL процессов
28
+
29
+ ## Требования к окружению
30
+
31
+ Python 3.6 или новее.
32
+
33
+ ## Установка
34
+
35
+ ```bash
36
+ pip install amochka
37
+ ```
38
+
39
+ Для использования ETL модуля установите дополнительные зависимости:
40
+
41
+ ```bash
42
+ pip install amochka psycopg2-binary python-dotenv
43
+ ```
44
+
45
+ ## Кэширование кастомных полей
46
+
47
+ Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
48
+
49
+ ## Примеры использования
50
+
51
+ ### Быстрый старт: выгрузка обновленных сделок
52
+
53
+ ```python
54
+ from datetime import datetime, timedelta
55
+ from amochka import AmoCRMClient, CacheConfig
56
+
57
+ client = AmoCRMClient(
58
+ base_url="https://example.amocrm.ru",
59
+ token_file="token.json",
60
+ cache_config=CacheConfig.disabled(),
61
+ disable_logging=True
62
+ )
63
+
64
+ three_hours_ago = datetime.utcnow() - timedelta(hours=3)
65
+ leads = client.fetch_updated_leads_raw(
66
+ pipeline_id=123456,
67
+ updated_from=three_hours_ago,
68
+ save_to_file="leads.json",
69
+ include_contacts=True
70
+ )
71
+ ```
72
+
73
+ ### ETL: синхронизация в PostgreSQL
74
+
75
+ ```python
76
+ from etl.config import DatabaseConfig, AmoCRMAccount
77
+ from etl.extractors import AmoCRMExtractor
78
+ from etl.loaders import PostgresLoader
79
+ from etl.run_etl import sync_leads_with_contacts
80
+ from datetime import datetime, timezone
81
+
82
+ # Настройка БД
83
+ db_config = DatabaseConfig(
84
+ host="localhost",
85
+ port=5432,
86
+ dbname="amocrm",
87
+ user="postgres",
88
+ password="password",
89
+ schema="public"
90
+ )
91
+
92
+ # Настройка amoCRM аккаунта
93
+ account = AmoCRMAccount(
94
+ id=1,
95
+ name="main",
96
+ base_url="https://example.amocrm.ru",
97
+ token_path="token.json",
98
+ mybi_account_id=1,
99
+ pipeline_ids=[123456]
100
+ )
101
+
102
+ # ETL процесс
103
+ loader = PostgresLoader(db_config)
104
+ extractor = AmoCRMExtractor(account)
105
+
106
+ result = sync_leads_with_contacts(
107
+ extractor=extractor,
108
+ loader=loader,
109
+ mybi_account_id=1,
110
+ updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
111
+ updated_to=datetime.now(timezone.utc),
112
+ pipeline_ids=[123456]
113
+ )
114
+
115
+ print(f"Загружено сделок: {result['leads_count']}")
116
+ print(f"Загружено контактов: {result['contacts_count']}")
117
+ ```
118
+
119
+ ### Пример структуры данных
120
+
121
+ ```json
122
+ [
123
+ {
124
+ "id": 12345678,
125
+ "name": "Сделка: Заявка от клиента",
126
+ "custom_fields_values": [
127
+ {
128
+ "field_name": "utm_source",
129
+ "values": [{"value": "google"}]
130
+ }
131
+ ],
132
+ "_embedded": {
133
+ "tags": [
134
+ {"id": 123, "name": "Приоритетный клиент"}
135
+ ]
136
+ }
137
+ }
138
+ ]
139
+ ```
140
+
141
+ ## Интеграция с Apache Airflow
142
+
143
+ Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
144
+
145
+ ```python
146
+ from airflow.decorators import dag, task
147
+ from etl.config import DatabaseConfig, AmoCRMAccount
148
+ from etl.run_etl import sync_leads_with_contacts
149
+
150
+ @dag(schedule_interval=None)
151
+ def amocrm_sync():
152
+ @task
153
+ def sync_data():
154
+ db_config = DatabaseConfig.from_env()
155
+ account = AmoCRMAccount.from_env()
156
+ # ... ETL процесс
157
+
158
+ amocrm_sync()
159
+ ```
160
+
161
+ ## Тесты
162
+
163
+ Запустить тесты можно командой:
164
+
165
+ ```bash
166
+ pytest -q
167
+ ```
168
+
169
+ Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
170
+
171
+ ## Лицензия
172
+
173
+ MIT
@@ -0,0 +1,28 @@
1
+ """
2
+ amochka: Библиотека для работы с API amoCRM.
3
+ """
4
+
5
+ __version__ = "0.2.0"
6
+
7
+ from .client import AmoCRMClient, CacheConfig
8
+ from .etl import (
9
+ write_ndjson,
10
+ export_leads_to_ndjson,
11
+ export_contacts_to_ndjson,
12
+ export_notes_to_ndjson,
13
+ export_events_to_ndjson,
14
+ export_users_to_ndjson,
15
+ export_pipelines_to_ndjson,
16
+ )
17
+
18
+ __all__ = [
19
+ "AmoCRMClient",
20
+ "CacheConfig",
21
+ "write_ndjson",
22
+ "export_leads_to_ndjson",
23
+ "export_contacts_to_ndjson",
24
+ "export_notes_to_ndjson",
25
+ "export_events_to_ndjson",
26
+ "export_users_to_ndjson",
27
+ "export_pipelines_to_ndjson",
28
+ ]