SPB Git

spb/lou-ka

Public

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

Stats : compte « ailleurs au Québec » distinct du Grand Montréal (expansion provinciale)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 9, 2026) parent 2e6d158 Browse files

3 changed files +25 −3

modified frontend/src/api.ts +1 −0
@@ -131,6 +131,7 @@ export interface Stats {
131 quebec: number; 131 quebec: number;
132 levis: number; 132 levis: number;
133 montreal: number; 133 montreal: number;
134+ autres: number; // reste de la province (Outaouais, Estrie, Mauricie…)
134 sources: number; 135 sources: number;
135 avg_price: number | null; 136 avg_price: number | null;
136 } 137 }
modified frontend/src/pages/Home.tsx +3 −0
@@ -96,6 +96,9 @@ export default function Home() {
96 {(stats.montreal ?? 0) > 0 && ( 96 {(stats.montreal ?? 0) > 0 && (
97 <span className="stat-chip"><b>{stats.montreal}</b> Grand Montréal</span> 97 <span className="stat-chip"><b>{stats.montreal}</b> Grand Montréal</span>
98 )} 98 )}
99+ {(stats.autres ?? 0) > 0 && (
100+ <span className="stat-chip"><b>{stats.autres}</b> ailleurs au Québec</span>
101+ )}
99 {stats.avg_price != null && ( 102 {stats.avg_price != null && (
100 <span className="stat-chip"> 103 <span className="stat-chip">
101 loyer moyen <b>{Math.round(stats.avg_price)} $</b> 104 loyer moyen <b>{Math.round(stats.avg_price)} $</b>
modified louka/web.py +21 −3
@@ -232,17 +232,35 @@ def sources():
232 return {"sources": registry} 232 return {"sources": registry}
233 233
234 234
235+# Villes de la grande région de Montréal (le reste de la province est
236+# compté dans « autres » — Outaouais, Estrie, Mauricie, Est-du-Québec…)
237+_VILLES_GM = (
238+ "Montréal", "Montréal-Est", "Laval", "Longueuil", "Brossard", "Terrebonne",
239+ "Mascouche", "Repentigny", "Boucherville", "Saint-Lambert", "Westmount",
240+ "Côte Saint-Luc", "Dorval", "Pointe-Claire", "Verdun", "LaSalle", "Anjou",
241+ "Saint-Constant", "Delson", "Candiac", "Châteauguay", "Chambly",
242+ "Sainte-Julie", "Varennes", "Belœil", "McMasterville", "Mont-Saint-Hilaire",
243+ "Saint-Basile-le-Grand", "Saint-Bruno-de-Montarville", "Boisbriand",
244+ "Richelieu", "Beauharnois", "Salaberry-de-Valleyfield", "Vaudreuil-Dorion",
245+ "Kirkland", "Beaconsfield", "Dollard-des-Ormeaux", "Mont-Royal", "Outremont",
246+)
247+
248+
235 @app.get("/api/stats") 249 @app.get("/api/stats")
236 def stats(): 250 def stats():
237 con = db.connect() 251 con = db.connect()
252+ gm = ",".join("?" * len(_VILLES_GM))
238 row = con.execute( 253 row = con.execute(
239− """SELECT COUNT(*) total, 254+ f"""SELECT COUNT(*) total,
240 SUM(CASE WHEN city='Québec' THEN 1 ELSE 0 END) quebec, 255 SUM(CASE WHEN city='Québec' THEN 1 ELSE 0 END) quebec,
241 SUM(CASE WHEN city='Lévis' THEN 1 ELSE 0 END) levis, 256 SUM(CASE WHEN city='Lévis' THEN 1 ELSE 0 END) levis,
242− SUM(CASE WHEN city NOT IN ('Québec','Lévis') THEN 1 ELSE 0 END) montreal, 257+ SUM(CASE WHEN city IN ({gm}) THEN 1 ELSE 0 END) montreal,
258+ SUM(CASE WHEN city NOT IN ('Québec','Lévis') AND city NOT IN ({gm})
259+ THEN 1 ELSE 0 END) autres,
243 COUNT(DISTINCT source) sources, 260 COUNT(DISTINCT source) sources,
244 AVG(price) avg_price 261 AVG(price) avg_price
245− FROM listings WHERE active=1""").fetchone() 262+ FROM listings WHERE active=1""",
263+ list(_VILLES_GM) + list(_VILLES_GM)).fetchone()
246 log = [dict(r) for r in con.execute( 264 log = [dict(r) for r in con.execute(
247 "SELECT * FROM sync_log ORDER BY ts DESC LIMIT 20")] 265 "SELECT * FROM sync_log ORDER BY ts DESC LIMIT 20")]
248 con.close() 266 con.close()
249 267
Menu

Theme