Отчет по панели управления — непринятые политики

Это SQL-версия отчёта панели управления по не принятым политикам.

:discourse: Для работы этого отчёта необходимо включить плагин 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