Anexos de tipo de atividade

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 resposta getAddOnContext 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.