đź“… Prise en charge de la synchronisation du flux iCal dans le plugin Calendrier Discourse (Importation depuis des URL .ics)

J’ai reconstruit avec succès mon instance Discourse🥲


Le plugin officiel discourse-calendar de Discourse prend déjà en charge l’exportation .ics, ce qui est extrêmement utile pour partager des événements Discourse en externe. Cependant, de nombreuses communautés — en particulier dans l’éducation, le gouvernement ou les entreprises — s’appuient sur des flux iCal externes pour publier des informations sur les événements (par exemple, depuis Moodle, Office365, Google Calendar ou des plateformes CMS institutionnelles).

À l’heure actuelle, il n’existe aucun moyen intégré d’importer ou de synchroniser à partir de sources .ics. Cela limite l’utilisation de Discourse comme un véritable hub de calendrier pour les communautés qui publient déjà des calendriers importants ailleurs.


:sparkles: Proposition de fonctionnalité

Ajouter la synchronisation des flux iCal (importation depuis des URL .ics) au plugin Discourse Calendar.

:white_check_mark: Fonctionnalités de base

  • Configurer une URL de flux .ics pour une catĂ©gorie ou un sujet activĂ© pour le calendrier.
  • Importer automatiquement les Ă©vĂ©nements dans le calendrier, en correspondance avec le flux .ics.
  • SpĂ©cifier un intervalle de synchronisation (par exemple, horaire, quotidien) ou permettre un bouton manuel « Synchroniser maintenant ».
  • Utiliser le champ UID de l’évĂ©nement pour Ă©viter les doublons et mettre Ă  jour proprement les Ă©vĂ©nements modifiĂ©s.

:wrench: Configurations optionnelles

  • Étiqueter ou marquer les Ă©vĂ©nements importĂ©s pour afficher leur source externe.
  • Choisir entre :
    • Synchronisation unidirectionnelle (externe → Discourse uniquement),
    • ou synchronisation bidirectionnelle (la modification des Ă©vĂ©nements synchronisĂ©s dans Discourse renvoie les modifications — portĂ©e future).
  • Prise en charge de plusieurs flux .ics par calendrier, fusionnĂ©s en une seule vue.
  • Indication visuelle qu’un Ă©vĂ©nement est synchronisĂ© de l’extĂ©rieur (par exemple, « SynchronisĂ© depuis : outlook.university.edu »).

:teacher: Cas d’utilisation

Secteur Cas d’utilisation exemple
Éducation Remplir automatiquement les forums étudiants avec les dates de trimestre, les horaires de cours, les examens, etc.
Gouvernement Synchroniser les événements officiels du CMS ou de l’intranet vers un calendrier communautaire public
Entreprises Mettre en miroir les calendriers de réunion internes (depuis Outlook ou Google Calendar)
Forums d’événements Intégrer les listes d’intervenants ou les calendriers de sessions des fournisseurs externes

:locked_with_key: Sécurité et confidentialité

  • Les flux de calendrier pourraient prendre en charge un accès public ou tokenisĂ© (par exemple, URL contenant un jeton secret).
  • La prise en charge de OAuth2 / Basic Auth pourrait ĂŞtre une amĂ©lioration future.

:paperclip: Connexe

  • discourse-calendar
  • L’exportation .ics est dĂ©jĂ  prise en charge — excellent prĂ©cĂ©dent !
  • Besoin similaire discutĂ© dans d’anciens fils, par exemple, ici

:counterclockwise_arrows_button: Compatibilité

Cette fonctionnalité ne nécessiterait pas discourse-events (maintenant obsolète) et fonctionnerait nativement avec la syntaxe existante de Discourse Calendar ([calendar] et [event]). Les utilisateurs pourraient toujours créer manuellement des événements Discourse natifs — la synchronisation iCal augmenterait simplement ces calendriers.


J’aimerais savoir si cette fonctionnalité est déjà prévue — ou si d’autres membres de la communauté la trouveraient utile.

Merci !

5 « J'aime »

@Ethsim2 Ce serait une fonctionnalité énorme, et j’ai examiné sa faisabilité maintenant que Discourse passe à FullCalendar.

@sam a récemment mis un lien direct vers fullcalendar.io, et il s’avère que FullCalendar a maintenant une prise en charge de premier ordre des flux .ics via son système de plugins officiel — le gros du travail est donc déjà fait par la bibliothèque.


:rocket: Proposition : Activer la synchronisation des flux .ics en utilisant la prise en charge native de FullCalendar

Avec l’intégration prochaine de FullCalendar v6 dans Discourse, les bases sont en place pour prendre en charge cette fonctionnalité nativement.

Le plugin @fullcalendar/icalendar de FullCalendar (avec ical.js en arrière-plan) vous permet de charger des flux .ics publics comme ceci :

new Calendar(calendarEl, {
  plugins: [dayGridPlugin, iCalendarPlugin],
  events: {
    url: 'https://example.com/my-calendar.ics',
    format: 'ics'
  }
});

Il suffit de cela pour afficher un flux iCal distant dans l’interface utilisateur du calendrier — pas d’analyse personnalisée, juste du plug-and-play.


:hammer_and_wrench: Étapes d’implémentation suggérées pour Discourse

  1. Ajouter @fullcalendar/icalendar et ical.js au plugin (une fois que FullCalendar v6 sera entièrement intégré).
  2. Ajouter un paramètre d’administration/plugin (ou une option par catégorie) pour saisir une ou plusieurs URL .ics.
  3. Côté client, afficher le flux dans la vue calendrier.
  4. (Optionnel) Implémenter une synchronisation côté serveur qui :
    • RĂ©cupère pĂ©riodiquement le flux
    • Analyse les Ă©vĂ©nements nouveaux/mis Ă  jour
    • CrĂ©e ou met Ă  jour les sujets Discourse associĂ©s

:counterclockwise_arrows_button: Fréquence de synchronisation

Il est important de noter que la gestion par défaut des .ics de FullCalendar ne récupère le flux qu’au chargement initial du calendrier dans le navigateur. Cela signifie :

  • Il n’y a pas de rafraĂ®chissement quotidien ou automatique.
  • Les utilisateurs verront une copie obsolète Ă  moins de recharger ou de dĂ©clencher manuellement un rafraĂ®chissement.
  • Il n’y a pas de persistance — si un utilisateur navigue ailleurs, les donnĂ©es du flux sont perdues.

Pour que cela soit vraiment utile, Discourse devrait idéalement :

  • ExĂ©cuter un travail Sidekiq quotidien (ou planifiĂ©) qui rĂ©cupère le flux cĂ´tĂ© serveur.
  • Mettre en cache les Ă©vĂ©nements analysĂ©s pour un affichage cohĂ©rent entre les utilisateurs.
  • Lier Ă©ventuellement les Ă©vĂ©nements aux sujets ou en crĂ©er de nouveaux pour une intĂ©gration complète.

Cela permettrait un comportement de synchronisation approprié et redonnerait vie à une fonctionnalité clé précédemment gérée par le plugin d’Angus — mais en utilisant une base propre et maintenable.


:white_check_mark: Avantages

  • Intègre de manière transparente les flux .ics de Google Agenda, Outlook, iCal, etc.
  • Fait de Discourse un consommateur de calendrier, pas seulement un exportateur.
  • IdĂ©al pour les forums communautaires, les groupes d’étudiants, les Ă©vĂ©nements civiques, etc.
  • Entièrement basĂ© sur les fonctionnalitĂ©s prises en charge de FullCalendar — un minimum de JavaScript personnalisĂ© est nĂ©cessaire.

J’aimerais beaucoup voir cela se concrétiser maintenant que le plugin de calendrier retient à nouveau l’attention. Je suis heureux d’aider à le tester ou à contribuer à une preuve de concept.

Désolé @Halden42, mais votre message me laisse un peu perplexe.

Je comprends que Discourse « répare les fondations » du système de calendrier avec la mise à niveau de FullCalendar, mais je m’inquiète du temps qu’il me faudrait pour remplir manuellement un calendrier chargé. J’utilise l’interface graphique de Discourse tous les jours pour tout, et devoir dupliquer du contenu en dehors de l’interface est inacceptable.

J’ai remarqué que vous mentionniez une fonctionnalité qui me manque vraiment dans le plugin d’Angus, qui, je pense, résume le point principal de la synchronisation des événements dans Discourse :

Cette partie serait essentielle pour mon cas d’utilisation.

Mais je suis préoccupé car vous n’avez pas donné de détails sur la façon dont cela pourrait être mis en œuvre. Pourriez-vous expliquer à quoi cela ressemblerait en pratique ? Discourse créerait-il un sujet par événement ? Prendrait-il en charge les mises à jour ou les suppressions si le calendrier source change ?

C’est la partie sur laquelle je devrais le plus compter, et je ne suis pas encore sûr de la proximité de sa réalisation.

Merci encore pour votre réponse détaillée.

2 « J'aime »

Merci @Ethsim2 — c’est une excellente question de suivi, et je pense que votre préoccupation est la bonne : il ne s’agit pas seulement d’afficher les événements d’un flux .ics, mais de les intégrer dans Discourse d’une manière utile et traçable.

Quand j’ai dit « lier les événements aux sujets ou en créer de nouveaux », j’imaginais une configuration similaire à celle du plugin d’Angus — où chaque événement du flux correspondrait à un sujet sur Discourse, et les mises à jour du flux se refléteraient dans le sujet au fil du temps.


Actuellement, FullCalendar seul ne conserve pas les événements — il les affiche simplement à partir du flux lors du chargement de la page. Ainsi, si un événement disparaît du flux (c’est-à-dire qu’il a été annulé ou supprimé en externe), il disparaît simplement discrètement de l’interface du calendrier.

Mais ce n’est pas suffisant pour la plupart des flux de travail basés sur des forums, surtout lorsque les publications d’événements sont utilisées pour la discussion, les RSVP ou les annonces.


Voici ce que je proposerais pour cela :

Au lieu de supprimer le sujet lorsqu’un événement disparaît du flux, Discourse pourrait :

  • Conserver le sujet en place
  • Ajouter une ligne en haut comme :
    ⚠️ Cet événement a été annulé ou supprimé du calendrier source.
  • Verrouiller ou retirer le sujet en option, selon la prĂ©fĂ©rence de l’administrateur

Cela préserverait le contexte, permettrait les réponses et rendrait l’annulation visible — sans rien supprimer. Techniquement, c’est tout à fait réalisable : il suffirait de signaler que l’UID n’existe plus dans le fichier .ics et de mettre à jour le statut du sujet correspondant.


Donc oui — bien que FullCalendar lui-même ne gère pas ce statut, Discourse pourrait le gérer au niveau de la synchronisation. Le travail qui récupère le flux (par exemple, via Sidekiq) garderait une trace des événements qui existaient auparavant et qui n’existent plus, et marquerait le sujet correspondant en conséquence.

Si suffisamment de personnes sont intéressées par cela, je pense que nous pourrions établir un cahier des charges approprié. Il ne serait pas difficile de créer un prototype.

1 « J'aime »

Merci pour votre réponse réfléchie @Halden42 — cela clarifie beaucoup de choses.

Ce que vous avez décrit ici…

…est exactement le cas d’utilisation principal que j’essaie de retrouver depuis que j’ai abandonné le plugin d’Angus. Pour moi, la partie la plus critique n’est pas seulement de rendre les événements visuellement, mais de synchroniser un calendrier externe en direct dans le forum, où chaque événement a un sujet, et les changements apportés à cet événement (par exemple, annulation, report) sont reflétés dans ce sujet au fil du temps.

Je serais satisfait d’un modèle de synchronisation unidirectionnelle pour commencer — lecture seule de .ics vers Discourse — et même une simple détection de mises à jour couvrirait 90 % de mes cas d’utilisation. Un statut « annulé » affiché dans le sujet de l’événement s’il est supprimé du flux serait également idéal, plutôt que de supprimer le sujet directement.

S’il y a un endroit préférable pour proposer une spécification pour cela — peut-être une fois que la mise à niveau de FullCalendar sera stabilisée — je serais très intéressé à contribuer ou à tester.

Merci encore.

1 « J'aime »

Nous maintenons plusieurs calendriers Office 365 — chacun avec son propre flux .ics — pour différents types de réunions : Comité exécutif, Sessions d’engagement public, Groupes de travail internes, etc. Ces flux sont déjà bien structurés et régulièrement entretenus par les greffiers et les équipes d’administration.

Ce dont nous avons urgemment besoin, c’est d’un moyen de :

  • S’abonner Ă  diffĂ©rents flux .ics par catĂ©gorie (par exemple, un flux par type de rĂ©union)
  • CrĂ©er automatiquement un nouveau sujet dans la catĂ©gorie Discourse correspondante
  • Valider que le sujet se retrouve dans la catĂ©gorie correcte, de la mĂŞme manière que le plugin d’Angus nous permettait de filtrer par tags ou autres mĂ©tadonnĂ©es
  • ReflĂ©ter les changements (heure, titre) dans le sujet si l’évĂ©nement du calendrier est mis Ă  jour
  • Optionnellement signaler ou fermer le sujet si l’évĂ©nement est annulĂ© ou supprimĂ© du flux

Pour les conseils comme le nôtre, les catégories sont utilisées pour gérer la visibilité granulaire — certaines réunions sont privées (par exemple, exécutives ou de planification), d’autres sont publiques. Un sujet mal classé pourrait entraîner l’exposition de données sensibles, la validation au niveau de la catégorie est donc indispensable.

Nous aimerions voir quelque chose comme cela pris en charge officiellement dans la refonte à venir de FullCalendar. Cela réduirait considérablement le travail manuel et rendrait Discourse beaucoup plus viable en tant que source unique de vérité pour la coordination et la transparence des réunions.

Je suis étudiant en pharmacie aux États-Unis, et notre université fournit tous nos calendriers de stages, examens et travaux pratiques via un portail de calendrier. Les URL des flux ne se terminent pas par .ics, mais lorsque je les ouvre dans Chrome, elles téléchargent immédiatement un fichier .ics valide. Ce sont donc définitivement des flux iCal standard, juste avec une structure d’URL différente.

Jusqu’à récemment, j’utilisais le plugin d’Angus, et il gérait parfaitement ces flux. Chaque événement générait un sujet, et je pouvais acheminer différents flux vers différentes catégories (par exemple, « Thérapeutique », « Stages », « Examens »), ce qui aidait notre groupe d’étude à rester organisé.

Mais depuis que la récente erreur this.router a cassé le plugin, j’ai dû le désactiver — comme Ethsim2 — et il n’y a plus de moyen simple de garder notre calendrier synchronisé.

Si le plugin officiel pouvait prendre en charge :

  • Les flux .ics entrants (mĂŞme si l’URL ne se termine pas par .ics)
  • La crĂ©ation de sujets avec ciblage de catĂ©gorie
  • La configuration spĂ©cifique au flux (par exemple, un flux → une catĂ©gorie)
  • La dĂ©tection des mises Ă  jour et la gestion optionnelle de l’annulation des Ă©vĂ©nements

…cela ferait de Discourse un outil puissant pour la collaboration académique. Cela fonctionnait parfaitement pour nous avant que le plugin ne casse — j’aimerais donc beaucoup voir cette fonctionnalité intégrée nativement.

Je suis heureux de partager une URL de calendrier d’exemple en privé si cela peut aider aux tests.

Cela s’applique également aux flux Office 365, je comprends que de nombreuses universités aux États-Unis utilisent cet écosystème.

oui j’utilise cet écosystème :+1:

2 « J'aime »

non répertorié car il s’agissait à l’origine d’un utilisateur et de ses marionnettes. mais les comptes ont été fusionnés et maintenant le sujet est déroutant car l’utilisateur semble poster d’un compte à l’autre avec lui-même.