Archivos adjuntos de tipo de actividad

Esta es la quinta explicación en los complementos de Classroom .

En esta explicación, modificarás el ejemplo del paso de explicación anterior. para producir un archivo adjunto de tipo de actividad. Estos son todos los archivos adjuntos que requerir la entrega de un estudiante, como una respuesta escrita, un cuestionario u otro artefacto generado por el estudiante.

Es importante la distinción entre los archivos adjuntos de tipo de contenido y de tipo de actividad. Los archivos adjuntos con tipo de actividad difieren del tipo de contenido de las siguientes maneras:

  • Entregar aparece en la esquina superior derecha del iframe de vista de alumno.
  • Proporcionan un identificador único para el trabajo de los estudiantes.
  • La tarjeta de archivo adjunto aparece en la IU para calificar a Classroom.
  • Puede establecer una calificación para la tarea a la que pertenece.

Consulta la siguiente explicación para ver un análisis sobre las calificaciones. En el transcurso de este completarás lo siguiente:

  • Modifica las solicitudes anteriores de creación de archivos adjuntos al La API de Classroom para crear un archivo adjunto con el tipo de actividad.
  • Implementa el almacenamiento persistente para las entregas de los estudiantes.
  • Modifica la ruta anterior de la vista de estudiantes para aceptar sus entradas.
  • Proporciona una ruta para publicar el iframe de revisión del trabajo de los alumnos.

Una vez que termines, puedes crear archivos adjuntos con el tipo de actividad en las tareas mediante la IU de Google Classroom cuando accedas como profesor. Los alumnos de la clase pueden hacer lo siguiente: completar la actividad en el iframe y enviar una respuesta. El profesor puede Ver la entrega del estudiante en la IU de calificación de Classroom

A los efectos de este ejemplo, reutiliza la plantilla de archivo adjunto del explicación anterior que muestra la imagen de un punto de referencia famoso y una leyenda con el nombre del punto de referencia. La actividad consiste en pedirle al estudiante que proporcionan el nombre del punto de referencia.

Modifica la solicitud de creación de adjuntos

Navega a la sección de tu código en la que creaste un tipo de contenido adjunto en la explicación anterior. El elemento clave aquí es una instancia de una El objeto AddOnAttachment, en el que antes especificamos el teacherViewUri, studentViewUri y title para el archivo adjunto.

Si bien todos los archivos adjuntos de complementos requieren estos tres campos, la presencia o la ausencia de una studentWorkReviewUri determina si el adjunto está tipo de actividad o tipo de contenido. Una solicitud CREATE con un valor propagado studentWorkReviewUri se convierte en un archivo adjunto de tipo de actividad, mientras que una CREATE. sin un studentWorkReviewUri se convierte en un archivo adjunto de tipo de contenido.

La única modificación que puedes hacer a esta solicitud es propagar el studentWorkReviewUri. Agrega una ruta con un nombre adecuado aquí. tú implementarlo en un paso posterior.

Python

En nuestro ejemplo proporcionado, esto se encuentra en el método create_attachments de la archivo 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}",
}

Agregar almacenamiento persistente para archivos adjuntos de tipo de contenido

Registra la respuesta del estudiante a nuestra actividad. Podrás buscarlo más adelante, cuando el profesor ve el envío en el iframe de Revisión del trabajo de los alumnos.

Configura un esquema de base de datos para un Submission. En el ejemplo proporcionado, se espera a los estudiantes ingresar el nombre del punto de referencia que aparece en una imagen. Un Submission por lo tanto, contiene los siguientes atributos:

  • attachment_id: Es un identificador único para un archivo adjunto. Asignada por Classroom y se devuelve en la respuesta cuando se crea un adjunto.
  • submission_id: Es un identificador para una entrega de un estudiante. Asignada por Classroom y se devuelve en la respuesta getAddOnContext en la vista del alumno.
  • student_response: Es la respuesta del estudiante.

Python

Extiende la implementación de SQLite y flask_sqlalchemy de los pasos anteriores.

Navega al archivo en el que definiste las tablas anteriores. (models.py si sigues el ejemplo que te proporcionamos). Agrega lo siguiente en al final del archivo.

# 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))

Importa la nueva clase Submission al archivo de servidor con tu adjunto. las rutas de manejo.

Modificar la ruta de la vista de alumno

A continuación, modifica la ruta anterior de la vista de alumno para mostrar un formulario pequeño y aceptarlo. los aportes del estudiante. Puedes reutilizar la mayor parte del código del anterior explicación.

Ubica el código del servidor que proporciona la ruta para tu vista de estudiante. Este es la ruta especificada en el campo studentViewUri cuando se crea un adjunto. El primer cambio que debes hacer es extraer el submissionId del Respuesta getAddOnContext.

Python

En el ejemplo que proporcionamos, esto se encuentra en el método load_activity_attachment de el archivo 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")

También puedes enviar una solicitud para obtener el estado de entrega de un estudiante. La respuesta contiene un valor SubmissionState, que indica los estados como como si el estudiante abrió el archivo adjunto o lo entregó. Puede ser útil si quieres inhabilitar ediciones en una entrega entregada o si quieres interesadas en proporcionar información valiosa sobre los profesores progreso:

Python

En el ejemplo proporcionado, esta es una continuación del load_activity_attachment anterior.

# 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 último, recupera la información del adjunto de nuestra base de datos y entrega una entrada formulario. El formulario del ejemplo proporcionado consta de un campo de entrada de cadena y una en el botón Enviar. Muestra la imagen del punto de referencia y pídele al estudiante que ingrese su nombre. Una vez que proporcione una respuesta, regístrala en nuestra base de datos.

Python

En el ejemplo proporcionado, esta es una continuación del load_activity_attachment anterior.

# 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 entre los usuarios, considera inhabilitar el envío y, en su lugar, mostrarás la respuesta correcta en la Vista del profesor.

Cómo agregar una ruta para el iframe de revisión del trabajo de los alumnos

Por último, agrega una ruta para entregar el iframe de revisión del trabajo de los estudiantes. El nombre de este La ruta debe coincidir con la que se proporciona para studentWorkReviewUri cuando se crea. un archivo adjunto. Esta ruta se abre cuando el profesor vea la entrega del estudiante en la IU para calificar a Classroom.

Recibirás el parámetro de búsqueda submissionId cuando Classroom abre el iframe de revisión del trabajo de los alumnos. Úsalo para recuperar el trabajo del estudiante de tu base de datos local:

Python

En el ejemplo que proporcionamos, se encuentra en el archivo 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)

Prueba el complemento

Repite los pasos Prueba los pasos del complemento de la explicación anterior. Deberías tener un archivo adjunto que el alumno pueda abrir.

Completa los siguientes pasos para probar el archivo adjunto de la actividad:

  • Accede a Google Classroom. como uno de tus student prueba usuarios en la misma clase que el usuario de prueba del profesor.
  • Navega a la pestaña Trabajo en clase y expande la Tarea de prueba.
  • Haz clic en la tarjeta de archivo adjunto del complemento para abrir la vista del alumno y enviar un para la actividad.
  • Cierra el iframe después de completar la actividad. Si lo deseas, haz clic en el botón Botón In.

No deberías ver ningún cambio en Classroom después de completar la actividad. Ahora prueba el iframe de revisión del trabajo de los estudiantes:

  • Accede a Classroom como el usuario de prueba profesor.
  • Busca la columna de tu tarea de prueba en la pestaña Calificaciones. Haz clic en el ícono el nombre de la tarea de prueba.
  • Busca la tarjeta del usuario estudiante de prueba. Haz clic en el archivo adjunto de la tarjeta.

Confirma que aparezca la entrega correcta para el estudiante.

¡Felicitaciones! Ya puedes continuar con el siguiente paso: sincronizar archivo adjunto. calificaciones.