# ----------------------------------------------------------------------------- # Lou-Ka — Agrégateur de logements à louer (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/marquise_8.py : connecteur Marquise 8 (marquise8.com — Devmet/ # Marquise Condominiums). Tour de 137 condos locatifs tout inclus au # 3641, avenue Jean-Béraud à Laval (Chomedey, centre-ville). Le site # Webflow affiche ses unités via le widget Planpoint : on interroge l'API # JSON publique (app.planpoint.io/api/projects/find, 1 requête/sync, # voir _planpoint.py). Granularité UNITÉ (numéro de porte, pi², plan, # étage) mais AUCUN prix publié (« unitPriceTBD ») ni typologie ; seules # les unités « Available » sont retenues. deliveryDate au format # JJ-MM-AAAA (contrairement aux autres comptes Planpoint) — converti ici. # ----------------------------------------------------------------------------- from __future__ import annotations import re from ..schema import Listing from ._planpoint import planpoint_projects, unit_listing from .base import BaseConnector PAGE_URL = "https://marquise8.com/#unite" NAMESPACE = "marquise-8" HOST_NAME = "marquise-8" DEFAULT_CITY = "Laval" SECTOR = "Chomedey" EXTRA_AMENITIES = ["Formule tout inclus"] # « 01-07-2026 » (JJ-MM-AAAA, spécifique à ce compte) -> ISO « 2026-07-01 » _DMY_RE = re.compile(r"^(\d{2})-(\d{2})-(\d{4})$") class Marquise8Connector(BaseConnector): source_id = "marquise_8" 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=DEFAULT_CITY, extra_amenities=EXTRA_AMENITIES) if lst is None: continue lst.sector = SECTOR # date de livraison JJ-MM-AAAA -> ISO m = _DMY_RE.match(lst.availability_date or "") if m: iso = f"{m.group(3)}-{m.group(2)}-{m.group(1)}" lst.availability_date = iso lst.availability = f"Disponible le {iso}" listings.append(lst) return listings