SPB Git forge

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

232commits 1branches 0releases
172.9 MBsize
maindefault branch
2 days agolast push
HTML 98.9% Python 0.6%
2.7 KB · 60 lines python
Raw Blame History
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