# ----------------------------------------------------------------------------- # Lou-Ka — Agrégateur de logements à louer (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/boises_cite.py : connecteur Les Boisés de la Cité # (lesboisesdelacite.com) — 43 logements locatifs neufs (3½ à 4½ + bureau) # au 15, rue des Sentiers à Sainte-Marie (Beauce). La page /plans-prix/ # embarque le widget Planpoint : on interroge l'API JSON publique # (app.planpoint.io/api/projects/find, 1 requête/sync — voir _planpoint.py). # Granularité UNITÉ : prix mensuel publié, pi², chambres, sdb, plans, # inclusions ; seules les unités « Available » sont retenues. # ----------------------------------------------------------------------------- from __future__ import annotations from ..schema import Listing from ._planpoint import planpoint_projects, unit_listing from .base import BaseConnector PAGE_URL = "https://lesboisesdelacite.com/plans-prix/" NAMESPACE = "Lesboisesdelacit" HOST_NAME = "demo" # le projet Planpoint ne publie ni adresse ni coordonnées : on les fixe ici ADDRESS = "15, rue des Sentiers, Sainte-Marie" CONTACT = {"email": "info@lesboisesdelacite.com", "phone": "418-389-7584"} class BoisesCiteConnector(BaseConnector): source_id = "boises_cite" request_delay = 0.8 def fetch(self) -> list[Listing]: try: projects = planpoint_projects(self, "projects", NAMESPACE, HOST_NAME) except Exception: return [] listings: list[Listing] = [] for project in projects: for floor in project.get("floors") or []: for unit in floor.get("units") or []: lst = unit_listing(self.source_id, project, floor, unit, page_url=PAGE_URL, default_city="Sainte-Marie") if lst is None: continue lst.address = ADDRESS # absent du JSON Planpoint lst.details["contact"] = dict(CONTACT) # `bedrooms` Planpoint est un entier nu (« 2 ») que le # helper ne convertit pas : n chambres -> (n+2)½ try: beds = float(unit.get("bedrooms") or 0) except (TypeError, ValueError): beds = 0.0 if beds > 0 and "½" not in lst.unit_type: lst.bedrooms = float(beds) n = int(beds) + 2 lst.unit_type = "6½+" if n >= 6 else f"{n}½" listings.append(lst) return listings