사용자가 새 주제를 생성하면서 태그를 지정할 수 없음 - 태그 목록이 표시되지 않음

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 권한으로 로그인하면 두 가지를 동시에 수행할 수 있습니다. 조언을 주시면 감사하겠습니다.

몇몇 사람들을 당황스럽게 만들었지만, 관리자나 모더레이터는 다른 모든 사용자에게 적용되는 많은 제한 사항을 건너뛸 수 있습니다.

태그에 다른 제한 사항이 있나요? 예를 들어 특정 그룹만 사용할 수 있는 태그 그룹이나, 특정 카테고리의 태그에 설정한 제한 사항 등이 있습니다.

태그 페이지로 가서 태그 렌치 아이콘(비스태프 사용자의 경우 :information_source:)을 클릭하면, 설정한 추가 제한 사항을 추적하는 데 도움이 될 수 있는 더 많은 정보를 볼 수 있습니다. 예를 들어 메타 사이트의 broken 태그:

주제를 생성하고 태그를 지정할 때 Discourse가 trust_level_0과 trust_level_1의 조합을 제대로 처리하지 못하고 있을 수도 있나요?

여기에 trust_level_1을 추가해야 하나요:

그리고 이 줄에 trust_level_0을 추가해야 하나요:

trust_level_1에 속하는 모든 사용자는 기본적으로 trust_level_0에도 속합니다.

사이트 설정에 따라 TL0 사용자에게도 주제 생성 권한을 부여하는 것이 좋습니다. 많은 사용자가 질문을 하려고 가입한 후, 왜 주제 생성이 불가능한지 혼란을 겪고 포기할 수 있기 때문입니다.

하지만 이 설정이 현재 겪고 계신 문제를 설명하지는 못할 것 같습니다.

이 문제가 해당 사용자에게만 발생하는 건가요? 다른 사용자들은 주제를 성공적으로 태그할 수 있나요?

태그를 어떻게 설정했는지 더 자세한 정보를 제공해 주실 수 있을까요?

@HAWK 님이 말씀하신 대로, trust_level_one에 있는 사용자는 기본적으로 trust_level_0에도 포함되므로, 이 부분이 제게는 혼란스럽습니다. 이 문제를 겪는 사용자는 저를 포함해 여러 명 있습니다. 우리가 필요한 카테고리에서 사용할 수 있는 태그들을 확인해 보았습니다.

@JammyDodger 님, 제 태그 설정에서 어떤 부분을 확인해 보면 좋을까요?

태그는 매우 유연하며 다양한 방식으로 설정할 수 있으므로, 보다 구체적인 제안을 드리기 위해 태그 설정 방식에 대해 좀 더 자세한 정보가 필요할 수 있습니다.

흔한 경우 중 하나는 특정 카테고리에 대해 허용된 태그만 사용하도록 설정되어 있고, ‘다른 태그도 허용’ 옵션이 체크되지 않은 경우입니다. 이렇게 되면 해당 카테고리에서 제한된 태그만 사용할 수 있게 되며, 그 태그들이 스태프 전용이라면 다른 사용자는 어떤 태그도 사용할 수 없게 될 수 있습니다.

추가로 말씀드리면 (물론 이미 해결하셨기를 바라지만 :crossed_fingers:), Moin 님이 비슷한 문제에 대해 상세한 문제 해결 게시물을 여기에 남겼습니다:

안녕하세요, @JammyDodger. 직장 업무 때문에 다른 문제들에 얽혀 있었지만, 이 문제는 아직 해결되지 않았습니다. Z

자, 카테고리(Category)는 설정되어 있고, 해당 카테고리의 “태그” 설정에는 다음이 있습니다:

이 태그 그룹을 이 카테고리로 제한: TAG-GRP1, TAG-GRP2

"태그 그룹 관리(Manage Tag Groups)"에 들어가면 다음과 같습니다:

TAG-GRP1:

이름: TAG-GRP1
이 그룹의 태그:  TAG-GRP1용 내 태그 목록
상위 태그: -
이 그룹에서 주제당 태그 1개 제한 (미선택)

TAG-GRP2:

이름: TAG-GRP2
이 그룹의 태그:  TAG-GRP2용 내 태그 목록
상위 태그: -
이 그룹에서 주제당 태그 1개 제한 (미선택)

태그는 다음 그룹에게만 표시됨: admin, moderators, trust_level_0, trust_level_1

관리자(Admin) 권한으로 주제 생성 시 사용하려는 태그를 확인하면 다음과 같이 표시됩니다:

이 태그는 다음 그룹에 속합니다: . 이 태그는 다음 카테고리에서만 사용할 수 있습니다: TAG-GRP1, TAG-GRP2

이미 "태그 주제 허용 그룹(tag topic allowed groups)"과 "주제 생성 허용 그룹(create topic allowed groups)"에 TL0과 TL1을 설정해 두었습니다. 하지만 일반 사용자(TL1)의 경우 일부 태그를 사용할 수 없습니다.

위에 링크해 드린 문제 해결 게시물을 확인해 보셨나요? 꽤 상세하게 작성되어 있어 올바른 방향을 잡는 데 도움이 될 수 있습니다.

내용을 정확히 복사하신지 확신이 서지 않네요.

참고로, 설정에 TL0과 TL1을 모두 넣을 필요는 없습니다. TL1의 모든 멤버는 동시에 TL0이기도 하므로(예를 들어 TL0을 '모든 등록된 사용자’라고 생각하면 됩니다). TL0만 추가해도 충분합니다. :+1:

추천하신 링크 확인해 볼게요. 감사합니다.

안녕하세요 @JammyDodger, 올려주신 링크에 감사드립니다. 저에게 도움이 될 것 같아서 이미 링크를 확인해 보았는데요, 제 설정은 문제가 없는 것 같고, 해당 게시물에 제시된 권장 사항도 제 생각에 타당하며, 제 설정도 권장 사항대로 되어 있습니다. 또한 카테고리 설정에서 테스트를 위해 Also allow other tags 옵션도 활성화해 보았지만, 불행히도 제 문제는 해결되지 않았습니다.

권한 설정이 변경될 때 무언가를 재시작해야 하는지 궁금합니다.

먼저, 모든 텍스트가 가려진 이미지를 공유하게 되어 죄송합니다. 이해해 주시길 바랍니다.

이것은 태그 이름, 태그 그룹 이름, 그리고 해당 태그가 사용되어야 하는 카테고리입니다. 하지만 일반 사용자로 사용할 수 없습니다. 각 카테고리 이름 옆에 자물쇠 아이콘이 표시되는 것이 정상적인지 알고 싶습니다.

모든 도움과 아이디어에 감사드립니다.

카테고리가 모든 사람에게 공개되지 않은 경우 정상적인 현상입니다.
예를 들어, 제 태그 중 하나입니다. “Test” 옆에 자물쇠가 있는 것을 볼 수 있습니다.


그리고 해당 카테고리의 보안 설정입니다:
image
"모두"에게 “보기” 권한이 없기 때문에 카테고리 배지 옆에 자물쇠 아이콘이 표시됩니다. 이는 해당 카테고리가 공개되어 있지 않음을 의미합니다.

이것이 제가 설명한 문제와 관련이 있을까요?

사용자가 해당 카테고리에 접근할 수 없다면 토픽 생성 시 카테고리를 선택할 수 없게 되며(토픽 생성 시 선택할 수 없다면 ‘허용된 태그’ 구조도 적용되지 않음), 사용자가 해당 카테고리에 접근할 수 있는 그룹에 속해 있습니까?

아직 충돌의 원인이 무엇인지 정확히 파악하지 못했다면, 일부 태그 제한을 제거해 권한 충돌이 정확히 어디서 발생하는지 좁혀 나가는 것이 좋습니다.

데이터 탐색기(Data Explorer) 플러그인을 설치해 두셨나요? 특정 태그에 대한 모든 제한 사항을 보여 주는 쿼리를 하나 만들었습니다. 이거 역시 도움이 될 수 있을 것 같아요. 결과를 공유하고, 출력 결과에서 태그 그룹 이름, 태그 이름, 카테고리 이름을 다른 단어로 대체해 보셔도 좋습니다. 그러면 블랙박스를 비교하는 것보다 조금 더 쉽게 도와드릴 수 있을 거예요.

고맙습니다 @Moin . 네, 맞습니다. Data Explorer 플러그인을 설치해 두었습니다. 또 늦은 답변으로 죄송합니다.

이 쿼리는 제 설정에서 문제를 발견하는 데 도움이 되었습니다. 꽤 오랜 시간 동안 사용하지 않아서 개선할 부분이 있었는지 기억이 나지 않습니다.

태그나 태그 그룹으로 필터링할 수 있습니다

-- [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 버전을 실행 중인 친구에게 같은 쿼리를 시도해 보았더니, 스크립트가 아무 문제 없이 정상적으로 실행되었습니다.

시간 내어 조언해 주셔서 감사합니다.