diff --git a/ImportScolars.py b/ImportScolars.py
index 8e06e93c5c..c264e9d4cf 100644
--- a/ImportScolars.py
+++ b/ImportScolars.py
@@ -368,16 +368,16 @@ def scolars_import_excel_file(
# xxx Ad-hoc checks (should be in format description)
if scu.strlower(titleslist[i]) == "sexe":
try:
- val = scolars.normalize_sexe(val)
+ val = scolars.input_civilite(val)
except:
raise ScoValueError(
- "valeur invalide pour 'SEXE' (doit etre 'M' ou 'MME' ou 'H' ou 'F', pas '%s') ligne %d, colonne %s"
+ "valeur invalide pour 'SEXE' (doit etre 'M', 'F', ou 'MME', 'H', 'X' ou vide, mais pas '%s') ligne %d, colonne %s"
% (val, linenum, titleslist[i])
)
# Excel date conversion:
if scu.strlower(titleslist[i]) == "date_naissance":
if val:
- if re.match("^[0-9]*\.?[0-9]*$", str(val)):
+ if re.match(r"^[0-9]*\.?[0-9]*$", str(val)):
val = sco_excel.xldate_as_datetime(float(val))
# INE
if (
@@ -515,11 +515,11 @@ def _import_one_student(
# Admissions
args["etudid"] = etudid
args["annee"] = annee_courante
- adm_id = scolars.admission_create(cnx, args)
+ _ = scolars.admission_create(cnx, args)
# Adresse
args["typeadresse"] = "domicile"
args["description"] = "(infos admission)"
- adresse_id = scolars.adresse_create(cnx, args)
+ _ = scolars.adresse_create(cnx, args)
# Inscription au semestre
args["etat"] = "I" # etat insc. semestre
if formsemestre_id:
diff --git a/VERSION.py b/VERSION.py
index 8e8a40a40d..3ff1eed40e 100644
--- a/VERSION.py
+++ b/VERSION.py
@@ -1,19 +1,21 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
-SCOVERSION = "7.22"
+SCOVERSION = "7.23"
SCONAME = "ScoDoc"
SCONEWS = """
Année 2021
-- Modernisation du code Python.
+- Gestion du genre neutre (pas d'affichage de la civilité)
+- Diverses corrections (PV de jurys, ...)
+- Modernisation du code Python
Année 2020
- Corrections d'erreurs, améliorations saise absences< et affichage bulletins
-- Nouveau site scodoc.org pour la documentation.
+- Nouveau site scodoc.org pour la documentation
- Enregistrement de semestres extérieurs
- Améliorations PV de Jury
- Contributions J.-M. Place: aide au diagnostic problèmes export Apogée
diff --git a/ZScolar.py b/ZScolar.py
index f61d6a4328..6cc176cce6 100644
--- a/ZScolar.py
+++ b/ZScolar.py
@@ -99,7 +99,7 @@ import sco_formations
from scolars import (
format_nom,
format_prenom,
- format_sexe,
+ format_civilite,
format_lycee,
format_lycee_from_code,
)
@@ -916,7 +916,8 @@ REQUEST.URL0=%s
"nom": "?",
"nom_usuel": "",
"prenom": "?",
- "sexe": "?",
+ "civilite": "?",
+ "sexe": "?", # for backward compat
"email": "?",
"emailperso": "",
"error": "code etudiant inconnu",
@@ -935,7 +936,6 @@ REQUEST.URL0=%s
"nom",
"nom_usuel",
"prenom",
- "sexe",
"nomprenom",
"email",
"emailperso",
@@ -956,6 +956,10 @@ REQUEST.URL0=%s
"date_naissance_iso",
):
d[a] = scu.quote_xml_attr(etud[a])
+ d["civilite"] = scu.quote_xml_attr(
+ etud["civilite_str"]
+ ) # exception: ne sort pas la civilite brute
+ d["sexe"] = d["civilite"] # backward compat pour anciens clients
d["photo_url"] = scu.quote_xml_attr(sco_photos.etud_photo_url(self, etud))
sem = etud["cursem"]
@@ -1750,12 +1754,12 @@ REQUEST.URL0=%s
},
),
(
- "sexe",
+ "civilite",
{
"input_type": "menu",
- "labels": ["H", "F"],
- "allowed_values": ["MR", "MME"],
- "title": "Genre",
+ "labels": ["Homme", "Femme", "Autre/neutre"],
+ "allowed_values": ["M", "F", "X"],
+ "title": "Civilité",
},
),
(
diff --git a/config/postupgrade-db.py b/config/postupgrade-db.py
index 29f2c2ca60..e423984cdd 100755
--- a/config/postupgrade-db.py
+++ b/config/postupgrade-db.py
@@ -1070,6 +1070,21 @@ for dept in get_depts():
"etape",
["alter table notes_formsemestre_inscription add column etape text"],
)
+ # Migre identite.sexe vers identite.civilite: normalise valeurs: M, F, X
+ check_field(
+ cnx,
+ "identite",
+ "civilite",
+ [
+ "UPDATE identite set sexe='M' where upper(sexe) = 'M' or upper(sexe) = 'M.' or upper(sexe) = 'MR' or upper(sexe) = 'H'",
+ "UPDATE identite set sexe='F' where upper(sexe) = 'F' or upper(sexe) = 'MME' or upper(sexe) = 'MLLE' or upper(sexe) = 'MELLE' or upper(sexe) = 'MLLE.' or upper(sexe) = 'F'",
+ "UPDATE identite set sexe='X' where sexe is NULL",
+ "ALTER TABLE identite RENAME COLUMN sexe TO civilite",
+ "ALTER TABLE identite ALTER COLUMN civilite SET NOT NULL",
+ "ALTER TABLE identite ADD CONSTRAINT civchk CHECK (civilite IN ('M', 'F', 'X'))",
+ ],
+ )
+
# Add here actions to performs after upgrades:
cnx.commit()
cnx.close()
diff --git a/html_sidebar.py b/html_sidebar.py
index 7c50d5c3b7..e9e022fcb9 100644
--- a/html_sidebar.py
+++ b/html_sidebar.py
@@ -103,7 +103,7 @@ def sidebar(context, REQUEST=None):
# compte les absences du semestre en cours
H.append(
"""
Absences"""
% params
diff --git a/misc/createtables.sql b/misc/createtables.sql
index bb809dfe9c..bc937d0d27 100644
--- a/misc/createtables.sql
+++ b/misc/createtables.sql
@@ -49,7 +49,7 @@ CREATE TABLE identite (
etudid text DEFAULT notes_newid_etud('EID'::text) UNIQUE NOT NULL,
nom text,
prenom text,
- sexe text,
+ civilite text NOT NULL CHECK (civilite IN ('M', 'F', 'X')),
date_naissance date, -- new: date en texte
lieu_naissance text,
dept_naissance text,
diff --git a/misc/format_import_etudiants.txt b/misc/format_import_etudiants.txt
index 365a713684..658c6d2cac 100644
--- a/misc/format_import_etudiants.txt
+++ b/misc/format_import_etudiants.txt
@@ -8,7 +8,7 @@ Code_INE; text; identite; 1; code INE;INE
nom; text; identite; 0; nom de l'etudiant;
nom_usuel; text; identite; 1; nom usuel (si different);
prenom; text; identite; 0; prenom de l'etudiant
-sexe (H ou F); text; identite; 0; sexe ('H' ou 'F');sexe;genre
+civilite; text; identite; 1; sexe ('M', 'F', 'X');sexe;genre
date_naissance;text;identite; 1; date de naissance (jj/mm/aaaa)
lieu_naissance;text;identite; 1; lieu de naissance
nationalite; text; identite; 1; nationalite
diff --git a/notes_table.py b/notes_table.py
index 1ba2810be3..38de3147ed 100644
--- a/notes_table.py
+++ b/notes_table.py
@@ -372,7 +372,9 @@ class NotesTable:
def get_sexnom(self, etudid):
"M. DUPONT"
etud = self.identdict[etudid]
- return etud["sexe"] + " " + scu.strupper(etud["nom_usuel"] or etud["nom"])
+ return (
+ etud["civilite_str"] + " " + scu.strupper(etud["nom_usuel"] or etud["nom"])
+ )
def get_nom_short(self, etudid):
"formatte nom d'un etud (pour table recap)"
@@ -391,13 +393,7 @@ class NotesTable:
def get_nom_long(self, etudid):
"formatte nom d'un etud: M. Pierre DUPONT"
etud = self.identdict[etudid]
- return " ".join(
- [
- scolars.format_sexe(etud["sexe"]),
- scolars.format_prenom(etud["prenom"]),
- scolars.format_nom(etud["nom_usuel"] or etud["nom"]),
- ]
- )
+ return scolars.format_nomprenom(etud)
def get_displayed_etud_code(self, etudid):
'code à afficher sur les listings "anonymes"'
diff --git a/pe_avislatex.py b/pe_avislatex.py
index fdb2644c1f..a882a43e46 100644
--- a/pe_avislatex.py
+++ b/pe_avislatex.py
@@ -213,7 +213,7 @@ def get_code_latex_avis_etudiant(
elif tag_latex == u"bilanParTag":
valeur = get_bilanParTag(donnees_etudiant)
- # Les tags "simples": par ex. nom, prenom, sexe, ...
+ # Les tags "simples": par ex. nom, prenom, civilite, ...
else:
if tag_latex in donnees_etudiant:
valeur = donnees_etudiant[tag_latex].decode(scu.SCO_ENCODING)
@@ -410,7 +410,7 @@ def get_avis_poursuite_par_etudiant(
if pe_tools.PE_DEBUG:
pe_tools.pe_print(jury.syntheseJury[etudid]["nom"] + " " + etudid)
- sexe = jury.syntheseJury[etudid]["sexe"].decode(scu.SCO_ENCODING)
+ civilite_str = jury.syntheseJury[etudid]["civilite_str"].decode(scu.SCO_ENCODING)
nom = jury.syntheseJury[etudid]["nom"].replace(" ", "-").decode(scu.SCO_ENCODING)
prenom = (
jury.syntheseJury[etudid]["prenom"].replace(" ", "-").decode(scu.SCO_ENCODING)
@@ -429,7 +429,9 @@ def get_avis_poursuite_par_etudiant(
# Entete (commentaire)
- contenu_latex = u"%% ---- Etudiant: " + sexe + " " + nom + " " + prenom + u"\n"
+ contenu_latex = (
+ u"%% ---- Etudiant: " + civilite_str + " " + nom + " " + prenom + u"\n"
+ )
# les annnotations
annotationPE = get_annotation_PE(
@@ -502,7 +504,7 @@ def table_syntheseAnnotationPE(context, syntheseJury, tag_annotation_pe):
[syntheseJury[etudid]["nbSemestres"] for etudid in etudids]
) # le nombre de semestre le + grand
- infos = ["sexe", "nom", "prenom", "age", "nbSemestres"]
+ infos = ["civilite", "nom", "prenom", "age", "nbSemestres"]
entete = ["etudid"]
entete.extend(infos)
entete.extend(["P%d" % i for i in range(1, maxParcours + 1)]) # ajout du parcours
@@ -518,7 +520,7 @@ def table_syntheseAnnotationPE(context, syntheseJury, tag_annotation_pe):
# Les info générales:
row = {
"etudid": etudid,
- "sexe": e["sexe"],
+ "civilite": e["civilite"],
"nom": e["nom"],
"prenom": e["prenom"],
"age": e["age"],
diff --git a/pe_jurype.py b/pe_jurype.py
index fe43e7d1b2..0b0fad771a 100644
--- a/pe_jurype.py
+++ b/pe_jurype.py
@@ -85,7 +85,7 @@ class JuryPE:
- context : le contexte Zope
- juryEtudDict : dictionnaire récapitulant les étudiants participant au jury PE (données administratives +
celles des semestres valides à prendre en compte permettant le calcul des moyennes ...
- {'etudid : { 'nom', 'prenom', 'sexe', 'diplome', '', }}
+ {'etudid : { 'nom', 'prenom', 'civilite', 'diplome', '', }}
Rq: il contient à la fois les étudiants qui vont être diplomés à la date prévue
et ceux qui sont éliminés (abandon, redoublement, ...) pour affichage alternatif
@@ -812,7 +812,7 @@ class JuryPE:
self.syntheseJury[etudid] = {
"nom": etudinfo["nom"],
"prenom": etudinfo["prenom"],
- "sexe": etudinfo["sexe"],
+ "civilite": etudinfo["civilite"],
"age": str(pe_tools.calcul_age(etudinfo["date_naissance"])),
"lycee": etudinfo["nomlycee"]
+ (
@@ -985,7 +985,7 @@ class JuryPE:
[self.syntheseJury[etudid]["nbSemestres"] for etudid in etudids]
)
- infos = ["sexe", "nom", "prenom", "age", "nbSemestres"]
+ infos = ["civilite", "nom", "prenom", "age", "nbSemestres"]
entete = ["etudid"]
entete.extend(infos)
entete.extend(["P%d" % i for i in range(1, maxParcours + 1)])
@@ -1036,7 +1036,7 @@ class JuryPE:
# Les info générales:
row = {
"etudid": etudid,
- "sexe": e["sexe"],
+ "civilite": e["civilite"],
"nom": e["nom"],
"prenom": e["prenom"],
"age": e["age"],
diff --git a/pe_tools.py b/pe_tools.py
index ecaebaaeb8..5dad00994c 100644
--- a/pe_tools.py
+++ b/pe_tools.py
@@ -217,7 +217,7 @@ JURY_SYNTHESE_POUR_DEBUG = {
"EID1810": {
"nom": "ROUX",
"entree": "2016",
- "sexe": "M.",
+ "civilite_str": "M.",
"promo": 2016,
"S2": {
"groupe": {
diff --git a/sco_bulletins_json.py b/sco_bulletins_json.py
index 9a86c5832a..d21c958673 100644
--- a/sco_bulletins_json.py
+++ b/sco_bulletins_json.py
@@ -124,14 +124,14 @@ def formsemestre_bulletinetud_published_dict(
code_ine=etudinfo["code_ine"],
nom=scu.quote_xml_attr(etudinfo["nom"]),
prenom=scu.quote_xml_attr(etudinfo["prenom"]),
- sexe=scu.quote_xml_attr(etudinfo["sexe"]),
+ civilite=scu.quote_xml_attr(etudinfo["civilite_str"]),
photo_url=scu.quote_xml_attr(
sco_photos.etud_photo_url(context, etudinfo, fast=True)
),
email=scu.quote_xml_attr(etudinfo["email"]),
emailperso=scu.quote_xml_attr(etudinfo["emailperso"]),
)
-
+ d["etudiant"]["sexe"] = d["etudiant"]["civilite"] # backward compat for our clients
# Disponible pour publication ?
if not published:
return d # stop !
diff --git a/sco_bulletins_xml.py b/sco_bulletins_xml.py
index 95d9454cba..8d9aaecb14 100644
--- a/sco_bulletins_xml.py
+++ b/sco_bulletins_xml.py
@@ -107,7 +107,8 @@ def make_xml_formsemestre_bulletinetud(
code_ine=etudinfo["code_ine"],
nom=scu.quote_xml_attr(etudinfo["nom"]),
prenom=scu.quote_xml_attr(etudinfo["prenom"]),
- sexe=scu.quote_xml_attr(etudinfo["sexe"]),
+ civilite=scu.quote_xml_attr(etudinfo["civilite_str"]),
+ sexe=scu.quote_xml_attr(etudinfo["civilite_str"]), # compat
photo_url=scu.quote_xml_attr(sco_photos.etud_photo_url(context, etudinfo)),
email=scu.quote_xml_attr(etudinfo["email"]),
emailperso=scu.quote_xml_attr(etudinfo["emailperso"]),
diff --git a/sco_debouche.py b/sco_debouche.py
index ad3c653053..8641d68dc0 100644
--- a/sco_debouche.py
+++ b/sco_debouche.py
@@ -115,7 +115,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True):
)
row = {
"etudid": etudid,
- "sexe": etud["sexe"],
+ "civilite": etud["civilite"],
"nom": etud["nom"],
"prenom": etud["prenom"],
"_nom_target": "ficheEtud?etudid=" + etud["etudid"],
@@ -154,7 +154,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True):
L.sort(key=lambda x: x["sem_ident"])
titles = {
- "sexe": "",
+ "civilite": "",
"nom": "Nom",
"prenom": "Prénom",
"semestre": "Dernier semestre",
@@ -170,7 +170,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True):
"semestre",
"semestre_id",
"periode",
- "sexe",
+ "civilite",
"nom",
"prenom",
"moy",
diff --git a/sco_excel.py b/sco_excel.py
index 1e81aa43c2..d4a2b20baa 100644
--- a/sco_excel.py
+++ b/sco_excel.py
@@ -616,7 +616,7 @@ def Excel_feuille_listeappel(
li += 1
ws0.write(li, 0, n, style1b)
nomprenom = (
- t["sexe"]
+ t["civilite_str"]
+ " "
+ t["nom"]
+ " "
diff --git a/sco_export_results.py b/sco_export_results.py
index 223d3eb21c..992c802ae3 100644
--- a/sco_export_results.py
+++ b/sco_export_results.py
@@ -122,7 +122,7 @@ def _build_results_list(context, dpv_by_sem, etuds_infos):
"code_nip": "NIP",
"nom": "Nom",
"prenom": "Prénom",
- "sexe": "Civ.",
+ "civilite_str": "Civ.",
"nom_usuel": "Nom usuel",
"bac": "Bac",
"parcours": "Parcours",
@@ -133,7 +133,7 @@ def _build_results_list(context, dpv_by_sem, etuds_infos):
"periode",
"sid",
"code_nip",
- "sexe",
+ "civilite_str",
"nom",
# 'nom_usuel', # inutile ?
"prenom",
@@ -171,7 +171,7 @@ def _build_results_list(context, dpv_by_sem, etuds_infos):
"nom": etud["nom"],
"nom_usuel": etud["nom_usuel"],
"prenom": etud["prenom"],
- "sexe": etud["sexe"],
+ "civilite_str": etud["civilite_str"],
"_nom_target": "%s/ficheEtud?etudid=%s" % (context.ScoURL(), etudid),
"_nom_td_attrs": 'id="%s" class="etudinfo"' % etudid,
"bac": bac.abbrev(),
diff --git a/sco_find_etud.py b/sco_find_etud.py
index 25d76dc083..0af146e217 100644
--- a/sco_find_etud.py
+++ b/sco_find_etud.py
@@ -384,7 +384,7 @@ def search_inscr_etud_by_nip(context, code_nip, REQUEST=None, format="json"):
Seuls les départements accessibles par l'utilisateur sont cherchés.
Renvoie une liste des inscriptions de l'étudiants dans tout ScoDoc:
- code_nip, nom, prenom, sexe, dept, formsemestre_id, date_debut_sem, date_fin_sem
+ code_nip, nom, prenom, civilite_str, dept, formsemestre_id, date_debut_sem, date_fin_sem
"""
result, _ = search_etud_in_accessible_depts(
context, code_nip=code_nip, REQUEST=REQUEST
@@ -401,7 +401,7 @@ def search_inscr_etud_by_nip(context, code_nip, REQUEST=None, format="json"):
"dept": DeptId,
"etudid": e["etudid"],
"code_nip": e["code_nip"],
- "sexe": e["sexe"],
+ "civilite_str": e["civilite_str"],
"nom": e["nom"],
"prenom": e["prenom"],
"formsemestre_id": sem["formsemestre_id"],
@@ -414,7 +414,7 @@ def search_inscr_etud_by_nip(context, code_nip, REQUEST=None, format="json"):
"dept",
"etudid",
"code_nip",
- "sexe",
+ "civilite_str",
"nom",
"prenom",
"formsemestre_id",
diff --git a/sco_groups.py b/sco_groups.py
index c4746f6087..aa79d05fdd 100644
--- a/sco_groups.py
+++ b/sco_groups.py
@@ -473,7 +473,8 @@ def XMLgetGroupsInPartition(context, partition_id, REQUEST=None): # was XMLgetG
doc._push()
doc.etud(
etudid=e["etudid"],
- sexe=scolars.format_sexe(etud["sexe"]),
+ civilite=etud["civilite_str"],
+ sexe=etud["civilite_str"], # compat
nom=scolars.format_nom(etud["nom"]),
prenom=scolars.format_prenom(etud["prenom"]),
origin=comp_origin(etud, sem),
@@ -497,7 +498,7 @@ def XMLgetGroupsInPartition(context, partition_id, REQUEST=None): # was XMLgetG
doc._push()
doc.etud(
etudid=etud["etudid"],
- sexe=scolars.format_sexe(etud["sexe"]),
+ sexe=etud["civilite_str"],
nom=scolars.format_nom(etud["nom"]),
prenom=scolars.format_prenom(etud["prenom"]),
origin=comp_origin(etud, sem),
@@ -1255,26 +1256,26 @@ def groups_auto_repartition(context, partition_id=None, REQUEST=None):
context.Notes, formsemestre_id
) # > identdict
identdict = nt.identdict
- # build: { sexe : liste etudids trie par niveau croissant }
- sexes = sets.Set([x["sexe"] for x in identdict.values()])
+ # build: { civilite : liste etudids trie par niveau croissant }
+ civilites = sets.Set([x["civilite"] for x in identdict.values()])
listes = {}
- for sexe in sexes:
- listes[sexe] = [
+ for civilite in civilites:
+ listes[civilite] = [
(get_prev_moy(context.Notes, x["etudid"], formsemestre_id), x["etudid"])
for x in identdict.values()
- if x["sexe"] == sexe
+ if x["civilite"] == civilite
]
- listes[sexe].sort()
- log("listes[%s] = %s" % (sexe, listes[sexe]))
+ listes[civilite].sort()
+ log("listes[%s] = %s" % (civilite, listes[civilite]))
# affect aux groupes:
n = len(identdict)
igroup = 0
nbgroups = len(group_ids)
while n > 0:
- for sexe in sexes:
- if len(listes[sexe]):
+ for civilite in civilites:
+ if len(listes[civilite]):
n -= 1
- etudid = listes[sexe].pop()[1]
+ etudid = listes[civilite].pop()[1]
group_id = group_ids[igroup]
igroup = (igroup + 1) % nbgroups
change_etud_group_in_partition(
diff --git a/sco_groups_view.py b/sco_groups_view.py
index f3cafcbbe1..627a7c489c 100644
--- a/sco_groups_view.py
+++ b/sco_groups_view.py
@@ -464,8 +464,9 @@ def groups_table(
% (with_paiement, with_archives, with_annotations)
)
#
- columns_ids = ["nom_disp", "prenom"] # colonnes a inclure
+ columns_ids = ["civilite_str", "nom_disp", "prenom"] # colonnes a inclure
titles = {
+ "civilite_str": "Civ.",
"nom_disp": "Nom",
"prenom": "Prénom",
"email": "Mail",
@@ -733,7 +734,7 @@ def groups_table(
"etudid",
"code_nip",
"etat",
- "sexe",
+ "civilite_str",
"nom",
"nom_usuel",
"prenom",
diff --git a/sco_inscr_passage.py b/sco_inscr_passage.py
index f746238e5a..e5bdd1c4f4 100644
--- a/sco_inscr_passage.py
+++ b/sco_inscr_passage.py
@@ -611,7 +611,7 @@ def etuds_select_boxes(
def etuds_select_box_xls(context, src_cat):
"export a box to excel"
etuds = src_cat["etuds"]
- columns_ids = ["etudid", "sexe", "nom", "prenom", "etape"]
+ columns_ids = ["etudid", "civilite_str", "nom", "prenom", "etape"]
titles = {x: x for x in columns_ids}
# Ajoute colonne paiement inscription
diff --git a/sco_lycee.py b/sco_lycee.py
index 8d25650e13..0b3fbf9335 100644
--- a/sco_lycee.py
+++ b/sco_lycee.py
@@ -128,7 +128,7 @@ def _table_etuds_lycees(
else:
L = etuds
columns_ids = (
- "sexe",
+ "civilite_str",
"nom",
"prenom",
"codelycee",
@@ -148,7 +148,7 @@ def _table_etuds_lycees(
rows=L,
titles={
"nbetuds": "Nb d'étudiants",
- "sexe": "",
+ "civilite_str": "",
"nom": "Nom",
"prenom": "Prénom",
"etudid": "etudid",
diff --git a/sco_poursuite_dut.py b/sco_poursuite_dut.py
index 97c3a14a1b..a2fdc2fe9a 100644
--- a/sco_poursuite_dut.py
+++ b/sco_poursuite_dut.py
@@ -44,7 +44,7 @@ import VERSION
def etud_get_poursuite_info(context, sem, etud):
"""{ 'nom' : ..., 'semlist' : [ { 'semestre_id': , 'moy' : ... }, {}, ...] }"""
I = {}
- I.update(etud) # copie nom, prenom, sexe, ...
+ I.update(etud) # copie nom, prenom, civilite, ...
# Now add each semester, starting from the first one
semlist = []
@@ -174,7 +174,7 @@ def formsemestre_poursuite_report(
infos.append(info)
#
column_ids = (
- ("sexe", "nom", "prenom", "annee", "date_naissance")
+ ("civilite_str", "nom", "prenom", "annee", "date_naissance")
+ tuple(ids)
+ ("debouche",)
)
diff --git a/sco_prepajury.py b/sco_prepajury.py
index 4845defc40..82e60819b3 100644
--- a/sco_prepajury.py
+++ b/sco_prepajury.py
@@ -37,7 +37,7 @@ import sco_excel
import sco_formsemestre
import sco_parcours_dut
import sco_codes_parcours
-from scolars import format_nom, format_prenom, format_sexe, format_lycee
+from scolars import format_nom, format_prenom, format_civilite, format_lycee
from sco_abs import getAbsSemEtud
import VERSION
@@ -229,7 +229,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
l.append(etud["code_ine"])
l += [
etudid,
- format_sexe(etud["sexe"]),
+ etud["civilite_str"],
format_nom(etud["nom"]),
format_prenom(etud["prenom"]),
etud["date_naissance"],
diff --git a/sco_pvjury.py b/sco_pvjury.py
index 148ad1fb94..191247c75e 100644
--- a/sco_pvjury.py
+++ b/sco_pvjury.py
@@ -27,10 +27,13 @@
"""Edition des PV de jury
"""
+import time
+from reportlab.platypus import Paragraph
+from reportlab.lib import styles
import sco_utils as scu
import notesdb as ndb
-
+from notes_log import log
import scolars
import sco_formsemestre
import sco_groups
@@ -42,7 +45,8 @@ import sco_excel
from TrivialFormulator import TrivialFormulator
from gen_tables import GenTable
import sco_pvpdf
-from sco_pdf import *
+import sco_pdf
+from sco_pdf import PDFLOCK
"""PV Jury IUTV 2006: on détaillait 8 cas:
Jury de semestre n
@@ -75,7 +79,7 @@ def _descr_decisions_ues(context, nt, etudid, decisions_ue, decision_sem):
if decisions_ue[ue_id] and (
decisions_ue[ue_id]["code"] == sco_codes_parcours.ADM
or (
- CONFIG.CAPITALIZE_ALL_UES
+ scu.CONFIG.CAPITALIZE_ALL_UES
and sco_codes_parcours.code_semestre_validant(decision_sem["code"])
)
):
@@ -414,9 +418,11 @@ def pvjury_table(
if context.get_preference("bul_show_ects", formsemestre_id):
columns_ids += ["ects"]
- # if dpv['semestre_non_terminal']:
- # dec 2017: indique toujours le devenir ("diplôme obtenu" ou semestre suivant)
- columns_ids += ["validation_parcours_code", "devenir"]
+ # XXX if not dpv["semestre_non_terminal"]:
+ # La colonne doit être présente: redoublants validant leur diplome
+ # en répétant un semestre ancien: exemple: S1 (ADM), S2 (ADM), S3 (AJ), S4 (ADM), S3 (ADM)=> diplôme
+ columns_ids += ["validation_parcours_code"]
+ columns_ids += ["devenir"]
columns_ids += ["observations"]
lines = []
@@ -434,7 +440,7 @@ def pvjury_table(
context, e["etat"], e["decision_sem"]
),
"ue_cap": e["decisions_ue_descr"],
- "validation_parcours_code": "ADM" if e["validation_parcours"] else "AJ",
+ "validation_parcours_code": "ADM" if e["validation_parcours"] else "",
"devenir": e["autorisations_descr"],
"observations": ndb.unquote(e["observation"]),
"mention": e["mention"],
@@ -451,10 +457,10 @@ def pvjury_table(
) # vertical space
i = e["identite"]
l["nomprenom"] = [
- Paragraph(SU(i["nomprenom"]), cell_style),
- Paragraph(SU(i["code_nip"]), cell_style),
+ Paragraph(sco_pdf.SU(i["nomprenom"]), cell_style),
+ Paragraph(sco_pdf.SU(i["code_nip"]), cell_style),
Paragraph(
- SU(
+ sco_pdf.SU(
"Né le %s" % i["date_naissance"]
+ (" à %s" % i["lieu_naissance"] if i["lieu_naissance"] else "")
+ (" (%s)" % i["dept_naissance"] if i["dept_naissance"] else "")
@@ -516,7 +522,9 @@ def formsemestre_pvjury(
titles=titles,
columns_ids=columns_ids,
filename=scu.make_filename("decisions " + sem["titreannee"]),
- origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
+ origin="Généré par %s le " % scu.VERSION.SCONAME
+ + scu.timedate_human_repr()
+ + "",
caption="Décisions jury pour " + sem["titreannee"],
html_class="table_leftalign",
html_sortable=True,
@@ -844,7 +852,6 @@ def formsemestre_lettres_individuelles(
else:
# submit
sf = tf[2]["signature"]
- # pdb.set_trace()
signature = sf.read() # image of signature
try:
PDFLOCK.acquire()
diff --git a/sco_recapcomplet.py b/sco_recapcomplet.py
index 63a8c8d780..6fb23f7439 100644
--- a/sco_recapcomplet.py
+++ b/sco_recapcomplet.py
@@ -33,6 +33,7 @@ import jaxml
import sco_utils as scu
from notes_log import log
+import scolars
import sco_bulletins, sco_excel
import sco_groups
import sco_evaluations
@@ -234,6 +235,7 @@ def make_formsemestre_recapcomplet(
pour tous les étudiants, les moyennes par UE et générale,
trié par moyenne générale décroissante.
"""
+ civ_nom_prenom = False # 3 colonnes différentes ou une seule avec prénom abrégé ?
if format == "xml":
return _formsemestre_recapcomplet_xml(
context,
@@ -251,6 +253,7 @@ def make_formsemestre_recapcomplet(
force_publishing=force_publishing,
)
if format[:3] == "xls":
+ civ_nom_prenom = True # 3 cols: civilite, nom, prenom
keep_numeric = True # pas de conversion des notes en strings
else:
keep_numeric = False
@@ -270,7 +273,7 @@ def make_formsemestre_recapcomplet(
)[0]
nt = context._getNotesCache().get_NotesTable(
context, formsemestre_id
- ) # > get_modimpls, get_ues, get_table_moyennes_triees, get_etud_decision_sem, get_etud_etat, get_etud_rang, get_nom_short, get_mod_stats, nt.moy_moy, get_nom_long, get_etud_decision_sem,
+ ) # > get_modimpls, get_ues, get_table_moyennes_triees, get_etud_decision_sem, get_etud_etat, get_etud_rang, get_nom_short, get_mod_stats, nt.moy_moy, get_etud_decision_sem,
modimpls = nt.get_modimpls()
ues = nt.get_ues() # incluant le(s) UE de sport
#
@@ -292,7 +295,11 @@ def make_formsemestre_recapcomplet(
# Construit une liste de listes de chaines: le champs du tableau resultat (HTML ou CSV)
F = []
- h = [rank_label, "Nom"]
+ h = [rank_label]
+ if civ_nom_prenom:
+ h += ["Civilité", "Nom", "Prénom"]
+ else:
+ h += ["Nom"]
if not hidebac:
h.append("Bac")
@@ -370,7 +377,7 @@ def make_formsemestre_recapcomplet(
gr_name = group["group_name"] or ""
is_dem[etudid] = False
if rank_partition_id:
- rang_gr, ninscrits_gr, rank_gr_name = sco_bulletins.get_etud_rangs_groups(
+ rang_gr, _, rank_gr_name = sco_bulletins.get_etud_rangs_groups(
context, etudid, formsemestre_id, partitions, partitions_etud_groups, nt
)
if rank_gr_name[rank_partition_id]:
@@ -383,8 +390,13 @@ def make_formsemestre_recapcomplet(
else:
rank = nt.get_etud_rang(etudid)
- l = [rank, nt.get_nom_short(etudid)] # rang, nom,
e = nt.identdict[etudid]
+ if civ_nom_prenom:
+ scolars.format_etud_ident(e)
+ l = [rank, e["civilite_str"], e["nom_disp"], e["prenom"]] # civ, nom prenom
+ else:
+ l = [rank, nt.get_nom_short(etudid)] # rang, nom,
+
if not hidebac:
bac = sco_bac.Baccalaureat(e["bac"], e["specialite"])
l.append(bac.abbrev())
@@ -457,6 +469,8 @@ def make_formsemestre_recapcomplet(
def add_bottom_stat(key, title, corner_value=""):
l = ["", title]
+ if civ_nom_prenom:
+ l += ["", ""]
if not hidebac:
l.append("")
if format[:3] == "xls" or format == "csv":
@@ -628,7 +642,6 @@ def make_formsemestre_recapcomplet(
"formsemestre_id": formsemestre_id,
"etudid": etudid,
"name": l[1],
- "nomprenom": nt.get_nom_long(etudid),
}
if ir % 2 == 0:
cells = '' % etudid
diff --git a/sco_report.py b/sco_report.py
index ed795c534a..246c4f62f9 100644
--- a/sco_report.py
+++ b/sco_report.py
@@ -293,7 +293,7 @@ def formsemestre_report_counts(
"codedecision",
"devenir",
"etat",
- "sexe",
+ "civilite",
"qualite",
"villelycee",
"statut",
@@ -365,7 +365,7 @@ def table_suivi_cohorte(
bac="", # selection sur type de bac
bacspecialite="",
annee_bac="",
- sexe="",
+ civilite=None,
statut="",
only_primo=False,
):
@@ -404,7 +404,7 @@ def table_suivi_cohorte(
bacs = set()
bacspecialites = set()
annee_bacs = set()
- sexes = set()
+ civilites = set()
statuts = set()
for etudid in etudids:
etud = context.getEtudInfo(etudid=etudid, filled=True)[0]
@@ -414,7 +414,7 @@ def table_suivi_cohorte(
(not bac or (bac == etud["bac"]))
and (not bacspecialite or (bacspecialite == bacspe))
and (not annee_bac or (annee_bac == str(etud["annee_bac"])))
- and (not sexe or (sexe == etud["sexe"]))
+ and (not civilite or (civilite == etud["civilite"]))
and (not statut or (statut == etud["statut"]))
and (not only_primo or context.isPrimoEtud(etud, sem))
):
@@ -426,7 +426,7 @@ def table_suivi_cohorte(
bacs.add(etud["bac"])
bacspecialites.add(bacspe)
annee_bacs.add(etud["annee_bac"])
- sexes.add(etud["sexe"])
+ civilites.add(etud["civilite"])
if etud["statut"]: # ne montre pas les statuts non renseignés
statuts.add(etud["statut"])
sems = S.values()
@@ -617,8 +617,8 @@ def table_suivi_cohorte(
dbac += " (spécialité %s)" % bacspecialite
if annee_bac:
dbac += " (année bac %s)" % annee_bac
- if sexe:
- dbac += " genre: %s" % sexe
+ if civilite:
+ dbac += " civilité: %s" % civilite
if statut:
dbac += " statut: %s" % statut
tab = GenTable(
@@ -652,7 +652,15 @@ def table_suivi_cohorte(
expl.append(", ".join(ls) + "")
expl.append("")
logt("Z: table_suivi_cohorte done")
- return tab, "\n".join(expl), bacs, bacspecialites, annee_bacs, sexes, statuts
+ return (
+ tab,
+ "\n".join(expl),
+ bacs,
+ bacspecialites,
+ annee_bacs,
+ civilites,
+ statuts,
+ )
def formsemestre_suivi_cohorte(
@@ -663,27 +671,35 @@ def formsemestre_suivi_cohorte(
bac="",
bacspecialite="",
annee_bac="",
- sexe="",
+ civilite=None,
statut="",
only_primo=False,
REQUEST=None,
):
"""Affiche suivi cohortes par numero de semestre"""
percent = int(percent)
- tab, expl, bacs, bacspecialites, annee_bacs, sexes, statuts = table_suivi_cohorte(
+ (
+ tab,
+ expl,
+ bacs,
+ bacspecialites,
+ annee_bacs,
+ civilites,
+ statuts,
+ ) = table_suivi_cohorte(
context,
formsemestre_id,
percent=percent,
bac=bac,
bacspecialite=bacspecialite,
annee_bac=annee_bac,
- sexe=sexe,
+ civilite=civilite,
statut=statut,
only_primo=only_primo,
)
tab.base_url = (
- "%s?formsemestre_id=%s&percent=%s&bac=%s&bacspecialite=%s&sexe=%s"
- % (REQUEST.URL0, formsemestre_id, percent, bac, bacspecialite, sexe)
+ "%s?formsemestre_id=%s&percent=%s&bac=%s&bacspecialite=%s&civilite=%s"
+ % (REQUEST.URL0, formsemestre_id, percent, bac, bacspecialite, civilite)
)
if only_primo:
tab.base_url += "&only_primo=on"
@@ -693,8 +709,8 @@ def formsemestre_suivi_cohorte(
base_url = REQUEST.URL0
burl = (
- "%s?formsemestre_id=%s&bac=%s&bacspecialite=%s&sexe=%s&statut=%s"
- % (base_url, formsemestre_id, bac, bacspecialite, sexe, statut)
+ "%s?formsemestre_id=%s&bac=%s&bacspecialite=%s&civilite=%s&statut=%s"
+ % (base_url, formsemestre_id, bac, bacspecialite, civilite, statut)
)
if percent:
pplink = (
@@ -724,12 +740,12 @@ def formsemestre_suivi_cohorte(
bac=bac,
bacspecialite=bacspecialite,
annee_bac=annee_bac,
- sexe=sexe,
+ civilite=civilite,
statut=statut,
bacs=bacs,
bacspecialites=bacspecialites,
annee_bacs=annee_bacs,
- sexes=sexes,
+ civilites=civilites,
statuts=statuts,
percent=percent,
),
@@ -749,12 +765,12 @@ def _gen_form_selectetuds(
bac=None,
bacspecialite=None,
annee_bac=None,
- sexe=None,
+ civilite=None,
statut=None,
bacs=None,
bacspecialites=None,
annee_bacs=None,
- sexes=None,
+ civilites=None,
statuts=None,
):
"""HTML form pour choix criteres selection etudiants"""
@@ -764,8 +780,8 @@ def _gen_form_selectetuds(
bacspecialites.sort()
annee_bacs = list(annee_bacs)
annee_bacs.sort()
- sexes = list(sexes)
- sexes.sort()
+ civilites = list(civilites)
+ civilites.sort()
statuts = list(statuts)
statuts.sort()
#
@@ -824,13 +840,13 @@ def _gen_form_selectetuds(
F.append("")
#
F.append(
- """ Genre: