카테고리를 비공개로 전환하고 특정 그룹에 사용자 추가

제목이 다소 난해할 수 있지만, 맥락은 특정 카테고리를 “비공개”로 전환하되, 과거 기간 동안 해당 카테고리에 참여한 모든 사용자를 식별할 수 있는 방법을 마련하고, 그들을 그룹에 추가하여 접근 권한을 부여하는 것입니다.

그룹은 이 작업을 수행하기 전에 미리 생성할 수 있다고 가정해 보겠습니다.

현재 지원되는 기능:

  • 그룹 생성
  • 그룹에 대한 카테고리 권한 할당
  • 카테고리 권한 변경

누락된 부분은 특정 시간 범위의 카테고리 상호작용을 기반으로 “이 사용자를 그룹에 할당한다”고 지정하는 방법입니다.

해당 사용자를 식별하고 그룹에 할당할 수 있는 쿼리나 코드가 있을까요?

user_actions를 기반으로 어떤 사용자가 주제에 참여했는지 파악하기 위해 Data Explorer 쿼리를 사용했습니다:

-- [params]
-- int :topic = 3620561


select user_id, 
       sum(action_type) actions,
       sum(case action_type when 5 then 1 else 0 end) replies 
from user_actions ua
     join users u on u.id = ua.user_id
where target_topic_id = :topic
      and moderator is false
      and admin is false
group by ua.user_id

이 쿼리는 답변, 좋아요, 수정, 멘션과 같은 행동을 포함합니다. 또한 투표 응답을 포함하는 쿼리도 하나 더 가지고 있습니다. 이는 리드(잠재 고객) 수집을 위한 것이었지만, 답변 이외의 다른 활동을 한 사용자 중에도 해당 주제에 대해 권리를 주장할 수 있는 사람이 있을 것으로 예상됩니다. "참여"를 정의하는 것은 유용한 작업이 될 수 있습니다.

전체 카테고리로 확장하려면 topics t on target_topic_id = t.id와 조인하고 where 절에 category_id를 추가하면 됩니다. ua.created_at을 기준으로 시간 범위를 정의하는 것도 어렵지 않을 것입니다.

jericson님, 감사합니다. 제가 찾던 바로 그 내용이었어요.

결과를 쿼리에 전달해서 모든 사용자를 그룹에 추가할 수 있을 것 같아요.

그렇게 해보신 경험이 있으신 분 계신가요? 혹시 관련 Ruby 함수가 있다면, 사용자 ID를 그대로 복사해서 붙여넣는 것이 더 나은 방법일까요?

보통 제 선호하는 해결책입니다. 하지만 대량 작업 예제에서 페이지를 가져와서 rails에서 User 객체에 where 절을 적용하는 것이 더 합리적일 수 있습니다. (이런 상황에서 테스트 환경이 있으면 도움이 됩니다!)

사용자 수에 따라, 도움이 된다면 ‘Add Users to the group’ 상자에 쉼표로 구분된 목록을 붙여넣을 수 있습니다.

(뱃지 기반으로 사용자를 그룹에 추가하는 자동화 기능도 있습니다. 이 SQL을 기반으로 활용할 수 있지만, Rails 옵션으로 충분하다면 다소 복잡할 수 있습니다)

이유(그리고 에임버 5에서 무엇이 깨지는지 테스트하는 것 :stuck_out_tongue: ) 때문에 스테이징 환경 앱을 방금 가져왔습니다.

"본업"이 시간을 허락해 주는 한, 앞으로 며칠 안에 자세히 살펴볼 예정입니다 :smiley:

혹시 다른 분들이 필요하실 수 있을까 봐 쿼리를 완성해서 남겨 둡니다:

select ua.user_id, u.username, sum(action_type) actions, sum(case action_type when 5 then 1 else 0 end) replies from user_actions ua 
join users u on u.id = ua.user_id
join topics t on target_topic_id = t.id
where ua.created_at > 'YYYY-MM-DD'::date and t.category_id = CATEGORY_ID
group by ua.user_id, u.username;

YYY-MM-DD를 원하는 기준 날짜로, CATEGORY_ID를 해당 카테고리 ID로 교체하면 됩니다.

결과에는 user_id, username, actions, replies가 표시됩니다.

@JammyDodger 님, 해당 스크립트에 대해 알려주실 수 있을까요?

@jericson 님이 붙여넣은 링크에서는 찾을 수가 없네요.

사용자 목록(약 250개)을 추출할 수는 있습니다.

제가 제안한 옵션들은 UI에서 사용할 수 있지만, 두 번째 옵션은 Discourse Automation 플러그인이 필요합니다(좋은 플러그인입니다 :slight_smile:).

죄송하지만 그것이 어떻게 도움이 될지 이해가 되지 않습니다.

사용자 ID 목록(또는 심지어 사용자 이름 목록)이 있고, 이들을 그룹에 추가해야 합니다.
현재 자동화 기능에서 제 상황에 도움이 될 수 있는 사용 사례를 찾지 못했습니다. 현재 제공되는 기능은 배지나 사용자 정의 필드를 기반으로 그룹에 추가하는 것뿐인데, 이는 추가적인 단계(해당 사용자 모두에게 배지를 추가하거나 사용자 정의 필드를 추가한 후 원하는 특정 사용자에게 값을 입력하는 것)를 의미할 뿐입니다.

bulk_add_user_to_group 함수나, 아니면 루프 안에서 호출할 수 있는 add_user_to_group 함수 같은 것이 없나요?

네, 그렇게 하면 약간 더 복잡해지긴 하죠. 하지만 목록이 짧다면 탐색기 결과를 CSV로 내보내고, 메모장에서 연 다음, 사용자 추가(Add Users) 상자에 복사&붙여넣기할 수 있습니다:

한 번에 250개까지 처리할 수 있을 것 같지만, 그 정도 수량으로 직접 테스트해 보진 않았습니다. 그래도 안 되면 몇 번에 나눠서 처리하면 충분할 겁니다.


API를 사용하여 eg /groups/49/members.json 엔드포인트(자신의 group_id가 필요합니다)에 PUT 요청을 보내고, 사용자 이름/이메일 목록을 함께 보내는 것도 가능합니다.

완벽하게 작동했습니다. UI에 여러 사용자를 추가할 수 있다는 걸 잊고 있었네요 :slight_smile:

다른 분들을 위해, psql 쿼리 결과를 내보내려면 다음을 실행하세요:

psql
\o /home/discourse/output.txt
<여기에 쿼리 입력>
\o
exit

이제 /home/discourse/output.txt 파일에 화면에 출력되었을 쿼리 결과가 저장되어 있습니다.