# 주제 소유자가 공개할 때까지 주제 답글이 보이지 않나요?

**URL:** https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526
**Category:** Feature
**Created:** [3월 16, 2020, 11:08오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526 "2020-03-16T23:08:08Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [3월 16, 2020, 11:08오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/1 "2020-03-16T23:08:08Z")

</div>

제 파트너가 고대 그리스어와 고전 라틴어를 가르치는 교사인데, 몇 년째 수업에서 Discourse를 활용하고 있습니다. 주로 과제를 배포하고 나중에 토론하는 용도로 사용하고 있습니다. 다만, 지금까지는 수업 시간에 종이로 과제를 제출받았습니다.

하지만 코로나 사태로 학교가 휴교에 들어간 이후로는 100% 온라인 수업으로 전환했는데, 과제 제출도 포함됩니다. 그래서 현재 학생들은 모두 이메일로 과제를 보내고 있습니다. 이는 행정 업무가 많이 발생하여 매우 비효율적입니다(솔직히 말씀드리면, 파트너는 이런 행정적인 일에는 좀 약한 편이거든요 ;)).

몇 가지 옵션을 논의하던 중 파트너가 이렇게 말했습니다. “토론 주제(topic)에서 사람들이 제 게시물(즉, 주제 작성자의 게시물)과 자기 자신의 게시물만 볼 수 있게 하면 어떨까? 그러면 과제를 주제로 올리고, 각 학생이 아래에 답을 게시하되 다른 학생들의 답은 볼 수 없게 할 수 있겠네요. 그리고 모든 학생이 과제를 제출하고 토론할 때가 되면, 버튼을 한 번 눌러 '베일’을 걷어내어 주제 내의 _모든_ 게시물을 모든 사람이 볼 수 있게 하고, 서로의 작업을 보고 토론하게 하고 싶습니다.”

정말 훌륭하죠! (그래서 제가 그분을 사랑하는 겁니다.)

이 기능을 위한 플러그인을 만들 생각인데, ‘마법 스위치’(주제가 해결(solved) 상태가 되는 순간 모든 것을 보이게 하는) 기능에는 solved 플러그인을 활용할 계획입니다. 하지만 시작하기 전에 여러분의 의견을 듣고 피드백을 얻고자 합니다. 이 기능을 더 좋게 만들 아이디어도 환영합니다.

이를 효율적으로 구현하는 방법에 대한 힌트나 조언도 매우 환영합니다. 주제를 가져오는 방법이 다양하기 때문에, 학생 한 명이라도 이 기능을 우회하는 방법을 찾으면 모든 것이 무의미해지거든요.

주제와 관련된 모든 것이 `TopicView`를 통해 처리되는 걸까요? `username_filters`를 활용할 수 있을까요? 아니면 유사한 것을 만들어야 할까요? 아니면 guardian이 더 나은 방법일까요?

여러분의 생각을 들려주세요!

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [3월 16, 2020, 11:59오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/2 "2020-03-16T23:59:05Z")

</div>

여기서는 어떤 수준의 보안 보장이 필요한지에 따라 크게 달라지지만, 학생들은 꽤 영리할 것이라고 가정하기 때문에 CSS만 사용하는 솔루션은 작동하지 않을 것입니다.

CSS 솔루션이 작동하지 않는다면, 이 아이들은 아마도 악동일 것이고, 부정 행위를 위해 모든 허점을 찾아낼 가능성이 높습니다.

백도어 `[quote]` 확장이나 기타 온갖 장난이 일어날 수 있습니다. "게시글 보기"에 대한 단순한 패치만으로는 충분하지 않을 수 있습니다.

매우 안전한 방법은 PM(개인 메시지)을 이용하는 것입니다. 학생들이 PM으로 내용을 제출한 후, 완료되면 “클릭” 한 번으로 모든 PM을 해당 주제(topic)로 이동시키면 됩니다. 깔끔하고 … 간단하고 … 안전합니다.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [3월 17, 2020, 2:24오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/3 "2020-03-17T02:24:33Z")

</div>

해결책은 업로드 형태인가요, 아니면 컴포저 텍스트인가요?

업로드인 경우, 새로운 [Secure Media Uploads](https://meta.discourse.org/t/secure-media-uploads/meta/140017)를 사용하고, 사용자 다운로드를 위한 임시 URL 생성 방식을 변경하는 플러그인을 적용하여 스태프에게는 ‘적절한’ URL만 생성되도록 하면 작동할 수 있으며 최소한의 변경 사항이 될 수 있습니다. 주제가 해결/태그 지정/닫힌 후 임시 URL은 일반 상태로 복원되어 모든 사람이 모든 것을 볼 수 있게 됩니다.

제출 내용은 보지 않으면서 누가 제출하는지 볼 수 있다는 점도 좋습니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [3월 17, 2020, 6:29오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/4 "2020-03-17T06:29:15Z")

</div>

피드백과 아이디어를 주셔서 두 분 모두 감사합니다!

> [@sam](#):
>
> 이것을 매우 안전하게 처리하는 방법은 DM(개인 메시지)을 사용하는 것입니다. 학생들이 DM으로 자료를 제출하면, 완료된 후… “클릭” 한 번으로 모든 DM을 해당 토픽으로 이동시킬 수 있습니다. 깔끔하고 … 간단하고 … 안전하죠.

문제는 그녀가 동시에 진행 중인 과제 2~3개씩이 있는 6개의 다른 반을 맡고 있어서, 관리해야 할 과제가 약 15개나 된다는 점입니다. 그래서 아마도 _그렇게_ 쉽지는 않을 것 같습니다.

아니요, CSS만으로는 절대 해결되지 않을 것입니다. 확실합니다. 다만, 매일 문제를 패치하는 상황이 아니라면 이 문제가 한두 번 깨지는 것은 큰 문제가 되지 않을 것입니다.

> [@Falco](#):
>
> 업로드를 사용하면서, 새로운 [Secure Media Uploads](https://meta.discourse.org/t/secure-media-uploads/meta/140017)를 활용하면 됩니다.

정말 멋진 아이디어입니다. 하지만 대부분 작곡(Composer) 텍스트이고, 그녀도 모든 것을 업로드로 강제하고 싶어 하지 않습니다.

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [3월 17, 2020, 7:48오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/5 "2020-03-17T07:48:33Z")

</div>

> [@RGJ](#):
>
> 이렇게 하면 과제를 주제로 게시하고, 모든 학생이 다른 학생들의 답변을 볼 수 없이 아래에 자신의 답변을 게시할 수 있습니다. 그런 다음, 모든 사람이 자신의 작업을 입력하고 논의할 때가 되면, 버튼을 눌러 ‘보이는 것’을 없애고 주제 내의 _모든_ 게시물을 모든 사람에게 표시할 수 있도록 하여, 서로의 작업을 보고 논의할 수 있기를 바랍니다.

이것이 요청 사항이므로 제목을 수정하겠습니다.

직감이 말하건대, 이것은 스포일러 플러그인에 더 가깝고 다른 것은 아닌 것 같습니다. 스포일러는 주제 소유자만 공개할 수 있도록 해야 합니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [3월 17, 2020, 8:03오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/6 "2020-03-17T08:03:49Z")

</div>

스포일러를 구현하는 것은 조금 까다로울 수 있습니다. 그렇게 하면 `/raw` 루트도 보호해야 하니까요.

아래와 같은 방식을 고려해 볼 수 있습니다:

- 교사가 "왜 인도차이나에서 전쟁이 시작되었는가?"라는 과제를 게시합니다.

- 학생은 과제 내용을 자신에게 개인 메시지(PM)로 보낸 뒤, 작성을 마치면 해당 PM의 링크를 주제(토론)에 게시합니다. (장점: 수정이 가능하며, 교사에게 불필요한 알림이 가지 않습니다.)

- 교사는 PM에서 "직접적인 피드백"을 제공할 수 있습니다.

- 모든 채점이 완료되면 교사가 “게시” 버튼을 클릭하면, PM의 원본 콘텐츠가 복사되어 과제 주제에 있는 PM 링크를 대체합니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 17, 2020, 4:59오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/7 "2020-03-17T16:59:55Z")

</div>

사람들이 한 해에 여러 번 이 내용을 문의하며, 답변은 항상 "토픽별 권한을 설정할 수 없습니다"입니다. 이 문제를 해결할 수 있다면 상당한 관심이 있을 것이라고 생각합니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [3월 17, 2020, 5:51오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/8 "2020-03-17T17:51:48Z")

</div>

음, 이 문제는 좀 까다롭네요. `TopicView`와 `PostGuardian`을 좀 손보고 있는데, /raw와 인용된 게시물의 번호를 편집하는 트릭을 포함해서 큰 노력 없이 80% 정도는 달성했습니다. 현재로서는 다음 경로들을 통해 보여서는 안 되는 게시물들을 여전히 볼 수 있습니다:

- 검색
- 사용자 활동
- 다이제스트 이메일

그래서 추가 패치가 필요합니다. 지금은 이 정도밖에 떠오르지 않습니다. 게시물에 접근할 수 있는 다른 방법들에 대한 제안은 환영합니다.

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [3월 17, 2020, 8:48오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/9 "2020-03-17T20:48:15Z")

</div>

> [@pfaffman](#):
>
> 답은 항상 “토픽별 권한을 설정할 수 없습니다.”입니다.

여전히 답은 그대로입니다. 솔직히 말해서, 이 질문을 \_하는 것 자체\_가 질문자가 자신이 무엇을 이루고자 하는지 제대로 생각해보지 않았음을 보여준다고 생각합니다.

다만, 향상된 스포일러 모드는 괜찮다고 생각합니다. 그건 합리적인 것 같습니다.

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [3월 18, 2020, 4:16오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/10 "2020-03-18T04:16:14Z")

</div>

만약 이 기능이 "일반 사용자가 속삭임 게시물을 작성"하는 방식으로 구현된다면 어떨까요?

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [3월 18, 2020, 4:43오전 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/11 "2020-03-18T04:43:40Z")

</div>

누구에게 속삭임인가요? 토픽 소유자라면, 그들을 속삭임에서 강등해야 합니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [3월 23, 2020, 10:28오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/12 "2020-03-23T22:28:49Z")

</div>

아직 마무리해야 할 세부 사항이 몇 가지 있지만, 이제 작동하는 플러그인을 [GitHub - communiteq/discourse-private-replies · GitHub](https://github.com/communiteq/discourse-private-replies) 에 올렸습니다.

플러그인을 설치하고 활성화하면, 주제 소유자(및 스태프)는 각 주제 하단에 **Private Replies** 라는 이름의 추가 버튼이 표시됩니다.

 ![image](https://global.discourse-cdn.com/meta/original/3X/c/8/c893da26ab586764da33013126427bef1a1afd68.png)

이 버튼은 해당 주제의 ‘개인 답글’ 모드를 켜고 끌 수 있습니다.

개인 답글 모드가 활성화되면,

- 주제 소유자는 여전히 모든 게시물을 볼 수 있습니다.
- 다른 모든 사용자는 주제 소유자, 스태프, 그리고 본인이 작성한 게시물만 볼 수 있습니다.

이러한 주제는 주제 상단에 표시되는 배너로 구별할 수 있습니다:

![image](https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/original/3X/5/c/5cffcf7441e20557f6e66f58e495b9351f7c7aad.png)

주제 소유자가 게시물을 공개하기로 결정하면, 주제 하단의 같은 버튼(이제는 'Public Replies’로 표시됨)을 사용하여 Private Replies 모드를 비활성화할 수 있습니다. 그러면 배너가 사라지고 모든 게시물이 모든 사람에게 표시되게 됩니다(물론 카테고리 보안 설정은 준수됩니다).

이 플러그인은 다음과 같은 게시물 내용 조회 방식을 비활성화합니다:

- 주제 보기 (즉, 게시물을 보는 일반적인 방법)
- 사용자 프로필 - 활동
- 검색
- 원본 (`/raw/topic_id/post_id`)

면책 조항 1:

이 플러그인은 누가 주제에 게시물을 올렸는지를 완전히 숨기지 않습니다. 주제 목록의 사용자 아바타는 그대로 유지되며, 주제도 사용자 프로필 - 요약에서 여전히 표시됩니다. 그러나 이 두 가지 모두 게시물 내용을 드러내지 않습니다.

면책 조항 2:

제가 놓쳤을 수 있는 게시물 내용 조회 방식이 있는지 알 수 없습니다. (예를 들어, 다이제스트가 정보를 노출하는지 여부는 아직 테스트해야 합니다.) 제 배우자가 앞으로 몇 주 동안 이 부분을 테스트할 예정이며, 그녀의 학생들이 몇 가지 교묘한 우회 방법을 찾아낼 수 있을 것이라고 의심하지 않습니다. 그런 방법을 알게 되는 대로 즉시 막을 것입니다. 힌트와 팁은 환영합니다!

이번 주 안에 플러그인 카테고리 게시글과 좋은 `README.md`를 작성할 예정입니다. 그 때까지 여러분의 피드백을 듣고 싶습니다!

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [3월 23, 2020, 10:38오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/13 "2020-03-23T22:38:35Z")

</div>

이것이 성능에 어떤 영향을 미칠까요? 많은 서드파티 플러그인이 N+1, N제곱, N세제곱, N의 N승 쿼리를 추가하는 경우가 많습니다. 여기서는 그런 문제를 피할 수 있기를 바랍니다.

또한 전역적으로 항상 비용을 치러야 하는 대신, 해당 토픽별로 활성화할 수 있고 활성화된 토픽 외에는 다른 토픽에 대한 성능 영향이 전혀 없으면 좋겠습니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [3월 23, 2020, 10:46오후 UTC](https://meta.discourse.org/t/topic-replies-invisible-until-topic-owner-decides-to-reveal-them/144526/14 "2020-03-23T22:46:52Z")

</div>

가능한 한 효율적으로 유지하기 위해 최선을 다했습니다. 즉, 최대한 지연 평가(lazy evaluation)를 사용하고, 필터에서 최대한 빨리 탈출하도록 했습니다.

스태프의 사용자 ID나 보호된 토픽의 ID를 캐싱하는 것과 같은 작은 최적화 여지는 분명히 있지만, 첫 버전으로서 꽤 잘 했다고 _생각_합니다. 의견이 다른 분이 있다면, 제 코드를 자유롭게 비판해 주세요.
