Определение пользователей в нескольких группах с использованием AND вместо OR?

Использование категорий и подкатегорий для отображения контента пользователям по логике «ИЛИ» очень просто: например, если пользователь состоит в группе X или группе Y, он может видеть соответствующую категорию или подкатегорию.
Возможно ли эффективно реализовать логику «И», чтобы пользователь мог видеть категорию или подкатегорию только при условии, что он состоит одновременно и в группе X, и в группе Y?

Наш сценарий использования: у нас есть три уровня доступа. Их проще всего представить как студентов первого, второго и третьего курса. Студенты первого курса видят только контент первого курса, студенты второго курса — контент первого и второго курсов, а студенты третьего курса — весь контент. Это работает отлично.
Мы хотим добавить ещё один уровень: пользователи с уровнем доверия 3 должны получать ранний доступ к определённым событиям и ресурсам.
Сначала я попытался реализовать это, создав незаметные события для разных уровней курсов и отправляя ссылки на эти события пользователям с уровнем доверия 3. Однако любой пользователь, у которого уведомления настроены на отслеживание событий первого, второго или третьего курса, также может мгновенно увидеть эти события, а не только пользователи с уровнем доверия 3.
Другой вариант — создать категорию «Награды для уровня доверия 3» с подкатегориями для первого, второго и третьего курсов. Но ограничить права доступа таким образом невозможно: поскольку группы первого, второго и третьего курсов должны иметь видимость категории, все пользователи этих групп (независимо от уровня доверия) смогут заходить в подкатегории.

Один из очень громоздких способов — экспортировать пользователей с уровнем доверия 3, затем экспортировать пользователей, например, второго курса, объединить их в Excel, найти дубликаты и импортировать этих дублирующихся пользователей в группу с названием вроде «Уровень доверия 3 и второй курс». Это сработает, но потребует значительных ручных усилий каждый раз, а нам нужно выполнять это действие регулярно.

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

Заранее спасибо.

Создание новой группы, содержащей пользователей целевой группы с уровнем доверия 3, — это единственный способ, о котором я могу подумать, чтобы решить эту задачу. В Discourse нет правила «И», которое можно было бы использовать вместе с разрешениями безопасности категорий. Несколько раз поднимался похожий вопрос о создании правила категории, которое исключало бы участников одной или нескольких групп.

Если на вашем сайте доступен плагин Data Explorer, вы можете использовать запрос Data Explorer, который возвращает список всех пользователей целевой группы с уровнем доверия 3. Если у вас не слишком много пользователей, вы сможете скопировать/вставить имена пользователей, полученные из запроса, прямо в форму «Добавить пользователей» группы. Похоже, Discourse обрабатывает добавление имен пользователей, которые уже есть в группе, в эту форму, поэтому, если вы будете запускать запрос периодически, сможете просто постоянно копировать возвращаемые имена пользователей в форму «Добавить пользователей» группы. Обратите внимание, я не уверен, каково максимальное количество имен пользователей, которые можно вставить в форму. Я тестировал это с 80 пользователями, и всё работало без проблем. Также, если вы попытаетесь вставить точную копию списка пользователей в форму «Добавить пользователей», Discourse, похоже, вернет ошибку. Эту ошибку можно игнорировать.

Вот запрос, с которым я это тестировал. Перед запуском запроса вам нужно указать имя группы, например ‘year_2’.

--[params]
-- string :group_name

SELECT u.username
FROM group_users gu
JOIN groups g ON g.id = gu.group_id
JOIN users u ON u.id = gu.user_id
WHERE g.name = :group_name
AND u.trust_level = 3

Возможно автоматизировать описанный выше процесс, запустив запрос Data Explorer через API, а затем используя результаты запроса API для обновления группы. Подробная информация об этом здесь: Запуск запросов Data Explorer через API Discourse. После этого вам нужно будет обновить участников группы через API.

Было бы интересно иметь возможность выполнять некоторые действия непосредственно над результатами запроса Data Explorer. Например, с помощью запроса, возвращающего список имен пользователей, добавлять всех этих пользователей в группу, не проходя через этап копирования/вставки.

Спасибо!
Я ещё не пробовал Data Explorer, но он в моём списке того, что стоит изучить, и это звучит как правдоподобный способ сделать то, что я пытаюсь сделать. Я посмотрю…
Спасибо также за запрос.

Привет @CC_people,
Не уверен, что это вам поможет, но на всякий случай:

Другой вариант — создать пользовательский плагин, который добавлял бы пользователя в специальную группу при выполнении условий.

Просто сообщаю о том, что мы в итоге сделали здесь, на случай, если это будет полезно другим. Кратко: мы экспортируем данные в Excel, используем Excel для определения пользователей, соответствующих нашим критериям «И», а затем массово добавляем этих пользователей в группу.

Мы просили нашего технического специалиста изучить возможность создания пользовательского плагина для выполнения той же задачи, но, похоже, это оказывается немного сложным, поэтому пока мы остаемся при Excel.

Подробнее:

  1. Экспортировать всю базу данных пользователей.
  2. Импортировать в Excel. Использовать функции ISNUMBER и SEARCH для извлечения пользователей из определенной группы на первом листе на второй лист.
  3. Снова использовать ISNUMBER и SEARCH для извлечения пользователей из второй конкретной группы на третий лист.
  4. Массово добавить этих пользователей в соответствующие группы.

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

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

Может, стоит воспользоваться новым скриптом автоматизации «Членство в группе пользователей через значок», чтобы связать это? Особенно если у вас включены пользовательские триггерные значки.