Compare commits

..

175 Commits

Author SHA1 Message Date
989930e4ce Merge branch 'new_api' of https://scodoc.org/git/leonard.montalbano/ScoDoc into new_api 2022-07-07 14:48:19 +02:00
1fd296179d fix des conflits 2022-07-07 14:47:06 +02:00
7c340c798a version 2022-07-07 12:09:55 +02:00
d1250555b9 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc 2022-07-07 12:01:16 +02:00
89a64d92d3 Merge pull request 'Correction bug : "Faire figurer les décisions sur les bulletins"' (#436) from lehmann/ScoDoc-Front:master into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/436
2022-07-06 23:28:20 +02:00
f9b4a582f5 Correction bug : "Faire figurer les décisions sur les bulletins" 2022-07-06 21:17:39 +02:00
97b5ab8179 Page saisie jury: affiche version classique ou BUT 2022-07-06 00:19:02 +02:00
c9aa55979b Misc fixes. Suppr. validations BUT. 2022-07-06 00:05:14 +02:00
83ddd2bf03 Bul. DUT/ classic JSON: champ 'publie' 2022-07-05 20:40:21 +02:00
312faf74fb Fix: publication bulletin 2022-07-05 20:37:38 +02:00
180c21ffc4 Merge pull request 'Décisions RCUE relevé' (#429) from lehmann/ScoDoc-Front:master into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/429
2022-07-05 19:55:52 +02:00
428cc61527 Décisions RCUE relevé 2022-07-05 15:46:17 +02:00
aa97a10bf8 Ajout d'informations sur l'arrêté BUT 2022-07-05 11:41:58 +02:00
512b38665f Jury BUT: traitement des DEF et DEM. Close #426 2022-07-04 23:50:55 +02:00
fa358c2da4 Fix: import users vide 2022-07-04 17:23:51 +02:00
b6052bf75f merge 2022-07-04 17:16:54 +02:00
0ad0521a6e Merge pull request 'Edit coef : correction flottants + somme ne prend plus en compte les bonus' (#427) from lehmann/ScoDoc-Front:master into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/427
2022-07-04 17:13:49 +02:00
9bf05dd9cd Edit coef : correction flotants + somme ne prend plus en compte les bonus 2022-07-04 16:42:10 +02:00
3e62d9b425 Edit coef : correction nombres flotant & somme sans bonus 2022-07-04 16:38:26 +02:00
7e642317d3 cosmetic 2022-07-03 22:45:56 +02:00
d65a30a9e9 Tableaux recap: sauvegarde état. Close #414 2022-07-03 16:14:03 +02:00
c1f7bcdb92 Clé tri étudiants: laisse espaces internes 2022-07-03 11:30:07 +02:00
962015563a Fix: bug calcul année but 2022-07-03 08:38:12 +02:00
835234779f annotations 2022-07-03 08:31:01 +02:00
0bf636814d Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc 2022-07-02 11:17:15 +02:00
c5c7e9135b quelques annotations 2022-07-02 11:17:04 +02:00
fc7d844e53 Merge pull request 'fix logoname with dot problem' (#424) from jmplace/ScoDoc-Lille:fix_logoname_with_dot into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/424
2022-07-02 10:57:55 +02:00
Jean-Marie PLACE
bc11f97354 fix logoname with dot problem 2022-07-02 10:53:56 +02:00
720e891f23 Optimisation apo_semset_maq_status 2022-07-02 00:00:29 +02:00
d23649d725 Améliore PV jury BUT: col. UEs, largeurs en excel, divers. 2022-07-01 22:29:31 +02:00
dbf562b701 Export table tcue: close #421 2022-07-01 16:34:36 +02:00
5a8add1aac Fix: calcul malus sur données vides 2022-07-01 09:48:08 +02:00
bf8614a386 Tri PV jury BUT 2022-07-01 00:15:55 +02:00
e8e27dd964 PV jury annuel BUT 2022-06-30 23:49:39 +02:00
372a6e6ed6 Pas de décision de sem. affichée en BUT: ficheEtud et bul. json 2022-06-30 20:43:09 +02:00
8310d20a77 doc 2022-06-30 20:20:36 +02:00
266d5c1472 BUT : ajout code ATJ sur année, UEs, RCUEs 2022-06-30 20:13:30 +02:00
36cef70c46 Fusion + suppr. symlink 2022-06-30 19:54:50 +02:00
ecba9ecc8d Merge pull request 'Relevé : code + explications - décision année jury' (#420) from lehmann/ScoDoc-Front:master into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/420
2022-06-30 19:52:59 +02:00
e3bfbf1e40 Relevé : code + explications - décision année jury 2022-06-30 17:43:23 +02:00
969e0d4a97 Merge pull request '0 à la place de - si 0 ECTS' (#419) from lehmann/ScoDoc-Front:master into master
Reviewed-on: https://scodoc.org/git/ScoDoc/ScoDoc/pulls/419
2022-06-30 17:37:01 +02:00
92bd46d1d5 0 à la place de - si 0 ECTS 2022-06-30 16:54:06 +02:00
9c81715139 Bul. BUT JSON: decisions jury selon option "Faire figurer les décisions sur les bulletins" 2022-06-30 15:43:48 +02:00
b9694b21b9 Fix: code RED. Close #416 2022-06-30 15:32:22 +02:00
33b5621af7 Fix: calcul du malus BUT par UE. Close #417 2022-06-30 15:25:58 +02:00
c0c78074b2 Fix: calcul du malus BUT par UE. Close #417 2022-06-30 15:11:30 +02:00
9f46849729 Fix: API formsemestre 2022-06-30 13:34:40 +02:00
7645247357 Jury BUT: garde fou si mix classic/BUT... 2022-06-30 09:37:41 +02:00
e9c5914a9f Fix: bulletins Qlio mails 2022-06-30 09:31:05 +02:00
0330544a0b Fix:archives (again...) 2022-06-30 09:27:46 +02:00
0fe89b0501 Fix: fiche etud BUT 2022-06-30 08:59:19 +02:00
a476854fac 9.3.8 2022-06-29 23:16:20 +02:00
f08c741734 Fix: archivage PV (encoding) 2022-06-29 23:03:53 +02:00
d227264283 Liens navigation sur saise jury BUT 2022-06-29 22:53:56 +02:00
e1cdc232f8 9.3.6 2022-06-29 21:17:40 +02:00
63f024152a Oups: fichier oublié 2022-06-29 21:16:49 +02:00
01f3766082 css tableau résultats jury BUT 2022-06-29 19:54:22 +02:00
2e8b529801 css tableau résultats jury BUT 2022-06-29 19:38:39 +02:00
fd21172398 Export décisions jury BUT dans bulletins JSON 2022-06-29 19:25:08 +02:00
16b3221daa Refactoring / année BUT sur fiche étudiant (montage provoisoire) 2022-06-29 18:16:37 +02:00
b0e78b67ea WIP: amelioration form jury BUT 2022-06-29 16:30:01 +02:00
581131f54f Affichage code jury sem. sur table recap classic en mode jury. Close #409 2022-06-29 14:42:52 +02:00
dbb1264863 Fix: AP formsemestre avec parcours 2022-06-29 13:56:36 +02:00
081ad0d5e9 Fix: suppression anciennes UE avec formules 2022-06-29 13:41:22 +02:00
72144a4952 Minor bugs (edit_ue) 2022-06-29 09:08:31 +02:00
a02437323b Jury BUT: cas ou une UE sans niveau a été ajoutée au programme 2022-06-28 11:18:12 +02:00
a204e67efc Bonus La Roche-sur-Yon 2022-06-27 22:22:38 +02:00
860f5b9ad5 Modif exception _formsemestre_enrich 2022-06-27 22:12:57 +02:00
6ffa4b8d7a Fix: contrainte SQL unicite réf. comp. 2022-06-27 20:25:58 +02:00
4e02928c04 Fix: bug suppression d'un groupe 2022-06-27 19:49:29 +02:00
e8c8815b24 Jury BUT: cosmetic tableau jury (v2) 2022-06-27 19:47:41 +02:00
aa138133dc Fix: archivage PV: bug encoding 2022-06-27 19:20:26 +02:00
fa3ea025ed Jury BUT: cosmetic tableau jury 2022-06-27 18:53:44 +02:00
0c05c4f31d Jury BUT: fix pour cas GB avec NaN + présentation btableau multi-parcours 2022-06-27 18:41:54 +02:00
9f42244612 Fix: création auto de bonus si matières sans numéros 2022-06-27 09:32:26 +02:00
8dd3f6396d Facilie l'ajout de modules de malus sur les UE BUT 2022-06-26 22:45:53 +02:00
4ae831c3ac Fix: typo => bug jury 2022-06-26 21:17:56 +02:00
e3d2e30449 Ajout répertoire pour liens 2022-06-26 18:00:00 +02:00
6b1d4d1afd Modifie URL vers ressources statiques selon la version. Close #404 2022-06-26 17:55:05 +02:00
f7463cbbb0 Jury BUT: pas de saisie pour les DEM 2022-06-26 17:02:18 +02:00
a00296250f Fix: ne compte pas les UE bonus dans le tabelau recap 2022-06-26 16:37:08 +02:00
b2098c833a Jury BUT: Avertissement si plusieurs parcours mais étduiant non assigné 2022-06-26 16:08:28 +02:00
4087fd6096 Codes jury: enregistrement transcodage BUT, tableau documentation 2022-06-26 15:43:46 +02:00
3d5361ce50 Fix: calcul evaluations en attente / démissionnaires 2022-06-26 14:30:21 +02:00
69ceb8affc Fix: calcul evaluations en attente / démissionnaires 2022-06-26 14:29:57 +02:00
40e21f6f0d Corrige documentation codes jury BUT 2022-06-26 10:06:38 +02:00
8863c6efa1 Jury BUT: codes annuels identiques pour les non admis, non passage de droit 2022-06-26 09:59:43 +02:00
8fd696ff7e Jury BUT: code par défaut RED si 1 RCUE < 8 2022-06-26 09:52:50 +02:00
4f7827f8c2 Jurys BUT: améliore message erreur si pas RCUE 2022-06-26 09:37:50 +02:00
21460df51a Fix: edition UE / ref. comp. 2022-06-25 23:42:39 +02:00
060b7ad7cd Fix: Bulletin BUT: calcul des UE de chaque etud 2022-06-25 23:22:20 +02:00
29c2fb25e8 Fix: message erreur jury BUT si pas de ref. de comp. associé 2022-06-25 22:54:46 +02:00
c36a20c8b3 9.3.0 | avec page décision jury provisoire 2022-06-25 17:18:05 +02:00
1d3ccb565a Fix: enregistrement code jury BUT 2022-06-25 17:00:00 +02:00
01d28eac90 Table recap / jury: mémorise ordre de tri 2022-06-25 16:23:39 +02:00
b5138d3dfe Suppression décisions de jury BUT 2022-06-25 14:18:34 +02:00
cc4fd76187 Tableau recap. codes jury BUT 2022-06-25 12:32:00 +02:00
d776bdca66 Fix: affichage coef bonus. Closes #382 2022-06-25 08:22:08 +02:00
ca5fd33e4e Fix: pd PDF si prefs. vides 2022-06-25 07:41:37 +02:00
f9b50bb290 Jury BUT: génération des autorisations d'inscription 2022-06-25 03:52:28 +02:00
d364d30176 Jury BUT: calcul auto des décisions 2022-06-25 02:59:43 +02:00
be3d692202 Table jury BUT: affichage optionnel des codes enregistrés 2022-06-24 16:57:44 +02:00
5335e5cfae version history 2022-06-24 15:24:51 +02:00
7b1aec46e1 Fix: enregistrement codes décisions BUT + moyennes UEs 2022-06-24 15:24:33 +02:00
441200dd5b Jury BUT: documentation des codes 2022-06-24 13:40:05 +02:00
8a83e41698 BUT: pondération des UE dans les RCUEs 2022-06-24 12:39:54 +02:00
00f66be1c5 Table jury BUT: pas de colonnes rangs et admissions 2022-06-24 12:00:08 +02:00
dcee2a441f Tableau jury BUT: col. RCUEs avec tri sur moy. gen. S_pair 2022-06-24 08:59:09 +02:00
145f69aee2 Jury BUT: navigation liste/saisie 2022-06-24 07:28:27 +02:00
d1c55a317a Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-24 06:17:53 +02:00
27271e5c96 Cosmetic / n'affiche pas ECTS pour UE bonus 2022-06-24 04:16:31 +02:00
3e5ae5d961 Fix "Da Nang": invalidation caches poids evals sur modifs UEs 2022-06-24 03:34:52 +02:00
f546837821 Modif config log: moins verbeux, evite requetes ordinaires 2022-06-24 03:32:48 +02:00
6f842dc877 Fix: bug "rennes" sur les formsemestres sans formation associée 2022-06-23 17:53:27 +02:00
995fe1981b Pas de niveau de compétence pour les UE bonus 2022-06-23 15:33:01 +02:00
a41f92d550 ue_edit: interdit association de 2 UE du meme sem. auy même niveau de comp. 2022-06-23 15:04:08 +02:00
99c22bdb83 Fix: chargement ref. MT2E 2022-06-23 14:16:53 +02:00
bb68b85b61 Fix: ues_impair_sans_rcue 2022-06-23 13:51:56 +02:00
9c80c36425 Fix: set_ue_niveau_competence 2022-06-23 13:48:43 +02:00
137e04be04 raccordement migrations (insertion "calais") 2022-06-23 11:28:20 +02:00
58551c7c4f Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-23 11:13:55 +02:00
5dc20aece0 Fix pour base de IUT Calais 2022-06-23 11:10:41 +02:00
f1d8b6dedf Jurys BUT: corrige tri étudiants, ajout des groupes 2022-06-23 10:13:18 +02:00
baccf122fe Fix: clé de tri des étudiants (caractères spéciaux) 2022-06-23 09:37:35 +02:00
cfef65fc68 ue_edit: alert() lors de l'enregisttement du niveau de compétence 2022-06-23 09:06:17 +02:00
e87e8723d6 Fix: titre col RCUE 2022-06-23 09:00:52 +02:00
4ec1b9c906 WIP: jury but: table annuelle 2022-06-23 08:40:33 +02:00
cdef38b62b WIP: jury BUT: début table recap (inachevée) 2022-06-23 06:33:03 +02:00
0939feb9fc WIP: jurys BUT: force jury annuel (en attendant page dédiée pour semestres isolés) 2022-06-22 14:09:08 +02:00
c17e2bae47 WIP: jury BUT: enregistrement des décisions 2022-06-22 11:44:03 +02:00
d4a8b74c0a WIP: jury BUT: formulaire avec style (merci @sebL) 2022-06-21 18:33:43 +02:00
c1e279ed5c WIP: jury BUT: esquisse page saisie 2022-06-21 11:21:41 +02:00
a37a2c08e2 WIP: jury BUT: validations annee, RCUE, UE 2022-06-21 11:21:17 +02:00
cd2de51bcc Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-21 05:26:30 +02:00
30b4a28b7f Bonus Orléans (contrib. F. Masson) 2022-06-20 18:12:00 +02:00
4272fd0444 Merge branch 'iziram-master' 2022-06-20 18:03:49 +02:00
a709e9d6e9 WIP: jurys BUT: décisions possibles sur année 2022-06-20 17:56:27 +02:00
Matthias Hartmann
cf99d3c618 Fix Issue 364 : vérif group_name déjà existant 2022-06-17 20:42:45 +02:00
Matthias Hartmann
d3226a32f4 Revert "Fix Issue 364 : vérif group_name déjà existant"
This reverts commit 1a4461cfb0.
2022-06-17 20:36:02 +02:00
Matthias Hartmann
1a4461cfb0 Fix Issue 364 : vérif group_name déjà existant 2022-06-17 20:10:09 +02:00
a3cccac2d2 Liste saisies de notes: formattage des valeurs 2022-06-09 14:01:47 +02:00
9cc7a80fb0 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-09 07:40:10 +02:00
483de3ed0b WIP: jurys BUT 2022-06-09 07:39:58 +02:00
109e00b6eb Codes décisions jury pour BUT 2022-06-05 13:01:29 +02:00
5f9a916135 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-02 11:54:26 +02:00
2b2fb80403 Bulletin BUT: n'affiche que les UE du parcours de l'étudiant. 2022-06-02 10:48:28 +02:00
ad5bdd03d1 BUT: moyenne gen. considérant les UE du parcours de chaque étudiant 2022-06-02 03:14:13 +02:00
41b8b675f0 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-02 00:18:29 +02:00
2ca53511db Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-06-01 06:09:21 +02:00
a9924a3884 typo 2022-05-30 17:23:45 +02:00
8cd6fb8320 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-05-30 12:51:48 +02:00
b25ba0bc39 WIP: BUT validations/parcours. 2022-05-29 17:34:03 +02:00
6596bd778c Amélioration édition module 2022-05-29 17:31:29 +02:00
45449f0465 BUT: Partition de parcours et inscriptions 2022-05-28 11:38:22 +02:00
5af4b5bed6 WIP: Partitions non editables (pour groupes de parcours) 2022-05-26 23:45:57 +02:00
3c9cc3121f Cascades sur Identite. Inscription aux parcours BUT. 2022-05-26 03:55:03 +02:00
06be6d0ac5 Methode .modimpls_parcours listant les modimpls d'un parcours 2022-05-22 07:03:20 +02:00
6030d12aca Ajout colonne parcours sur table description semestre 2022-05-22 07:02:01 +02:00
40f0bca74d Création d'une partition avec groupes de parcours 2022-05-22 05:01:25 +02:00
fd8116a772 Parcours BUT / Ref. Compétences
+ association UE -> ApcNiveau
    + choix sur la page ue_edit
 + association Module <-> ensemble de ApcParcours
    + choix sur la page module_edit
 + association Module - ApcAppCritique
    ~ choix sur la page module_edit
    TODO: revoir pour présenter les AC du semestre et parcours sélectionnés (JS)

 + association FormSemestre <-> ApcParcours
    + choix sur la page formsemestre_editwithmodules
2022-05-22 03:26:39 +02:00
539041fd0d Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-05-21 07:41:09 +02:00
f7e908c92d repr 2022-05-21 07:27:00 +02:00
91544aa254 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-05-09 20:43:15 +02:00
c0edf3b1cf Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-05-06 09:39:19 +02:00
fc0413303f Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-05-06 07:33:37 +02:00
96248ccfd3 BUT: assoc. modules <-> App. Critiques 2022-05-02 14:39:06 +02:00
f537cd2e48 Code cleaning 2022-05-02 11:13:56 +02:00
c11fccab02 Edition tag sur modules 2022-05-02 10:54:52 +02:00
72dc72d286 WIP: BUT association modules <-> parcours 2022-05-01 23:58:41 +02:00
5d7085b858 Fix @permission_required to avoid double call 2022-04-30 06:10:45 +02:00
1a18fef3e0 BUT: association UE <-> niveau competence 2022-04-29 08:17:04 +02:00
0709b53bbe Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-04-28 16:09:22 +02:00
cbfc0ef641 db: merge migrations 2022-04-28 05:28:24 +02:00
7b12552121 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93 2022-04-28 01:22:28 +02:00
e465acdd73 Add index on news 2022-04-26 12:57:41 +02:00
12 changed files with 160 additions and 82 deletions

View File

@ -473,7 +473,7 @@ def etudiant_bulletin_semestre( # XXX TODO Ajouter la possibilité de retourner
return response return response
return sco_bulletins.get_formsemestre_bulletin_etud_json( return sco_bulletins.get_formsemestre_bulletin_etud_json(
formsemestre, etud, version formsemestre, etud, version=version
) )

View File

@ -650,7 +650,7 @@ class ResultatsSemestre(ResultatsCache):
elif nb_ues_validables < len(ues_sans_bonus): elif nb_ues_validables < len(ues_sans_bonus):
row["_ues_validables_class"] += " moy_inf" row["_ues_validables_class"] += " moy_inf"
row["_ues_validables_order"] = nb_ues_validables # pour tri row["_ues_validables_order"] = nb_ues_validables # pour tri
if mode_jury: if mode_jury and self.validations:
dec_sem = self.validations.decisions_jury.get(etudid) dec_sem = self.validations.decisions_jury.get(etudid)
jury_code_sem = dec_sem["code"] if dec_sem else "" jury_code_sem = dec_sem["code"] if dec_sem else ""
idx = add_cell( idx = add_cell(

View File

@ -451,6 +451,7 @@ class ApcAppCritique(db.Model, XMLModel):
if competence is not None: if competence is not None:
query = query.filter(ApcNiveau.competence == competence) query = query.filter(ApcNiveau.competence == competence)
return query return query
<<<<<<< HEAD
def __init__(self, id, niveau_id, code, libelle, modules): def __init__(self, id, niveau_id, code, libelle, modules):
self.id = id self.id = id
@ -458,6 +459,8 @@ class ApcAppCritique(db.Model, XMLModel):
self.code = code self.code = code
self.libelle = libelle self.libelle = libelle
self.modules = modules self.modules = modules
=======
>>>>>>> 7c340c798ad59c41653efc83bfd079f11fce1938
def to_dict(self) -> dict: def to_dict(self) -> dict:
return {"libelle": self.libelle} return {"libelle": self.libelle}
@ -544,11 +547,14 @@ class ApcAnneeParcours(db.Model, XMLModel):
) )
ordre = db.Column(db.Integer) ordre = db.Column(db.Integer)
"numéro de l'année: 1, 2, 3" "numéro de l'année: 1, 2, 3"
<<<<<<< HEAD
def __init__(self, id, parcours_id, ordre): def __init__(self, id, parcours_id, ordre):
self.id = id self.id = id
self.parcours_id = parcours_id self.parcours_id = parcours_id
self.ordre = ordre self.ordre = ordre
=======
>>>>>>> 7c340c798ad59c41653efc83bfd079f11fce1938
def __repr__(self): def __repr__(self):
return f"<{self.__class__.__name__} ordre={self.ordre!r} parcours={self.parcours.code!r}>" return f"<{self.__class__.__name__} ordre={self.ordre!r} parcours={self.parcours.code!r}>"

View File

@ -43,6 +43,7 @@ class ApcValidationRCUE(db.Model):
formsemestre_id = db.Column( formsemestre_id = db.Column(
db.Integer, db.ForeignKey("notes_formsemestre.id"), index=True, nullable=True db.Integer, db.ForeignKey("notes_formsemestre.id"), index=True, nullable=True
) )
"formsemestre pair du RCUE"
# Les deux UE associées à ce niveau: # Les deux UE associées à ce niveau:
ue1_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False) ue1_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False)
ue2_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False) ue2_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False)

View File

@ -58,7 +58,6 @@ from app.scodoc import sco_formations
from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre
from app.scodoc import sco_groups from app.scodoc import sco_groups
from app.scodoc import sco_permissions_check from app.scodoc import sco_permissions_check
from app.scodoc import sco_photos
from app.scodoc import sco_preferences from app.scodoc import sco_preferences
from app.scodoc import sco_pvjury from app.scodoc import sco_pvjury
from app.scodoc import sco_users from app.scodoc import sco_users
@ -66,15 +65,6 @@ import app.scodoc.sco_utils as scu
from app.scodoc.sco_utils import ModuleType, fmt_note from app.scodoc.sco_utils import ModuleType, fmt_note
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
# ----- CLASSES DE BULLETINS DE NOTES
from app.scodoc import sco_bulletins_standard
from app.scodoc import sco_bulletins_legacy
# import sco_bulletins_example # format exemple (à désactiver en production)
# ... ajouter ici vos modules ...
from app.scodoc import sco_bulletins_ucac # format expérimental UCAC Cameroun
def get_formsemestre_bulletin_etud_json( def get_formsemestre_bulletin_etud_json(
formsemestre: FormSemestre, formsemestre: FormSemestre,

View File

@ -92,7 +92,6 @@ def formsemestre_bulletinetud_published_dict(
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
d = {"type": "classic", "version": "0"} d = {"type": "classic", "version": "0"}
if (not sem["bul_hide_xml"]) or force_publishing: if (not sem["bul_hide_xml"]) or force_publishing:
published = True published = True
else: else:
@ -134,6 +133,7 @@ def formsemestre_bulletinetud_published_dict(
) )
d["etudiant"]["sexe"] = d["etudiant"]["civilite"] # backward compat for our clients d["etudiant"]["sexe"] = d["etudiant"]["civilite"] # backward compat for our clients
# Disponible pour publication ? # Disponible pour publication ?
d["publie"] = published
if not published: if not published:
return d # stop ! return d # stop !
@ -364,8 +364,35 @@ def formsemestre_bulletinetud_published_dict(
return d return d
def dict_decision_jury(etudid, formsemestre_id, with_decisions=False): def dict_decision_jury(etudid, formsemestre_id, with_decisions=False) -> dict:
"dict avec decision pour bulletins json" """dict avec decision pour bulletins json
- decision : décision semestre
- decision_ue : list des décisions UE
- situation
with_decision donne les décision même si bul_show_decision est faux.
Exemple:
{
'autorisation_inscription': [{'semestre_id': 4}],
'decision': {'code': 'ADM',
'compense_formsemestre_id': None,
'date': '2022-01-21',
'etat': 'I'},
'decision_ue': [
{
'acronyme': 'UE31',
'code': 'ADM',
'ects': 16.0,
'numero': 23,
'titre': 'Approfondissement métiers',
'ue_id': 1787
},
...
],
'situation': 'Inscrit le 25/06/2021. Décision jury: Validé. UE acquises: '
'UE31, UE32. Diplôme obtenu.'}
"""
from app.scodoc import sco_bulletins from app.scodoc import sco_bulletins
d = {} d = {}

View File

@ -35,13 +35,17 @@ from app.models.etudiants import Identite
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app import log from app import db, log
from app.comp import res_sem from app.comp import res_sem
from app.comp.res_compat import NotesTableCompat from app.comp.res_compat import NotesTableCompat
from app.models import FormSemestre from app.models import FormSemestre
from app.models.notes import etud_has_notes_attente from app.models.notes import etud_has_notes_attente
from app.models.validations import (
ScolarAutorisationInscription,
ScolarFormSemestreValidation,
)
from app.models.but_validations import ApcValidationRCUE, ApcValidationAnnee
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.scolog import logdb from app.scodoc.scolog import logdb
from app.scodoc.sco_codes_parcours import * from app.scodoc.sco_codes_parcours import *
@ -989,28 +993,32 @@ def do_formsemestre_validation_auto(formsemestre_id):
def formsemestre_validation_suppress_etud(formsemestre_id, etudid): def formsemestre_validation_suppress_etud(formsemestre_id, etudid):
"""Suppression des decisions de jury pour un etudiant.""" """Suppression des décisions de jury pour un étudiant/formsemestre.
log("formsemestre_validation_suppress_etud( %s, %s)" % (formsemestre_id, etudid)) Efface toutes les décisions enregistrées concernant ce formsemestre et cet étudiant:
cnx = ndb.GetDBConnexion() code semestre, UEs, autorisations d'inscription
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) """
args = {"formsemestre_id": formsemestre_id, "etudid": etudid} log(f"formsemestre_validation_suppress_etud( {formsemestre_id}, {etudid})")
try:
# -- Validation du semestre et des UEs # Validations jury classiques (semestres, UEs, autorisations)
cursor.execute( for v in ScolarFormSemestreValidation.query.filter_by(
"""delete from scolar_formsemestre_validation etudid=etudid, formsemestre_id=formsemestre_id
where etudid = %(etudid)s and formsemestre_id=%(formsemestre_id)s""", ):
args, db.session.delete(v)
) for v in ScolarAutorisationInscription.query.filter_by(
# -- Autorisations d'inscription etudid=etudid, origin_formsemestre_id=formsemestre_id
cursor.execute( ):
"""delete from scolar_autorisation_inscription db.session.delete(v)
where etudid = %(etudid)s and origin_formsemestre_id=%(formsemestre_id)s""", # Validations jury spécifiques BUT
args, for v in ApcValidationRCUE.query.filter_by(
) etudid=etudid, formsemestre_id=formsemestre_id
cnx.commit() ):
except: db.session.delete(v)
cnx.rollback() for v in ApcValidationAnnee.query.filter_by(
raise etudid=etudid, formsemestre_id=formsemestre_id
):
db.session.delete(v)
db.session.commit()
sem = sco_formsemestre.get_formsemestre(formsemestre_id) sem = sco_formsemestre.get_formsemestre(formsemestre_id)
_invalidate_etud_formation_caches( _invalidate_etud_formation_caches(

View File

@ -224,9 +224,26 @@ class releveBUT extends HTMLElement {
<div class=abs>Non justifiées</div> <div class=abs>Non justifiées</div>
<div>${data.semestre.absences?.injustifie ?? "-"}</div> <div>${data.semestre.absences?.injustifie ?? "-"}</div>
<div class=abs>Total</div><div>${data.semestre.absences?.total ?? "-"}</div> <div class=abs>Total</div><div>${data.semestre.absences?.total ?? "-"}</div>
</div> </div>`;
<a class=photo href="${data.etudiant.fiche_url}"><img src="${data.etudiant.photo_url || "default_Student.svg"}" alt="photo de l'étudiant" title="fiche de l'étudiant" height="120" border="0"></a> if(data.semestre.decision_rcue?.length){
`; output += `
<div>
<div class=enteteSemestre>RCUE</div><div></div>
${(()=>{
let output = "";
data.semestre.decision_rcue.forEach(competence=>{
output += `<div class=rang>${competence.niveau.competence.titre}</div><div>${competence.code}</div>`;
})
return output;
})()}
</div>
</div>`
}
output += `
<a class=photo href="${data.etudiant.fiche_url}">
<img src="${data.etudiant.photo_url || "default_Student.svg"}" alt="photo de l'étudiant" title="fiche de l'étudiant" height="120" border="0">
</a>`;
/*${data.semestre.groupes.map(groupe => { /*${data.semestre.groupes.map(groupe => {
return ` return `
<div> <div>
@ -240,9 +257,11 @@ class releveBUT extends HTMLElement {
}).join("") }).join("")
}*/ }*/
this.shadow.querySelector(".infoSemestre").innerHTML = output; this.shadow.querySelector(".infoSemestre").innerHTML = output;
if(data.semestre.decision_annee?.code){
/*if(data.semestre.decision_annee?.code){
this.shadow.querySelector(".decision_annee").innerHTML = "Décision année : " + data.semestre.decision_annee.code + " - " + correspondanceCodes[data.semestre.decision_annee.code]; this.shadow.querySelector(".decision_annee").innerHTML = "Décision année : " + data.semestre.decision_annee.code + " - " + correspondanceCodes[data.semestre.decision_annee.code];
} }*/
this.shadow.querySelector(".decision").innerHTML = data.semestre.situation || ""; this.shadow.querySelector(".decision").innerHTML = data.semestre.situation || "";
/*if (data.semestre.decision?.code) { /*if (data.semestre.decision?.code) {

View File

@ -258,7 +258,7 @@
<li><a href="https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm">Bulletin <li><a href="https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm">Bulletin
officiel spécial n°4 du 17 juin 2021</a></li> officiel spécial n°4 du 17 juin 2021</a></li>
<li><a <li><a
href="https://cache.media.enseignementsup-recherche.gouv.fr//file/SPE4-MESRI-17-6-2021/19/4/SP4_ESR_17_6_2021_1413194.pdf">version href="https://cache.media.enseignementsup-recherche.gouv.fr//file/SPE4-MESRI-17-6-2021/19/4/SP4_ESR_17_6_2021_1413194.pdf">Version
pdf complète</a></li> pdf complète</a></li>
</ul> </ul>

View File

@ -57,7 +57,7 @@ from app.models.ues import UniteEns
from app import api from app import api
from app import db from app import db
from app import models from app import models
from app.models import ScolarNews from app.models import ScolarNews, but_validations
from app.auth.models import User from app.auth.models import User
from app.but import apc_edit_ue, jury_but_recap from app.but import apc_edit_ue, jury_but_recap
from app.decorators import ( from app.decorators import (
@ -71,7 +71,7 @@ from app.views import notes_bp as bp
# --------------- # ---------------
from app.scodoc import sco_utils as scu from app.scodoc import sco_bulletins_json, sco_utils as scu
from app.scodoc import notesdb as ndb from app.scodoc import notesdb as ndb
from app import log, send_scodoc_alarm from app import log, send_scodoc_alarm
@ -2143,6 +2143,16 @@ def formsemestre_validation_etud_form(
): ):
"Formulaire choix jury pour un étudiant" "Formulaire choix jury pour un étudiant"
readonly = not sco_permissions_check.can_validate_sem(formsemestre_id) readonly = not sco_permissions_check.can_validate_sem(formsemestre_id)
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
if formsemestre.formation.is_apc():
return redirect(
url_for(
"notes.formsemestre_validation_but",
scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id,
etudid=etudid,
)
)
return sco_formsemestre_validation.formsemestre_validation_etud_form( return sco_formsemestre_validation.formsemestre_validation_etud_form(
formsemestre_id, formsemestre_id,
etudid=etudid, etudid=etudid,
@ -2515,51 +2525,68 @@ def do_formsemestre_validation_auto(formsemestre_id):
def formsemestre_validation_suppress_etud( def formsemestre_validation_suppress_etud(
formsemestre_id, etudid, dialog_confirmed=False formsemestre_id, etudid, dialog_confirmed=False
): ):
"""Suppression des decisions de jury pour un etudiant.""" """Suppression des décisions de jury pour un étudiant."""
if not sco_permissions_check.can_validate_sem(formsemestre_id): if not sco_permissions_check.can_validate_sem(formsemestre_id):
return scu.confirm_dialog( return scu.confirm_dialog(
message="<p>Opération non autorisée pour %s</h2>" % current_user, message="<p>Opération non autorisée pour %s</h2>" % current_user,
dest_url=scu.ScoURL(), dest_url=scu.ScoURL(),
) )
etud = Identite.query.get_or_404(etudid)
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
if formsemestre.formation.is_apc():
next_url = url_for(
"scolar.ficheEtud",
scodoc_dept=g.scodoc_dept,
etudid=etudid,
)
else:
next_url = url_for(
"notes.formsemestre_validation_etud_form",
scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id,
etudid=etudid,
)
if not dialog_confirmed: if not dialog_confirmed:
etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] d = sco_bulletins_json.dict_decision_jury(
formsemestre = FormSemestre.query.get_or_404(formsemestre_id) etudid, formsemestre_id, with_decisions=True
sem = formsemestre.to_dict() )
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) d.update(but_validations.dict_decision_jury(etud, formsemestre))
decision_jury = nt.get_etud_decision_sem(etudid)
if decision_jury: descr_ues = [f"{u['acronyme']}: {u['code']}" for u in d.get("decision_ue", [])]
existing = ( dec_annee = d.get("decision_annee")
"<p>Décision existante: %(code)s du %(event_date)s</p>" % decision_jury if dec_annee:
) descr_annee = dec_annee.get("code", "-")
else: else:
existing = "" descr_annee = "-"
existing = f"""
<ul>
<li>Semestre : {d.get("decision", {"code":"-"})['code'] or "-"}</li>
<li>Année BUT: {descr_annee}</li>
<li>UEs : {", ".join(descr_ues)}</li>
<li>RCUEs: {len(d.get("decision_rcue", []))} décisions</li>
</ul>
"""
return scu.confirm_dialog( return scu.confirm_dialog(
"""<h2>Confirmer la suppression des décisions du semestre %s (%s - %s) pour %s ?</h2>%s f"""<h2>Confirmer la suppression des décisions du semestre
<p>Cette opération est irréversible. {formsemestre.titre_mois()} pour {etud.nomprenom}
</p> </h2>
""" <p>Cette opération est irréversible.</p>
% ( <div>
sem["titre_num"], {existing}
sem["date_debut"], </div>
sem["date_fin"], """,
etud["nomprenom"],
existing,
),
OK="Supprimer", OK="Supprimer",
dest_url="", dest_url="",
cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" cancel_url=next_url,
% (formsemestre_id, etudid),
parameters={"etudid": etudid, "formsemestre_id": formsemestre_id}, parameters={"etudid": etudid, "formsemestre_id": formsemestre_id},
) )
sco_formsemestre_validation.formsemestre_validation_suppress_etud( sco_formsemestre_validation.formsemestre_validation_suppress_etud(
formsemestre_id, etudid formsemestre_id, etudid
) )
return flask.redirect( flash("Décisions supprimées")
scu.ScoURL() return flask.redirect(next_url)
+ "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&head_message=Décision%%20supprimée"
% (formsemestre_id, etudid)
)
# ------------- PV de JURY et archives # ------------- PV de JURY et archives

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.3.15" SCOVERSION = "9.3.16"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"

View File

@ -33,7 +33,7 @@ except NameError:
load_dotenv(os.path.join(BASEDIR, ".env")) load_dotenv(os.path.join(BASEDIR, ".env"))
CHK_CERT = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) CHK_CERT = bool(int(os.environ.get("CHECK_CERTIFICATE", False)))
SCODOC_URL = os.environ["SCODOC_URL"] or "http://localhost:5000" SCODOC_URL = os.environ.get("SCODOC_URL") or "http://localhost:5000"
API_URL = SCODOC_URL + "/ScoDoc/api" API_URL = SCODOC_URL + "/ScoDoc/api"
SCODOC_USER = os.environ["SCODOC_USER"] SCODOC_USER = os.environ["SCODOC_USER"]
SCODOC_PASSWORD = os.environ["SCODOC_PASSWORD"] SCODOC_PASSWORD = os.environ["SCODOC_PASSWORD"]
@ -85,13 +85,13 @@ if r.status_code != 200:
print(f"{len(r.json())} étudiants courants") print(f"{len(r.json())} étudiants courants")
# Bulletin d'un BUT # Bulletin d'un BUT
formsemestre_id = 1052 # A adapter formsemestre_id = 1063 # A adapter
etudid = 16400 etudid = 16450
bul = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin") bul = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin")
# d'un DUT # d'un DUT
formsemestre_id = 1028 # A adapter formsemestre_id = 1062 # A adapter
etudid = 14721 etudid = 16309
bul_dut = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin") bul_dut = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin")