maisaedu-utilities-prefect 1.2.69__tar.gz → 1.2.71__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.
Files changed (73) hide show
  1. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/PKG-INFO +1 -1
  2. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/deals.py +115 -0
  3. maisaedu_utilities_prefect-1.2.71/maisaedu_utilities_prefect/hubspot/marketing_emails.py +48 -0
  4. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/PKG-INFO +1 -1
  5. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/setup.py +1 -1
  6. maisaedu_utilities_prefect-1.2.69/maisaedu_utilities_prefect/hubspot/marketing_emails.py +0 -65
  7. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/LICENSE +0 -0
  8. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/__init__.py +0 -0
  9. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/azure_blob_service/__init__.py +0 -0
  10. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/azure_blob_service/azureBlobService.py +0 -0
  11. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/__init__.py +0 -0
  12. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/env.py +0 -0
  13. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/notification.py +0 -0
  14. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/redshift.py +0 -0
  15. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/constants/selenium.py +0 -0
  16. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/__init__.py +0 -0
  17. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/athena.py +0 -0
  18. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/database/postgres.py +0 -0
  19. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/dw.py +0 -0
  20. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/googlesheet/__init__.py +0 -0
  21. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/googlesheet/gspread.py +0 -0
  22. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/__init__.py +0 -0
  23. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/associations.py +0 -0
  24. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/company.py +0 -0
  25. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/contacts.py +0 -0
  26. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/contacts_lists.py +0 -0
  27. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/email_events.py +0 -0
  28. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/form_submission_events.py +0 -0
  29. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/forms.py +0 -0
  30. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/forms_submissions.py +0 -0
  31. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/landing_pages.py +0 -0
  32. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/lineItems.py +0 -0
  33. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/objects.py +0 -0
  34. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/owners.py +0 -0
  35. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/pipelines.py +0 -0
  36. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/tickets.py +0 -0
  37. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/hubspot/users.py +0 -0
  38. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/__init__.py +0 -0
  39. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/service/__init__.py +0 -0
  40. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/llm/service/llm_service.py +0 -0
  41. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/notification.py +0 -0
  42. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/__init__.py +0 -0
  43. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/document_handling.py +0 -0
  44. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/one_drive/extractor.py +0 -0
  45. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/__init__.py +0 -0
  46. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/__init__.py +0 -0
  47. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/adminGroupModel.py +0 -0
  48. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasetDatasourceModel.py +0 -0
  49. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasetRefreshScheduleModel.py +0 -0
  50. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/datasourceModel.py +0 -0
  51. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/models/gatewayModel.py +0 -0
  52. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/__init__.py +0 -0
  53. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/activityLogsService.py +0 -0
  54. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/adminGroupsService.py +0 -0
  55. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/client.py +0 -0
  56. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/datasetService.py +0 -0
  57. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/datasourceService.py +0 -0
  58. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/gatewayService.py +0 -0
  59. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/powerbi_api/services/userService.py +0 -0
  60. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/prefect_api/__init__.py +0 -0
  61. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/prefect_api/flows.py +0 -0
  62. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/scripts/flow-mem-limit +0 -0
  63. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/scripts/refresh-secrets +0 -0
  64. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/secrets.py +0 -0
  65. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/selenium/__init__.py +0 -0
  66. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/selenium/service/__init__.py +0 -0
  67. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/tunnel.py +0 -0
  68. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect/utils.py +0 -0
  69. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/SOURCES.txt +0 -0
  70. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/dependency_links.txt +0 -0
  71. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/requires.txt +0 -0
  72. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/maisaedu_utilities_prefect.egg-info/top_level.txt +0 -0
  73. {maisaedu_utilities_prefect-1.2.69 → maisaedu_utilities_prefect-1.2.71}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: maisaedu_utilities_prefect
3
- Version: 1.2.69
3
+ Version: 1.2.71
4
4
  Summary: Utilities for interaction with Prefect, for +A Education
5
5
  Home-page: UNKNOWN
6
6
  Author: A+ Educação
@@ -141,3 +141,118 @@ def get_all_deals_v1_recent_modified(
141
141
  prefect.get_run_logger().error(resp)
142
142
  raise Exception(e)
143
143
  return data
144
+
145
+ def get_deal_v3_with_history(
146
+ app_private_token,
147
+ deal_id,
148
+ properties_with_history,
149
+ tries=5,
150
+ ):
151
+ logger = prefect.get_run_logger()
152
+ base_url = f"https://api.hubapi.com/crm/v3/objects/deals/{deal_id}"
153
+
154
+ params = {}
155
+
156
+ if properties_with_history:
157
+ params["propertiesWithHistory"] = ",".join(properties_with_history)
158
+
159
+ headers = {
160
+ "content-type": "application/json",
161
+ "cache-control": "no-cache",
162
+ "Authorization": f"Bearer {app_private_token}",
163
+ }
164
+
165
+ for i in range(tries):
166
+ try:
167
+ r = requests.get(url=base_url, headers=headers, params=params)
168
+ r.raise_for_status()
169
+ response_dict = r.json()
170
+ return response_dict
171
+ except Exception as e:
172
+ logger.error(f"Error to fetch deal v3 with history (attempt {i+1}/{tries}): {e}")
173
+ if i == tries - 1:
174
+ raise
175
+
176
+
177
+ def chunk_list(values, chunk_size):
178
+ values = list(values)
179
+ for i in range(0, len(values), chunk_size):
180
+ yield values[i:i + chunk_size]
181
+
182
+ def get_deals_v3_batch_with_history(
183
+ app_private_token,
184
+ deal_ids,
185
+ properties_with_history=None,
186
+ properties=None,
187
+ batch_size=50,
188
+ tries=5,
189
+ ):
190
+ """
191
+ Lê deals em lote na API v3 usando:
192
+ POST /crm/v3/objects/deals/batch/read
193
+
194
+ - deal_ids: iterável de IDs de deals
195
+ - properties_with_history: lista de propriedades com histórico
196
+ - properties: lista de propriedades atuais
197
+ - batch_size: máximo 50 por causa da API da HubSpot
198
+
199
+ Retorna: dict {deal_id: payload_json_completo}
200
+ """
201
+ logger = prefect.get_run_logger()
202
+ url = "https://api.hubapi.com/crm/v3/objects/deals/batch/read"
203
+
204
+ # garantia extra: nunca passa de 50
205
+ if batch_size > 50:
206
+ batch_size = 50
207
+
208
+ headers = {
209
+ "content-type": "application/json",
210
+ "cache-control": "no-cache",
211
+ "Authorization": f"Bearer {app_private_token}",
212
+ }
213
+
214
+ results_by_id = {}
215
+
216
+ # garante lista de strings
217
+ deal_ids = [str(d) for d in deal_ids]
218
+
219
+ for ids_chunk in chunk_list(deal_ids, batch_size):
220
+ if not ids_chunk:
221
+ continue
222
+
223
+ # LOG para você ver o tamanho do chunk
224
+ logger.info(f"Chamando batch/read para {len(ids_chunk)} deals "
225
+ f"({ids_chunk[0]} .. {ids_chunk[-1]})")
226
+
227
+ body = {
228
+ "inputs": [{"id": did} for did in ids_chunk]
229
+ }
230
+
231
+ if properties:
232
+ body["properties"] = list(properties)
233
+
234
+ if properties_with_history:
235
+ body["propertiesWithHistory"] = list(properties_with_history)
236
+
237
+ for attempt in range(tries):
238
+ try:
239
+ r = requests.post(url, headers=headers, json=body, timeout=30)
240
+ r.raise_for_status()
241
+ resp = r.json()
242
+
243
+ for deal in resp.get("results", []):
244
+ deal_id = deal.get("id")
245
+ if deal_id is not None:
246
+ results_by_id[deal_id] = deal
247
+
248
+ break # deu certo, sai do retry
249
+ except Exception as e:
250
+ logger.error(
251
+ f"Erro ao buscar deals v3 em batch "
252
+ f"(chunk {ids_chunk[0]}..{ids_chunk[-1]}) "
253
+ f"(tentativa {attempt+1}/{tries}): {e}"
254
+ )
255
+ if attempt == tries - 1:
256
+ raise
257
+
258
+ return results_by_id
@@ -0,0 +1,48 @@
1
+
2
+ from retry import retry
3
+ import requests
4
+ import json
5
+ import urllib
6
+
7
+ @retry(tries=5, delay=2, backoff=2)
8
+ def get_marketing_emails(api_key, app_private_token, after=None):
9
+ url = "https://api.hubapi.com/marketing/v3/emails?"
10
+ if api_key is not None:
11
+ parameter_dict = {"hapikey": api_key, "limit": 100}
12
+ headers = {"content-type": "application/json", "cache-control": "no-cache"}
13
+ else:
14
+ parameter_dict = {"limit": 100}
15
+ headers = {
16
+ "content-type": "application/json",
17
+ "cache-control": "no-cache",
18
+ "Authorization": f"Bearer {app_private_token}",
19
+ }
20
+
21
+ if after is not None:
22
+ parameter_dict["after"] = after
23
+
24
+ parameter_dict["includeStats"] = "true"
25
+
26
+ parameters = urllib.parse.urlencode(parameter_dict)
27
+
28
+ url = url + parameters
29
+
30
+ r = requests.get(url=url, headers=headers)
31
+ r.raise_for_status()
32
+ response_dict = json.loads(r.text)
33
+ return response_dict
34
+
35
+
36
+ def get_all_marketing_emails(api_key, app_private_token):
37
+ has_more = True
38
+ after = None
39
+ while has_more:
40
+ resp = get_marketing_emails(api_key, app_private_token, after)
41
+
42
+ if "paging" in resp and "next" in resp["paging"]:
43
+ after = resp["paging"]["next"]["after"]
44
+ has_more = True
45
+ else:
46
+ has_more = False
47
+
48
+ yield resp["results"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: maisaedu-utilities-prefect
3
- Version: 1.2.69
3
+ Version: 1.2.71
4
4
  Summary: Utilities for interaction with Prefect, for +A Education
5
5
  Home-page: UNKNOWN
6
6
  Author: A+ Educação
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="maisaedu_utilities_prefect",
5
- version="1.2.69",
5
+ version="1.2.71",
6
6
  description="Utilities for interaction with Prefect, for +A Education",
7
7
  license="MIT License",
8
8
  author="A+ Educação",
@@ -1,65 +0,0 @@
1
- import requests
2
- import json
3
- import urllib
4
- import time
5
- import prefect
6
-
7
-
8
- def get_marketing_emails(api_key, app_private_token, offset=None):
9
- url = "https://api.hubapi.com/marketing-emails/v1/emails/with-statistics?"
10
- if api_key is not None:
11
- parameter_dict = {"hapikey": api_key, "limit": 100}
12
- headers = {"content-type": "application/json", "cache-control": "no-cache"}
13
- else:
14
- parameter_dict = {"limit": 100}
15
- headers = {
16
- "content-type": "application/json",
17
- "cache-control": "no-cache",
18
- "Authorization": f"Bearer {app_private_token}",
19
- }
20
-
21
- if offset is not None:
22
- parameter_dict["offset"] = offset
23
-
24
- parameter_dict["orderBy"] = "updated"
25
-
26
- parameters = urllib.parse.urlencode(parameter_dict)
27
-
28
- url = url + parameters
29
-
30
- try:
31
- r = requests.get(url=url, headers=headers)
32
- response_dict = json.loads(r.text)
33
- return response_dict
34
- except Exception as e:
35
- print(e)
36
-
37
-
38
- def get_all_marketing_emails(api_key, app_private_token):
39
- offset = 0
40
- total = 1
41
- attempts = 0
42
- while total > offset:
43
- resp = get_marketing_emails(api_key, app_private_token, offset)
44
-
45
- try:
46
- if "objects" in resp and "offset" in resp:
47
- attempts = 0
48
- offset = resp["offset"] + len(resp["objects"])
49
- total = resp["total"]
50
-
51
- yield resp["objects"]
52
- else:
53
- attempts += 1
54
- if attempts > 2:
55
- offset = total
56
- except Exception as e:
57
- if "errorType" in e and e["errorType"] == "RATE_LIMIT":
58
- print(e)
59
- print(resp)
60
- time.sleep(10)
61
- else:
62
- prefect.get_run_logger().error("Failed")
63
- prefect.get_run_logger().error(e)
64
- prefect.get_run_logger().error(resp)
65
- raise e