Converter uma categoria para privada e adicionar usuários a um grupo específico com acesso

O título pode ser um pouco enigmático, mas o contexto é converter uma categoria para “privada”, mas ter uma maneira de identificar todos os usuários que participaram dela no passado \\u003ctimeframe\\u003e e adicioná-los a um grupo para que ele possa ser definido como tendo acesso.

Vamos supor que o grupo possa ser criado antes disso.

O que é atualmente suportado:

  • Criar um grupo
  • Atribuir permissões para um grupo a uma categoria
  • Alterar as permissões da categoria

O que está faltando é uma maneira de dizer “atribuir estes usuários a um grupo”, com base em sua interação nesta categoria em um período específico.

Talvez exista uma consulta ou código que eu possa executar que possa identificar esses usuários e atribuí-los a um grupo?

Usei uma consulta no Data Explorer para descobrir quem participou de um tópico com base em 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

Isso inclui ações como respostas, curtidas, edições e menções. Eu também tenho uma consulta que inclui respostas de enquetes. Isso foi para coletar leads, mas espero que algumas das pessoas que fizeram algo além de responder possam ter uma reivindicação sobre o tópico. Definir “participou” pode ser um exercício útil.

Para expandir para a categoria inteira, junte-se a topics t on target_topic_id = t.id e adicione category_id à cláusula where. Não deve ser difícil definir o período com base em ua.created_at.

2 curtidas

Obrigado @jericson, é exatamente o que eu estava procurando.

Imagino que eu poderia alimentar os resultados para uma consulta que adiciona todos os usuários a um grupo então.
Alguém tem experiência fazendo isso? Talvez seja melhor copiar e colar brutalmente os IDs de usuário e executar uma função Ruby se houver algo disponível?

Essa geralmente é minha solução preferida. Mas provavelmente faz mais sentido usar uma página dos exemplos de operações em massa e aplicar a cláusula where no objeto User no Rails. (Ter um ambiente de teste para um momento como este ajuda!)

Dependendo de quantos existem, você pode colar uma lista separada por vírgulas na caixa Adicionar usuários ao grupo, se isso for útil?

(Também existe uma Automação para adicionar usuários a um grupo com base em um crachá, para a qual você pode usar este SQL como base. Isso pode ser um pouco complicado se você estiver satisfeito com a opção Rails, no entanto)

1 curtida

Acabei de trazer o aplicativo do ambiente de homologação por esse motivo (e também para testar o que quebra com o Ember 5 :stuck_out_tongue: )

Vou investigar nos próximos dias, se o “trabalho de verdade” me permitir tempo :smiley:

Apenas para deixar a consulta completa caso outros precisem:

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;

Apenas substitua YYY-MM-DD pela sua data de corte e CATEGORY_ID pelo seu ID de categoria.
O resultado mostrará o user_id, username, actions e replies.

Você pode me indicar esse script, @JammyDodger?

Não consigo vê-lo no link postado por @jericson.

Posso extrair uma lista de usuários (será em torno de 250).

1 curtida

As opções que sugeri estão disponíveis na interface do usuário, embora a segunda precise do plugin Discourse Automation (é um bom plugin, no entanto :slight_smile:)

1 curtida

Desculpe, mas não entendo como isso poderia me ajudar.

Eu tenho uma lista de IDs de usuário (ou até mesmo nomes de usuário) e preciso adicioná-los a um grupo.
Eu não vejo nas automações atuais um caso de uso que possa me ajudar. Existe apenas a adição a um grupo com base em distintivos ou campos personalizados, mas isso significa apenas adicionar uma etapa adicional (adicionar um distintivo a todos esses usuários ou adicionar um campo personalizado aos usuários e, em seguida, adicionar um valor aos usuários específicos que eu quero).

Não existe uma função bulk_add_user_to_group ou mesmo uma add_user_to_group que eu possa simplesmente chamar em um loop, talvez?

Sim, seria um pouco mais complicado fazer dessa forma. Mas se você tiver uma lista curta, pode exportar os resultados do explorador como um CSV, abrir no bloco de notas e copiar e colar na caixa Adicionar Usuários:

Você pode conseguir fazer 250 de uma vez, embora eu não tenha tentado com tantas. Um punhado de lotes deve cobrir, se não.


Também deve ser possível através da API usando uma requisição PUT para o endpoint eg /groups/49/members.json (você precisará do seu próprio group_id) com uma lista de seus nomes de usuário/e-mails.

1 curtida

Funcionou perfeitamente, esqueci que era possível adicionar múltiplos nomes de usuário à interface :slight_smile:

Para outros, para exportar o resultado da consulta psql, basta executar:

psql
\o /home/discourse/output.txt
\u003cyour query here\u003e
\o
exit

Agora em /home/discourse/output.txt você terá o resultado da consulta como seria impresso na tela.

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