DocScoDoc/docs/Internals.md

3.0 KiB

Code de ScoDoc 9

Quelques informations pour les développeurs.

  • le code est écrit en Python 3.9 (passage à 3.10 prévu en 2022).
  • le code doit être formatté par black qui est normalement intégré à votre éditeur (VSCode et PyCharm sont deux choix judicieux).
  • outre Python, les principaux composants logiciels sont:

Principaux objets

Les objets manipulés par ScoDoc sont pour la plupart stockés en base postgres et accédé soit directement en SQL (anciennes parties de ScoDoc), soit à travers l'ORM SQLAlchemy (recommandé pour tout nouveau code).

Les modèles correspondant sont déclarés dans /opt/scodoc/app/models/.

Principales classes (le nom de certaines classes Python est donné en CaractèresCommeCa).

  • Étudiants (classe Identite): nom, codes INE/NIP, etc
  • Formations: programmes pédagogiques, contenant
    • Unités d'Enseignement (UniteEns);
    • Matières et Modules (Module, avec son type standard, bonus, ressources ou SAÉ).
  • FormSemestre: instanciation d'une session de formation, avec un programme pédagogique donné (Formation), les dates de début et fin, des étudiants inscrits, des responsables, divers codes, et les ModuleImpl mis en œuvre.
  • ModuleImpl: la mise en place d'un module pédagogique (le ModuleImpl est au Module ce que le FormSemestre est à la Formation): lié à un module, avec un enseignant responsable et des étudiants inscrits.
  • Inscriptions: tables d'association avec codes et/ou état (démission, défaillant): FormsemestreInscription ModuleImplInscription.

Vues et décorateurs

Une vue ordinaire (Web) pourrait ressembler à cela. Noter la présence de décorateurs:

  • @scodoc récupère le département (présent dans l'URL) et initialise quelques trucs;
  • @permission_required: permet de contrôler l'accès, en se basant sur les permissions définies dans la classe Permission.
@bp.route("/un_exemple")
@scodoc
@permission_required(Permission.ScoChangeFormation)
def un_exemple():
    # Récupérer le ou les arguments: exemple avec formation_id
    formation_id = int(request.args["formation_id"])
    # Charger le ou les objets utilies:
    formation = models.Formation.query.get(
        formation_id=formation_id
    ).first_or_404()
    # Effectuer au besoin un traitement
    resultat = ...
    # Afficher le résultat
    return render_template( 
        "exemple_template.html", 
        resultat=resultat, # par exemple
        formation=formation,
        ... # etc
    )