# ----------------------------------------------------------------------------- # Lou-Ka — Agrégateur de logements à louer (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/espace_w.py : connecteur Espace W (espacew.com — condos locatifs # à Cité Mirabel, 4 immeubles W1 à W4, rue de Chenonceau/boul. de Versailles). # 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É : pi², chambres, salle(s) de bain, # plans et inclusions par unité, adresse + lat/lng par immeuble ; la source # ne publie AUCUN prix (price null chez Planpoint, pas de prix sur le site # non plus) — rien d'inventé. Seules les unités « Available » sont retenues # (les louées/vendues sont exclues). # ----------------------------------------------------------------------------- from __future__ import annotations from ..schema import Listing from ._planpoint import planpoint_projects, unit_listing from .base import BaseConnector PAGE_URL = "https://www.espacew.com/unites-et-disponibilites/" NAMESPACE = "Espace-W-condos-locatifs" HOST_NAME = "Espace-W" class EspaceWConnector(BaseConnector): source_id = "espace_w" 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="Mirabel") if lst is not None: listings.append(lst) return listings