Falha na exportação do arquivo de dados do usuário: método 'url' indefinido para uma instância de DiscourseDataExplorer::QueryGroup

Divulgação completa: Usei o ask.discourse para redigir este relatório de bug após uma conversa. Além disso, sei que estou atrasado nas atualizações, mas queria postar isso enquanto ainda estava fresco na minha memória.

Consegui reproduzir isso em duas contas de usuário diferentes.

Resumo

Solicitar um arquivo de dados do usuário (Preferências → Exportar seus dados → Solicitar arquivo) falha para usuários que marcaram com um sinalizadores (bookmark) um relatório de grupo do Data Explorer. O job em segundo plano Jobs::ExportUserArchive trava ao gerar o CSV de Sinalizadores, portanto a exportação nunca é concluída e nenhum link de download é enviado.

Ambiente

  • Versão do Discourse: 2026.8.0-latest.1
  • Data Explorer: incluído no núcleo (a versão segue a do núcleo)
  • Auto-hospedado / hospedado: auto-hospedado
  • Pilha Ruby/Rails conforme o backtrace: activemodel/activerecord 8.0.5.1, Sidekiq 7.3.10

Etapas para reproduzir

  1. Como administrador, crie uma consulta no Data Explorer e conceda acesso a um grupo.
  2. Na aba Relatórios do grupo, clique em Sinalizar na consulta para que ela se torne um relatório de grupo sinalizado.
  3. Como esse mesmo usuário, vá para Preferências → Exportar seus dados → Solicitar arquivo.
  4. Observe o job falhar (verifique Admin → Logs ou os logs do Sidekiq).

Comportamento esperado

O arquivo do usuário deve ser gerado e o usuário deve receber o link de download, incluindo seus sinalizadores.

Comportamento real

O job de exportação levanta uma exceção e o arquivo falha. O backtrace mostra que a travamento ocorre em bookmarks_export, onde o job chama .url no objeto sinalizado:

Job exception: undefined method 'url' for an instance of DiscourseDataExplorer::QueryGroup

Backtrace (reduzido aos frames relevantes):

activemodel-8.0.5.1/lib/active_model/attribute_methods.rb:512:in 'ActiveModel::AttributeMethods#method_missing'
activerecord-8.0.5.1/lib/active_record/attribute_methods.rb:495:in 'ActiveRecord::AttributeMethods#method_missing'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:325:in 'block in Jobs::ExportUserArchive#bookmarks_export'
activerecord-8.0.5.1/lib/active_record/relation/delegation.rb:101:in 'Array#each'
activerecord-8.0.5.1/lib/active_record/relation/delegation.rb:101:in 'ActiveRecord::Delegation#each'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:319:in 'Jobs::ExportUserArchive#bookmarks_export'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:170:in 'Kernel#public_send'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:170:in 'block (2 levels) in Jobs::ExportUserArchive#execute'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:168:in 'block in Jobs::ExportUserArchive#execute'

Análise

Os sinalizadores são polimórficos. O job de exportação chama bookmarkable.url, o que funciona para os tipos principais sinalizáveis (Topic, Post), mas DiscourseDataExplorer::QueryGroup não implementa url, então o job levanta NoMethodError no primeiro sinalizador desse tipo.

Parece que o Data Explorer registra grupos de consultas como sinalizáveis (via botão Sinalizar do relatório do grupo), mas o modelo falta o método url (ou o job de exportação principal precisa de uma verificação para tipos sinalizáveis que não forneçam um).

Correção sugerida

Ou implementar um método url em DiscourseDataExplorer::QueryGroup, ou tornar o bookmarks_export do núcleo defensivo (por exemplo, bookmarkable.respond_to?(:url) / resgate por linha) para que um único tipo sinalizável não suportado não possa derrubar toda a exportação.

Solução temporária

Excluir os sinalizadores problemáticos (linhas em bookmarks onde bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' para o usuário afetado) permite que a exportação seja concluída.