El script de automatización Schedule PM con resultados de Data Explorer no envía PMs

Usamos una instancia alojada de Discourse y hacemos uso del plugin de Automatización proporcionado con su gama de scripts y desencadenadores, sin embargo, estamos teniendo problemas para recibir PMs del script ‘Programar PM con resultados del explorador de datos’.
Parece que el desencadenador de Automatización está funcionando y la consulta del explorador de datos se está ejecutando (esta consulta funciona y produce resultados cuando se ejecuta manualmente), sin embargo, no estamos recibiendo ningún PM después de esto. He probado conmigo mismo como destinatario y también con el grupo ‘Admin’, pero en ambos casos no se reciben PMs.

No estoy seguro si me estoy perdiendo algo obvio aquí, pero cualquier ayuda sería apreciada.

1 me gusta

Hola Christian :wave:

¿Ves algo relacionado en /logs?

2 Me gusta

Creo que estoy viendo algo similar:

La consulta del explorador de datos parece haberse ejecutado:

Pero no se entrega ningún PM.

Veo este error en /logs:

Message (5 copies reported)

Job exception: undefined method `to_sym' for nil:NilClass


Backtrace

/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
/var/www/discourse/plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
/var/www/discourse/plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
/var/www/discourse/plugins/discourse-automation/app/jobs/scheduled/discourse_automation_tracker.rb:36:in `run_pending_automation'

También obtengo un error ‘500’ si intento activar la automatización manualmente, y este error (ligeramente diferente) en los registros:

Message (4 copies reported)

NoMethodError (undefined method `to_sym' for nil:NilClass)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'

Vamos a moverlo a Bug y veamos si alguien puede echarle un vistazo. :+1:

2 Me gusta

Tras un poco más de investigación, creo que puede estar relacionado con el tipo de consulta que intentas ejecutar. Acabo de intentarlo con una muy simple y he conseguido que funcione y envíe un mensaje privado. ¿Podrías compartir tu consulta?

1 me gusta

Gracias por investigar esto.
La consulta no es totalmente simple y se ve así:

WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT 
  t.id, 
  t.title, 
  t.created_at, 
  t.last_posted_at, 
  t.views, 
  t.posts_count, 
  t.user_id, 
  t.last_post_user_id
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Como digo, se ejecuta manualmente y produce resultados.

1 me gusta

Por “manualmente”, ¿te refieres a activar la consulta desde el explorador de datos o a activar el script desde el complemento de automatización?

1 me gusta

Desde el explorador de datos.

1 me gusta

Creo que tiene que ver con la magia de estilo user_id que hace el explorador de datos al convertirlos de IDs simples a enlaces utilizables. Si ejecuto tu informe tal como está, da error como estás viendo, pero si elimino tanto t.user_id como t.last_post_user_id del SELECT, sí funciona.

Si los convierto en nombres de usuario simples, también parece funcionar correctamente a través de la automatización:


WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT
  t.id,
  t.title,
  t.created_at,
  t.last_posted_at,
  t.views,
  t.posts_count,
  us.username,
  u2.username
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
JOIN users u2 ON u2.id = t.last_post_user_id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Aunque también hemos contactado a alguien más experto para que lo revise con más detalle. :+1: :slight_smile:


Aunque por separado, no estoy seguro de que tu consulta haga lo que quieres. ¿Está relacionada de alguna manera con la Solución, ya que veo muchos PM en mis resultados?

3 Me gusta

Gracias, lo intentaré con cambios en el ID de usuario.

Originalmente no escribí esta consulta, así que aún no he determinado si nos da lo que queremos de todos modos, así que probablemente la reescribiré.

2 Me gusta

Es esta línea: https://github.com/discourse/discourse-data-explorer/blob/705753216cc632b4f6505d2000926ab3b73d8628/lib/result_to_markdown.rb#L20

related = relations.dig(colrender[col_index].to_sym) if col_index < colrender.size

La condición if del final es incorrecta: colrender se supone que es disperso, no empaquetado. Contendrá nulos si algunas, pero no todas, las columnas proporcionan datos de renderizado adicionales.

La comprobación correcta probablemente sería unless colrender[col_index].nil?

Además, este código parece descuidar los tipos de renderizado url, reltime y html porque no son clases de ActiveRecord.

6 Me gusta

Por mi parte, parece que no puedo activar correctamente este script de automatización, sin importar la consulta del explorador de datos. Por ejemplo:

SELECT username from users
LIMIT 10

Error 500 cuando lo activo manualmente desde Automatización:

Mensaje (3 copias reportadas)

TypeError (Nil no es una fuente JSON válida.)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-data-explorer/lib/report_generator.rb:42:in `parse'
plugins/discourse-data-explorer/lib/report_generator.rb:42:in `params_to_hash'
plugins/discourse-data-explorer/lib/report_generator.rb:15:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'
actionpack (7.0.4.3) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.0.4.3) lib/abstract_controller/base.rb:215:in `process_action'
actionpack (7.0.4.3) lib/action_controller/metal/rendering.rb:53:in `process_action'
actionpack (7.0.4.3) lib/abstract_controller/callbacks.rb:234:in `block in process_action'

Env

HTTP HOSTS: discourse.canapin.dev

Estos problemas experimentados deberían solucionarse con esta PR:

4 Me gusta

Este tema se cerró automáticamente después de 2 días. Ya no se permiten nuevas respuestas.