forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -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,
|
||||||
|
@ -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 (
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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"]
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user