from dataclasses import dataclass from typing import Optional @dataclass(slots=True) class Address: uprn: Optional[int] landlord_property_id: Optional[str] address: Optional[str] full_address: Optional[str] postcode: str property_type: Optional[str] built_form: Optional[str] estimated: bool # Additional address data, associated to a standardised asset list domna_full_address: Optional[str] domna_address_1: Optional[str] landlord_heating_system: Optional[str] = None solar_reason: Optional[str] = None cavity_reason: Optional[str] = None @property def address1(self): if self.domna_address_1 is not None: address1 = self.domna_address_1 else: address1 = self.address # Format address1 = str(int(address1)) if isinstance(address1, float) else str(address1) return address1 @property def request_data(self) -> dict[str, Optional[str]]: """ Canonical request payload for downstream services. """ data = { "uprn": self.uprn, "landlord_property_id": self.landlord_property_id, "postcode": self.postcode, "address1": self.address1, "full_address": self.full_address, } # Drop nulls return {k: v for k, v in data.items() if v is not None} @property def heating_system(self): """ Helper function to extract a heating system, which can be used to estimate EPC. This is a very limited, placeholder function to cover some initial immediate cases. :return: """ ll_heating = self.landlord_property_id if not ll_heating: return None if ll_heating == "electric storage heaters": # Return with the same format at the EPC return "Electric storage heaters" return None