Event Duplicator: duplica eventos/tópicos do calendário para um novo período

:information_source: Resumo Permite que usuários autorizados dupliquem eventos/tópicos de calendário (criados via Discourse Calendar and Events ) em um novo período. Funciona em um único tópico ou em uma série inteira com marcação (por exemplo, todos os tópicos marcados como grand-prix), com uma etapa de revisão para editar as datas propostas antes de confirmar.
:hammer_and_wrench: Link do Repositório GitHub - louking/discourse-event-duplicator: discourse plugin to duplicate events · GitHub
:open_book: Guia de Instalação Como instalar plugins no Discourse

Resumo

Este plugin foi desenvolvido para uma comunidade de clube de corrida cujo calendário é composto principalmente pelos mesmos eventos ocorrendo todos os anos em datas ajustadas. Recriar o tópico de cada evento manualmente a cada temporada significava duplicar o bloco [event ...], corrigir o título e procurar quais já haviam sido refeitos. Isso era tedioso e propenso a erros. O Event Duplicator automatiza esse processo: selecione um evento de origem ou uma série inteira marcada, obtenha uma nova data proposta, revise ou edite-a e confirme.

Veja docs/USAGE.md para um guia completo de uso: quem pode usá-lo, duplicação de uma série versus um único tópico, como funciona a etapa de revisão.

Recursos

  • Duplicação de séries: selecione uma categoria e uma ou mais marcações (por exemplo, grand-prix, signature-race; as correspondências são combinadas com OU e desduplicadas, portanto, um tópico com várias marcações correspondentes aparece apenas uma vez), opcionalmente restrito a um intervalo de datas de origem, e depois revise as datas propostas da próxima ocorrência antes de confirmar.
  • Duplicação de evento único: o mesmo fluxo de revisão e confirmação para um tópico de cada vez, acessado pelo menu de administração do tópico (ícone de chave de fenda).
  • Etapa de revisão editável: cada linha mostra a data de início original ao lado de uma nova data proposta que você pode editar (granularidade de dia), além de um título editável. A data de fim é sempre derivada automaticamente da duração do evento de origem, portanto, não fica dessincronizada com uma data de início editada.
  • Duas estratégias de deslocamento de data plugáveis, selecionáveis por execução com um padrão configurável:
    • Mesma data do calendário: desloca para frente pelo número configurado de meses.
    • N-º dia da semana do mês: preserva, por exemplo, “3º sábado do mês”, mesmo quando o deslocamento cai em um mês diferente.
  • Quantidade de deslocamento configurável: desloca para frente por qualquer número de meses (12, ou seja, um ano, por padrão), não apenas anualmente. Útil para cadências mensais, trimestrais ou outras recorrentes. Pode ser sobrescrito por execução, com um padrão global por meio de uma nova configuração (abaixo).
  • Marcação “Data a definir”: para eventos cuja data real ainda não está definida, marque uma linha. Uma anotação configurável (padrão (data a definir)) é adicionada ao título do tópico e ao nome do evento.
  • Rastreamento de duplicação: impede a duplicação do mesmo evento duas vezes (relevante, pois um tópico pode ter mais de uma marcação de série). Tópicos já duplicados são marcados e desmarcados por padrão na revisão, com uma opção explícita de marcar a caixa novamente para forçar a duplicação. Excluir um tópico duplicado libera automaticamente sua origem para nova duplicação, e restaurá-lo bloqueia-o novamente.
  • Feedback pós-duplicação: linhas duplicadas com sucesso se transformam em um link para o novo tópico diretamente na tabela de revisão. Falhas genuínas são relatadas por linha, em vez de abortar todo o lote.

Requisitos

  • discourse-calendar deve estar instalado e habilitado. Este plugin duplica eventos usando a marcação de postagem [event ...] e o modelo DiscoursePostEvent::Event do próprio discourse-calendar, em vez de criar armazenamento de datas separado.
  • Testado no Discourse 2026.7.0. Não verificado em versões anteriores.

Configuração

Todas as configurações estão em Admin → Settings → Plugins, procure por event_duplicator:

Configuração Padrão Descrição
event_duplicator_enabled desativado Habilita o plugin.
event_duplicator_allowed_groups equipe Grupos (além da permissão normal de criação de tópicos por categoria) autorizados a duplicar eventos. Nota: uma lista vazia significa ninguém, não todos. Adicione o grupo “todos” para abrir completamente essa permissão.
event_duplicator_default_date_strategy Mesma data do calendário Regra padrão de deslocamento de data; pode ser sobrescrita por execução.
event_duplicator_default_shift_months 12 Quantidade padrão de deslocamento, em meses; pode ser sobrescrita por execução.
event_duplicator_tbd_annotation (data a definir) Texto adicionado ao título/nome do evento de um tópico duplicado quando marcado como “a definir” na revisão. Deixe em branco para desativar completamente o recurso de anotação.

A autorização é uma combinação AND de três verificações: permissões normais de categoria do Discourse, participação no grupo event_duplicator_allowed_groups e a permissão do discourse-calendar para criar postagens [event].

Limitações conhecidas

  • A edição de data na etapa de revisão tem apenas granularidade de dia (sem edição de hora). Essa é uma decisão de escopo deliberada: o caso de uso alvo são datas recorrentes de corridas/eventos, não horários.

Código-fonte / problemas

Atualizado em 2026-08-01: a versão v1.1.0 adiciona deslocamento baseado em meses configurável, veja abaixo

4 Curtiram

Ótimo trabalho! E obrigado por compartilhá-lo com os outros. Ele preenche efetivamente uma lacuna na funcionalidade de #calendário-e-eventos.

No entanto, me pergunto se não seria melhor chamá-lo de “Duplicador de Eventos Anuais”, já que não parece ser projetado para duplicações mensais.

Você estaria aberto a estendê-lo para cobrir um caso de uso mensal?

Temos muitos eventos mensais, bimestrais e trimestrais (ou seja, quartais), que ocorrem na Xª segunda-feira (etc.) do mês. Eles contêm uma quantidade significativa de documentação/envios, o que os torna inadequados para o mecanismo principal de eventos recorrentes.

No momento, isso exige bastante trabalho manual, e erros acontecem!!

Devido aos prazos mais curtos, para que isso funcione, provavelmente seria necessário algum tipo de alerta (como uma MP para o proprietário do Tópico +/- administradores) assim que o evento atual for concluído (se estiver marcado).

1 Curtiu

Talvez. Uma possibilidade seria ter uma visualização de eventos duplicados com um controle de “deslocamento (meses)”, cujo valor padrão seria uma nova configuração. É mais ou menos isso que você está procurando?

Adicionei add n months shift support · Issue #19 · louking/discourse-event-duplicator · GitHub para acompanhar isso. Tenho outras tarefas pendentes, então não tenho certeza qual será a prioridade. À primeira vista, no entanto, parece ser uma modificação bastante rápida.

Francamente, tenho menos interesse em fazer essa parte. Se os eventos fizessem parte de uma série (ou seja, fossem marcados de uma determinada maneira), o plugin teria que lembrar qual era o último dos eventos marcados, notar se um novo evento foi marcado no final da série, etc. Acho que as necessidades para essa notificação seriam diversas e não acredito que eu conseguiria cobrir todas as possibilidades.

1 Curtiu

Ótimo, obrigado.

Compreensível! Agora que penso um pouco mais sobre isso, acredito que poderia ser facilmente resolvido com um simples marcador.

@nathank O recurso Shift (months) foi lançado na versão v1.1.0.

A página de revisão agora possui um campo “Shift (months)” ao lado do menu suspenso da regra de Data. O valor padrão é 12, mantendo o mesmo comportamento de antes, mas você pode substituí-lo em cada execução. Há também uma nova configuração de site chamada event_duplicator_default_shift_months caso você queira um padrão diferente para todo o site.

Ele funciona com ambas as regras de data. Uma série mensal ou trimestral que precise de um dia específico da semana ainda recebe o tratamento de “mesmo dia da semana do mês”, apenas no intervalo de meses que você definir, em vez de um ano fixo.

Atualize para a versão v1.1.0 para obtê-lo (reconstrua se o seu app.yml estiver fixado em uma tag específica). A issue #19 tem os detalhes da implementação, caso queira conferir.

Acho que faz sentido atualizar também o primeiro post. Vou fazer isso até amanhã, provavelmente.