diff --git a/get.py b/get.py index 6fd3915..0c926fb 100755 --- a/get.py +++ b/get.py @@ -123,10 +123,10 @@ def conf_value(xkey: str): "fontsize_name": 10, "fontsize_count": 14, "width": 1300, - "height": 900, + "height": 0, "hmargin": 20, "parcours_separator": "/", - "year_separator": "", + "year_separator": " ", "rank_separator": "", "diplome_separator": "", } @@ -136,10 +136,10 @@ def conf_value(xkey: str): return defaults[xkey] if xkey[-9:] == "separator": return " " - if xkey == "nick": - return "{diplome}{rank}{multidepartment}{modalite}{parcours}" + if xkey == "nick" or xkey == "displayname": + return "{diplome}{rank}{multidepartment}{modalite}{parcours}{year}" if xkey == "extnick": - return "{rank}{multidepartment}{diplomenobut}{modaliteshort}" + return "{ext}{rank}{multidepartment}{diplomenobut}{modaliteshort}" if xkey == "orders": return [[], [], [], [], []] return {} @@ -334,42 +334,9 @@ def get_override(sem, xkey, default=None): return default -def analyse_student(semobj, etud, year=None): - """Returns the final (department,diplome,rank,modalite,parcours,nickname) tuple from etudid in semid, taking into accounts overrides.""" - session_id = semobj["session_id"].split("-") - department = session_id[0] - diplome = session_id[1] - modalite = session_id[2] - if year == None: - if semobj["semestre_id"] < 0: - rank = 1 - else: - rank = (semobj["semestre_id"] + 1) // 2 - else: - rank = year - parcours = None - groups = [] - if "groups" in etud: - for x in etud["groups"]: - if x["partition_name"] == "Parcours": - parcours = x["group_name"] - groups.append(x["group_name"]) - if parcours == None: - parcours = "" - parcours = get_override(semobj, "parcours", parcours) - department = get_override(semobj, "department", department) - rank = get_override(semobj, "rank", rank) - diplome = get_override(semobj, "diplome", diplome) - modalite = get_override(semobj, "modalite", modalite) - if len(modalite) > 0 and modalite[0] == "G": - goal = modalite.split(":")[1:] - modalite = None - for g in goal: - gg = g.split("=") - # print(f"Looking for {gg[0]} yielding {gg[1]} out of {groupes}") - if gg[0] in groups: - modalite = gg[1] - nick = conf_value("nick") +def nick_replace( + department, diplome, rank, modalite, parcours, nick, year=Options.base_year +): if len(department) > 0: nick = nick.replace( "{department}", conf_value("department_separator") + department @@ -386,30 +353,96 @@ def analyse_student(semobj, etud, year=None): nick = nick.replace("{diplome}", conf_value("diplome_separator") + diplome) else: nick = nick.replace("{diplome}", "") + if len(diplome) > 0 and diplome != "BUT": + nick = nick.replace("{diplomenobut}", conf_value("diplome_separator") + diplome) + else: + nick = nick.replace("{diplomenobut}", "") if len(str(rank)) > 0: nick = nick.replace("{rank}", conf_value("rank_separator") + str(rank)) else: nick = nick.replace("{rank}", "") + nick = nick.replace( + "{year}", conf_value("year_separator") + str(Options.base_year + rank - 1) + ) + if diplome != "BUT": + nick = nick.replace( + "{yearnobut}", + conf_value("year_separator") + str(Options.base_year + rank - 1), + ) + else: + nick = nick.replace("{yearnobut}", "") if len(modalite) > 0: nick = nick.replace("{modalite}", conf_value("modalite_separator") + modalite) else: nick = nick.replace("{modalite}", "") + if len(modalite) > 0 and modalite != "FI": + nick = nick.replace("{modaliteshort}", modalite[-1]) + else: + nick = nick.replace("{modaliteshort}", "") if len(parcours) > 0: nick = nick.replace("{parcours}", conf_value("parcours_separator") + parcours) else: nick = nick.replace("{parcours}", "") - formsem_department[str(semobj["id"])] = department - if nick == " BUT 1 GEA EXT": - print(department, diplome, rank, modalite, parcours, nick) - sys.exit(0) - return department, diplome, rank, modalite, parcours, nick - - -def nick(semobj, etud): - department, diplome, rank, modalite, parcours, nick = analyse_student(semobj, etud) + extname = "Ecand " + if diplome == "BUT": + extname = "EXT" + nick = nick.replace("{ext}", extname) return nick +def analyse_student(semobj, etud, univ_year=None): + """Returns the final (department,diplome,rank,modalite,parcours,nickname,displayname) tuple from etudid in semid, taking into accounts overrides.""" + session_id = semobj["session_id"].split("-") + year = str(semobj["annee_scolaire"]) + department = session_id[0] + diplome = session_id[1] + modalite = session_id[2] + if univ_year == None: + if semobj["semestre_id"] < 0: + rank = 1 + else: + rank = (semobj["semestre_id"] + 1) // 2 + else: + rank = univ_year + parcours = None + groups = [] + if "groups" in etud: + for x in etud["groups"]: + if x["partition_name"] == "Parcours": + parcours = x["group_name"] + groups.append(x["group_name"]) + if parcours == None: + parcours = "" + parcours = get_override(semobj, "parcours", parcours) + department = get_override(semobj, "department", department) + rank = get_override(semobj, "rank", rank) + diplome = get_override(semobj, "diplome", diplome) + modalite = get_override(semobj, "modalite", modalite) + formsem_department[str(semobj["id"])] = department + if len(modalite) > 0 and modalite[0] == "G": + goal = modalite.split(":")[1:] + modalite = None + for g in goal: + gg = g.split("=") + # print(f"Looking for {gg[0]} yielding {gg[1]} out of {groupes}") + if gg[0] in groups: + modalite = gg[1] + nick = conf_value("nick") + nick = nick_replace(department, diplome, rank, modalite, parcours, nick, year) + displayname = conf_value("displayname") + displayname = nick_replace( + department, diplome, rank, modalite, parcours, displayname, year + ) + return department, diplome, rank, modalite, parcours, nick, displayname + + +def get_nick(semobj, etud): + department, diplome, rank, modalite, parcours, nick, displayname = analyse_student( + semobj, etud + ) + return nick, displayname + + def get_dept_from_sem(semid): return formsem_department[str(semid)] @@ -471,10 +504,11 @@ def analyse_depts(): studentsummary["modalite"] = {} # modalite studentsummary["parcours"] = {} # parcours studentsummary["nickname"] = {} # nick + studentsummary["displayname"] = {} # display name studentsummary["dept"] = dept # useful when merging students studentsummary["bac"] = "" # usually - department, diplome, rank, modalite, parcours, nick = analyse_student( - sem, etud, year + department, diplome, rank, modalite, parcours, nick, displayname = ( + analyse_student(sem, etud, year) ) if "bac" in etud["admission"]: studentsummary["bac"] = etud["admission"]["bac"] @@ -483,7 +517,9 @@ def analyse_depts(): bacs.add(studentsummary["bac"]) # We skip non-techno students if we are in techno mode # If we want a mixed reporting, maybe we should change this - if Options.techno and studentsummary["bac"][:2] != "ST": # TODO: change this + if ( + Options.techno and studentsummary["bac"][:2] != "ST" + ): # TODO: change this continue if bucket in studentsummary["cursus"]: semestreerreur = int(bucket) + 1 @@ -503,6 +539,7 @@ def analyse_depts(): studentsummary["modalite"][bucket] = modalite studentsummary["parcours"][bucket] = parcours studentsummary["nickname"][bucket] = nick + studentsummary["displayname"][bucket] = displayname studentsummary["debug"] = etud["sort_key"] # TODO: REMOVE studentsummary["unid"] = etud["code_nip"] cohort_nip.add(etud["code_nip"]) @@ -514,6 +551,7 @@ analyse_depts() def allseeingodin(): """This function changes the student lists by peeking in the past and the future to know which students come from another cohort or go into a later cohort.""" + displaynames = {} oldstudents = {} oldstudentslevel = {} futurestudents = {} @@ -535,7 +573,9 @@ def allseeingodin(): continue if nip not in oldstudentslevel or semlevel > oldstudentslevel[nip]: oldstudentslevel[nip] = semlevel - oldstudents[nip] = [semid, nick(sem, etud)] + nick_t, disp_t = get_nick(sem, etud) + oldstudents[nip] = [semid, nick_t] + displaynames[nick_t] = disp_t for semid in futuresems: sem = cache["sem"][semid] if sem["formation"]["type_parcours"] != 700: @@ -551,7 +591,7 @@ def allseeingodin(): continue if nip not in futurestudentslevel or semlevel > futurestudentslevel[nip]: futurestudentslevel[nip] = semlevel - futurestudents[nip] = nick(sem, etud) + futurestudents[nip], tmp = get_nick(sem, etud) unification = {} @@ -602,6 +642,7 @@ def allseeingodin(): "modalite", "parcours", "nickname", + "displayname", "old", "oldsem", ): @@ -610,14 +651,67 @@ def allseeingodin(): if bucket not in base[skey]: base[skey][bucket] = supp[skey][bucket] del student[suppidx] + foundfirst = False + # Ensure all cursus are continuous + for etudid in student: + etud = student[etudid] + foundfirst = False + foundlast = False + fillblanks = None + there = -1 + for i in range(6): + if str(i) in etud["cursus"]: + if foundfirst and foundlast: + fillblanks = [there, i] + else: + foundfirst = True + here = i + else: + if not foundfirst: + continue + foundlast = True + there = i + if fillblanks is not None: + for i in range(fillblanks[0] - 1, fillblanks[1]): + bucket = str(i) + if bucket not in etud["cursus"]: + etud["etudid"][bucket] = etudid + etud["cursus"][bucket] = -1 + etud["pseudodept"][bucket] = "OUT" + etud["diplome"][bucket] = "OUT" + etud["rank"][bucket] = (i // 2) + 1 + etud["modalite"][bucket] = "FI" + etud["parcours"][bucket] = "" + etud["nickname"][bucket] = "OUT" + str(etud["rank"][bucket]) + etud["displayname"][bucket] = "Césure" + displaynames[etud["nickname"][bucket]] = etud["displayname"][bucket] + return displaynames -allseeingodin() +displaynames = allseeingodin() strange_cases = [] next = {} nextnick = {} + +def prepare_display(displaynames): + for etudid in student: + for semlevel in range(5): + if str(semlevel) in student[etudid]["nickname"]: + a = student[etudid]["nickname"][str(semlevel)] + b = student[etudid]["displayname"][str(semlevel)] + if a in displaynames: + if b != displaynames[a]: + die("{a} will be displayed as {b} or {displaynames[a]} !", 6) + else: + displaynames[a] = b + return displaynames + + +displaynames = prepare_display(displaynames) + + for etudid in student.keys(): etud = student[etudid] cursus_array = [None] * 6 @@ -738,6 +832,15 @@ unknown = {} entries = {} redirs = {} +finals = { + "FAIL": "✘", + "RED": "↩", + "QUIT": "↴", + "+DUT": "➡", + "DIPLOME": "✔", + "?": "?", +} + for d in depts: badred[d] = 0 goodred[d] = 0 @@ -790,46 +893,48 @@ for etudid in student.keys(): f"REDI{lastyear} {SCODOC_SERVER}/{ddd}/Scolarite/fiche_etud?etudid={etudid}" ) if resultyear == None: - finaloutput = "?" + etud["nickshort"][lastyear] + finaloutput = "?" unknown[ddd] += 1 strangecases.append( f"????{lastyear} {SCODOC_SERVER}/{ddd}/Scolarite/fiche_etud?etudid={etudid}" ) elif resultyear in ("RAT", "ATJ"): - finaloutput = "?" + etud["nickshort"][lastyear] + finaloutput = "?" unknown[ddd] += 1 strangecases.append( f"ATTE{lastyear} {SCODOC_SERVER}/{ddd}/Scolarite/fiche_etud?etudid={etudid}" ) elif resultyear in ("RED", "ABL", "ADSUP"): - finaloutput = "RED " + etud["nickshort"][lastyear] + finaloutput = "RED" checkred = True elif lastyear == 3 and resultyear in ("ADM", "ADJ"): - finaloutput = "DIPLOME " + etud["nickshort"][lastyear] + finaloutput = "DIPLOME" diploma[ddd] += 1 elif lastyear == 2 and resultyear in ("ADM", "ADJ"): - finaloutput = "+DUT " + etud["nickshort"][lastyear] + finaloutput = "+DUT" reor2[ddd] += 1 elif resultyear in ("PAS1NCI", "PASD"): - finaloutput = "QUIT " + etud["nickshort"][lastyear] + finaloutput = "QUIT" reor1[ddd] += 1 elif lastyear < 2 and resultyear in ("ADM", "ADJ"): - finaloutput = "QUIT " + etud["nickshort"][lastyear] + finaloutput = "QUIT" reor1[ddd] += 1 elif resultyear in ("NAR", "DEM", "DEF", "ABAN"): - finaloutput = "FAIL " + etud["nickshort"][lastyear] + finaloutput = "FAIL" failure[ddd] += 1 elif resjury["annee"]["annee_scolaire"] != Options.base_year + lastyear - 1: - finaloutput = "RED " + etud["nickshort"][lastyear] + finaloutput = "RED" checkred = True if checkred: if "future" not in etud: # print(f"// Mauvais redoublement : {etudid}") badred[ddd] += 1 - finaloutput = "FAIL" + finaloutput[3:] + finaloutput = "FAIL" else: goodred[ddd] += 1 - etud["nickshort"][lastyear + 1] = finaloutput + output = finaloutput + " " + etud["nickshort"][lastyear] + etud["nickshort"][lastyear + 1] = output + displaynames[output] = finals[finaloutput] + etud["nickshort"][lastyear] (firstsem, firstyear) = ( (etud["short"][1], 1) if etud["short"][1] != None @@ -840,7 +945,7 @@ for etudid in student.keys(): firstdept = cache["sem"][firstsem]["departement"]["acronym"] if "old" in etud: yearold = cache["sem"][etud["oldsem"]]["annee_scolaire"] - etud["nickshort"][firstyear - 1] = etud["old"] + " " + str(yearold) + etud["nickshort"][firstyear - 1] = etud["old"] yy = yearold delta = firstyear + Options.base_year - yy - 2 for i in range(delta, firstyear - 1): @@ -860,53 +965,13 @@ for etudid in student.keys(): rank = etud["rank"][startsem] modalite = etud["modalite"][startsem] parcours = etud["parcours"][startsem] - nick = conf_value("extnick") - if len(department) > 0: - nick = nick.replace( - "{department}", conf_value("department_separator") + department - ) - else: - nick = nick.replace("{department}", "") - if len(department) > 0 and len(depts) > 1: - nick = nick.replace( - "{multidepartment}", conf_value("department_separator") + department - ) - else: - nick = nick.replace("{multidepartment}", "") - if len(diplome) > 0: - nick = nick.replace("{diplome}", conf_value("diplome_separator") + diplome) - else: - nick = nick.replace("{diplome}", "") - if len(diplome) > 0 and diplome != "BUT": - nick = nick.replace( - "{diplomenobut}", conf_value("diplome_separator") + diplome - ) - else: - nick = nick.replace("{diplomenobut}", "") - if len(str(rank)) > 0: - nick = nick.replace("{rank}", conf_value("rank_separator") + str(rank)) - else: - nick = nick.replace("{rank}", "") - if len(modalite) > 0: - nick = nick.replace( - "{modalite}", conf_value("modalite_separator") + modalite - ) - else: - nick = nick.replace("{modalite}", "") - if len(modalite) > 0 and modalite != "FI": - nick = nick.replace("{modaliteshort}", modalite[-1]) - else: - nick = nick.replace("{modaliteshort}", "") - if len(parcours) > 0: - nick = nick.replace( - "{parcours}", conf_value("parcours_separator") + parcours - ) - else: - nick = nick.replace("{parcours}", "") - if diplome != "BUT": - nick = "Ecand " + nick - else: - nick = "EXT" + nick + nick = "EXT" + conf_value("nick") + nick = nick_replace(department, diplome, rank, modalite, parcours, nick) + displayname = conf_value("extnick") + displayname = nick_replace( + department, diplome, rank, modalite, parcours, displayname + ) + displaynames[nick] = displayname etud["nickshort"][firstyear - 1] = nick for i in range(0, firstyear - 1): etud["nickshort"][i] = nick + "*" * (firstyear - 1 - i) @@ -1171,7 +1236,20 @@ def printsvg(): k["out"] = lho if lhi != lho and lhi * lho != 0: print(f"BUG1: {j} {k} {lhi} {lho}") + print(json.dumps(layer_structure, indent=2)) + print(json.dumps(node_structure, indent=2)) ls["inout"] += k["size"] + if height == 0: + minheight = 0 + for i in range(5): + ls = layer_structure[i] + new_minheight = spacing * (ls["num"] - 1) + 2 * hmargin + 2 * ls["inout"] + if new_minheight > minheight: + minheight = new_minheight + height = (1 + (minheight // 150)) * 150 + + for i in range(5): + ls = layer_structure[i] ls["density"] = ls["inout"] / ( spacing + height - spacing * ls["num"] - 2 * hmargin ) @@ -1218,7 +1296,7 @@ def printsvg(): stroke="black", ) g1.append(r) - nw = textwidth(n, "Arial", fontsize_name) * unit_ratio + nw = textwidth(displaynames[n], "Arial", fontsize_name) * unit_ratio cw = textwidth(str(ns["size"]), "Arial", fontsize_count) * unit_ratio gw = nw + cw + padding ggw = gw + 2 * padding @@ -1235,7 +1313,7 @@ def printsvg(): cxpos += gw / 2 + padding + thickness rxpos += gw / 2 + padding + thickness t = drawsvg.Text( - n, + displaynames[n], str(fontsize_name) + "pt", nxpos, ypos + fontsize_name / 2,