From af02899b6f06c59371b720afa836b7183a144290 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 24 Mar 2026 16:48:11 +0000 Subject: [PATCH] get addresses and jobs from watford file --- ...tford_Warm_Homes_Wave_3_RA Downloads .xlsx | Bin 0 -> 16741 bytes backend/pashub_fetcher/handler/Dockerfile | 2 +- backend/pashub_fetcher/handler/handler.py | 74 ++++++++++++++---- 3 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 backend/pashub_fetcher/Watford_Warm_Homes_Wave_3_RA Downloads .xlsx diff --git a/backend/pashub_fetcher/Watford_Warm_Homes_Wave_3_RA Downloads .xlsx b/backend/pashub_fetcher/Watford_Warm_Homes_Wave_3_RA Downloads .xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6e41291b3750db019ca5bdef1827d1e865761bb6 GIT binary patch literal 16741 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 List[Job]: + wb = load_workbook(filepath, data_only=True) + ws = wb["watford warm homes (wave 3) mai"] + + HEADER_ROW = 3 + + headers: Dict[str, int] = {} + for col in range(1, ws.max_column + 1): + value = str(ws.cell(row=HEADER_ROW, column=col).value) + if value: + headers[value.strip()] = col + + name_col = headers["Name"] + link_col = headers["Pashub Link"] + + jobs: List[Job] = [] + + for row in range(HEADER_ROW + 1, ws.max_row + 1): + name = ws.cell(row=row, column=name_col).value + link = ws.cell(row=row, column=link_col).value + + if not name or not link: + continue + + link = str(link) + + match = re.search(r"/jobs/([0-9a-fA-F\-]+)/", link) + if not match: + continue + + job_id = match.group(1) + + jobs.append({"id": job_id, "address": str(name)}) + if not match: + continue + + job_id = match.group(1) + + jobs.append({"id": job_id, "address": str(name)}) + + return jobs + + def handler(event: Mapping[str, Any], context: Any) -> None: - pas_hub_email = "random@test.com" - pas_hub_password = "my_fake_password" + BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + filepath = os.path.join(BASE_DIR, "Watford_Warm_Homes_Wave_3_RA Downloads .xlsx") + + jobs: List[Job] = extract_jobs(filepath) + + logger.info("Successfully loaded jobs from spreadsheet") + + # pas_hub_email = "random@test.com" + # pas_hub_password = "my_fake_password" + + pas_hub_email = "sebastian@osmosis-acd.com" + pas_hub_password = "Osmosis2025!" try: token: str = get_token_from_local_storage(pas_hub_email, pas_hub_password) @@ -28,17 +85,6 @@ def handler(event: Mapping[str, Any], context: Any) -> None: sharepoint_location=DomnaSites.SOCIAL_HOUSING_WAVE_3 ) - jobs: List[Job] = [ - { - "id": "5abf6e27-e4c4-4ba8-b69d-9e34939e0002", - "address": "FLAT 11 Abbey View, Garsmouth Way, Watford, WD25 9DY", - }, - { - "id": "047f4455-85e2-4293-97b1-6b460137d33e", - "address": "FLAT 14 Abbey View, Garsmouth Way, Watford, WD25 9DY", - }, - ] # TODO: get these from request body or spreadsheet - sharepoint_client.makedir("Watford Test", "/JTK Test Folder") saved_file_paths: List[str] = []