📅 Supporta il feed iCal in Discourse Calendar Plugin (Importa da URL .ics)

Ho ricostruito con successo la mia istanza Discourse🥲


Il plugin ufficiale discourse-calendar di Discourse supporta già l’esportazione in formato .ics, estremamente utile per condividere eventi di Discourse esternamente. Tuttavia, molte community — in particolare in ambito educativo, governativo o aziendale — si affidano a feed iCal esterni per pubblicare informazioni sugli eventi (ad esempio da Moodle, Office365, Google Calendar o piattaforme CMS istituzionali).

Al momento, non esiste un modo integrato per importare o sincronizzare da sorgenti .ics. Questo limita l’uso di Discourse come vero e proprio hub di calendari per le community che già pubblicano calendari importanti altrove.


:sparkles: Proposta di Funzionalità

Aggiungere la sincronizzazione dei feed iCal (importazione da URL .ics) al plugin Discourse Calendar.

:white_check_mark: Funzionalità Principali

  • Configurare un URL di feed .ics per una categoria o un argomento abilitato al calendario.
  • Importare automaticamente gli eventi nel calendario, corrispondenti al feed .ics.
  • Specificare un intervallo di sincronizzazione (ad esempio, orario, giornaliero) o consentire un pulsante manuale “Sincronizza ora”.
  • Utilizzare il campo UID dell’evento per evitare duplicati e aggiornare gli eventi modificati in modo pulito.

:wrench: Configurazioni Opzionali

  • Taggare o etichettare gli eventi importati per mostrare la loro origine esterna.
  • Scegliere tra:
    • Sincronizzazione unidirezionale (esterno → Discourse soltanto),
    • o sincronizzazione bidirezionale (la modifica degli eventi sincronizzati all’interno di Discourse ripubblica le modifiche — ambito futuro).
  • Supportare feed .ics multipli per calendario, uniti in un’unica visualizzazione.
  • Indicazione visiva che un evento è sincronizzato esternamente (ad esempio, “Sincronizzato da: outlook.university.edu”).

:teacher: Casi d’Uso

Settore Esempio di Caso d’Uso
Educazione Popolare automaticamente i forum degli studenti con date di semestre, orari dei corsi, esami, ecc.
Governo Sincronizzare eventi ufficiali da CMS o intranet a un calendario della community pubblica
Aziende Rispecchiare calendari di riunioni interne (da Outlook o Google Calendar)
Forum Eventi Integrare elenchi di relatori o calendari di sessioni da fornitori esterni

:locked_with_key: Sicurezza e Privacy

  • I feed del calendario potrebbero supportare l’accesso pubblico o tokenizzato (ad esempio, URL contenente un token segreto).
  • Il supporto per OAuth2 / Basic Auth potrebbe essere un miglioramento futuro.

:paperclip: Correlati

  • discourse-calendar
  • L’esportazione .ics è già supportata — ottimo precedente!
  • Esigenza simile discussa in thread più vecchi, ad esempio qui

:counterclockwise_arrows_button: Compatibilità

Questa funzionalità non richiederebbe discourse-events (ora deprecato) e funzionerebbe nativamente con la sintassi esistente di Discourse Calendar ([calendar] e [event]). Gli utenti potrebbero ancora creare eventi nativi di Discourse manualmente — la sincronizzazione iCal aumenterebbe semplicemente questi calendari.


Mi piacerebbe sapere se questa funzionalità è già in roadmap — o se altri nella community la troverebbero utile.

Grazie!

5 Mi Piace

@Ethsim2 Questa sarebbe una funzionalità enorme e ho approfondito la fattibilità ora che Discourse sta passando a FullCalendar.

@sam ha recentemente collegato direttamente a fullcalendar.io, e si scopre che FullCalendar ora ha un supporto di prima classe per i feed .ics tramite il suo sistema di plugin ufficiale, quindi il lavoro più pesante è già svolto dalla libreria.


:rocket: Proposta: Abilitare la sincronizzazione dei feed .ics utilizzando il supporto nativo di FullCalendar

Con l’imminente integrazione di FullCalendar v6 in Discourse, le basi sono pronte per supportare questa funzionalità in modo nativo.

Il plugin di FullCalendar @fullcalendar/icalendar (con ical.js sotto il cofano) consente di caricare feed .ics pubblici in questo modo:

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

Tutto ciò che serve per visualizzare un feed iCal remoto nell’interfaccia utente del calendario: nessuna analisi personalizzata, solo plug-and-play.


:hammer_and_wrench: Passaggi di implementazione suggeriti per Discourse

  1. Aggiungere @fullcalendar/icalendar e ical.js al plugin (una volta che FullCalendar v6 sarà completamente integrato).
  2. Aggiungere un’impostazione admin/plugin (o un’opzione per categoria) per inserire uno o più URL .ics.
  3. Sul lato client, visualizzare il feed nella vista calendario.
  4. (Opzionale) Implementare la sincronizzazione lato server che:
    • Recupera periodicamente il feed
    • Analizza eventi nuovi/aggiornati
    • Crea o aggiorna argomenti Discourse associati

:counterclockwise_arrows_button: Frequenza di sincronizzazione

È importante notare che la gestione predefinita dei .ics di FullCalendar recupera il feed solo al caricamento iniziale del calendario nel browser. Ciò significa:

  • Non c’è un aggiornamento giornaliero o automatico.
  • Gli utenti vedranno una copia obsoleta a meno che non ricarichino o attivino manualmente un aggiornamento.
  • Non c’è persistenza: se un utente naviga altrove, i dati del feed vengono persi.

Per rendere questa funzionalità veramente utile, Discourse dovrebbe idealmente:

  • Eseguire un job Sidekiq giornaliero (o pianificato) che recupera il feed lato server.
  • Memorizzare nella cache gli eventi analizzati per una visualizzazione coerente tra gli utenti.
  • Collegare facoltativamente gli eventi agli argomenti o crearne di nuovi per una piena integrazione.

Ciò consentirebbe un comportamento di sincronizzazione corretto e riporterebbe in vita una funzionalità chiave precedentemente gestita dal plugin di Angus, ma utilizzando una base pulita e manutenibile.


:white_check_mark: Vantaggi

  • Integra perfettamente i feed .ics da Google Calendar, Outlook, iCal, ecc.
  • Rende Discourse un consumatore di calendari, non solo un esportatore.
  • Ottimo per forum comunitari, gruppi di studenti, eventi civici, ecc.
  • Costruito interamente su funzionalità FullCalendar supportate: JavaScript personalizzato minimo necessario.

Mi piacerebbe vedere questa funzionalità implementata ora che il plugin del calendario sta ricevendo nuovamente attenzione. Sono felice di aiutare a testarla o a contribuire a una proof-of-concept.

Mi dispiace @Halden42 ma sono un po’ confuso riguardo al tuo post.

Capisco che Discourse stia “riparando le fondamenta” del sistema di calendario con l’aggiornamento di FullCalendar, ma sono preoccupato per quanto tempo mi ci vorrebbe per popolare manualmente un calendario fitto di appuntamenti. Uso l’interfaccia grafica di Discourse ogni giorno per tutto, e dover duplicare contenuti al di fuori dell’interfaccia non è un’opzione.

Ho notato che hai menzionato una funzionalità che mi manca molto dal plugin di Angus, che credo colga il punto principale della sincronizzazione degli eventi in Discourse:

Questa parte sarebbe essenziale per il mio caso d’uso.

Ma sono preoccupato perché non sei entrato nei dettagli su come ciò potrebbe essere implementato. Potresti spiegare come apparirebbe in pratica? Discourse creerebbe un argomento per ogni evento? Supporterebbe aggiornamenti o eliminazioni se il calendario di origine cambia?

Questa è la parte su cui dovrei fare più affidamento, e non sono ancora sicuro di quanto ci siamo vicini.

Grazie ancora per la tua risposta dettagliata.

2 Mi Piace

Grazie @Ethsim2 — è un ottimo seguito e penso che la tua preoccupazione sia esattamente quella giusta: non si tratta solo di visualizzare eventi da un feed .ics, ma di incorporarli in Discourse in modo utile e tracciabile.

Quando ho detto “collegare eventi agli argomenti o crearne di nuovi”, immaginavo una configurazione simile a come funzionava il plugin di Angus — dove ogni evento nel feed corrisponderebbe a un argomento su Discourse e gli aggiornamenti al feed si rifletterebbero nell’argomento nel tempo.


Al momento, FullCalendar da solo non memorizza gli eventi — li visualizza solo dal feed al caricamento della pagina. Quindi, se un evento scompare dal feed (cioè è stato cancellato o eliminato esternamente), semplicemente scompare silenziosamente dall’interfaccia del calendario.

Ma questo non è abbastanza buono per la maggior parte dei flussi di lavoro basati su forum, specialmente dove i post degli eventi vengono utilizzati per discussioni, RSVP o annunci.


Ecco cosa proporrei per questo:

Invece di rimuovere l’argomento quando un evento scompare dal feed, Discourse potrebbe:

  • Mantenere l’argomento al suo posto
  • Aggiungere una riga in cima come:
    ⚠️ Questo evento è stato cancellato o rimosso dal calendario di origine.
  • Opzionalmente bloccare o rimuovere l’argomento dall’elenco, a seconda delle preferenze dell’amministratore

Ciò preservarebbe il contesto, consentirebbe risposte e renderebbe visibile la cancellazione — senza eliminare nulla. Tecnicamente, questo è abbastanza fattibile: basterebbe segnalare che l’UID non esiste più nel file .ics e aggiornare lo stato dell’argomento corrispondente.


Quindi sì — mentre FullCalendar da solo non gestisce questo stato, Discourse potrebbe gestirlo a livello di sincronizzazione. Il processo che recupera il feed (ad esempio, tramite Sidekiq) terrebbe traccia di quali eventi esistevano in precedenza e non esistono più, e contrassegnerebbe di conseguenza l’argomento corrispondente.

Se abbastanza persone fossero interessate a questo, penso che potremmo sviluppare una specifica adeguata. Non sarebbe difficile creare un prototipo.

1 Mi Piace

Grazie per la risposta ponderata @Halden42 — questo chiarisce molto.

Ciò che hai descritto qui…

…è esattamente il caso d’uso principale che ho cercato di recuperare da quando ho abbandonato il plugin di Angus. Per me, la parte più critica non è solo la visualizzazione degli eventi, ma la sincronizzazione di un calendario esterno live nel forum, dove ogni evento ha un argomento e le modifiche a quell’evento (ad es. cancellazione, riprogrammazione) si riflettono in quell’argomento nel tempo.

Sarei felice di iniziare con un modello di sincronizzazione unidirezionale — di sola lettura da .ics a Discourse — e anche solo un rilevamento di base degli aggiornamenti coprirebbe il 90% dei miei casi d’uso. Uno stato “cancellato” visualizzato nell’argomento dell’evento se viene rimosso dal feed sarebbe ideale, piuttosto che eliminare l’argomento del tutto.

Se c’è un posto preferito dove proporre una specifica per questo — magari una volta che l’aggiornamento di FullCalendar si stabilizza — sarei molto interessato a contribuire o testare.

Grazie ancora.

1 Mi Piace

Manteniamo diversi calendari di Office 365 — ognuno con il proprio feed .ics — per diversi tipi di riunioni: Comitato Esecutivo, Sessioni di Coinvolgimento Pubblico, Gruppi di Lavoro Interni, e così via. Questi feed sono già ben strutturati e regolarmente mantenuti da impiegati e team amministrativi.

Ciò di cui abbiamo urgentemente bisogno è un modo per:

  • Iscriversi a diversi feed .ics per categoria (ad esempio, un feed per tipo di riunione)
  • Creare automaticamente un nuovo argomento nella categoria Discourse corrispondente
  • Validare che l’argomento finisca nella categoria corretta, simile a come il plugin di Angus ci permetteva di filtrare per tag o altri metadati
  • Riflettere le modifiche (ora, titolo) nell’argomento se l’evento del calendario viene aggiornato
  • Opzionalmente segnalare o chiudere l’argomento se l’evento viene cancellato o rimosso dal feed

Per consigli come il nostro, le categorie vengono utilizzate per gestire la visibilità granulare — alcune riunioni sono private (ad esempio, esecutive o di pianificazione), altre sono pubbliche. Un argomento archiviato in modo errato potrebbe comportare l’esposizione di dati sensibili, quindi la validazione a livello di categoria è un must.

Ci piacerebbe vedere qualcosa di simile supportato ufficialmente nel prossimo overhaul di FullCalendar. Ridurrebbe significativamente il lavoro manuale e renderebbe Discourse molto più valido come unica fonte di verità per il coordinamento e la trasparenza delle riunioni.

Sono uno studente di farmacia negli Stati Uniti e la nostra università fornisce tutti i nostri orari di rotazione, esami e pratiche attraverso un portale del calendario. Gli URL dei feed non terminano con .ics, ma quando li apro in Chrome, scaricano immediatamente un file .ics valido. Quindi sono sicuramente feed iCal standard, solo con una struttura URL diversa.

Fino a poco tempo fa, utilizzavo il plugin di Angus, e gestiva questi feed perfettamente. Ogni evento generava un argomento e potevo instradare feed diversi in categorie diverse (ad esempio, “Terapeutica”, “Rotazioni”, “Esami”), il che aiutava il nostro gruppo di studio a rimanere organizzato.

Ma da quando il recente errore this.router ha interrotto il plugin, ho dovuto disabilitarlo - come Ethsim2 - e ora non c’è un modo semplice per mantenere sincronizzato il nostro calendario.

Se il plugin ufficiale potesse supportare:

  • Feed .ics in entrata (anche se l’URL non termina con .ics)
  • Creazione di argomenti con targeting per categoria
  • Configurazione specifica del feed (ad esempio, un feed → una categoria)
  • Rilevamento degli aggiornamenti e gestione opzionale dell’annullamento degli eventi

…renderebbe Discourse uno strumento potente per la collaborazione accademica. Funzionava perfettamente per noi prima che il plugin si rompesse, quindi mi piacerebbe vedere questa funzionalità implementata nativamente.

Sono felice di condividere un URL di calendario di esempio privatamente se questo aiuta con i test.

questo vale anche per Office 365, capisco che molte università negli Stati Uniti utilizzino quell’ecosistema

sì uso quell’ecosistema :+1:

2 Mi Piace

non in elenco perché originariamente si trattava di un utente e dei suoi sockpuppet. ma gli account sono stati uniti e ora l’argomento è confuso poiché l’utente sembra postare avanti e indietro con se stesso.