From abd0ed882f155a7f9c56e98f3ca318cf705185d3 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 14:53:55 +0000 Subject: [PATCH 01/16] get uprn from pashub job id --- backend/pashub_fetcher/handler/handler.py | 10 ++++++++-- backend/pashub_fetcher/pashub_client.py | 15 +++++++++++++++ .../pashub_to_ara_trigger_request.py | 9 +++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 backend/pashub_fetcher/pashub_to_ara_trigger_request.py diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index 38b79ab4..8a02ce72 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -1,6 +1,6 @@ import os import re -from typing import Any, Dict, List, Mapping +from typing import Any, Dict, List, Mapping, Optional from openpyxl import load_workbook from backend.pashub_fetcher.job import Job @@ -80,10 +80,16 @@ def handler(event: Mapping[str, Any], context: Any) -> None: for job in jobs: try: + job_id = job["id"] + uprn: Optional[str] = pashub_client.get_uprn_by_job_id(job_id) + logger.info(f"Got UPRN {uprn} for job {job_id}") + job_files: List[str] = pashub_client.get_core_evidence_files_by_job_id( - job["id"] + job_id ) + # Upload files to s3 + # Upload files to sharepoint job_path = f"{BASE_PATH}/{job['address']}" diff --git a/backend/pashub_fetcher/pashub_client.py b/backend/pashub_fetcher/pashub_client.py index efc21803..20b8590d 100644 --- a/backend/pashub_fetcher/pashub_client.py +++ b/backend/pashub_fetcher/pashub_client.py @@ -71,6 +71,21 @@ class PashubClient: return saved_files + def get_uprn_by_job_id(self, job_id: str) -> Optional[str]: + logger.info(f"Getting UPRN for job ID {job_id}") + url = f"{self.base}/jobs/{job_id}" + + r = self.session.get(url) + if r.status_code == 401: + raise UnauthorizedError("Token expired or invalid") + + r.raise_for_status() + + try: + return r.json()["uprn"] + except Exception: + return None + def _get_core_file_type(self, file: EvidenceFileData) -> Optional[CoreFiles]: for core_file in CoreFiles: if file.file_name.startswith(core_file.value): diff --git a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py new file mode 100644 index 00000000..d97281fd --- /dev/null +++ b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py @@ -0,0 +1,9 @@ +from typing import Optional + +from pydantic import BaseModel + + +class PashubToAraTriggerRequest(BaseModel): + pashub_job_id: str + + sharepoint_url: Optional[str] = None From 4ac7ed6f096b3bb49501e85cc006f8f85f9295ec Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 15:38:19 +0000 Subject: [PATCH 02/16] define sqlalchemy objects for new database tables / types --- backend/app/db/models/uploaded_files.py | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 backend/app/db/models/uploaded_files.py diff --git a/backend/app/db/models/uploaded_files.py b/backend/app/db/models/uploaded_files.py new file mode 100644 index 00000000..d4bf48d8 --- /dev/null +++ b/backend/app/db/models/uploaded_files.py @@ -0,0 +1,44 @@ +import enum +from sqlalchemy import TIMESTAMP, BigInteger, Column, Text, Enum as SqlEnum + +from backend.app.db.base import Base + + +class FileTypeEnum(enum.Enum): + PHOTO_PACK = "photo_pack" + SITE_NOTE = "site_note" + RD_SAP_SITE_NOTE = "rd_sap_site_note" + PAS_2023_VENTILATION = "pas_2023_ventilation" + PAS_2023_CONDITION = "pas_2023_condition" + PAS_SIGNIFICANCE = "pas_significance" + PAR_PHOTO_PACK = "par_photo_pack" + PAS_2023_PROPERTY = "pas_2023_property" + PAS_2023_OCCUPANCY = "pas_2023_occupancy" + + +class FileSourceEnum(enum.Enum): + PAS_HUB = "pas hub" + SHAREPOINT = "sharepoint" + HUBSPOT = "hubspot" + + +class UploadedFiles(Base): + __tablename__ = "uploaded_files" + + id = Column(BigInteger, primary_key=True) + + s3_file_bucket = Column(Text, nullable=False) + s3_file_key = Column(Text, nullable=False) + s3_upload_timestamp = Column(TIMESTAMP(timezone=True), nullable=False) + + landlord_property_id = Column(Text, nullable=True) + uprn = Column(BigInteger, nullable=True) + hubspot_listing_id = Column(BigInteger, nullable=True) + + file_type = Column( + SqlEnum(FileTypeEnum, name="file_type", create_type=False), nullable=True + ) + + source = Column( + SqlEnum(FileSourceEnum, name="file_source", create_type=False), nullable=True + ) From 1a01ad94acb22628486c1c561bbdc3f6d9e50dfa Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 16:07:06 +0000 Subject: [PATCH 03/16] refactor handler --- backend/pashub_fetcher/handler/handler.py | 152 ++++++++++++++-------- 1 file changed, 97 insertions(+), 55 deletions(-) diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index 8a02ce72..f8539201 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -39,94 +39,136 @@ def extract_jobs(filepath: str) -> List[Job]: if not name or not link: continue - link = str(link) - - match = re.search(r"/jobs/([0-9a-fA-F\-]+)/", link) + match = re.search(r"/jobs/([0-9a-fA-F\-]+)/", str(link)) if not match: continue - job_id = match.group(1) - - jobs.append({"id": job_id, "address": str(name)}) + jobs.append( + { + "id": match.group(1), + "address": str(name), + } + ) return jobs +def get_pashub_client(email: str, password: str) -> PashubClient: + token = get_token_from_local_storage(email, password) + logger.info("Token extracted successfully") + return PashubClient(token=token) + + +def upload_job_to_sharepoint( + sharepoint_client: DomnaSharepointClient, + base_path: str, + job: Job, + job_files: List[str], +) -> None: + job_path = f"{base_path}/{job['address']}" + + # Create main job folder + sharepoint_client.makedir(job["address"], base_path) + + # Create subfolders + for folder in SharepointSubfolders: + sharepoint_client.makedir(folder.value, job_path) + + # Upload into assessment folder + assessment_path = f"{job_path}/{SharepointSubfolders.ASSESSMENT.value}" + + for file_path in job_files: + filename = file_path.split("/")[-1] + + sharepoint_client.upload_file( + file_path, + assessment_path, + filename, + ) + + +def upload_job_to_s3( + job: Job, + job_files: List[str], +) -> None: + # Example: + # for file_path in job_files: + # s3_client.upload_file(...) + pass + + +def process_job( + job: Job, + pashub_client: PashubClient, + sharepoint_client: DomnaSharepointClient, + base_path: str, +) -> List[str]: + job_id = job["id"] + + uprn: Optional[str] = pashub_client.get_uprn_by_job_id(job_id) + logger.info(f"Got UPRN {uprn} for job {job_id}") + + job_files: List[str] = pashub_client.get_core_evidence_files_by_job_id(job_id) + + upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) + upload_job_to_s3(job, job_files) + + return job_files + + def handler(event: Mapping[str, Any], context: Any) -> None: 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 = "random@test.com" + # pas_hub_password = "my_fake_password" - try: - token: str = get_token_from_local_storage(pas_hub_email, pas_hub_password) - logger.info(f"Token extracted successfully") - except: - logger.error("Error getting auth token from Pas Hub") - raise + pas_hub_email = "sebastian@osmosis-acd.com" + pas_hub_password = "Osmosis2025!" + + pashub_client = get_pashub_client(pas_hub_email, pas_hub_password) - pashub_client = PashubClient(token=token) sharepoint_client = DomnaSharepointClient( sharepoint_location=DomnaSites.SOCIAL_HOUSING_WAVE_3 ) + BASE_PATH = "/Osmosis-ACD Projects/Watford Warm Homes/Watford Property Folders (Shared with Client)" + saved_file_paths: List[str] = [] - BASE_PATH = "/Osmosis-ACD Projects/Watford Warm Homes/Watford Property Folders (Shared with Client)" # TODO: get from request body for job in jobs: try: - job_id = job["id"] - uprn: Optional[str] = pashub_client.get_uprn_by_job_id(job_id) - logger.info(f"Got UPRN {uprn} for job {job_id}") - - job_files: List[str] = pashub_client.get_core_evidence_files_by_job_id( - job_id + files = process_job( + job, + pashub_client, + sharepoint_client, + BASE_PATH, ) - - # Upload files to s3 - - # Upload files to sharepoint - job_path = f"{BASE_PATH}/{job['address']}" - - sharepoint_client.makedir(job["address"], BASE_PATH) - - for folder in SharepointSubfolders: - sharepoint_client.makedir(folder.value, job_path) - - assessment_path = f"{job_path}/{SharepointSubfolders.ASSESSMENT.value}" - - for file_path in job_files: - filename = file_path.split("/")[-1] - - sharepoint_client.upload_file( - file_path, - assessment_path, - filename, - ) - - saved_file_paths.extend(job_files) + saved_file_paths.extend(files) except UnauthorizedError: logger.warning("Token expired - refreshing") - token = get_token_from_local_storage(pas_hub_email, pas_hub_password) - - pashub_client = PashubClient(token=token) - - # retry once - saved_file_paths.extend( - pashub_client.get_core_evidence_files_by_job_id(job["id"]) + pashub_client = get_pashub_client( + pas_hub_email, + pas_hub_password, ) - print(f"saved {len(saved_file_paths)} files") + # retry once + files = process_job( + job, + pashub_client, + sharepoint_client, + BASE_PATH, + ) + saved_file_paths.extend(files) + + logger.info(f"Saved {len(saved_file_paths)} files") if __name__ == "__main__": event = {"Records": [{"body": "{}"}]} - handler(event, None) From 3ee80cde100edafeb0978bc81ea2f8eb25ee4aa2 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 16:10:26 +0000 Subject: [PATCH 04/16] dummy credentials --- backend/pashub_fetcher/handler/handler.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index f8539201..c728661f 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -123,11 +123,8 @@ def handler(event: Mapping[str, Any], context: Any) -> None: 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!" + pas_hub_email = "random@test.com" + pas_hub_password = "my_fake_password" pashub_client = get_pashub_client(pas_hub_email, pas_hub_password) From 4a4099901ffef9dc01202c053af984a75e71dd08 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 16:33:35 +0000 Subject: [PATCH 05/16] upload files to s3 --- backend/pashub_fetcher/handler/handler.py | 28 +++++++++++++++-------- utils/s3.py | 11 +++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index c728661f..45ca74e3 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -3,11 +3,13 @@ import re from typing import Any, Dict, List, Mapping, Optional from openpyxl import load_workbook +from backend.app.config import get_settings from backend.pashub_fetcher.job import Job from backend.pashub_fetcher.pashub_client import PashubClient, UnauthorizedError from backend.pashub_fetcher.sharepoint_subfolders import SharepointSubfolders from backend.pashub_fetcher.token_getter import get_token_from_local_storage from utils.logger import setup_logger +from utils.s3 import upload_file_to_s3 from utils.sharepoint.domna_sharepoint_client import DomnaSharepointClient from utils.sharepoint.domna_sites import DomnaSites @@ -87,13 +89,17 @@ def upload_job_to_sharepoint( ) -def upload_job_to_s3( - job: Job, - job_files: List[str], -) -> None: - # Example: - # for file_path in job_files: - # s3_client.upload_file(...) +def upload_job_to_s3(job_files: List[str], uprn: str) -> None: + bucket = get_settings().DATA_BUCKET + + base_path = f"uprn/{uprn}" + + for file_path in job_files: + filename = os.path.basename(file_path) + file_key = f"{base_path}/{filename}" + + upload_file_to_s3(file_path, bucket, file_key) + pass @@ -106,12 +112,16 @@ def process_job( job_id = job["id"] uprn: Optional[str] = pashub_client.get_uprn_by_job_id(job_id) - logger.info(f"Got UPRN {uprn} for job {job_id}") + if uprn: + logger.info(f"Got UPRN {uprn} for job {job_id}") + else: + logger.info(f"No UPRN found for job {job_id}") job_files: List[str] = pashub_client.get_core_evidence_files_by_job_id(job_id) upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) - upload_job_to_s3(job, job_files) + if uprn: + upload_job_to_s3(job_files, uprn) return job_files diff --git a/utils/s3.py b/utils/s3.py index 6aa3f44e..242e0db5 100644 --- a/utils/s3.py +++ b/utils/s3.py @@ -472,3 +472,14 @@ def list_xmls_in_s3_folder(bucket_name, folder_name): f"Failed to list XML files in folder {folder_name} in bucket {bucket_name}: {str(e)}" ) return [] + + +def upload_file_to_s3(file_path: str, bucket_name: str, file_key: str) -> None: + try: + s3 = boto3.resource("s3") + bucket = s3.Bucket(bucket_name) + bucket.upload_file(file_path, file_key) + logger.info(f"Uploaded {file_path} to s3://{bucket_name}/{file_key}") + except Exception as e: + logger.error(f"Failed to upload {file_path} to S3: {e}") + raise From a989700c9e7aeb869f607d296ddea73a457449f2 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 26 Mar 2026 17:16:08 +0000 Subject: [PATCH 06/16] corrections to get data into s3 --- backend/app/config.py | 9 +++++++++ backend/pashub_fetcher/handler/handler.py | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/app/config.py b/backend/app/config.py index 6604fec9..8a9260c0 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -65,6 +65,15 @@ class Settings(BaseSettings): ORDNANCE_SURVEY_API_KEY: str = "changeme" + # Sharepoint + SHAREPOINT_CLIENT_ID: str = "changeme" + SHAREPOINT_CLIENT_SECRET: str = "changeme" + SHAREPOINT_TENANT_ID: str = "changeme" + DOMNA_SHAREPOINT_ID: str = "changeme" + OSMOSIS_ACD_SHAREPOINT_ID: str = "changeme" + PRIVATE_PAY_SHAREPOINT_ID: str = "changeme" + SOCIAL_HOUSING_WAVE_3_SHAREPOINT_ID: str = "changeme" + # Optional AWS creds (only required in local) AWS_ACCESS_KEY_ID: Optional[str] = None AWS_SECRET_KEY_ID: Optional[str] = None diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index 45ca74e3..6fa2a909 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -3,7 +3,6 @@ import re from typing import Any, Dict, List, Mapping, Optional from openpyxl import load_workbook -from backend.app.config import get_settings from backend.pashub_fetcher.job import Job from backend.pashub_fetcher.pashub_client import PashubClient, UnauthorizedError from backend.pashub_fetcher.sharepoint_subfolders import SharepointSubfolders @@ -90,9 +89,9 @@ def upload_job_to_sharepoint( def upload_job_to_s3(job_files: List[str], uprn: str) -> None: - bucket = get_settings().DATA_BUCKET + bucket = "retrofit-energy-assessments-dev" # TODO: create new bucket - base_path = f"uprn/{uprn}" + base_path = f"documents/uprn/{uprn}" for file_path in job_files: filename = os.path.basename(file_path) @@ -119,10 +118,12 @@ def process_job( job_files: List[str] = pashub_client.get_core_evidence_files_by_job_id(job_id) - upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) if uprn: + logger.info("Uploading files to s3") upload_job_to_s3(job_files, uprn) + upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) + return job_files From 68ecbe11095ff8a97d453a1ef98164595c88d146 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Fri, 27 Mar 2026 09:49:18 +0000 Subject: [PATCH 07/16] update db after loading file to s3 --- .../{uploaded_files.py => uploaded_file.py} | 6 ++-- backend/pashub_fetcher/core_files.py | 23 +++++++++++++ backend/pashub_fetcher/handler/handler.py | 33 +++++++++++++++++-- 3 files changed, 56 insertions(+), 6 deletions(-) rename backend/app/db/models/{uploaded_files.py => uploaded_file.py} (91%) diff --git a/backend/app/db/models/uploaded_files.py b/backend/app/db/models/uploaded_file.py similarity index 91% rename from backend/app/db/models/uploaded_files.py rename to backend/app/db/models/uploaded_file.py index d4bf48d8..726ed0a3 100644 --- a/backend/app/db/models/uploaded_files.py +++ b/backend/app/db/models/uploaded_file.py @@ -22,10 +22,10 @@ class FileSourceEnum(enum.Enum): HUBSPOT = "hubspot" -class UploadedFiles(Base): +class UploadedFile(Base): __tablename__ = "uploaded_files" - id = Column(BigInteger, primary_key=True) + id = Column(BigInteger, primary_key=True, autoincrement=True) s3_file_bucket = Column(Text, nullable=False) s3_file_key = Column(Text, nullable=False) @@ -39,6 +39,6 @@ class UploadedFiles(Base): SqlEnum(FileTypeEnum, name="file_type", create_type=False), nullable=True ) - source = Column( + file_source = Column( SqlEnum(FileSourceEnum, name="file_source", create_type=False), nullable=True ) diff --git a/backend/pashub_fetcher/core_files.py b/backend/pashub_fetcher/core_files.py index 82637f70..4da10661 100644 --- a/backend/pashub_fetcher/core_files.py +++ b/backend/pashub_fetcher/core_files.py @@ -1,4 +1,7 @@ from enum import Enum +from typing import Optional + +from backend.app.db.models.uploaded_file import FileTypeEnum class CoreFiles(Enum): @@ -11,3 +14,23 @@ class CoreFiles(Enum): PAR_PHOTOPACK = "PAR Photo Pack" PAS2023_PROPERTY = "PAS 2023 Property Assessment Report" PAS2023_OCCUPANCY = "PAS 2023 Occupancy Assessment Report" + + +CORE_TO_FILETYPE_MAP = { + CoreFiles.PHOTOPACK: FileTypeEnum.PHOTO_PACK.value, + CoreFiles.SITENOTE: FileTypeEnum.SITE_NOTE.value, + CoreFiles.RDSAP_SITENOTE: FileTypeEnum.RD_SAP_SITE_NOTE.value, + CoreFiles.PAS2023_VENTILATION: FileTypeEnum.PAS_2023_VENTILATION.value, + CoreFiles.PAS2023_CONDITION: FileTypeEnum.PAS_2023_CONDITION.value, + CoreFiles.PAS_SIGNIFICANCE: FileTypeEnum.PAS_SIGNIFICANCE.value, + CoreFiles.PAR_PHOTOPACK: FileTypeEnum.PAR_PHOTO_PACK.value, + CoreFiles.PAS2023_PROPERTY: FileTypeEnum.PAS_2023_PROPERTY.value, + CoreFiles.PAS2023_OCCUPANCY: FileTypeEnum.PAS_2023_OCCUPANCY.value, +} + + +def infer_file_type(filename: str) -> Optional[str]: + for core_file, file_type in CORE_TO_FILETYPE_MAP.items(): + if filename.startswith(core_file.value): + return file_type + return None diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index 6fa2a909..34f44589 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -1,8 +1,15 @@ +from datetime import datetime, timezone import os import re from typing import Any, Dict, List, Mapping, Optional from openpyxl import load_workbook +from backend.app.db.connection import db_session +from backend.app.db.models.uploaded_file import ( + FileSourceEnum, + UploadedFile, +) +from backend.pashub_fetcher.core_files import infer_file_type from backend.pashub_fetcher.job import Job from backend.pashub_fetcher.pashub_client import PashubClient, UnauthorizedError from backend.pashub_fetcher.sharepoint_subfolders import SharepointSubfolders @@ -88,17 +95,35 @@ def upload_job_to_sharepoint( ) -def upload_job_to_s3(job_files: List[str], uprn: str) -> None: - bucket = "retrofit-energy-assessments-dev" # TODO: create new bucket +def upload_job_to_s3_and_update_db(job_files: List[str], uprn: str) -> None: + bucket = "retrofit-energy-assessments-dev" base_path = f"documents/uprn/{uprn}" + uploaded_files: List[UploadedFile] = [] + for file_path in job_files: filename = os.path.basename(file_path) file_key = f"{base_path}/{filename}" upload_file_to_s3(file_path, bucket, file_key) + # load row to db + uploaded_files.append( + UploadedFile( + s3_file_bucket=bucket, + s3_file_key=file_key, + s3_upload_timestamp=datetime.now(timezone.utc), + uprn=int(uprn), + file_source=FileSourceEnum.PAS_HUB.value, + file_type=infer_file_type(filename), + ) + ) + + with db_session() as session: + session.add_all(uploaded_files) + session.commit() + pass @@ -120,7 +145,9 @@ def process_job( if uprn: logger.info("Uploading files to s3") - upload_job_to_s3(job_files, uprn) + upload_job_to_s3_and_update_db(job_files, uprn) + + # add record of new file in db upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) From 43e9466e05c76363c05f7e7401061cf207f18210 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Fri, 27 Mar 2026 16:23:21 +0000 Subject: [PATCH 08/16] log object better --- .../pashub_fetcher/handler/test_handler.py | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/pashub_fetcher/handler/test_handler.py b/backend/pashub_fetcher/handler/test_handler.py index 996835a2..07f651f4 100644 --- a/backend/pashub_fetcher/handler/test_handler.py +++ b/backend/pashub_fetcher/handler/test_handler.py @@ -1,7 +1,23 @@ from typing import Any, Mapping import json +from utils.logger import setup_logger + +logger = setup_logger() + def handler(event: Mapping[str, Any], context: Any) -> None: - print("Received event:") - print(json.dumps(event, indent=2)) + logger.info("Received event:") + + for record in event.get("Records", []): + body_str = record.get("body", "") + + try: + body_obj = json.loads(body_str) + except json.JSONDecodeError: + logger.error("Failed to parse body as JSON") + logger.info(body_str) + continue + + logger.info("Parsed message body:") + logger.info(json.dumps(body_obj, indent=2)) From b9e9c9edb5a904927ddfbce870071da08ef4f7fc Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Fri, 27 Mar 2026 16:32:41 +0000 Subject: [PATCH 09/16] get pashub email and password from environment vars --- backend/app/config.py | 4 ++++ backend/pashub_fetcher/handler/handler.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/app/config.py b/backend/app/config.py index 8a9260c0..e137429f 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -74,6 +74,10 @@ class Settings(BaseSettings): PRIVATE_PAY_SHAREPOINT_ID: str = "changeme" SOCIAL_HOUSING_WAVE_3_SHAREPOINT_ID: str = "changeme" + # Pas Hub + PASHUB_EMAIL: str = "changeme" + PASHUB_PASSWORD: str = "changeme" + # Optional AWS creds (only required in local) AWS_ACCESS_KEY_ID: Optional[str] = None AWS_SECRET_KEY_ID: Optional[str] = None diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index 34f44589..be8131bf 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -4,6 +4,7 @@ import re from typing import Any, Dict, List, Mapping, Optional from openpyxl import load_workbook +from backend.app.config import get_settings from backend.app.db.connection import db_session from backend.app.db.models.uploaded_file import ( FileSourceEnum, @@ -155,14 +156,16 @@ def process_job( def handler(event: Mapping[str, Any], context: Any) -> None: + settings = get_settings() + 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 = settings.PASHUB_EMAIL + pas_hub_password = settings.PASHUB_PASSWORD pashub_client = get_pashub_client(pas_hub_email, pas_hub_password) From 540cafc62a5168b5f7f1d4d2edbfff139af5117d Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Fri, 27 Mar 2026 16:37:45 +0000 Subject: [PATCH 10/16] update trigger request object --- backend/pashub_fetcher/pashub_to_ara_trigger_request.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py index d97281fd..5ef41883 100644 --- a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py +++ b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py @@ -6,4 +6,7 @@ from pydantic import BaseModel class PashubToAraTriggerRequest(BaseModel): pashub_job_id: str - sharepoint_url: Optional[str] = None + address: Optional[str] = None + sharepoint_link: Optional[str] = None + uprn: Optional[str] = None + landlord_property_id: Optional[str] = None From d5bd88b61a7e24e19f408ed55325804e15e09b4b Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Mon, 30 Mar 2026 14:27:26 +0000 Subject: [PATCH 11/16] modify trigger request object --- backend/pashub_fetcher/pashub_to_ara_trigger_request.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py index 5ef41883..ae165158 100644 --- a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py +++ b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py @@ -4,9 +4,16 @@ from pydantic import BaseModel class PashubToAraTriggerRequest(BaseModel): - pashub_job_id: str + pashub_link: ( + str # e.g. https://pashub.net/jobs/12345-abcd-1234-abcd-12345abcde/details + ) address: Optional[str] = None sharepoint_link: Optional[str] = None uprn: Optional[str] = None landlord_property_id: Optional[str] = None + deal_stage: Optional[str] = None + + @property + def pashub_job_id(self) -> str: + return self.pashub_link.split("/")[-2] From 354c8fcb279db1ed0f03fc6839f6aef5574dfa79 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 30 Mar 2026 17:51:13 +0100 Subject: [PATCH 12/16] fixing property.property and passing task id --- backend/app/plan/router.py | 4 ++ backend/export/property_scenarios/main.py | 50 ++++++++++++++++++++++- recommendations/Costs.py | 2 +- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 27151437..db15b09a 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -174,6 +174,8 @@ async def trigger_plan_entrypoint(body: PlanTriggerRequest): service="plan_engine", inputs=data, task_only=True, + source=SourceEnum.PORTFOLIO, + source_id=str(body.portfolio_id), ) subtask_interface = SubTaskInterface() @@ -222,6 +224,8 @@ async def trigger_plan_entrypoint(body: PlanTriggerRequest): service="plan_engine", inputs=data, task_only=False, + source=SourceEnum.PORTFOLIO, + source_id=str(body.portfolio_id), ) data["task_id"] = str(task_id) data["subtask_id"] = str(subtask_id) diff --git a/backend/export/property_scenarios/main.py b/backend/export/property_scenarios/main.py index d38db4c9..8ba1467a 100644 --- a/backend/export/property_scenarios/main.py +++ b/backend/export/property_scenarios/main.py @@ -134,7 +134,7 @@ def handler(event: Mapping[str, Any], context: Optional[Any]) -> Mapping[str, Un body_dict = { "task_id": "test", "subtask_id": "test", - "portfolio_id": 569, + "portfolio_id": 647, "scenario_ids": [], "default_plans_only": True, } @@ -159,6 +159,54 @@ def handler(event: Mapping[str, Any], context: Optional[Any]) -> Mapping[str, Un with db_read_session() as session: exported_files = process_export(payload, session) + # Merge with input + raw_input1 = pd.read_excel( + "/Users/khalimconn-kowlessar/Downloads/eon - 20260323 address sanitisation - Standardised.xlsx", + sheet_name="Standardised Asset List", + ) + raw_input2 = pd.read_excel( + "/Users/khalimconn-kowlessar/Downloads/eon - 20260323 address sanitisation - Standardised.xlsx", + sheet_name="Addresses needing validation", + ) + raw_input = pd.concat([raw_input1, raw_input2], ignore_index=True) + raw_input["epc_os_uprn"] = np.where( + pd.isnull(raw_input["epc_os_uprn"]), + raw_input["ordnance_survey_uprn"], + raw_input["epc_os_uprn"], + ) + raw_input["epc_os_uprn"] = raw_input["epc_os_uprn"].astype(int) + + left_df = raw_input[ + ["epc_os_uprn", "domna_address_1", "landlord_property_type", "landlord_property_type"]].copy() + + combined = left_df.merge( + exported_files["default_plans"], how="right", + left_on="epc_os_uprn", right_on="uprn" + ) + raw_addresses = pd.read_excel( + "/Users/khalimconn-kowlessar/Downloads/North Tyneside Council. EPC D and Below with Type (1).xlsx") + raw_addresses = raw_addresses[["UPRN", "Address 1", "Postcode"]] + raw_addresses["Address 1"] = raw_addresses["Address 1"].str.replace(" ", " ") + raw_addresses = raw_addresses.drop_duplicates("Address 1") + + combined2 = combined.merge( + raw_addresses, how="left", left_on="domna_address_1", right_on="Address 1" + ) + + combined2 = combined2.drop(columns=["landlord_property_id"]) + combined2 = combined2.rename(columns={"UPRN": "landlord_property_id"}) + combined2["epc_os_uprn"] = combined2["epc_os_uprn"].astype("Int64") + combined2.to_excel("/Users/khalimconn-kowlessar/Downloads/EON - recommended measures for review.xlsx") + + removed = raw_addresses[~raw_addresses["UPRN"].isin(combined2["landlord_property_id"])] + + df2 = pd.read_excel( + "/Users/khalimconn-kowlessar/Downloads/20260330 EON - recommended measures for review (1).xlsx" + ) + removed2 = raw_addresses[~raw_addresses["UPRN"].isin(df2["landlord_property_id"])] + + raw_addresses[raw_addresses["Address 1"].duplicated()] + # TODO: Need to handle the exported files - e.g. upload to s3 and email a presigned url _ = exported_files return { diff --git a/recommendations/Costs.py b/recommendations/Costs.py index f2d43339..cb67a90f 100644 --- a/recommendations/Costs.py +++ b/recommendations/Costs.py @@ -209,7 +209,7 @@ class Costs: # Try and get the region after converting the keys to lower self.region = { k.lower(): v for k, v in county_to_region_map.items() - }.get(self.property.property.epc_record.local_authority_label.lower(), None) + }.get(self.property.epc_record.local_authority_label.lower(), None) if self.region is None: logger.warning("No region found for county %s, defaulting to South East England", From 117306688810e419ad8d458a202e20bc701b8432 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 30 Mar 2026 18:47:13 +0100 Subject: [PATCH 13/16] remove redundant code --- backend/export/property_scenarios/main.py | 58 ++++----------------- backend/tests/test_rebaselining_pipeline.py | 10 ++-- 2 files changed, 13 insertions(+), 55 deletions(-) diff --git a/backend/export/property_scenarios/main.py b/backend/export/property_scenarios/main.py index 8ba1467a..f3ea0100 100644 --- a/backend/export/property_scenarios/main.py +++ b/backend/export/property_scenarios/main.py @@ -134,10 +134,18 @@ def handler(event: Mapping[str, Any], context: Optional[Any]) -> Mapping[str, Un body_dict = { "task_id": "test", "subtask_id": "test", - "portfolio_id": 647, + "portfolio_id": 655, "scenario_ids": [], "default_plans_only": True, } + + body_dict = { + "task_id": "test", + "subtask_id": "test", + "portfolio_id": 655, + "scenario_ids": [1174], + "default_plans_only": False, + } :param event: Lambda event containing export request details :param context: Lambda context (not used in this handler but included for completeness) :return: HTTP response indicating success or failure of the export operation @@ -159,54 +167,6 @@ def handler(event: Mapping[str, Any], context: Optional[Any]) -> Mapping[str, Un with db_read_session() as session: exported_files = process_export(payload, session) - # Merge with input - raw_input1 = pd.read_excel( - "/Users/khalimconn-kowlessar/Downloads/eon - 20260323 address sanitisation - Standardised.xlsx", - sheet_name="Standardised Asset List", - ) - raw_input2 = pd.read_excel( - "/Users/khalimconn-kowlessar/Downloads/eon - 20260323 address sanitisation - Standardised.xlsx", - sheet_name="Addresses needing validation", - ) - raw_input = pd.concat([raw_input1, raw_input2], ignore_index=True) - raw_input["epc_os_uprn"] = np.where( - pd.isnull(raw_input["epc_os_uprn"]), - raw_input["ordnance_survey_uprn"], - raw_input["epc_os_uprn"], - ) - raw_input["epc_os_uprn"] = raw_input["epc_os_uprn"].astype(int) - - left_df = raw_input[ - ["epc_os_uprn", "domna_address_1", "landlord_property_type", "landlord_property_type"]].copy() - - combined = left_df.merge( - exported_files["default_plans"], how="right", - left_on="epc_os_uprn", right_on="uprn" - ) - raw_addresses = pd.read_excel( - "/Users/khalimconn-kowlessar/Downloads/North Tyneside Council. EPC D and Below with Type (1).xlsx") - raw_addresses = raw_addresses[["UPRN", "Address 1", "Postcode"]] - raw_addresses["Address 1"] = raw_addresses["Address 1"].str.replace(" ", " ") - raw_addresses = raw_addresses.drop_duplicates("Address 1") - - combined2 = combined.merge( - raw_addresses, how="left", left_on="domna_address_1", right_on="Address 1" - ) - - combined2 = combined2.drop(columns=["landlord_property_id"]) - combined2 = combined2.rename(columns={"UPRN": "landlord_property_id"}) - combined2["epc_os_uprn"] = combined2["epc_os_uprn"].astype("Int64") - combined2.to_excel("/Users/khalimconn-kowlessar/Downloads/EON - recommended measures for review.xlsx") - - removed = raw_addresses[~raw_addresses["UPRN"].isin(combined2["landlord_property_id"])] - - df2 = pd.read_excel( - "/Users/khalimconn-kowlessar/Downloads/20260330 EON - recommended measures for review (1).xlsx" - ) - removed2 = raw_addresses[~raw_addresses["UPRN"].isin(df2["landlord_property_id"])] - - raw_addresses[raw_addresses["Address 1"].duplicated()] - # TODO: Need to handle the exported files - e.g. upload to s3 and email a presigned url _ = exported_files return { diff --git a/backend/tests/test_rebaselining_pipeline.py b/backend/tests/test_rebaselining_pipeline.py index 9fbe1f35..a0c62f34 100644 --- a/backend/tests/test_rebaselining_pipeline.py +++ b/backend/tests/test_rebaselining_pipeline.py @@ -2,6 +2,10 @@ import os import pickle import pandas as pd import pytest +from datetime import datetime +from backend.ml_models.api import ModelApi +from backend.app.utils import sap_to_epc +from backend.app.config import get_prediction_buckets def load_sample_certificates(): @@ -60,12 +64,6 @@ def load_cleaning_data(): @pytest.mark.integration def test_rebaselining_pipeline_with_real_data(): - import pandas as pd - from datetime import datetime - from backend.ml_models.api import ModelApi - from backend.app.utils import sap_to_epc - from backend.app.config import get_prediction_buckets - df = load_sample_certificates() cleaning_data = load_cleaning_data() input_properties = [make_property_from_row(row, cleaning_data=cleaning_data) for _, row in df.iterrows()] From 968beec6ccbe79161c369cca285631706fe71424 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 31 Mar 2026 08:16:05 +0000 Subject: [PATCH 14/16] tweaks to run for guinness partnership --- ...s_Coordination_Design_Board_1774881298.xlsx | Bin 0 -> 156765 bytes backend/pashub_fetcher/handler/handler.py | 14 +++++++++----- .../pashub_to_ara_trigger_request.py | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 backend/pashub_fetcher/The_Guinness_Partnership_AtkinsR_alis_Coordination_Design_Board_1774881298.xlsx diff --git a/backend/pashub_fetcher/The_Guinness_Partnership_AtkinsR_alis_Coordination_Design_Board_1774881298.xlsx b/backend/pashub_fetcher/The_Guinness_Partnership_AtkinsR_alis_Coordination_Design_Board_1774881298.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6478e3bbad82979bdb6e7f0679d477236bec3b1 GIT binary patch literal 156765 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%0D34A8c)8Yr{Psoc-j6<%) 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

7y;nrxqB=O6(QvGdw76+NK7DeM2r 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 List[Job]: wb = load_workbook(filepath, data_only=True) - ws = wb["watford warm homes (wave 3) mai"] + # ws = wb["watford warm homes (wave 3) mai"] + ws = wb["filtered"] HEADER_ROW = 3 @@ -37,7 +38,8 @@ def extract_jobs(filepath: str) -> List[Job]: headers[value.strip()] = col name_col = headers["Name"] - link_col = headers["Pashub Link"] + # link_col = headers["Pashub Link"] + link_col = headers["PasHub Link"] jobs: List[Job] = [] @@ -148,8 +150,6 @@ def process_job( logger.info("Uploading files to s3") upload_job_to_s3_and_update_db(job_files, uprn) - # add record of new file in db - upload_job_to_sharepoint(sharepoint_client, base_path, job, job_files) return job_files @@ -159,7 +159,11 @@ def handler(event: Mapping[str, Any], context: Any) -> None: settings = get_settings() BASE_DIR = os.path.dirname(os.path.dirname(__file__)) - filepath = os.path.join(BASE_DIR, "Watford_Warm_Homes_Wave_3_RA Downloads .xlsx") + # filepath = os.path.join(BASE_DIR, "Watford_Warm_Homes_Wave_3_RA Downloads .xlsx") + filepath = os.path.join( + BASE_DIR, + "The_Guinness_Partnership_AtkinsR_alis_Coordination_Design_Board_1774881298.xlsx", + ) jobs: List[Job] = extract_jobs(filepath) logger.info("Successfully loaded jobs from spreadsheet") diff --git a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py index ae165158..2e4f8380 100644 --- a/backend/pashub_fetcher/pashub_to_ara_trigger_request.py +++ b/backend/pashub_fetcher/pashub_to_ara_trigger_request.py @@ -1,5 +1,4 @@ from typing import Optional - from pydantic import BaseModel From f68ff1fca6d9ca5b70d0e4879d51160a2c7f615f Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 31 Mar 2026 08:22:40 +0000 Subject: [PATCH 15/16] make settings variables optional --- backend/app/config.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/app/config.py b/backend/app/config.py index e137429f..6b378a30 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -66,17 +66,17 @@ class Settings(BaseSettings): ORDNANCE_SURVEY_API_KEY: str = "changeme" # Sharepoint - SHAREPOINT_CLIENT_ID: str = "changeme" - SHAREPOINT_CLIENT_SECRET: str = "changeme" - SHAREPOINT_TENANT_ID: str = "changeme" - DOMNA_SHAREPOINT_ID: str = "changeme" - OSMOSIS_ACD_SHAREPOINT_ID: str = "changeme" - PRIVATE_PAY_SHAREPOINT_ID: str = "changeme" - SOCIAL_HOUSING_WAVE_3_SHAREPOINT_ID: str = "changeme" + SHAREPOINT_CLIENT_ID: Optional[str] = None + SHAREPOINT_CLIENT_SECRET: Optional[str] = None + SHAREPOINT_TENANT_ID: Optional[str] = None + DOMNA_SHAREPOINT_ID: Optional[str] = None + OSMOSIS_ACD_SHAREPOINT_ID: Optional[str] = None + PRIVATE_PAY_SHAREPOINT_ID: Optional[str] = None + SOCIAL_HOUSING_WAVE_3_SHAREPOINT_ID: Optional[str] = None # Pas Hub - PASHUB_EMAIL: str = "changeme" - PASHUB_PASSWORD: str = "changeme" + PASHUB_EMAIL: Optional[str] = None + PASHUB_PASSWORD: Optional[str] = None # Optional AWS creds (only required in local) AWS_ACCESS_KEY_ID: Optional[str] = None From 9075cac3aa26d6c5715b041ae98a5ed6294a5e8f Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 31 Mar 2026 08:25:56 +0000 Subject: [PATCH 16/16] handle missing pas hub credentials --- backend/pashub_fetcher/handler/handler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/pashub_fetcher/handler/handler.py b/backend/pashub_fetcher/handler/handler.py index a27f49bc..df7bb9dc 100644 --- a/backend/pashub_fetcher/handler/handler.py +++ b/backend/pashub_fetcher/handler/handler.py @@ -171,6 +171,9 @@ def handler(event: Mapping[str, Any], context: Any) -> None: pas_hub_email = settings.PASHUB_EMAIL pas_hub_password = settings.PASHUB_PASSWORD + if (not pas_hub_email) or (not pas_hub_password): + raise ValueError("Pas Hub credentials not provided") + pashub_client = get_pashub_client(pas_hub_email, pas_hub_password) sharepoint_client = DomnaSharepointClient(