############################################################################## # ScoDoc # Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ ScoDoc 9 API : accès aux évaluations """ from flask import g, jsonify from flask_login import login_required import app from app.api import api_bp as bp, api_web_bp from app.decorators import scodoc, permission_required from app.scodoc.sco_utils import json_error from app.models import Evaluation, ModuleImpl, FormSemestre from app.scodoc import sco_evaluation_db from app.scodoc.sco_permissions import Permission import app.scodoc.sco_utils as scu @bp.route("/evaluation/<int:evaluation_id>") @api_web_bp.route("/evaluation/<int:evaluation_id>") @login_required @scodoc @permission_required(Permission.ScoView) def evaluation(evaluation_id: int): """Description d'une évaluation. { 'coefficient': 1.0, 'date_debut': '2016-01-04T08:30:00', 'date_fin': '2016-01-04T12:30:00', 'description': 'TP NI9219 Température', 'evaluation_type': 0, 'id': 15797, 'moduleimpl_id': 1234, 'note_max': 20.0, 'numero': 3, 'poids': { 'UE1.1': 1.0, 'UE1.2': 1.0, 'UE1.3': 1.0 }, 'publish_incomplete': False, 'visi_bulletin': True } """ query = Evaluation.query.filter_by(id=evaluation_id) if g.scodoc_dept: query = ( query.join(ModuleImpl) .join(FormSemestre) .filter_by(dept_id=g.scodoc_dept_id) ) e = query.first_or_404() return jsonify(e.to_dict_api()) @bp.route("/moduleimpl/<int:moduleimpl_id>/evaluations") @api_web_bp.route("/moduleimpl/<int:moduleimpl_id>/evaluations") @login_required @scodoc @permission_required(Permission.ScoView) def evaluations(moduleimpl_id: int): """ Retourne la liste des évaluations d'un moduleimpl moduleimpl_id : l'id d'un moduleimpl Exemple de résultat : voir /evaluation """ query = Evaluation.query.filter_by(moduleimpl_id=moduleimpl_id) if g.scodoc_dept: query = ( query.join(ModuleImpl) .join(FormSemestre) .filter_by(dept_id=g.scodoc_dept_id) ) return jsonify([e.to_dict_api() for e in query]) @bp.route("/evaluation/<int:evaluation_id>/notes") @api_web_bp.route("/evaluation/<int:evaluation_id>/notes") @login_required @scodoc @permission_required(Permission.ScoView) def evaluation_notes(evaluation_id: int): """ Retourne la liste des notes à partir de l'id d'une évaluation donnée evaluation_id : l'id d'une évaluation Exemple de résultat : { "1": { "id": 1, "etudid": 10, "evaluation_id": 1, "value": 15.0, "comment": "", "date": "Wed, 20 Apr 2022 06:49:05 GMT", "uid": 2 }, "2": { "id": 2, "etudid": 1, "evaluation_id": 1, "value": 12.0, "comment": "", "date": "Wed, 20 Apr 2022 06:49:06 GMT", "uid": 2 }, ... } """ query = Evaluation.query.filter_by(id=evaluation_id) if g.scodoc_dept: query = ( query.join(ModuleImpl) .join(FormSemestre) .filter_by(dept_id=g.scodoc_dept_id) ) evaluation = query.first_or_404() dept = evaluation.moduleimpl.formsemestre.departement app.set_sco_dept(dept.acronym) notes = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id) for etudid in notes: # "ABS", "EXC", etc mais laisse les notes sur le barème de l'éval. note = notes[etudid] note["value"] = scu.fmt_note(note["value"], keep_numeric=True) note["note_max"] = evaluation.note_max del note["id"] return jsonify(notes)