Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 98.9%
Python 0.6%
1# -----------------------------------------------------------------------------2# Lou-Ka — Agrégateur de logements à louer (province de Québec)3# Auteur : Simon-Pierre Boucher — contact@spboucher.ai4# connectors/boises_cite.py : connecteur Les Boisés de la Cité5# (lesboisesdelacite.com) — 43 logements locatifs neufs (3½ à 4½ + bureau)6# au 15, rue des Sentiers à Sainte-Marie (Beauce). La page /plans-prix/7# embarque le widget Planpoint : on interroge l'API JSON publique8# (app.planpoint.io/api/projects/find, 1 requête/sync — voir _planpoint.py).9# Granularité UNITÉ : prix mensuel publié, pi², chambres, sdb, plans,10# inclusions ; seules les unités « Available » sont retenues.11# -----------------------------------------------------------------------------12from __future__ import annotations1314from ..schema import Listing15from ._planpoint import planpoint_projects, unit_listing16from .base import BaseConnector1718PAGE_URL = "https://lesboisesdelacite.com/plans-prix/"19NAMESPACE = "Lesboisesdelacit"20HOST_NAME = "demo"2122# le projet Planpoint ne publie ni adresse ni coordonnées : on les fixe ici23ADDRESS = "15, rue des Sentiers, Sainte-Marie"24CONTACT = {"email": "info@lesboisesdelacite.com", "phone": "418-389-7584"}252627class BoisesCiteConnector(BaseConnector):28 source_id = "boises_cite"29 request_delay = 0.83031 def fetch(self) -> list[Listing]:32 try:33 projects = planpoint_projects(self, "projects",34 NAMESPACE, HOST_NAME)35 except Exception:36 return []37 listings: list[Listing] = []38 for project in projects:39 for floor in project.get("floors") or []:40 for unit in floor.get("units") or []:41 lst = unit_listing(self.source_id, project, floor, unit,42 page_url=PAGE_URL,43 default_city="Sainte-Marie")44 if lst is None:45 continue46 lst.address = ADDRESS # absent du JSON Planpoint47 lst.details["contact"] = dict(CONTACT)48 # `bedrooms` Planpoint est un entier nu (« 2 ») que le49 # helper ne convertit pas : n chambres -> (n+2)½50 try:51 beds = float(unit.get("bedrooms") or 0)52 except (TypeError, ValueError):53 beds = 0.054 if beds > 0 and "½" not in lst.unit_type:55 lst.bedrooms = float(beds)56 n = int(beds) + 257 lst.unit_type = "6½+" if n >= 6 else f"{n}½"58 listings.append(lst)59 return listings60