diff --git a/src/pages/_compte_shell.py b/src/pages/_compte_shell.py index 277515c..528eba4 100644 --- a/src/pages/_compte_shell.py +++ b/src/pages/_compte_shell.py @@ -23,6 +23,12 @@ SECTIONS = [ "href": "/compte/vues", "require_subscription": True, }, + { + "key": "roadmap", + "label": "Roadmap", + "href": "/compte/roadmap", + "require_subscription": True, + }, ] diff --git a/src/pages/compte_roadmap.py b/src/pages/compte_roadmap.py new file mode 100644 index 0000000..6aebb6c --- /dev/null +++ b/src/pages/compte_roadmap.py @@ -0,0 +1,45 @@ +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) diff --git a/tests/roadmap/test_compte_roadmap.py b/tests/roadmap/test_compte_roadmap.py new file mode 100644 index 0000000..6126f40 --- /dev/null +++ b/tests/roadmap/test_compte_roadmap.py @@ -0,0 +1,5 @@ +def test_module_imports_and_registers(): + from src.pages import compte_roadmap + + assert callable(compte_roadmap.layout) + assert callable(compte_roadmap.cast_vote)