From 995a5e353d83d00ac0915b77b9c6e24ed5267581 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 27 Nov 2025 15:54:11 +0000 Subject: [PATCH 1/2] test it works for one --- backend/src/dashboard/scripts/quick_one.py | 18 +++++------------- .../dashboard/services/hubspot_client_async.py | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/backend/src/dashboard/scripts/quick_one.py b/backend/src/dashboard/scripts/quick_one.py index 4a89a7c..34c8ae8 100644 --- a/backend/src/dashboard/scripts/quick_one.py +++ b/backend/src/dashboard/scripts/quick_one.py @@ -1,14 +1,6 @@ -#from dashboard.services.file_manager import FileManager -#from dashboard.services.json_reader import jsonReader -#s3 = FileManager() - -#key, path, data = s3.download_and_read_latest() -#hubspot_data = jsonReader(data) - -#df = hubspot_data.generate_df_via_product_type("Empty Cavity - ECO4") - - -#one = df.iloc(0) - -from dashboard.service +from dashboard.services.file_manager import FileManager +from dashboard.services.json_reader import jsonReader +s3 = FileManager() +key, path, data = s3.download_and_read_latest() +hubspot_data = jsonReader(data) diff --git a/backend/src/dashboard/services/hubspot_client_async.py b/backend/src/dashboard/services/hubspot_client_async.py index f5a52e8..a48748d 100644 --- a/backend/src/dashboard/services/hubspot_client_async.py +++ b/backend/src/dashboard/services/hubspot_client_async.py @@ -2,6 +2,8 @@ import logging import asyncio from hubspot.crm.associations import ApiException import hubspot +from datetime import datetime + class HubSpotClientAsync: API_CONCURRENCY = asyncio.Semaphore(5) # globally limit concurrency @@ -298,7 +300,7 @@ class HubSpotClientAsync: return results async def get_expected_commencement_history(self, deal_id: str): - """Fetch historical values for expected_commencement_date.""" + """Fetch JSON-serializable historical values for expected_commencement_date.""" deal = await self._run( self.client.crm.deals.basic_api.get_by_id, deal_id, @@ -306,6 +308,16 @@ class HubSpotClientAsync: properties_with_history=["expected_commencement_date"] ) - return deal.properties_with_history.get("expected_commencement_date", []) - + history = deal.properties_with_history.get("expected_commencement_date", []) + json_ready_history = [] + for entry in history: + safe_entry = {} + for key, val in entry.items(): + if isinstance(val, datetime): + safe_entry[key] = val.isoformat() + else: + safe_entry[key] = val + json_ready_history.append(safe_entry) + + return json_ready_history From 07c6d5e7aa08dc14158de11e9d27657aba4fe69c Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 27 Nov 2025 16:14:27 +0000 Subject: [PATCH 2/2] completed check for one --- backend/src/dashboard/scripts/quick_one.py | 57 +++++++++++++++++-- .../services/hubspot_client_async.py | 6 +- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/backend/src/dashboard/scripts/quick_one.py b/backend/src/dashboard/scripts/quick_one.py index 34c8ae8..4a79f31 100644 --- a/backend/src/dashboard/scripts/quick_one.py +++ b/backend/src/dashboard/scripts/quick_one.py @@ -1,6 +1,53 @@ -from dashboard.services.file_manager import FileManager -from dashboard.services.json_reader import jsonReader -s3 = FileManager() +import asyncio +import json +from datetime import datetime -key, path, data = s3.download_and_read_latest() -hubspot_data = jsonReader(data) +from dashboard.services.hubspot_client import Pipeline +from dashboard.services.hubspot_client_async import HubSpotClientAsync +from dashboard.services.file_manager import FileManager + +OUTPUT_FILE = "hubspot_deals.json" + + +async def main(): + hubspot = HubSpotClientAsync() + + # Fetch all deal IDs (but we will take only one) + deals = await hubspot.get_deal_ids_by_pipeline( + Pipeline.OPERATIONS_SOCIAL_HOUSING.value + ) + + if not deals: + print("No deals found.") + return + + # Only take ONE deal + # Just do one + deal_id = deals[0] + print(f"Fetching only deal: {deal_id}") + + try: + data = await hubspot.from_deal_get_info(deal_id) + except Exception as e: + print(f"Error fetching deal {deal_id}: {e}") + return + + # Save result + with open(OUTPUT_FILE, "w") as f: + json.dump([data], f, indent=2) + + print("Done! Saved 1 deal.") + + +if __name__ == "__main__": + asyncio.run(main()) + + fm = FileManager() + timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S") + s3_filename = f"hubspot_deals_{timestamp}.json" + + fm.upload_to_s3( + OUTPUT_FILE, + bucket="retrofit-data-dev", + object_name=f"hubspot_insight/{s3_filename}" + ) diff --git a/backend/src/dashboard/services/hubspot_client_async.py b/backend/src/dashboard/services/hubspot_client_async.py index a48748d..ccafdea 100644 --- a/backend/src/dashboard/services/hubspot_client_async.py +++ b/backend/src/dashboard/services/hubspot_client_async.py @@ -137,9 +137,7 @@ class HubSpotClientAsync: company_id = await self.from_deal_get_associated_company_id(deal_id) company_info = await self.get_company_information(company_id) if company_id else {} appointments = await self.from_deal_get_appointments(deal_id) - - - + return { "deal_properties": deal_info, "line_items": line_items, @@ -313,7 +311,7 @@ class HubSpotClientAsync: json_ready_history = [] for entry in history: safe_entry = {} - for key, val in entry.items(): + for key, val in entry.to_dict().items(): if isinstance(val, datetime): safe_entry[key] = val.isoformat() else: