Это SQL-версия отчёта панели управления по не принятым политикам.
Для работы этого отчёта необходимо включить плагин Discourse Policy.
Этот отчёт панели управления выявляет темы с политиками, которые не были приняты определёнными пользователями. Он помогает администраторам обеспечивать соблюдение пользователями правил публикаций, выявлять тех, кто не принял обязательные политики, обеспечивать выполнение правил форума, управлять обновлениями политик и подтверждать согласие пользователей с руководящими принципами.
SELECT distinct t.id AS topic_id, gu.user_id AS user_id
FROM post_policies pp
JOIN post_policy_groups pg on pg.post_policy_id = pp.id
JOIN posts p ON p.id = pp.post_id AND p.deleted_at is null
JOIN topics t ON t.id = p.topic_id AND t.deleted_at is null
JOIN group_users gu ON gu.group_id = pg.group_id
LEFT JOIN policy_users pu ON
pu.user_id = gu.user_id AND
pu.post_policy_id = pp.id AND
pu.accepted_at IS NOT NULL AND
pu.revoked_at IS NULL AND
(pu.expired_at IS NULL OR pu.expired_at < pu.accepted_at) AND
((pu.version IS NULL AND pp.version IS NULL) OR
(pp.version IS NOT NULL AND pu.version IS NOT NULL AND pu.version = pp.version))
WHERE pu.id IS NULL
Пояснение к SQL-запросу
Этот запрос выполняет следующие операции:
- Выполняет соединения таблиц
post_policies,post_policy_groups,posts,topicsиgroup_usersдля создания списка тем и пользователей, к которым применяются правила публикаций на основе их членства в группах. - Использует левое соединение (LEFT JOIN) с таблицей
policy_usersдля поиска случаев, когда пользователь не принял политику (pu.id IS NULL), обеспечивая учёт только текущих и актуальных подтверждений принятия политики (не отозванных, не истёкших и соответствующих текущей версии политики). - Выбирает уникальные пары
topic_idиuser_id, указывающие на темы с политиками, которые не были приняты определёнными пользователями.
Пример результатов
| topic | user |
|---|---|
| Policy Topic 1 | user_1 |
| Policy Topic 1 | user_2 |
| Policy Topic 2 | user_1 |
| … | … |