Error al exportar el archivo de datos del usuario: método 'url' no definido para una instancia de DiscourseDataExplorer::QueryGroup

Divulgación completa: Utilicé ask.discourse para redactar este informe de error tras una conversación. También sé que me debo actualizaciones, pero quería publicar esto mientras aún estaba fresco en mi memoria.

Pude reproducirlo en dos cuentas de usuario diferentes.

Resumen

Solicitar un archivo de datos del usuario (Preferencias → Exportar tus datos → Solicitar archivo) falla para los usuarios que han marcado con un marcador un informe de grupo de Data Explorer. El trabajo en segundo plano Jobs::ExportUserArchive se detiene al generar el CSV de marcadores, por lo que la exportación nunca se completa y no se envía ningún enlace de descarga.

Entorno

  • Versión de Discourse: 2026.8.0-latest.1
  • Data Explorer: incluido con el núcleo (la versión sigue la del núcleo)
  • Autoalojado / alojado: autoalojado
  • Pila Ruby/Rails según la traza de errores: activemodel/activerecord 8.0.5.1, Sidekiq 7.3.10

Pasos para reproducir

  1. Como administrador, crea una consulta de Data Explorer y otorga acceso a un grupo.
  2. En la pestaña Informes del grupo, haz clic en Marcar en la consulta para que se convierta en un informe de grupo marcado.
  3. Como ese mismo usuario, ve a Preferencias → Exportar tus datos → Solicitar archivo.
  4. Observa cómo falla el trabajo (revisa Admin → Registros o los registros de Sidekiq).

Comportamiento esperado

Debería generarse el archivo del usuario y el usuario debería recibir el enlace de descarga, incluidos sus marcadores.

Comportamiento real

El trabajo de exportación lanza una excepción y el archivo falla. La traza de errores muestra que el error ocurre en bookmarks_export, donde el trabajo llama a .url sobre el objeto marcado:

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

Trazas de errores (resumidas a los marcos 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álisis

Los marcadores son polimórficos. El trabajo de exportación llama a bookmarkable.url, lo cual funciona para los tipos de objetos marcables del núcleo (Topic, Post), pero DiscourseDataExplorer::QueryGroup no implementa url, por lo que el trabajo lanza NoMethodError en el primer marcador de este tipo.

Parece que Data Explorer registra los grupos de consultas como marcables (mediante el botón Marcar de informes de grupo), pero el modelo carece del método url (o el trabajo de exportación del núcleo necesita una protección para los tipos de objetos marcables que no proporcionan uno).

Solución sugerida

Implementar un método url en DiscourseDataExplorer::QueryGroup, o hacer que bookmarks_export del núcleo sea defensivo (p. ej., bookmarkable.respond_to?(:url) / rescate por fila) para que un solo tipo de objeto marcabl no compatible no pueda interrumpir toda la exportación.

Solución temporal

Eliminar los marcadores problemáticos (filas en bookmarks donde bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' para el usuario afectado) permite que la exportación se complete.