Ответы в теме не видны, пока владелец темы не решит их показать?

Итак, моя вторая половинка — учительница (древнегреческий и классическая латынь), и она уже несколько лет использует Discourse в своих классах. В основном она применяет его для распределения заданий среди студентов и последующего обсуждения. Однако все задания сдаются на бумаге во время уроков.

До сих пор — но теперь, поскольку школы закрыты из-за паники вокруг коронавируса, она переходит на 100% онлайн-обучение, включая сдачу заданий. Так что все эти студенты сейчас отправляют свои работы ей по электронной почте. Это крайне неэффективно, поскольку требует от неё значительных административных усилий (и я могу сказать вам, что она не очень сильна в таких вещах ;)).

Мы обсудили несколько вариантов, и она сказала: «Почему бы мне не создать тему, где люди видят только мои посты (то есть посты автора темы) и свои собственные? Это позволило бы мне публиковать задание как тему, а каждый студент мог бы разместить свой ответ под ней, не видя ответов других. Затем, когда все сдадут работы и наступит время обсуждения, я хочу иметь возможность нажать кнопку, чтобы снять завесу и сделать все посты в теме видимыми для всех, чтобы они могли видеть и обсуждать работы друг друга».

Да — гениально! (Вот почему я её люблю).

Я собираюсь создать плагин для этого, вероятно, используя плагин «solved» для «магического переключения» (делать всё видимым сразу после того, как тема решена). Но прежде чем начать, я хотел бы узнать ваше мнение, получить обратную связь и, возможно, идеи, как сделать это ещё лучше.

Советы и подсказки по эффективной реализации этого тоже были бы очень кстати — ведь существует множество способов получить доступ к теме, и если хотя бы один студент найдёт способ обойти это, всё теряет смысл.

Всё ли, касающееся темы, передаётся через TopicView? Могу ли я использовать username_filters? Или создать что-то похожее на них? Или же guardian — более подходящий вариант?

Слушаю ваши мысли!

18 лайков

Это сильно зависит от требуемых гарантий безопасности, но, учитывая, что студенты, скорее всего, довольно подкованы, решение только на CSS не сработает.

Теперь, если решение на CSS не подходит, и эти ребята, вероятно, будут выискивать любые лазейки, чтобы схитрить.

Могут произойти бэкдоры для разворачивания [quote] и всякие другие проделки. Простого патча «может видеть пост» может оказаться недостаточно.

Очень безопасный способ сделать это — через личные сообщения (ЛС): студенты отправляют материалы через ЛС, а после завершения… одним «кликом» все ЛС перемещаются в тему. Чисто… просто… безопасно.

18 лайков

Это загрузка решений или текст композитора?

Если это загрузки, то с использованием новой функции Безопасная загрузка медиафайлов плюс плагина для изменения способа генерации временных URL-адресов для загрузки пользователями, чтобы создавать «правильные» ссылки только для сотрудников, можно решить задачу с минимальными изменениями. После того как тема будет решена, помечена или закрыта, временный URL вернётся в обычное состояние, и все смогут увидеть всё содержимое.

Также круто, что можно видеть, кто отправляет решения, не просматривая при этом содержимое этих решений.

8 лайков

Спасибо вам обоим за обратную связь и идеи!

Проблема в том, что у неё 6 разных классов, в каждом из которых одновременно выполняются, возможно, 2 или 3 задания, так что в общей сложности ей приходится управлять примерно 15 различными заданиями. Так что, наверное, это не будет таким простым.

Нет, только CSS не сработает, это точно. С другой стороны, это не станет большой проблемой, если это однажды или дважды взломают, главное, чтобы мне не приходилось исправлять уязвимости каждый день.

Это действительно отличная идея. Но в основном это текстовые сообщения в редакторе, и она не хочет обязывать всех использовать только загрузку файлов.

2 лайка

Я изменю заголовок, так как это именно запрос.

Мне кажется, это больше похоже на плагин для спойлеров, чем на что-либо другое. Спойлеры смогут раскрывать только владельцы тем.

4 лайка

Спойлер будет немного сложным, потому что тогда нужно будет защищать и маршруты /raw.

Может быть так:

  • Преподаватель публикует тему «Почему началась война в Индокитае».

  • Студент создаёт личное сообщение самому себе с заданием, а после завершения публикует ссылку в теме. (Преимущество: можно вносить правки, не беспокоя преподавателя)

  • Преподаватель может затем предоставить «прямую обратную связь» в личном сообщении.

  • Когда всё будет оценено, преподаватель нажмёт «Опубликовать», что скопирует исходное содержимое личного сообщения и заменит ссылку на него в теме с заданием.

7 лайков

Люди спрашивают об этом несколько раз в год, и ответ всегда один: «У вас не может быть разрешений для конкретных тем». Если вам удастся это реализовать, я думаю, это вызовет большой интерес.

6 лайков

Что ж, это немного запутанно. Я немного поработал над TopicView и PostGuardian, и это позволяет достичь 80% без особых усилий, включая /raw и трюки с редактированием номеров цитируемых постов. В данный момент я всё ещё могу видеть посты, которые не должен видеть, через:

  • поиск
  • активность пользователей
  • дайджест-письма

Так что требуется ещё немного доработки. На данный момент это всё, что я могу придумать. Предложения по другим способам получения доступа к постам приветствуются.

4 лайка

И это всё ещё правильный ответ. Честно говоря, мне кажется, что даже задавать этот вопрос говорит о том, что человек, который его задаёт, на самом деле не продумал, чего именно он пытается добиться.

Впрочем, я не против расширенного режима скрытия спойлеров — думаю, это имеет смысл.

4 лайка

А что, если это было бы реализовано как «обычные пользователи создают whisper-посты»?

2 лайка

Шёпотом кому? Владельцу темы? Тогда его нужно понизить в правах на уровне «шёпот».

4 лайка

Мне ещё нужно доделать несколько мелких деталей, но у меня уже есть рабочий плагин по адресу: GitHub - communiteq/discourse-private-replies · GitHub

После установки и включения плагина у владельца темы (а также у сотрудников) в нижней части каждой темы появится дополнительная кнопка с надписью Private Replies.

С помощью этой кнопки можно включать и выключать режим «частных ответов» для темы.

Когда режим частных ответов включён:

  • владелец темы по-прежнему видит все сообщения;
  • все остальные пользователи видят только сообщения, написанные владельцем темы, сотрудниками и самими собой.

Такая тема распознаётся по баннеру в верхней части:

image

Если владелец темы решит сделать сообщения общедоступными, он может использовать ту же кнопку внизу темы (теперь она называется «Public Replies»), чтобы отключить режим частных ответов. Баннер исчезнет, и все сообщения станут видимыми для всех (разумеется, с учётом настроек безопасности категории).

Плагин блокирует следующие способы получения содержимого сообщений:

  • просмотр темы (то есть обычный способ просмотра сообщений);
  • профиль пользователя — активность;
  • поиск;
  • сырой вывод (/raw/topic_id/post_id).

Примечание 1:

Плагин не скрывает полностью, кто публиковал сообщения в теме. Аватары пользователей в списке тем остаются без изменений, и темы также отображаются в профиле пользователя — сводка. Однако ни то, ни другое не раскрывает содержимое сообщений.

Примечание 2:

Я не знаю, существуют ли способы получения содержимого сообщений, которые я мог упустить. (Например, мне ещё предстоит проверить, раскрывают ли дайджесты какую-либо информацию). Мой супруг будет тестировать это в ближайшие недели, и я не сомневаюсь, что его ученики смогут найти какие-нибудь умные лазейки. Я постараюсь закрыть их, как только узнаю о них. Подсказки и советы приветствуются!

Позже на этой неделе я создам пост в категории плагинов и напишу хороший файл README.md. А пока я буду рад вашим отзывам!

9 лайков

Каковы последствия для производительности? Многие сторонние плагины добавляют запросы с N+1, N², N³, N^N… надеюсь, здесь этого удастся избежать.

Также было бы здорово, если бы эту функцию можно было включать/выключать для каждой темы отдельно, и она не влияла бы на производительность других тем, где она отключена, вместо того чтобы платить глобальную цену за производительность постоянно?

7 лайков

Я сделал всё возможное, чтобы обеспечить максимальную эффективность: оценивал данные максимально лениво и как можно быстрее выходил из любых фильтров.

Конечно, есть небольшие возможности для оптимизации, например, кэширование идентификаторов пользователей модераторов и идентификаторов защищённых тем, но я считаю, что для первой версии справился неплохо. Если кто-то не согласен, пожалуйста, не стесняйтесь критиковать мой код.

9 лайков