仪表板报告 - 未接受的策略

这是未接受策略的仪表板报告的 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_policiespost_policy_groupspoststopicsgroup_users 表,以根据用户所属的组别,列出受帖子策略约束的主题和用户。
  • 使用左连接(left join)与 policy_users 表进行连接,以查找用户尚未接受策略的情况(pu.id IS NULL),确保只考虑当前且相关的策略接受记录(未撤销、未过期且与策略的当前版本匹配)。
  • 选择不同的 topic_iduser_id 对,表示存在某些用户尚未接受策略的主题。

示例结果

主题 用户
策略主题 1 user_1
策略主题 1 user_2
策略主题 2 user_1