Respostas ao tópico invisíveis até que o dono decida revelá-las?

Então, meu/sua companheiro(a) é professor(a) (de grego antigo e latim clássico) e vem usando o Discourse em suas aulas há vários anos. Ela o utiliza principalmente para distribuir tarefas aos alunos e discutí-las depois. No entanto, todas as tarefas eram entregues em papel durante as aulas.

Até agora — já que as escolas foram fechadas devido à toda a correria em torno da pandemia de coronavírus, ela está migrando para o ensino 100% online, incluindo as tarefas. Assim, todos esses alunos estão atualmente enviando seus trabalhos por e-mail para ela. Isso é muito pouco eficiente, pois exige que ela faça bastante trabalho administrativo (e posso te dizer que ela não é muito boa nesse tipo de coisa ;)).

Discutimos algumas opções e ela disse: “por que eu não posso ter um tópico onde as pessoas só podem ver minhas postagens (ou seja, as postagens feitas pelo criador do tópico) e as delas mesmas? Isso me permitiria postar uma tarefa como um tópico e fazer com que cada aluno poste suas respostas abaixo, sem poder ver as respostas dos outros. Depois que todos tiverem enviado seus trabalhos e for hora de discutir, gostaria de poder apertar um botão para remover o véu e tornar todas as postagens do tópico visíveis para todos, para que possam ver e discutir o trabalho uns dos outros.”

Sim — brilhante! (é por isso que eu a amo).

Vou criar um plugin para isso, provavelmente aproveitando o plugin “solved” para a mágica de alternar (tornar tudo visível assim que o tópico for marcado como resolvido). Mas antes de começar, gostaria de ouvir sua opinião, obter algum feedback e talvez receber algumas ideias para tornar isso ainda melhor.

Dicas e orientações sobre como implementar isso de forma eficiente também seriam muito bem-vindas — já que existem muitas maneiras de recuperar um tópico e, se um único aluno encontrar uma maneira de contornar isso, tudo se tornará inútil.

Tudo relacionado a um tópico é passado por meio de um TopicView? Poderia aproveitar os username_filters? Ou construir algo semelhante a isso? Ou um “guardian” seria uma abordagem melhor?

Deixe-me saber o que você pensa!

18 curtidas

Isso depende fortemente das garantias de segurança necessárias aqui, mas, como presumo que os estudantes sejam bastante espertos, uma solução apenas em CSS não funcionará.

Agora, se uma solução em CSS não funcionar e essas crianças provavelmente vão ser travessos e encontrar todas as brechas para trapacear.

Expansões de backdoor [quote] e todo tipo de outras travessuras podem acontecer. Um simples patch para “pode ver a postagem” pode não ser suficiente.

Uma maneira muito segura de fazer isso seria via MP (mensagem privada): os alunos enviam o conteúdo por MP e, uma vez concluído… um “clique” move todas as MPs para o tópico. Limpo… simples… seguro.

18 curtidas

As soluções são uploads ou texto do Composer?

Se forem uploads, usar o novo Uploads de Mídia Segura, mais um plugin para alterar a forma como a URL temporária é gerada para downloads de usuários, de modo a gerar apenas URLs “seguras” para a equipe, pode funcionar e ser uma mudança mínima. Após um tópico ser resolvido/marcado/fechado, a URL temporária volta ao estado normal, permitindo que todos vejam tudo.

Também é interessante que você possa ver pessoas enviando soluções sem conseguir ver o conteúdo da submissão.

8 curtidas

Obrigado a ambos pelo feedback e pelas ideias!

O problema é que ela tem 6 turmas diferentes com talvez 2 ou 3 tarefas cada sendo executadas simultaneamente, então ela tem cerca de 15 tarefas diferentes para gerenciar. Então, não vai ser tão fácil, imagino.

Não, apenas CSS não vai funcionar, isso é certo. Por outro lado, não seria um grande problema se isso fosse burlado uma ou duas vezes, desde que eu não acabe corrigindo problemas todos os dias.

Essa é uma ideia realmente legal. Mas eles são majoritariamente textos no editor, e ela não quer obrigar que tudo seja enviado como uploads.

2 curtidas

Vou editar o título, já que esta é a solicitação.

Meu instinto diz que isso se parece mais com um plugin de spoiler do que com qualquer outra coisa. Os spoilers só seriam reveláveis pelo dono do tópico.

4 curtidas

O spoiler vai ser um pouco complicado, pois então você também terá que proteger as rotas /raw.

Talvez:

  • O professor posta “Por que a guerra começou na Indochina”

  • O aluno cria uma MP para si mesmo com a tarefa e, assim que terminar, posta um link no tópico. (Vantagem: revisões, não incomoda o professor)

  • O professor pode então fornecer “feedback direto” na MP

  • Assim que tudo for avaliado, o professor clica em “Publicar”, o que copia o conteúdo bruto da MP e substitui o link da MP no tópico da tarefa.

7 curtidas

As pessoas perguntam sobre isso várias vezes por ano e a resposta é sempre: “Você não pode ter permissões específicas por tópico.” Se você conseguir resolver isso, acredito que haverá um interesse considerável.

6 curtidas

Bem, isso está um pouco complicado. Estive mexendo um pouco em TopicView e PostGuardian, e isso me deixa em 80% sem muito esforço, incluindo /raw e truques com a edição de números de postagens citadas. No momento, ainda consigo ver postagens que não deveria, por meio de:

  • busca
  • atividade do usuário
  • e-mails de resumo

Então, precisa de mais alguns ajustes. Por enquanto, isso é tudo que consigo pensar. Sugestões de outras formas de acessar uma postagem são bem-vindas.

4 curtidas

E essa ainda é a resposta. Na verdade, acho que até mesmo fazer essa pergunta indica que a pessoa não refletiu de verdade sobre o que está tentando alcançar.

Não me importo com um modo de spoiler aprimorado, porém; acho que faz sentido.

4 curtidas

E se isso fosse implementado como ‘usuários comuns criando posts de sussurro’?

2 curtidas

Sussurros para quem? Para o proprietário do tópico? Então eles precisam ser rebaixados dos sussurros.

4 curtidas

Ainda preciso finalizar alguns detalhes, mas já tenho um plugin funcional em GitHub - communiteq/discourse-private-replies · GitHub

Após instalar e ativar o plugin, o dono do tópico (e a equipe) verá um botão extra na parte inferior de cada tópico chamado Respostas Privadas.

O botão pode ser usado para alternar o modo de ‘respostas privadas’ para o tópico.

Quando o modo de respostas privadas está ativado:

  • o dono do tópico ainda pode ver todas as postagens
  • todos os outros usuários verão apenas as postagens feitas pelo dono do tópico, pela equipe e por eles mesmos.

Um tópico assim pode ser identificado por um banner no topo do tópico:

image

Quando o dono do tópico decidir tornar as postagens públicas, pode usar o mesmo botão na parte inferior do tópico (agora chamado de ‘Respostas Públicas’) para desativar o modo de Respostas Privadas. O banner desaparecerá e todas as postagens ficarão visíveis para todos (respeitando, é claro, a segurança da categoria).

O plugin desabilita as seguintes formas de acessar o conteúdo das postagens:

  • visualização do tópico (ou seja, a maneira comum de ver as postagens)
  • perfil do usuário - atividades
  • busca
  • conteúdo bruto (/raw/topic_id/post_id)

Aviso 1:

O plugin não esconde completamente quem postou no tópico. Os avatares dos usuários na lista de tópicos permanecem inalterados e os tópicos também aparecem no perfil do usuário - resumo. No entanto, nenhum desses dois revela o conteúdo das postagens.

Aviso 2:

Não sei se existem outras formas de acessar o conteúdo das postagens que eu possa ter deixado passar. (Ainda preciso testar, por exemplo, se os resumos revelarão algo). Meu SO vai testar isso nas próximas semanas e não tenho dúvidas de que os alunos dela conseguirão encontrar algumas brechas inteligentes. Vou tentar corrigi-las assim que souber delas. Dicas e sugestões são bem-vindas!

Vou criar uma postagem na categoria de plugins e um bom README.md ainda esta semana. Enquanto isso, adoraria receber seu feedback!

9 curtidas

Quais são as implicações de desempenho disso? Muitos plugins de terceiros conseguem adicionar consultas N+1, N ao quadrado, N ao cubo, N elevado a N… esperamos que isso possa ser evitado aqui.

Seria bom também se pudesse ser ativado por tópico e ter zero impacto de desempenho em qualquer outro tópico, exceto naqueles em que estiver ativado, em vez de um custo global que precise ser pago o tempo todo?

7 curtidas

Fiz o meu melhor para manter tudo o mais eficiente possível, ou seja, avaliei da forma mais preguiçosa que pude e saí de qualquer filtro o mais rápido possível.

Com certeza há espaço para pequenas otimizações, como armazenar em cache os IDs dos usuários da equipe e os IDs dos tópicos protegidos, mas acho que fiz muito bem para uma primeira versão. Se alguém discordar, fique à vontade para criticar meu código.

9 curtidas