[FEATURE] Add followed activities with email notifications#877
[FEATURE] Add followed activities with email notifications#877florentdestremau wants to merge 3 commits intoClub-Alpin-Annecy:masterfrom
Conversation
This feature allows users to follow activities and receive email notifications when new events are published for those activities. Key features: - Auto-subscribe to activities when registering for events (unless explicitly unsubscribed) - User profile page to manage followed activities (/profile/followed-activities) - Notify followers button on published events for leaders - Secure unsubscribe links in notification emails (30-day signed tokens) - Retroactive migration: auto-populates from existing registrations New files: - collectives/models/user_followed_activity.py: Association model - collectives/templates/profile/followed_activities.html: Management UI - migrations/versions/c84f9ec33732_add_user_followed_activities.py: DB migration - tests/unit/test_followed_activities.py: Unit tests - plans/followed-activities-notifications.md: Implementation plan Modified: - User/ActivityType models with relationships and helper methods - Event routes for auto-subscription and notification endpoint - Profile routes for activity management - Email templates and configuration - Navigation and event admin templates
4445003 to
4ae7eb2
Compare
gdaviet
left a comment
There was a problem hiding this comment.
Merci pour la PR @florentdestremau !
Effectivement ce serait bien si @acapai peux jeter un oeil pour voir comment les implémentations peuvent se combiner
Mon avis personnel c'est la registration automatique n'est pas forcément désirable, le laisser opt-in en proposant de suivre les activités dans son profile me semble suffisant.
Sinon quelques remarques de Claude qui me semblent pertinentes :
- Security — token unsubscribe requires login (blocker)
unfollow_activity_with_token is a GET route but it calls current_user.id. This route is reached via a link in an email. If the recipient is
not logged in, current_user will be anonymous and the check token_user_id != current_user.id will always fail, making the unsubscribe link
completely broken. This is the most critical issue — the route must either work without authentication, or redirect to login first and then
complete the action.
- Performance — N+1 on follower collection (routes/event.py:577-580)
for activity in event.activity_types:
for assoc in activity.followers_assoc:
followers_assoc is lazy=True, so this fires one query per activity. On a large club with many activities and followers, this could be slow.
Should use an explicit join query or eager-load followers_assoc before the loop.
Pour le AGENTS.md : c'est une bonne chose de l'ajouter, par contre peut être dans une PR séparée ?
|
Salut, Effectivement quand j'avais écris cette issue #873 , j'avais déjà entamé un travail sur une branche . Je viens de faire le tour de ton travail , et j'ai rassemblé les retours fait par @jnguiot ici : #873 (comment) . La PR que je propose rassemble un peu tout ça ! Si vous voulez tester/faire des route sur la PR #886 que j'ai ouverte n'hésitez pas . Bonne lecture ! |
Résumé
Cette PR ajoute une fonctionnalité permettant aux utilisateurs de "suivre" des activités et de recevoir des notifications par email lorsqu'une nouvelle collective est publiée pour une activité suivie.
Fonctionnalités principales
🔔 Système de suivi d'activités
/profile/followed-activitiespour voir et gérer les activités suivies📧 Notifications par email
itsdangerous, valide 30 jours, dans chaque email🔄 Migration rétroactive
user_followed_activitiesà partir des inscriptions existantesArchitecture technique
Modèle de données
user_followed_activities(clé composite :user_id+activity_type_id)followed_at,explicitly_unfollowed,unfollowed_atUseretActivityTypeRoutes ajoutées
GET /profile/followed-activities- Liste des activités suiviesPOST /profile/follow-activity/<id>- Suivre une activitéPOST /profile/unfollow-activity/<id>- Ne plus suivreGET /profile/unfollow-activity/<id>/token/<token>- Désabonnement via emailPOST /event/<id>/notify-followers- Notifier les abonnés (leaders uniquement)Fichiers modifiés
Nouveaux fichiers
collectives/models/user_followed_activity.py- Modèle d'associationcollectives/templates/profile/followed_activities.html- Interface utilisateurmigrations/versions/c84f9ec33732_add_user_followed_activities.py- Migration Alembictests/unit/test_followed_activities.py- Tests unitaires (5 tests)Fichiers modifiés
collectives/models/user/model.py- Relations et méthodes helpercollectives/models/activity_type.py- Relation inversecollectives/models/__init__.py- Export du nouveau modèlecollectives/routes/event.py- Auto-subscription + route notificationcollectives/routes/profile.py- Routes de gestioncollectives/email_templates.py- Fonction d'envoi d'emailscollectives/configuration.yaml- Templates de messages emailcollectives/templates/event/partials/admin.html- Bouton notificationcollectives/templates/partials/main-navigation.html- Lien menu profilPoints à reviewer
1. Sécurité
2. Performance
activity.followers_assoc- acceptable pour des événements avec < 1000 abonnés ?3. Migration
explicitly_unfollowedpour éviter les réabonnements forcés4. UX
5. Codestyle
collectives/routes/event.pyje dois ajouter la logique à 3 endroits différents donc dommage, mais pour le coup je ne suis pas au clair sur comment on pourrait factoriser ça.Tests
Résultat : 37 tests passent (dont 5 nouveaux pour cette feature)
Configuration requise
Les nouvelles clés de configuration sont automatiquement créées au démarrage :
EVENT_NOTIFICATION_TO_FOLLOWERS_SUBJECT- Sujet de l'emailEVENT_NOTIFICATION_TO_FOLLOWERS_MESSAGE- Corps du templateChecklist
plans/Captures d'écran
Note pour les reviewers : Cette feature a été développée en suivant le plan détaillé dans
plans/followed-activities-notifications.md.