用户在创建新主题时无法添加标签 - 标签未被列出

我有一个普通用户,其信任级别为 trust_level_0 和 trust_level_1,并且我有以下设置:

tag topic allowed groups: admins, moderators, staff, trust_level_0
create topic allowed groups: admins, moderators, trust_level_1
create tag allowed groups: admins, moderators, staff

该用户可以创建主题,但在创建主题时无法使用标签。他可以使用标签进行搜索,但在创建主题时未列出这些标签。

我的设置是否不正确?我是否遗漏了什么?使用 staff 或 admin 用户,我可以同时执行这两项操作。感谢任何建议。

2 个赞

这让不少人感到困惑,但管理员和版主可以绕过适用于其他所有人的许多限制。

您是否对您的标签设置了任何其他限制?例如,只有特定用户组才能使用的标签组,或者您在特定类别中对标签设置的任何限制?

如果您转到标签页面并点击标签扳手(非工作人员请点击 :information_source:),它应该会显示更多信息,或许能帮助您追踪您设置的任何额外限制。例如,这里元讨论(meta)上的 broken

2 个赞

Discourse 是否可能在创建主题和标记主题时未能正确处理 trust_level_0 和 trust_level_1 之间的混合?

我应该将 trust_level_1 添加到这里吗:

并将 trust_level_0 添加到这一行:

任何处于 trust_level_1 的人默认也在 trust_level_0 中。

3 个赞

你可能需要允许 TL0 具有创建主题的权限,具体取决于你网站的设置,因为人们通常会注册以提问等,可能会因为不知道为什么不能而感到困惑(可能会因此放弃,未能自己解决)。

但我认为这不足以解释你遇到的问题。

这个问题仅发生在这个用户身上吗?其他人是否也能成功标记主题?

你能提供更多关于你如何设置标签的细节吗?

正如 @HAWK 所说,任何处于 trust_level_one 的用户,默认都属于 trust_level_0,因此这让我感到困惑。这个问题不止一个用户遇到过。我检查了我们需要使用的类别中的标签。

@JammyDodger,你觉得检查我的标签设置时,哪些方面可能会有趣?

1 个赞

标签非常灵活,可以通过多种方式进行配置,因此我们可能需要一些关于您如何设置标签的详细信息,以便提供更具体的建议。

虽然一种常见的情况是当一个类别被设置为仅允许使用某些标签,而且“也允许其他标签”的选项没有被勾选时。这可能限制该类别只能使用被限制的标签,而如果这些标签是仅限员工使用的,这可能会阻止其他人使用任何其他标签。

Just to follow up (though hopefully you’ve already managed to track it down :crossed_fingers:), but Moin gave a thorough troubleshooting post for a similar thing here:

2 个赞

@JammyDodger@HAWK 。我一直在处理工作中的其他问题,但我仍然被这个问题困扰。Z

好的,我有我的分类,在分类的“标签”设置中,我有:

将这些标签组限制到此分类:TAG-GRP1, TAG-GRP2

当我转到“管理标签组”时,我有:

TAG-GRP1:

名称:TAG-GRP1
此组中的标签:TAG-GRP1 的标签列表
父标签:-
限制每个主题从此组中选择一个标签(未选中)

TAG-GRP2:

名称:TAG-GRP2
此组中的标签:TAG-GRP2 的标签列表
父标签:-
限制每个主题从此组中选择一个标签(未选中)

标签仅对以下组可见:admin, moderators, trust_level_0, trust_level_1

当我以管理员身份检查创建主题时想要使用的标签时,我可以看到:

此标签属于以下组:. 它只能在以下分类中使用:TAG-GRP1, TAG-GRP2

我已经将 TL0 和 TL1 添加到“允许标签主题的组”和“允许创建主题的组”中。但是对于普通用户 TL1,我无法使用某些标签。

您查看我上面链接的故障排除帖子了吗?它非常详细,可以帮助您找到正确的方向。

我不确定您是否准确地复制了它?

另外,FYI,没有必要在任何设置中同时包含 TL0 和 TL1,因为所有 TL1 的成员也都是 TL0(可以认为 TL0 是“所有注册用户”)。添加 TL0 就足够了。 :+1:

2 个赞

正在查看您推荐的链接。谢谢。

1 个赞

你好 @JammyDodger ,感谢您发布的链接,我认为它可以帮助我。我已经检查了链接,我认为我的设置是正确的,该帖子中的建议对我来说是有意义的,并且我的设置符合推荐,并且我在类别设置中启用了“也允许其他标签”进行测试,但不幸的是,这并没有解决我的问题。

我想知道在更改权限设置时是否需要重新启动“某些东西”。

首先,请原谅我分享这张图片,上面所有的文字都被遮挡了,希望你能理解。

这些是标签名称、标签组名称以及它应该使用的类别,但我的普通用户无法使用。我想知道每个类别名称旁边都有一个挂锁图标是否正常。

感谢大家的帮助和建议。

当某个类别不是对所有人可见时,这是正常的。
例如,这是我的一个标签。您可以看到“测试”旁边有一个锁:


这些是该类别的安全设置:

“所有人”没有“查看”权限,这就是为什么类别徽章旁边会显示锁图标。它表示该类别不是公开的。

这会不会与我描述的问题有关?

从某种意义上说,如果用户无法访问该类别,那么他们在创建主题时就无法选择它(并且如果他们在创建主题时无法选择它,那么您的‘允许标签’结构也不会生效)。该用户是否属于一个能够访问这些类别的组?

我认为,如果您还没有确定冲突是什么,您可能需要开始移除一些标签限制,看看是否能精确地缩小权限冲突发生的范围。

您是否安装了数据浏览器插件?我创建了一个查询,可以显示标签的所有限制。也许这对您也有帮助。您甚至可以分享结果,并在输出中用其他词替换标签组名称、标签名称和类别名称。这样在帮助您时会比比较黑箱更容易一些。

谢谢你,@Moin。是的,我有。我安装了数据浏览器插件。再次抱歉回复晚了。

这是帮助我发现配置问题的查询。我有一段时间没用了,所以不记得是否有我想改进的地方。

您可以按标签或标签组进行筛选

-- [params]
-- null string :tag_name
-- null string :tag_group

WITH allowed_tags AS (
  SELECT ct.category_id, t.id AS tag_id
  FROM category_tags ct
  JOIN tags t ON t.id = ct.tag_id
  UNION
  SELECT ctg.category_id, tgm.tag_id
  FROM category_tag_groups ctg
  JOIN tag_group_memberships tgm ON tgm.tag_group_id = ctg.tag_group_id
),

restricted_categories AS (
  SELECT c.id, c.name
  FROM categories c
  WHERE c.allow_global_tags = FALSE
    AND (
      EXISTS (SELECT 1 FROM category_tags ct WHERE ct.category_id = c.id)
      OR EXISTS (SELECT 1 FROM category_tag_groups ctg WHERE ctg.category_id = c.id)
    )
),

all_tag_category_combinations AS (
  SELECT t.id AS tag_id, t.name AS tag_name, rc.id AS category_id, rc.name AS category_name
  FROM tags t
  CROSS JOIN restricted_categories rc
  WHERE t.target_tag_id IS NULL
),

not_allowed_tags AS (
  SELECT atcc.tag_id, atcc.category_id, atcc.category_name
  FROM all_tag_category_combinations atcc
  LEFT JOIN allowed_tags al
    ON al.tag_id = atcc.tag_id AND al.category_id = atcc.category_id
  WHERE al.tag_id IS NULL
)

SELECT
  main.id AS tag_id,
  main.name AS tag_name,
  COALESCE(STRING_AGG(DISTINCT syn.name, ', '), '') AS synonyms,

  tg.id AS tag_group_id,
  COALESCE(parent_tag.name, '') AS parent_tag_name,
  CASE WHEN tg.one_per_topic THEN 'true' ELSE '' END AS one_tag_per_topic,

  COALESCE(
    STRING_AGG(
      DISTINCT
      CASE
        WHEN crtg.min_count IS NOT NULL THEN crtg_cat.name || ' (' || crtg.min_count || ')'
        ELSE NULL
      END,
      ', '
    ),
    ''
  ) AS required_in_categories_with_min,

  COALESCE(STRING_AGG(DISTINCT ctg_cat.name, ', '), '') AS tag_group_limited_to_category,
  COALESCE(STRING_AGG(DISTINCT ctags_cat.name, ', '), '') AS tag_limited_to_category,
  COALESCE(STRING_AGG(DISTINCT nat.category_name, ', '), '') AS not_allowed_in_categories,

  CASE
    WHEN COUNT(DISTINCT g.name) > 0 THEN COALESCE(STRING_AGG(DISTINCT g_use.name, ', '), '')
    ELSE ''
  END AS use_limited_to,
  COALESCE(STRING_AGG(DISTINCT g.name, ', '), '') AS view_only_groups

FROM tags AS main
LEFT JOIN tags AS syn ON syn.target_tag_id = main.id
LEFT JOIN tag_group_memberships AS tgm ON tgm.tag_id = main.id
LEFT JOIN tag_groups AS tg ON tg.id = tgm.tag_group_id
LEFT JOIN tags AS parent_tag ON parent_tag.id = tg.parent_tag_id
LEFT JOIN tag_group_permissions tgp ON tgp.tag_group_id = tg.id AND tgp.permission_type = 3
LEFT JOIN groups g ON g.id = tgp.group_id

LEFT JOIN category_required_tag_groups AS crtg ON crtg.tag_group_id = tg.id
LEFT JOIN categories AS crtg_cat ON crtg.category_id = crtg_cat.id
LEFT JOIN category_tag_groups AS ctg ON ctg.tag_group_id = tg.id
LEFT JOIN categories AS ctg_cat ON ctg.category_id = ctg_cat.id
LEFT JOIN category_tags AS ctags ON ctags.tag_id = main.id
LEFT JOIN categories AS ctags_cat ON ctags.category_id = ctags_cat.id
LEFT JOIN not_allowed_tags AS nat ON nat.tag_id = main.id
LEFT JOIN tag_group_permissions tgp_use ON tgp_use.tag_group_id = tg.id AND tgp_use.permission_type = 1
LEFT JOIN groups g_use ON g_use.id = tgp_use.group_id

WHERE
  main.target_tag_id IS NULL AND
  (
    :tag_name IS NULL OR
    LOWER(main.name) LIKE LOWER('%' || :tag_name || '%') OR
    LOWER(syn.name) LIKE LOWER('%' || :tag_name || '%')
  ) AND
  (
    :tag_group IS NULL OR
    LOWER(tg.name) LIKE LOWER('%' || :tag_group || '%')
  )

GROUP BY
  main.id, main.name, tg.id, tg.name, parent_tag.name, tg.one_per_topic
ORDER BY main.name, tag_group_id

@Moin,我在 3.5.0.beta8-dev 版本中尝试了该查询,但它不起作用。我收到了这个错误消息:

PG::QueryCanceled: ERROR:  canceling statement due to statement timeout

我搜索了这个错误,发现我应该增加 statement_timeout,但这是在生产服务器上发生的,我对数据库 PostgreSQL 了解不多。我正在研究如何在不搞砸服务器的情况下使其正常工作。

只是出于好奇,我尝试在另一论坛上与朋友一起运行 3.4.0.beta1-dev 版本的查询,脚本运行正常,看起来效果很好。