46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
from dash import ALL, Input, Output, callback, ctx, no_update, register_page
|
|
from flask_login import current_user
|
|
|
|
from src.pages._compte_shell import account_guard, account_shell
|
|
from src.roadmap import db as roadmap_db
|
|
from src.roadmap import github
|
|
from src.roadmap import ui as roadmap_ui
|
|
from src.subscriptions import db as subs_db
|
|
|
|
register_page(
|
|
__name__,
|
|
path="/compte/roadmap",
|
|
title="Roadmap | decp.info",
|
|
name="Roadmap",
|
|
description="Votez pour les prochaines fonctionnalités de decp.info.",
|
|
)
|
|
|
|
|
|
def layout(**_):
|
|
guard = account_guard("/compte/roadmap", require_subscription=True)
|
|
if guard is not None:
|
|
return guard
|
|
balance = subs_db.credit_pending(current_user.id)
|
|
return account_shell(
|
|
"roadmap", roadmap_ui.roadmap_content(editable=True, balance=balance)
|
|
)
|
|
|
|
|
|
@callback(
|
|
Output("roadmap-vote-list", "children"),
|
|
Output("roadmap-balance", "children"),
|
|
Input({"type": "roadmap-vote", "index": ALL}, "n_clicks"),
|
|
prevent_initial_call=True,
|
|
)
|
|
def cast_vote(n_clicks):
|
|
if not ctx.triggered_id or not any(n_clicks):
|
|
return no_update, no_update
|
|
issue_number = ctx.triggered_id["index"]
|
|
if subs_db.spend_vote(current_user.id):
|
|
roadmap_db.record_vote(current_user.id, issue_number)
|
|
balance = subs_db.credit_pending(current_user.id)
|
|
issues = github.fetch_roadmap_issues()
|
|
counts = roadmap_db.vote_counts()
|
|
items = roadmap_ui.vote_items(issues["au_vote"], counts, editable=True)
|
|
return items, roadmap_ui.balance_text(balance)
|