Convertir una categoría a privada y añadir usuarios a un grupo específico con acceso

El título podría ser un poco críptico, pero el contexto es convertir una categoría en “privada” pero tener una forma de identificar a todos los usuarios que participaron en ella en un período de tiempo anterior y agregarlos a un grupo para que se pueda configurar como que tienen acceso.

Supongamos que el grupo se puede crear antes de esto.

Lo que actualmente se admite:

  • Crear un grupo
  • Asignar permisos de un grupo a una categoría
  • Alterar los permisos de la categoría

Lo que falta es una forma de decir “asignar estos usuarios a un grupo”, basándose en su interacción en esta categoría en un período de tiempo específico.

¿Quizás hay una consulta o código que pueda ejecutar que pueda identificar a esos usuarios y asignarlos a un grupo?

He utilizado una consulta de Explorador de Datos para averiguar quién participó en un tema basándome en user_actions:

-- [params]
-- int :topic = 3620561


select user_id,
       sum(action_type) actions,
       sum(case action_type when 5 then 1 else 0 end) replies
from user_actions ua
     join users u on u.id = ua.user_id
where target_topic_id = :topic
      and moderator is false
      and admin is false
group by ua.user_id

Eso incluye acciones como respuestas, me gusta, ediciones y menciones. También tengo una consulta que incluye respuestas a encuestas. Esto fue para recopilar clientes potenciales, pero espero que algunas de las personas que hicieron algo además de responder tengan derecho al tema. Definir “participó” podría ser un ejercicio útil.

Para expandir a toda la categoría, únete con topics t on target_topic_id = t.id y añade category_id a la cláusula where. No debería ser difícil definir el plazo basándose en ua.created_at.

2 Me gusta

Gracias @jericson, esto es exactamente lo que estaba buscando.

Supongo que podría alimentar los resultados a una consulta que agregue a todos los usuarios a un grupo.
¿Alguien tiene experiencia haciendo eso? ¿Quizás sea mejor copiar y pegar brutalmente los IDs de usuario y ejecutar una función de Ruby si hay algo disponible?

Esa suele ser mi solución preferida. Pero probablemente tenga más sentido tomar una página de los ejemplos de operaciones masivas y aplicar la cláusula where al objeto User en Rails. (¡Tener un entorno de prueba para un momento como este ayuda!)

Dependiendo de cuántos haya, puede pegar una lista separada por comas en el cuadro Agregar usuarios al grupo, ¿si eso le sirve de algo?

(También hay una Automatización para agregar usuarios a un grupo según una insignia, para la cual podría usar esta SQL como base. Sin embargo, eso podría ser un poco complicado si está satisfecho con la opción de Rails).

1 me gusta

Acabo de traer la aplicación del entorno de staging por esta razón (y también para probar qué se rompe con ember 5 :stuck_out_tongue: )

Lo investigaré en los próximos días, si mi “trabajo real” me lo permite :smiley:

Solo para dejar la consulta completa en caso de que otros la necesiten:

select ua.user_id, u.username, sum(action_type) actions, sum(case action_type when 5 then 1 else 0 end) replies from user_actions ua 
join users u on u.id = ua.user_id
join topics t on target_topic_id = t.id
where ua.created_at > 'YYYY-MM-DD'::date and t.category_id = CATEGORY_ID
group by ua.user_id, u.username;

Simplemente reemplace YYY-MM-DD con su fecha límite y CATEGORY_ID con su ID de categoría.
El resultado mostrará el user_id, username, actions y replies.

¿Puedes indicarme ese script @JammyDodger?

No lo veo en el enlace pegado por @jericson

Puedo extraer una lista de usuarios (serán unos 250).

1 me gusta

Las opciones que sugerí están disponibles en la interfaz de usuario, aunque la segunda requiere el plugin Discourse Automation (aunque es un buen plugin :slight_smile:)

1 me gusta

Lo siento, pero no entiendo cómo eso podría ayudarme.

Tengo una lista de IDs de usuario (o incluso nombres de usuario) y necesito agregarlos a un grupo.
No veo en las automatizaciones actuales un caso de uso que pueda ayudarme. Solo se puede agregar a un grupo según insignias o campos personalizados, pero eso solo significa agregar un paso adicional (agregar una insignia a todos esos usuarios o agregar un campo personalizado a los usuarios y luego agregar un valor a los usuarios específicos que deseo).

¿No hay una función bulk_add_user_to_group o incluso una add_user_to_group que pueda simplemente llamar en un bucle, tal vez?

Sí, sería un poco más complicado hacerlo de esa manera. Pero si tienes una lista corta, puedes exportar los resultados del explorador como un CSV, abrirlo en el bloc de notas y copiar y pegar los nombres de usuario en el cuadro Añadir usuarios:

Es posible que puedas hacerlo con 250 a la vez, aunque no lo he intentado con tantos. Sin embargo, un puñado de lotes debería ser suficiente si no.


También debería ser posible a través de la API utilizando una solicitud PUT al punto final, por ejemplo, /groups/49/members.json (necesitarás tu propio group_id) con una lista de tus nombres de usuario/correos electrónicos.

1 me gusta

Funcionó perfectamente, olvidé que podías agregar varios nombres de usuario a la interfaz de usuario :slight_smile:

Para otros, para exportar el resultado de la consulta psql simplemente ejecuta:

psql
\o /home/discourse/output.txt

<tu consulta aquí>
\o
exit

Ahora en /home/discourse/output.txt tendrás el resultado de la consulta tal como se imprimiría en pantalla.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.