Les réunions de l'association, et la présence annoncée - #45
Merged
Conversation
Une réunion de bureau, un conseil, une assemblée générale : ce sont des événements de l'association, mais pas des manifestations. Elles vivent donc dans les événements, avec un type qui les distingue, et trois différences qui comptent. Elles ne sortent jamais sur le site public. C'est la contrainte qui commande tout le reste : la table des événements alimente la page d'accueil publique, et chaque événement porte un jeton de partage qui ouvre une page sans authentification. Une réunion publiée par inadvertance aurait affiché son ordre du jour et l'adresse d'un domicile sur Internet. Deux verrous ferment ce chemin, tous deux portés par les requêtes et non par les pages, pour qu'un futur appelant en hérite sans y penser : les événements publiés à venir sont filtrés sur le type, et la lecture par jeton de partage refuse les réunions. Une réunion publiée répond « lien indisponible » sur son propre jeton. Elles se voient avant les manifestations. Un bandeau les annonce en tête du tableau de bord, avec la réponse de présence à même le bandeau, et une section colorée les place en haut de la liste des événements. Elles se répondent. Trois réponses — je serai là, peut-être, je ne peux pas — parce qu'un parent qui ne sait pas encore n'est ni un présent ni un absent, et qu'une assemblée générale se prépare avec des chiffres honnêtes. Une réponse par personne, modifiable, retirable en recliquant. L'onglet « Bénévoles » d'une réunion devient « Présences » et liste qui vient, qui hésite et qui s'excuse. Le formulaire masque ce qui n'a pas de sens pour une réunion : la billetterie et la description publique disparaissent, et le sous-titre rappelle que rien n'ira sur le site public. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Une réunion de bureau, un conseil, une assemblée générale : ce sont des événements de l'association, mais pas des manifestations. Elles vivent donc dans les événements, avec un type qui les distingue, et trois différences qui comptent.
Elles ne sortent jamais sur le site public
C'est la contrainte qui commande tout le reste. La table
eventsalimente la page d'accueil publique, et chaque événement porte unshareTokenqui ouvre/inscription/[token]sans authentification. Une réunion publiée par inadvertance aurait affiché son ordre du jour et l'adresse d'un domicile sur Internet.Deux verrous ferment ce chemin, tous deux portés par les requêtes et non par les pages, pour qu'un futur appelant en hérite sans y penser :
getUpcomingPublishedEvents()— accueil public, page Rejoindrekind = 'event'getEventByShareToken()— page publique d'un événementkind = 'event': le jeton d'une réunion n'ouvre rienTesté avec une réunion volontairement publiée, portant une adresse de domicile et un ordre du jour : zéro occurrence sur
/, sur/rejoindreet sur son propre jeton de partage, qui répond « Lien d'inscription indisponible ». Les liens des vrais événements continuent de fonctionner.Elles se voient avant les manifestations
Elles se répondent
Trois réponses — je serai là / peut-être / je ne peux pas — parce qu'un parent qui ne sait pas encore n'est ni un présent ni un absent, et qu'une assemblée générale se prépare avec des chiffres honnêtes. Une réponse par personne (contrainte d'unicité en base), modifiable, retirable en recliquant dessus. L'onglet « Bénévoles » d'une réunion devient « Présences » et liste qui vient, qui hésite et qui s'excuse.
Répondre exige une session : on répond pour soi, jamais au nom d'un autre. La route refuse aussi de noter une présence sur un événement ordinaire — là, ce sont les créneaux de bénévoles.
Côté saisie
Le formulaire d'événement s'ouvre sur un choix en deux cartes (un événement / une réunion). En mode réunion, la billetterie et la description publique disparaissent — sans objet — et le sous-titre rappelle que rien n'ira sur le site public.
Vérifications
Migration
0019_meetings: colonneevents.kind(défautevent, donc tout l'existant reste un événement) et tablemeeting_attendance.🤖 Generated with Claude Code
https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
Generated by Claude Code