カテゴリをプライベートに変換し、特定のグループにアクセス権を持つユーザーを追加する

タイトルは少し分かりにくいかもしれませんが、文脈としては、カテゴリを「プライベート」に変換しつつ、過去の「期間」にそれに参加したすべてのユーザーを特定してグループに追加し、アクセス権を設定できるようにしたいということです。

グループは事前に作成できると仮定します。

現在サポートされていること:

  • グループの作成
  • カテゴリへのグループの権限割り当て
  • カテゴリの権限の変更

不足しているのは、「特定の期間におけるこのカテゴリでのやり取りに基づいて、これらのユーザーをグループに割り当てる」方法です。

それらのユーザーを特定し、グループに割り当てることができるクエリまたはコードはありますか?

user_actionsに基づいてトピックに参加したユーザーを特定するために、Data Explorerクエリを使用しました。

-- [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

これには、返信、いいね、編集、メンションなどのアクションが含まれます。また、投票の回答を含むクエリもあります。これはリードを収集するためのものでしたが、返信以外の何かをした人のうち、トピックに貢献した人がいると予想しています。「参加した」を定義することは、有益な演習になるでしょう。

カテゴリ全体に拡張するには、topics t on target_topic_id = t.idと結合し、where句にcategory_idを追加します。ua.created_atに基づいて期間を定義するのは難しくないはずです。

「いいね!」 2

@jericsonさん、ありがとうございます。まさに探していたものです。\n\n結果をクエリに渡して、すべてのユーザーをグループに追加できると推測しています。\nそのような経験をしたことがある人はいますか?利用可能なものがあれば、ユーザーIDをひたすらコピー&ペーストしてRuby関数を実行する方が良いでしょうか?

それは通常、私が好む解決策です。しかし、一括操作の例からページを引っ張ってきて、RailsのUserオブジェクトにwhere句を適用する方が理にかなっているでしょう。(このような時のためにテスト環境を用意しておくと役立ちます!)

ユーザーが何人いるかによりますが、グループに追加するユーザーのボックスにコンマ区切りのリストを貼り付けることができます。それが役に立つかもしれません。

(また、バッジに基づいてユーザーをグループに追加する自動化もあります。これのベースとしてこのSQLを使用できます。ただし、Railsオプションで問題ない場合は、少し複雑になるかもしれません。)

「いいね!」 1

まさにこの目的のためにステージング環境アプリを導入しました(そして、Ember 5で何が壊れるかのテストもしています :stuck_out_tongue:

「本業」で時間が取れれば、数日中に調査します :smiley:

他の人が必要とする場合のためにクエリを完了させておきます。

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;

YYY-MM-DD をカットオフ日付に、CATEGORY_ID をカテゴリIDに置き換えてください。
結果には、user_id、username、actions、replies が表示されます。

そのスクリプトを教えていただけますか、@JammyDodger

@jericson が貼り付けたリンクには見当たりません。

ユーザーリスト(約250人)を抽出できます。

「いいね!」 1

提案したオプションはUIで利用可能ですが、2番目のオプションには Discourse Automation プラグインが必要です(ただし、良いプラグインです :slight_smile:)。

「いいね!」 1

申し訳ありませんが、それがどのように役立つのか理解できません。

ユーザーID(またはユーザー名)のリストがあり、それらをグループに追加する必要があります。
現在の自動化では、私を助けることができるユースケースが見当たりません。バッジまたはカスタムフィールドに基づいてグループに追加することしかできませんが、それは追加のステップ(それらのすべてのユーザーにバッジを追加するか、ユーザーにカスタムフィールドを追加してから、私が望む特定のユーザーに値を追加する)を意味するだけです。

ループで呼び出すことができるbulk_add_user_to_group関数やadd_user_to_group関数はありませんか?

はい、その方法だと少し複雑になります。しかし、短いリストであれば、エクスプローラーの結果をCSVとしてエクスポートし、メモ帳で開いて、ユーザー追加ボックスにコピー&ペーストすることができます。

一度に250件までできるかもしれませんが、試したことはありません。もしそうでなければ、数回のバッチでカバーできるはずです。


APIを使用して、/groups/49/members.json エンドポイント(独自のgroup_idが必要です)にユーザー名/メールアドレスのリストを含むPUTリクエストを送信することでも可能になるはずです。

「いいね!」 1

完璧に機能しました。UIに複数のユーザー名を追加できることを忘れていました :slight_smile:

他の人のために、psqlクエリ結果をエクスポートするには、次を実行するだけです。

psql
\o /home/discourse/output.txt

<ここにクエリを入力>
\o
exit

これで、/home/discourse/output.txt に、画面に表示されるのと同じ形式でクエリの結果が得られます。

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