Convertire una categoria in privata e aggiungere utenti a un gruppo specifico con accesso

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.

2 Mi Piace

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ò)

1 Mi Piace

Ho appena portato l’app dell’ambiente di staging per questo motivo (e anche per testare cosa si rompe con ember 5 :stuck_out_tongue: )

Approfondirò nei prossimi giorni, se il “vero lavoro” me lo permetterà :smiley:

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.

Puoi indicarmi quello script @JammyDodger?

Non riesco a vederlo nel link incollato da @jericson

Posso estrarre un elenco di utenti (saranno circa 250).

1 Mi Piace

Le opzioni che ho suggerito sono disponibili nell’interfaccia utente, anche se la seconda richiede il plugin Discourse Automation (è comunque un buon plugin :slight_smile:)

1 Mi Piace

Mi dispiace ma non capisco come questo possa aiutarmi.

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.

1 Mi Piace

Ha funzionato perfettamente, ho dimenticato che si potevano aggiungere più nomi utente all’interfaccia utente :slight_smile:

Per gli altri, per esportare il risultato della query psql è sufficiente eseguire:

psql
\o /home/discourse/output.txt
<la tua query qui>
\o
exit

Ora in /home/discourse/output.txt avrai il risultato della query così come verrebbe stampato sullo schermo.

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