feat: registre des votes feature_votes #94

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Colin Maudry
2026-06-30 13:55:28 +02:00
parent d98e7313de
commit fb45c8e7d5
6 changed files with 102 additions and 0 deletions
+11
View File
@@ -76,6 +76,13 @@ cache.init_app(
app: Dash = Dash(
server=server,
# name="src" (et non "src.app") pour que use_pages enregistre les pages sous
# le namespace `src.pages.*`, identique aux imports inter-pages (ex.
# inscription.py: `from src.pages.connexion import linkedin_button`). Sinon
# Dash découvre `pages.connexion` tandis que l'import explicite crée
# `src.pages.connexion` : deux identités, même URL → "duplicate paths" →
# check_for_duplicate_pathnames lève à chaque requête → 500 sur toute l'app.
name="src",
title="decp.info",
use_pages=True,
suppress_callback_exceptions=True,
@@ -109,6 +116,10 @@ from src.saved_views import db as saved_views_db # noqa: E402
saved_views_db.init_schema()
from src.roadmap import db as roadmap_db # noqa: E402
roadmap_db.init_schema()
# robots.txt
@app.server.route("/robots.txt")
View File
+42
View File
@@ -0,0 +1,42 @@
from datetime import datetime, timezone
from src.auth.db import get_conn
SCHEMA = """
CREATE TABLE IF NOT EXISTS feature_votes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
issue_number INTEGER NOT NULL,
created_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_feature_votes_issue
ON feature_votes(issue_number);
"""
def _now() -> str:
return datetime.now(timezone.utc).isoformat()
def init_schema() -> None:
get_conn().executescript(SCHEMA)
def record_vote(user_id: int, issue_number: int) -> None:
get_conn().execute(
"INSERT INTO feature_votes (user_id, issue_number, created_at) "
"VALUES (?, ?, ?)",
(user_id, issue_number, _now()),
)
def vote_counts() -> dict[int, int]:
rows = (
get_conn()
.execute(
"SELECT issue_number, COUNT(*) FROM feature_votes GROUP BY issue_number"
)
.fetchall()
)
return {row[0]: row[1] for row in rows}