Este é o quinto tutorial sobre os complementos do Google Sala de Aula série de tutoriais.
Neste tutorial, você vai modificar o exemplo da etapa anterior. para produzir um anexo do tipo atividade. Estes são os anexos exigem o envio de um estudante, como uma resposta por escrito, um teste ou outro artefato gerado pelo aluno.
É importante diferenciar os tipos de conteúdo e de atividade. Anexos de tipo de atividade diferem de tipo de conteúdo das seguintes maneiras:
- Uma "Entrega" aparece no canto superior direito do iframe da visualização do estudante.
- Eles fornecem um identificador exclusivo para o trabalho do estudante.
- O card de anexo aparece na interface de notas do Google Sala de Aula.
- Eles podem dar uma nota para a atividade à qual pertencem.
Consulte o próximo tutorial para saber mais sobre a avaliação. Durante este curso, do Google, conclua o seguinte:
- Modifique as solicitações anteriores de criação de anexos para API Classroom para criar um anexo de tipo de atividade.
- Implementar um armazenamento permanente para os envios dos estudantes.
- Modifique o trajeto anterior "Visualização de estudante" para aceitar as entradas dele.
- Indique uma rota para disponibilizar o iframe "Revisão dos trabalhos dos alunos".
Depois de terminar, você pode criar anexos do tipo atividade em tarefas por meio de na interface do Google Sala de Aula após fazer login como professor. Os alunos da turma podem concluir a atividade no iframe e enviar uma resposta. O professor pode ver o envio do estudante na interface de avaliação do Google Sala de Aula.
Para este exemplo, reutilize o modelo de anexo da tutorial anterior que mostra a imagem de um ponto de referência famoso e uma legenda com o nome do ponto de referência. A atividade consiste em pedir que o estudante forneça o nome do ponto de referência.
Modificar a solicitação de criação de anexo
Navegue até a seção do código na qual você criou um content-type
anexo no tutorial anterior. O item-chave aqui é uma instância de um
Objeto AddOnAttachment, em que já especificamos o teacherViewUri
,
studentViewUri
e title
para o anexo.
Embora todos os anexos exijam esses três campos, a presença ou
a ausência de um studentWorkReviewUri
determina se o anexo foi
tipo de atividade ou de conteúdo. Uma solicitação CREATE
preenchida com
studentWorkReviewUri
se torna um anexo do tipo atividade, enquanto uma CREATE
se torna um anexo.
sem um studentWorkReviewUri
se torna um anexo de tipo de conteúdo.
A única modificação a ser feita nessa solicitação é preencher o
studentWorkReviewUri
. Adicione uma rota com nome apropriado aqui; você
implementá-los em uma etapa posterior.
Python
No exemplo fornecido, isso está no método create_attachments
na
arquivo webapp/attachment_routes.py
.
attachment = {
# Specifies the route for a teacher user.
"teacherViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True),
},
# Specifies the route for a student user.
"studentViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True)
},
# Specifies the route for a teacher user when the attachment is
# loaded in the Classroom grading view.
# The presence of this field marks this as an activity-type attachment.
"studentWorkReviewUri": {
"uri":
flask.url_for(
"view_submission", _scheme='https', _external=True)
},
# The title of the attachment.
"title": f"Attachment {attachment_count}",
}
Adicionar armazenamento permanente para anexos de tipo de conteúdo
Registrar a resposta do estudante à nossa atividade. Você poderá procurá-lo mais tarde, quando o professor vê o envio no iframe "Revisão dos trabalhos dos alunos".
Configure um esquema de banco de dados para um Submission
. No exemplo que apresentamos,
os estudantes digitam o nome do ponto de referência mostrado em uma imagem. Um Submission
portanto, contém os seguintes atributos:
attachment_id
: um identificador exclusivo para um anexo. Atribuída por ao Google Sala de Aula e retornada na resposta ao criar anexo.submission_id
: identificador do envio de um estudante. Atribuída por Sala de Aula e retornado na respostagetAddOnContext
em a visualização do estudante.
student_response
: a resposta fornecida pelo estudante.
Python
Estenda a implementação do SQLite e da flask_sqlalchemy
das etapas anteriores.
Navegue até o arquivo em que você definiu as tabelas anteriores
(models.py
se você estiver seguindo o exemplo fornecido). Adicione o seguinte em
parte inferior do arquivo.
# Database model to represent a student submission.
class Submission(db.Model):
# The attachmentId is the unique identifier for the attachment.
submission_id = db.Column(db.String(120), primary_key=True)
# The unique identifier for the student's submission.
attachment_id = db.Column(db.String(120), primary_key=True)
# The student's response to the question prompt.
student_response = db.Column(db.String(120))
Importe a nova classe Submission
para o arquivo do servidor com seu anexo.
rotas de trânsito.
Modificar o trajeto da visualização de estudantes
Em seguida, modifique o trajeto anterior "Visualização do estudante" para mostrar um pequeno formulário e aceite do aluno. É possível reutilizar a maior parte do código .
Localize o código de servidor que fornece o trajeto para o Student View. Isso é
a rota especificada no campo studentViewUri
ao criar um anexo.
A primeira mudança é extrair o submissionId
do
getAddOnContext
resposta.
Python
No exemplo fornecido, isso está no método load_activity_attachment
da
no arquivo webapp/attachment_routes.py
.
# Issue a request to the courseWork.getAddOnContext endpoint
addon_context_response = classroom_service.courses().courseWork(
).getAddOnContext(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"]).execute()
# One of studentContext or teacherContext will be populated.
user_context = "student" if addon_context_response.get(
"studentContext") else "teacher"
# If the user is a student...
if user_context == "student":
# Extract the submissionId from the studentContext object.
# This value is provided by Google Classroom.
flask.session["submissionId"] = addon_context_response.get(
"studentContext").get("submissionId")
Você também pode enviar uma solicitação para verificar o status de envio do estudante.
A resposta contém um valor SubmissionState
, que indica estados como:
caso o aluno tenha aberto ou entregue o anexo. Isso pode ser
útil se quiser proibir edições em um envio entregue ou se você estiver
interessados em fornecer aos professores insights sobre as atividades progresso:
Python
Em nosso exemplo fornecido, isso é uma continuação
load_activity_attachment
acima.
# Issue a request to get the status of the student submission.
submission_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().get(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"],
attachmentId=flask.session["attachmentId"],
submissionId=flask.session["submissionId"]).execute()
Por fim, busque as informações do anexo do nosso banco de dados e forneça uma entrada forma O formulário no exemplo fornecido consiste em um campo de entrada de string e um botão "Enviar". Mostre a imagem de ponto de referência e peça para o estudante digitar o nome dela. Quando ele responder, registre em nosso banco de dados.
Python
Em nosso exemplo fornecido, isso é uma continuação
load_activity_attachment
acima.
# Look up the attachment in the database.
attachment = Attachment.query.get(flask.session["attachmentId"])
message_str = f"I see that you're a {user_context}! "
message_str += (
f"I've loaded the attachment with ID {attachment.attachment_id}. "
if user_context == "teacher" else
"Please complete the activity below.")
form = activity_form_builder()
if form.validate_on_submit():
# Record the student's response in our database.
# Check if the student has already submitted a response.
# If so, update the response stored in the database.
student_submission = Submission.query.get(flask.session["submissionId"])
if student_submission is not None:
student_submission.student_response = form.student_response.data
else:
# Store the student's response by the submission ID.
new_submission = Submission(
submission_id=flask.session["submissionId"],
attachment_id=flask.session["attachmentId"],
student_response=form.student_response.data)
db.session.add(new_submission)
db.session.commit()
return flask.render_template(
"acknowledge-submission.html",
message="Your response has been recorded. You can close the " \
"iframe now.",
instructions="Please Turn In your assignment if you have " \
"completed all tasks."
)
# Show the activity.
return flask.render_template(
"show-activity-attachment.html",
message=message_str,
image_filename=attachment.image_filename,
image_caption=attachment.image_caption,
user_context=user_context,
form=form,
responses=response_strings)
Para diferenciar os usuários, considere desativar o envio e mostrar a resposta correta na Visualização de professor.
Adicionar uma rota para o iframe "Revisão dos trabalhos dos alunos"
Por fim, adicione um caminho para exibir o iframe "Revisão dos trabalhos dos alunos". O nome deste
de rota precisa corresponder àquela fornecida para studentWorkReviewUri
ao criar
um anexo. Esse trajeto abre quando o professor visualiza o envio do estudante em
a interface de usuário de notas do Google Sala de Aula.
Você recebe o parâmetro de consulta submissionId
quando o Google Sala de Aula
abre o iframe "Revisão dos trabalhos dos alunos". Use para recuperar o trabalho do estudante no
banco de dados local:
Python
No exemplo fornecido, isso está no arquivo webapp/attachment_routes.py
.
@app.route("/view-submission")
def view_submission():
"""
Render a student submission using the show-student-submission.html template.
"""
# Save the query parameters passed to the iframe in the session, just as we did
# in previous routes. Abbreviated here for readability.
add_iframe_query_parameters_to_session(flask.request.args)
# For the sake of brevity in this example, we'll skip the conditional logic
# to see if we need to authorize the user as we have done in previous steps.
# We can assume that the user that reaches this route is a teacher that has
# already authorized and created an attachment using the add-on.
# In production, we recommend fully validating the user's authorization at
# this stage as well.
# Look up the student's submission in our database.
student_submission = Submission.query.get(flask.session["submissionId"])
# Look up the attachment in the database.
attachment = Attachment.query.get(student_submission.attachment_id)
# Render the student's response alongside the correct answer.
return flask.render_template(
"show-student-submission.html",
message=f"Loaded submission {student_submission.submission_id} for "\
f"attachment {attachment.attachment_id}.",
student_response=student_submission.student_response,
correct_answer=attachment.image_caption)
Testar o complemento
Repita as etapas de teste do complemento do tutorial anterior. Você deve têm um anexo que pode ser aberto pelo aluno.
Conclua as etapas a seguir para testar o anexo da atividade:
- Faça login no Google Sala de Aula. como um de seus student (aluno) de teste na mesma turma do usuário de teste professor.
- Acesse a guia Atividades e expanda a opção Atividade do teste.
- Clique no card de anexo do complemento para abrir a visualização do aluno e enviar uma para a atividade.
- Feche o iframe após concluir a atividade. Opcionalmente, clique no botão Virar In.
Nenhuma mudança vai ocorrer no Google Sala de Aula após a conclusão a atividade. Agora teste o iframe "Revisão dos trabalhos dos alunos":
- Faça login no Google Sala de Aula como usuário de teste professor.
- Encontre a coluna da tarefa de teste na guia Notas. Clique no botão nome da atividade de teste.
- Encontre o cartão do usuário estudante de teste. Clique no anexo no card.
Confirme se o envio correto aparece para o estudante.
Parabéns! Você está pronto para prosseguir para a próxima etapa: sincronizar o anexo notas.