Es fácil usar categorías y subcategorías para permitir a los usuarios verlas basándose en la lógica ‘OR’, es decir, si un usuario está en el Grupo X o en el Grupo Y, puede ver la categoría o subcategoría.
¿Es posible usar eficazmente la lógica ‘AND’, de modo que un usuario deba estar en el Grupo X Y en el Grupo Y para poder ver una categoría / subcategoría?
Nuestro caso de uso es que tenemos tres niveles de acceso. Es más fácil pensar en ellos como estudiantes de primer año, estudiantes de segundo año y estudiantes de tercer año. Los de primer año solo pueden ver el contenido de primer año, los de segundo año pueden ver el contenido de primer y segundo año, los de tercer año pueden ver todo el contenido. Funciona muy bien.
Queremos añadir otra capa, recompensando a los usuarios con Nivel de Confianza 3 con acceso anticipado a ciertos eventos y recursos.
Primero intenté hacerlo usando eventos no listados en los diversos niveles de año, y enviando un enlace a esos eventos a los usuarios con Nivel de Confianza 3, sin embargo, cualquiera con notificaciones configuradas para monitorear el Año 1, Año 2 o Año 3 también puede ver instantáneamente esos eventos, no limitado al Nivel de Confianza 3.
Otra forma de hacerlo sería crear una categoría llamada “Recompensas Nivel de Confianza 3”, y tener subcategorías para Año 1, Año 2 y Año 3, pero no es posible restringir los permisos de esta manera; dado que Año 1, Año 2 y Año 3 tienen que tener visibilidad sobre la categoría, de nuevo, todos los usuarios de esos grupos (con cualquier nivel de Confianza) pueden ver en las subcategorías.
Una forma muy torpe de hacerlo sería exportar usuarios con Nivel de Confianza 3, luego exportar usuarios con (por ejemplo) Año 2, fusionarlos en Excel para encontrar duplicados, luego importar esos duplicados en un grupo llamado algo como “Nivel de Confianza 3 y Año 2”. Funcionaría, pero requeriría bastante trabajo manual cada vez, y es una acción que queremos realizar con regularidad.
¿Alguna idea sobre otras formas de lograr el mismo resultado? ¿Podría un complemento o script personalizado al menos automatizar el proceso de exportación e importación?
Crear un nuevo grupo que contenga a los usuarios del grupo de destino que tienen el nivel de confianza 3 es la única forma que se me ocurre para lograr esto. Discourse no tiene una regla Y que se pueda usar con los permisos de seguridad de categorías. Una pregunta similar ha surgido un par de veces sobre la creación de una regla de categoría que excluya a miembros de uno o más grupos.
Si el plugin Data Explorer está disponible en tu sitio, podrías usar una consulta de Data Explorer que devuelva una lista de todos los usuarios del grupo de destino que tienen el nivel de confianza 3. Si no estás tratando con un gran número de usuarios, deberías poder copiar/pegar los nombres de usuario que se devuelven de la consulta directamente en el formulario Añadir Usuarios de un grupo. Discourse parece manejar la adición de nombres de usuario que ya existen en un grupo en ese formulario, por lo que si ejecutas la consulta periódicamente, deberías poder seguir copiando los nombres de usuario que se devuelven en el formulario Añadir Usuarios del grupo. Ten en cuenta que no estoy seguro de cuál es el número máximo de nombres de usuario que se pueden pegar en el formulario. Acabo de probarlo con 80 usuarios y funciona sin problemas. Además, si intentas pegar una lista exacta de duplicados de usuarios en el formulario Añadir Usuarios, Discourse parece devolver un error. Sin embargo, el error se puede ignorar.
Aquí está la consulta con la que he probado esto. Necesitas proporcionar el nombre del grupo, por ejemplo ‘year_2’, antes de ejecutar la consulta.
--[params]
-- string :group_name
SELECT u.username
FROM group_users gu
JOIN groups g ON g.id = gu.group_id
JOIN users u ON u.id = gu.user_id
WHERE g.name = :group_name
AND u.trust_level = 3
Sería posible automatizar el proceso anterior ejecutando la consulta de Data Explorer a través de la API, y luego usando los resultados de la solicitud de la API para actualizar el grupo. Los detalles sobre eso están aquí: Ejecutar consultas de Data Explorer con la API de Discourse. Luego necesitarías actualizar los miembros del grupo a través de la API.
Sería interesante poder realizar algunos tipos de acciones directamente sobre los resultados de una consulta de Data Explorer. Por ejemplo, con una consulta que devuelva una lista de nombres de usuario, añadir todos los usuarios a un grupo sin tener que pasar por el paso de copiar y pegar.
¡Gracias!
No he jugado con Data Explorer, pero está en mi lista de cosas por explorar, y esto suena como una forma plausible de hacer lo que estoy intentando hacer. Le echaré un vistazo…
Gracias también por la consulta.
Solo para informar sobre lo que terminamos haciendo aquí, en caso de que sea útil para otros. En resumen, estamos exportando a Excel, haciendo que Excel determine quién cumple nuestros criterios ‘Y’, y luego agregando masivamente a esos usuarios a un grupo.
Le pedimos a nuestro asistente técnico que investigara un complemento personalizado para hacer lo mismo, pero parece que está resultando un poco complicado, por lo que por el momento nos quedamos con Excel.
Más detalles:
Exportar toda la base de datos de usuarios.
Importar a Excel. Usar ISNUMBER y SEARCH para extraer usuarios de un grupo específico en la primera hoja a una segunda hoja.
Usar ISNUMBER y SEARCH nuevamente para extraer usuarios del segundo grupo específico a una tercera hoja.
Agregar masivamente a esos usuarios a sus grupos apropiados.
Imagino que hay una forma más limpia de lograr el mismo resultado, sin embargo, ahora que está implementado, solo se trata de pegar los datos exportados cada vez e importar los resultados, sin tener que pensar en ello durante el proceso.
Estamos utilizando este sistema para recompensar a los usuarios ‘regulares’ de tl3 con privilegios adicionales y acceso anticipado a cosas, y está teniendo el efecto deseado de fomentar un uso de mayor calidad y mayor cantidad. Así que, éxito, aunque un poco tosco y no automatizado. Tenemos nuestra función de ‘este grupo Y ese grupo’.
Podrías usar el nuevo script de Automatización ‘User Group Membership through Badge’ para vincular esto, ¿quizás? Especialmente si tienes habilitadas las insignias activadas por eventos personalizados.