Преобразовать категорию в приватную и добавить пользователей в конкретную группу с доступом

Заголовок может показаться немного загадочным, но суть задачи заключается в том, чтобы сделать категорию «приватной», но при этом найти способ идентифицировать всех пользователей, которые участвовали в ней в прошлом за указанный , и добавить их в группу, чтобы затем предоставить им доступ.

Предположим, что группа может быть создана заранее.

В настоящее время поддерживается следующее:

  • Создание группы
  • Назначение прав группы для категории
  • Изменение прав доступа к категории

Отсутствует возможность указать «добавить этих пользователей в группу» на основе их взаимодействия в данной категории за определённый промежуток времени.

Возможно, существует запрос или код, который я могу выполнить, чтобы идентифицировать этих пользователей и добавить их в группу?

Я использовал запрос Data Explorer, чтобы определить, кто участвовал в теме на основе 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

Это включает такие действия, как ответы, лайки, правки и упоминания. У меня также есть запрос, который включает ответы на опросы. Это было для сбора потенциальных клиентов, но я ожидаю, что некоторые из тех, кто что-то сделал, кроме ответа, могут иметь отношение к теме. Определение «участия» может быть полезным упражнением.

Чтобы расширить запрос на всю категорию, присоединитесь к topics t on target_topic_id = t.id и добавьте category_id в условие where. Определить временной интервал на основе ua.created_at не должно составить труда.

Спасибо, @jericson, это именно то, что я искал.

Я предполагаю, что можно передать результаты в запрос, который добавит всех пользователей в группу. У кого-нибудь есть опыт выполнения такой задачи? Может быть, лучше просто скопировать и вставить идентификаторы пользователей и запустить функцию на Ruby, если такая имеется?

Обычно я предпочитаю именно такое решение. Но, вероятно, имеет смысл воспользоваться примером из примеров массовых операций и применить предложение where к объекту User в Rails. (Наличие тестовой среды в такой ситуации очень помогает!)

В зависимости от количества пользователей, вы можете вставить список через запятую в поле «Добавить пользователей в группу», если это вам подходит?

(Также существует автоматизация для добавления пользователей в группу на основе бейджа, где вы можете использовать этот SQL как основу. Однако это может оказаться немного запутанным, если вы предпочитаете вариант с Rails).

Я специально поднял staging-среду для этого (а также чтобы проверить, что сломается с 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;

Просто замените YYYY-MM-DD на вашу дату отсечения, а CATEGORY_ID — на идентификатор вашей категории.

В результате будут отображены user_id, username, actions и replies.

Можешь подсказать мне тот скрипт, @JammyDodger?

Я не вижу его по ссылке, которую прислал @jericson.

Я могу извлечь список пользователей (их будет около 250).

Предложенные мной опции доступны в интерфейсе, хотя для второй требуется плагин Discourse Automation (кстати, отличный плагин :slight_smile:)

Извините, но я не понимаю, как это может мне помочь.

У меня есть список идентификаторов пользователей (или даже их имён), и мне нужно добавить их в группу.
В текущих автоматизациях я не вижу подходящего сценария использования. Есть только добавление в группу на основе бейджей или пользовательских полей, но это означает лишь дополнительный шаг (добавление бейджа всем этим пользователям или добавление пользовательского поля пользователям, а затем присвоение значения конкретным пользователям, которых я хочу добавить).

Разве нет функции bulk_add_user_to_group или даже add_user_to_group, которую я мог бы просто вызывать в цикле?

Да, такой способ будет немного более запутанным. Но если у вас есть список небольшой длины, вы можете экспортировать результаты обзора в CSV-файл, открыть его в Блокноте и скопировать и вставить их в поле «Добавить пользователей»:

Возможно, можно обработать сразу 250 записей, хотя я не пробовал с таким количеством. Однако, если нет, то несколько пакетов должны справиться.


Также это можно сделать через API, отправив PUT-запрос на конечную точку, например /groups/49/members.json (вам понадобится ваш собственный group_id), со списком ваших имён пользователей или адресов электронной почты.

Сработало идеально, я забыл, что в интерфейсе можно добавлять несколько имён пользователей :slight_smile:

Для остальных: чтобы экспортировать результат запроса psql, просто выполните:

psql
\o /home/discourse/output.txt
<ваш запрос здесь>
\o
exit

Теперь в файле /home/discourse/output.txt будет результат запроса, как если бы он был выведен на экран.