Il titolo potrebbe essere un po’ criptico, ma il contesto è convertire una categoria in “privata” ma avere un modo per identificare tutti gli utenti che vi hanno partecipato in passato in un \\u003ctimeframe\\u003e e aggiungerli a un gruppo in modo che possa essere impostato come avente accesso.
Supponiamo che il gruppo possa essere creato in precedenza.
Cosa è attualmente supportato:
Creare un gruppo
Assegnare permessi per un gruppo a una categoria
Modificare i permessi della categoria
Ciò che manca è un modo per dire “assegna questi utenti a un gruppo”, in base alla loro interazione in questa categoria in un periodo di tempo specifico.
Forse esiste una query o un codice che posso eseguire per identificare quegli utenti e assegnarli a un gruppo?
Ho utilizzato una query di Data Explorer per capire chi ha partecipato a un argomento in base a 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
Ciò include azioni come risposte, mi piace, modifiche e menzioni. Ho anche una query che include le risposte ai sondaggi. Questo serviva per raccogliere lead, ma mi aspetto che alcune delle persone che hanno fatto qualcosa oltre a rispondere possano avere un diritto sull’argomento. Definire “ha partecipato” potrebbe essere un esercizio utile.
Per espandere all’intera categoria, unisci con topics t on target_topic_id = t.id e aggiungi category_id alla clausola where. Non dovrebbe essere difficile definire l’intervallo di tempo in base a ua.created_at.
Grazie @jericson, è esattamente quello che stavo cercando.
Immagino che potrei fornire i risultati a una query che aggiunge tutti gli utenti a un gruppo.
Qualcuno ha avuto esperienza nel farlo? Forse è meglio copiare-brutalmente-incollare gli ID utente ed eseguire una funzione ruby se c’è qualcosa di disponibile?
Questa è di solito la mia soluzione preferita. Ma probabilmente ha più senso attingere a esempi di operazioni in blocco e applicare la clausola where all’oggetto User in rails. (Avere un ambiente di test per un momento come questo aiuta!)
A seconda di quanti ce ne sono, puoi incollare un elenco separato da virgole nella casella Aggiungi utenti al gruppo, se può essere utile?
(C’è anche un’automazione per aggiungere utenti a un gruppo in base a un badge, per la quale potresti usare questo SQL come base. Potrebbe essere un po’ complicato se sei soddisfatto dell’opzione Rails, però)
Per completare la query nel caso in cui altri ne abbiano bisogno:
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;
Sostituisci semplicemente YYY-MM-DD con la tua data di riferimento e CATEGORY_ID con il tuo ID di categoria.
Il risultato mostrerà user_id, username, actions e replies.
Le opzioni che ho suggerito sono disponibili nell’interfaccia utente, anche se la seconda richiede il plugin Discourse Automation (è comunque un buon plugin )
Ho un elenco di ID utente (o anche nomi utente) e devo aggiungerli a un gruppo.
Non vedo nelle attuali automazioni un caso d’uso che possa aiutarmi. C’è solo l’aggiunta a un gruppo basata su badge o campi personalizzati, ma ciò significa solo aggiungere un ulteriore passaggio (aggiungere un badge a tutti quegli utenti o aggiungere un campo personalizzato agli utenti e quindi aggiungere un valore agli utenti specifici che desidero).
Non esiste una funzione bulk_add_user_to_group o anche una add_user_to_group che posso semplicemente chiamare in un ciclo, magari?
Sì, sarebbe un po’ più complicato farlo in quel modo. Ma se hai un elenco abbastanza corto, puoi esportare i risultati di Explorer come CSV, aprirlo in Blocco note e copiarli e incollarli nella casella Aggiungi utenti:
Potresti riuscire a farne 250 in una volta sola, anche se non ci ho provato con così tanti. Una manciata di lotti dovrebbe comunque coprirlo, in caso contrario.
Dovrebbe anche essere possibile tramite l’API utilizzando una richiesta PUT all’endpoint ad esempio /groups/49/members.json (avrai bisogno del tuo group_id) con un elenco dei tuoi nomi utente/email.