# ----------------------------------------------------------------------------- # Lou-Ka — Agrégateur de logements à louer (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/lac_jerome.py : connecteur Habitations du Lac Jérôme # (habitationsdulacjerome.com — 3 projets locatifs neufs à Saint-Jérôme : # Le Seize (condos), La Quaza (maisons et bachelors), Le Hexa (condos)). # Le site WordPress affiche ses unités via le widget Planpoint : on # interroge l'API JSON publique (app.planpoint.io/api/groups/find, # 1 requête/sync, voir _planpoint.py). Granularité UNITÉ, AVEC prix # mensuel publié (1 900 $ à 2 800 $), pi², plans par unité, inclusions # françaises et date de livraison. Les projets Planpoint n'ont ni adresse # ni lat/lng ; chez La Quaza et Le Hexa le NOM de l'unité est une adresse # civique (« 113 Réal-Piché ») qu'on récupère comme adresse. Seules les # unités « Available » sont retenues. # ----------------------------------------------------------------------------- from __future__ import annotations import re from ..schema import Listing from ._planpoint import planpoint_projects, unit_listing from .base import BaseConnector PAGE_URL = "https://habitationsdulacjerome.com/" NAMESPACE = "habitations-du-lac-jerome" HOST_NAME = "for-rent" # « 113 Réal-Piché » -> adresse civique (rue du projet à Saint-Jérôme) _CIVIC_RE = re.compile(r"^\d+\s+[A-ZÀ-Ü]", re.U) class LacJeromeConnector(BaseConnector): source_id = "lac_jerome" request_delay = 0.8 def fetch(self) -> list[Listing]: try: projects = planpoint_projects(self, "groups", 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="Saint-Jérôme") if lst is None: continue # adresse civique dans le nom d'unité (La Quaza, Le Hexa) name = (unit.get("name") or "").strip() if not lst.address and _CIVIC_RE.match(name): lst.address = name listings.append(lst) return listings