Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.3 KiB
Accès gratuit pour tous via TOUS_ABONNES
Date : 2026-06-26 Statut : Design validé
Contexte
La plateforme de paiement Frisbii doit effectuer un background check avant d'autoriser la réception de paiements (plusieurs semaines). En attendant, on veut ouvrir gratuitement à tout utilisateur connecté les fonctionnalités normalement réservées aux abonnés, sans casser le code d'abonnement existant (qui sera réactivé tel quel une fois Frisbii validé).
Objectif
Un drapeau d'environnement TOUS_ABONNES qui, lorsqu'il vaut true :
- donne à tout utilisateur connecté l'accès aux fonctionnalités réservées aux abonnés ;
- affiche un bandeau d'information en haut de la page
/compte/abonnement; - désactive (et grise) les boutons « S'abonner » sur
/compte/abonnement.
Quand le drapeau est absent ou false, le comportement actuel est strictement
inchangé.
Architecture existante (rappel)
src/pages/_compte_shell.pycentralise l'accès :current_user_has_subscription()→ utilisé par_nav(sections visibles du menu) etaccount_guard(protection des pages réservées) ;SECTIONSmarquearchives,filtres,siretavecrequire_subscription: True.
db.has_active_subscription(user_id)est le contrôle bas-niveau « vrai abonnement payant » ; appelé directement par :compte_abonnement.py(has_access→ vue « abonnement actif » vs cartes de plans) ;auth/routes.py::_post_login_url(redirection post-login) ;subscriptions/routes.py::subscribe(anti double-abonnement).
compte_abonnement.py::_plan_cardrend le bouton « S'abonner ».
Conception
1. Variable d'environnement
Dans src/utils/__init__.py, suivant la convention de DEVELOPMENT :
TOUS_ABONNES = os.getenv("TOUS_ABONNES", "False").lower() == "true"
Documentée dans .template.env.
2. Déblocage de l'accès (point unique)
src/pages/_compte_shell.py::current_user_has_subscription() :
def current_user_has_subscription() -> bool:
from src.subscriptions import db
if not current_user.is_authenticated:
return False
if TOUS_ABONNES:
return True
return db.has_active_subscription(current_user.id)
Ce seul changement débloque les sections archives/filtres/siret dans le
menu (_nav) et lève leur account_guard.
On ne touche pas à db.has_active_subscription() : il doit continuer à
refléter un vrai abonnement payant. Conséquence voulue : sur
/compte/abonnement, has_access reste False pour un utilisateur sans
abonnement réel → il voit les cartes de plans (désactivées) + le bandeau, et
non une fausse vue « abonnement actif ».
3. Bandeau d'information (page /compte/abonnement uniquement)
Dans compte_abonnement.py::layout, quand TOUS_ABONNES, insérer en haut du
body (avant les cartes) un dbc.Alert (color="info") :
Les fonctionnalités normalement accessibles contre un abonnement de 20 € HT par mois sont accessibles à tous et toutes en attendant la validation de mon dossier pour recevoir des paiements.
4. Boutons « S'abonner » désactivés et gris
Dans compte_abonnement.py::_plan_card, quand TOUS_ABONNES, le bouton est
rendu désactivé et gris (className="btn btn-secondary disabled",
disabled=True). Les cartes restent visibles à titre informatif.
5. Redirection post-login
Inchangée. _post_login_url s'appuie sur db.has_active_subscription, qui
reste False pour les non-abonnés réels → redirection vers
/compte/abonnement, ce qui est le comportement souhaité avec TOUS_ABONNES.
Hors périmètre
- Aucune autre fonctionnalité « abonné » n'est gatée ailleurs que via
account_guard(vérifié : pas de contrôle d'abonnement danstableau.py, exports, sauvegarde de filtres). - Pas de modification du flux de paiement Frisbii ni du webhook.
Tests
current_user_has_subscription():Truesi connecté +TOUS_ABONNES,Falsesi non connecté même avec le drapeau, comportement DB normal si drapeau absent.visible_sections: sections réservées visibles via le drapeau (en s'appuyant sur le helper).compte_abonnement: bandeau présent et bouton désactivé quandTOUS_ABONNESest actif ; absents sinon.