Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
7 changed files with 22 additions and 29 deletions
Showing only changes of commit dc4eb63afe - Show all commits

View File

@ -61,7 +61,6 @@ DecisionsProposeesUE: décisions de jury sur une UE du BUT
from datetime import datetime from datetime import datetime
import html import html
import re import re
from typing import Union
import numpy as np import numpy as np
from flask import flash, g, url_for from flask import flash, g, url_for
@ -150,7 +149,7 @@ class DecisionsProposees:
def __init__( def __init__(
self, self,
etud: Identite = None, etud: Identite = None,
code: Union[str, list[str]] = None, code: str | list[str] | None = None,
explanation="", explanation="",
code_valide=None, code_valide=None,
include_communs=True, include_communs=True,

View File

@ -6,7 +6,6 @@
"""Jury BUT: un RCUE, ou Regroupe Cohérent d'UEs """Jury BUT: un RCUE, ou Regroupe Cohérent d'UEs
""" """
from typing import Union
from flask_sqlalchemy.query import Query from flask_sqlalchemy.query import Query
from app.comp.res_but import ResultatsSemestreBUT from app.comp.res_but import ResultatsSemestreBUT
@ -205,7 +204,7 @@ class RegroupementCoherentUE:
self.moy_rcue > codes_cursus.BUT_BARRE_RCUE self.moy_rcue > codes_cursus.BUT_BARRE_RCUE
) )
def code_valide(self) -> Union[ApcValidationRCUE, None]: def code_valide(self) -> ApcValidationRCUE | None:
"Si ce RCUE est ADM, CMP ou ADJ, la validation. Sinon, None" "Si ce RCUE est ADM, CMP ou ADJ, la validation. Sinon, None"
validation = self.query_validations().first() validation = self.query_validations().first()
if (validation is not None) and ( if (validation is not None) and (

View File

@ -123,7 +123,7 @@ class Assiduite(db.Model):
user_id: int = None, user_id: int = None,
est_just: bool = False, est_just: bool = False,
external_data: dict = None, external_data: dict = None,
) -> object or int: ) -> "Assiduite":
"""Créer une nouvelle assiduité pour l'étudiant""" """Créer une nouvelle assiduité pour l'étudiant"""
# Vérification de non duplication des périodes # Vérification de non duplication des périodes
assiduites: Query = etud.assiduites assiduites: Query = etud.assiduites
@ -285,7 +285,7 @@ class Justificatif(db.Model):
entry_date: datetime = None, entry_date: datetime = None,
user_id: int = None, user_id: int = None,
external_data: dict = None, external_data: dict = None,
) -> object or int: ) -> "Justificatif":
"""Créer un nouveau justificatif pour l'étudiant""" """Créer un nouveau justificatif pour l'étudiant"""
nouv_justificatif = Justificatif( nouv_justificatif = Justificatif(
date_debut=date_debut, date_debut=date_debut,
@ -313,7 +313,7 @@ def is_period_conflicting(
date_debut: datetime, date_debut: datetime,
date_fin: datetime, date_fin: datetime,
collection: Query, collection: Query,
collection_cls: Assiduite or Justificatif, collection_cls: Assiduite | Justificatif,
) -> bool: ) -> bool:
""" """
Vérifie si une date n'entre pas en collision Vérifie si une date n'entre pas en collision

View File

@ -47,7 +47,6 @@
nommé _description.txt qui est une description (humaine, format libre) de l'archive. nommé _description.txt qui est une description (humaine, format libre) de l'archive.
""" """
from typing import Union
import datetime import datetime
import glob import glob
import json import json
@ -253,7 +252,7 @@ class BaseArchiver:
self, self,
archive_id: str, archive_id: str,
filename: str, filename: str,
data: Union[str, bytes], data: str | bytes,
dept_id: int = None, dept_id: int = None,
): ):
"""Store data in archive, under given filename. """Store data in archive, under given filename.

View File

@ -141,12 +141,9 @@ class CountCalculator:
self.hours += finish_hours.total_seconds() / 3600 self.hours += finish_hours.total_seconds() / 3600
self.hours += self.hour_per_day - (start_hours.total_seconds() / 3600) self.hours += self.hour_per_day - (start_hours.total_seconds() / 3600)
def compute_assiduites(self, assiduites: Query or list): def compute_assiduites(self, assiduites: Query | list):
"""Calcule les métriques pour la collection d'assiduité donnée""" """Calcule les métriques pour la collection d'assiduité donnée"""
assi: Assiduite assi: Assiduite
assiduites: list[Assiduite] = (
assiduites.all() if isinstance(assiduites, Query) else assiduites
)
for assi in assiduites: for assi in assiduites:
self.count += 1 self.count += 1
delta: timedelta = assi.date_fin - assi.date_debut delta: timedelta = assi.date_fin - assi.date_debut
@ -167,7 +164,7 @@ class CountCalculator:
self.hours += delta.total_seconds() / 3600 self.hours += delta.total_seconds() / 3600
def to_dict(self) -> dict[str, int or float]: def to_dict(self) -> dict[str, int | float]:
"""Retourne les métriques sous la forme d'un dictionnaire""" """Retourne les métriques sous la forme d'un dictionnaire"""
return { return {
"compte": self.count, "compte": self.count,
@ -179,7 +176,7 @@ class CountCalculator:
def get_assiduites_stats( def get_assiduites_stats(
assiduites: Query, metric: str = "all", filtered: dict[str, object] = None assiduites: Query, metric: str = "all", filtered: dict[str, object] = None
) -> dict[str, int or float]: ) -> dict[str, int | float]:
"""Compte les assiduités en fonction des filtres""" """Compte les assiduités en fonction des filtres"""
if filtered is not None: if filtered is not None:
@ -276,7 +273,7 @@ def filter_assiduites_by_est_just(assiduites: Assiduite, est_just: bool) -> Quer
def filter_by_user_id( def filter_by_user_id(
collection: Assiduite or Justificatif, collection: Assiduite | Justificatif,
user_id: int, user_id: int,
) -> Query: ) -> Query:
""" """
@ -286,8 +283,8 @@ def filter_by_user_id(
def filter_by_date( def filter_by_date(
collection: Assiduite or Justificatif, collection: Assiduite | Justificatif,
collection_cls: Assiduite or Justificatif, collection_cls: Assiduite | Justificatif,
date_deb: datetime = None, date_deb: datetime = None,
date_fin: datetime = None, date_fin: datetime = None,
strict: bool = False, strict: bool = False,
@ -320,7 +317,7 @@ def filter_justificatifs_by_etat(justificatifs: Query, etat: str) -> Query:
return justificatifs.filter(Justificatif.etat.in_(etats)) return justificatifs.filter(Justificatif.etat.in_(etats))
def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int or None) -> Query: def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int | None) -> Query:
""" """
Filtrage d'une collection d'assiduites en fonction de l'ID du module_impl Filtrage d'une collection d'assiduites en fonction de l'ID du module_impl
""" """
@ -328,8 +325,8 @@ def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int or None) ->
def filter_by_formsemestre( def filter_by_formsemestre(
collection_query: Assiduite or Justificatif, collection_query: Assiduite | Justificatif,
collection_class: Assiduite or Justificatif, collection_class: Assiduite | Justificatif,
formsemestre: FormSemestre, formsemestre: FormSemestre,
) -> Query: ) -> Query:
""" """
@ -358,7 +355,7 @@ def filter_by_formsemestre(
return collection_result.filter(collection_class.date_fin <= form_date_fin) return collection_result.filter(collection_class.date_fin <= form_date_fin)
def justifies(justi: Justificatif, obj: bool = False) -> list[int] or Query: def justifies(justi: Justificatif, obj: bool = False) -> list[int] | Query:
""" """
Retourne la liste des assiduite_id qui sont justifié par la justification Retourne la liste des assiduite_id qui sont justifié par la justification
Une assiduité est justifiée si elle est COMPLETEMENT ou PARTIELLEMENT Une assiduité est justifiée si elle est COMPLETEMENT ou PARTIELLEMENT
@ -597,7 +594,7 @@ def invalidate_assiduites_etud_date(etudid, date: datetime):
invalidate_assiduites_count(etudid, sem) invalidate_assiduites_count(etudid, sem)
def simple_invalidate_cache(obj: dict, etudid: str or int = None): def simple_invalidate_cache(obj: dict, etudid: str | int = None):
"""Invalide le cache de l'étudiant et du / des semestres""" """Invalide le cache de l'étudiant et du / des semestres"""
date_debut = ( date_debut = (
obj["date_debut"] obj["date_debut"]

View File

@ -109,13 +109,13 @@ class HTMLStringElement(HTMLElement):
class HTMLBuilder: class HTMLBuilder:
def __init__(self, *content: HTMLElement or str) -> None: def __init__(self, *content: HTMLElement | str) -> None:
self.content: list[HTMLElement or str] = list(content) self.content: list[HTMLElement | str] = list(content)
def add(self, *element: HTMLElement or str): def add(self, *element: HTMLElement | str):
self.content.extend(element) self.content.extend(element)
def remove(self, element: HTMLElement or str): def remove(self, element: HTMLElement | str):
if element in self.content: if element in self.content:
self.content.remove(element) self.content.remove(element)

View File

@ -152,7 +152,6 @@ class _Merger:
def export(self): def export(self):
"""Génère un nouvel objet Assiduité ou Justificatif""" """Génère un nouvel objet Assiduité ou Justificatif"""
obj: Assiduite or Justificatif = None
if self.est_abs: if self.est_abs:
_glob.COMPTE[0] += 1 _glob.COMPTE[0] += 1
self._to_assi() self._to_assi()
@ -167,7 +166,7 @@ def _assi_in_justifs(deb, fin, etudid):
class _Statistics: class _Statistics:
def __init__(self) -> None: def __init__(self) -> None:
self.object: dict[str, dict or int] = {"total": 0} self.object: dict[str, dict | int] = {"total": 0}
self.year: int = None self.year: int = None
def __set_year(self, year: int): def __set_year(self, year: int):