Merge pull request 'Correction BUG + Ticket #913' (#924) from iziram/ScoDoc:hotfix into master

Reviewed-on: #924
This commit is contained in:
Emmanuel Viennet 2024-06-05 15:37:44 +02:00
commit ecd753fae7
5 changed files with 135 additions and 103 deletions

View File

@ -405,6 +405,18 @@ class Identite(models.ScoDocModel):
modimpls_by_formsemestre[formsemestre.id] = modimpls_sem modimpls_by_formsemestre[formsemestre.id] = modimpls_sem
return modimpls_by_formsemestre return modimpls_by_formsemestre
def get_modimpls_from_formsemestre(
self, formsemestre: "FormSemestre"
) -> list["ModuleImpl"]:
"""
Liste des ModuleImpl auxquels l'étudiant est inscrit dans le formsemestre.
"""
modimpls = ModuleImpl.query.join(ModuleImplInscription).filter(
ModuleImplInscription.etudid == self.id,
ModuleImpl.formsemestre_id == formsemestre.id,
)
return modimpls.all()
@classmethod @classmethod
def convert_dict_fields(cls, args: dict) -> dict: def convert_dict_fields(cls, args: dict) -> dict:
"""Convert fields in the given dict. No other side effect. """Convert fields in the given dict. No other side effect.

View File

@ -755,3 +755,85 @@ tr.row-justificatif.non_valide td.assi-type {
#gtrcontent[data-pdp="true"] .pdp { #gtrcontent[data-pdp="true"] .pdp {
display: block; display: block;
} }
.sco-drop {
border: 1px solid #e1e1e1;
/* Couleur de bordure plus douce */
border-radius: 8px;
/* Coins plus arrondis */
background-color: #fafafa;
/* Couleur de fond légère */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
/* Ombre douce pour de la profondeur */
width: 100%;
/* Adaptation à la largeur de son conteneur */
max-width: 600px;
/* Largeur maximale pour une meilleure apparence sur grands écrans */
margin: 10px auto;
/* Centrage avec une marge */
position: relative;
z-index: 1;
}
.sco-drop[open] {
z-index: 2;
/* Empilement au-dessus des autres détails */
}
.sco-drop summary {
font-weight: 600;
/* Texte plus épais */
color: #333;
/* Couleur de texte plus foncée pour le contraste */
padding: 7px 10px;
/* Plus de padding pour une meilleure ergonomie */
cursor: pointer;
list-style: none;
/* Enlève les puces */
outline: none;
/* Supprime la bordure de focus par défaut pour un look plus net */
user-select: none;
/* Empêche la sélection du texte */
text-align: center;
}
.sco-drop summary::-webkit-details-marker {
display: none;
/* Cache le triangle par défaut sur Chrome/Safari */
}
.sco-drop summary:focus {
outline: none;
/* Plus propre sans contour lors du focus */
}
.sco-drop ul {
list-style: none;
/* Enlève les puces */
margin: 5px 0;
padding: 0;
background-color: #fff;
/* Arrière-plan blanc pour le contenu */
position: absolute;
border-radius: 8px;
z-index: 1000;
border: 1px solid #e1e1e1;
/* Bordure plus douce */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
/* Ombre douce pour de la profondeur */
overflow-y: scroll;
max-height: 150px;
/* Hauteur maximale pour une meilleure apparence sur grands écrans */
}
.sco-drop li {
padding: 10px 20px;
/* Espacement intérieur pour les éléments de liste */
border-top: 1px solid #e1e1e1;
/* Séparateur subtil entre les éléments */
}
.sco-drop li:first-child {
border-top: none;
/* Pas de bordure en haut du premier élément */
}

View File

@ -335,17 +335,36 @@
); );
} }
function generateConflitDetails(assiduites){
let html = '<details class="sco-drop"><summary>Assiduités en conflit</summary><ul>'
assiduites.forEach((a)=>{
const deb = new Date(a.date_debut);
const fin = new Date(a.date_fin);
let date = "";
if (deb.isSame(fin, "day")){
date = `le ${deb.format("DD/MM/YYYY")} de ${deb.format("HH:mm")} à ${fin.format("HH:mm")}`;
}else{
date = `du ${deb.format("DD/MM/YYYY")} au ${fin.format("DD/MM/YYYY")}`;
}
html += `<li>
<a
href="edit_assiduite_etud/${a.assiduite_id}"
title="Cliquez pour voir/éditer l'assiduité"
target="_blank"
>
${a.etat} ${date}
</a>
</li>`
})
return html + "</ul></details>"
}
function updateTable(assiduites) { function updateTable(assiduites) {
const img_conflit = `
<a
class="conflit_calendar"
title="Des assiduités existent déjà pour cette période. Cliquez ici pour voir le calendrier de l'assiduité de l'étudiant"
data-tooltip
target="_blank"
>📅</a>`
// Suppression existant // Suppression existant
document.querySelectorAll("td.btns").forEach((el) => { document.querySelectorAll("td.btns").forEach((el) => {
el.remove(); el.remove();
@ -454,8 +473,7 @@
tdMatin.setAttribute("data-tooltip", ""); tdMatin.setAttribute("data-tooltip", "");
} else { } else {
tdMatin.innerHTML = img_conflit; tdMatin.innerHTML = generateConflitDetails(etudAssiMorning);
tdMatin.querySelector(".conflit_calendar").href = `calendrier_assi_etud?etudid=${etudid}`;
tdMatin.classList.add("conflit"); tdMatin.classList.add("conflit");
} }
} }
@ -485,8 +503,7 @@
tdApresmidi.setAttribute("title", text); tdApresmidi.setAttribute("title", text);
tdApresmidi.setAttribute("data-tooltip", ""); tdApresmidi.setAttribute("data-tooltip", "");
} else { } else {
tdApresmidi.innerHTML = img_conflit; tdApresmidi.innerHTML = generateConflitDetails(etudAssiAfternoon);
tdApresmidi.querySelector(".conflit_calendar").href = `calendrier_assi_etud?etudid=${etudid}`;
tdApresmidi.classList.add("conflit"); tdApresmidi.classList.add("conflit");
} }
} }
@ -560,7 +577,6 @@
// coche tous les boutons de la colonne // coche tous les boutons de la colonne
function allPresent(day, time) { function allPresent(day, time) {
// Version naive : coche tous les boutons de la colonne // Version naive : coche tous les boutons de la colonne
// TODO - Optimiser avec une seule requête API
let tds = document.querySelectorAll(`td[day="${day}"][time="${time}"]`); let tds = document.querySelectorAll(`td[day="${day}"][time="${time}"]`);
const real_time = time == "am" ? "matin" : "apresmidi"; const real_time = time == "am" ? "matin" : "apresmidi";
const assi = { const assi = {

View File

@ -86,87 +86,7 @@
} }
.sco-drop {
border: 1px solid #e1e1e1;
/* Couleur de bordure plus douce */
border-radius: 8px;
/* Coins plus arrondis */
background-color: #fafafa;
/* Couleur de fond légère */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
/* Ombre douce pour de la profondeur */
width: 100%;
/* Adaptation à la largeur de son conteneur */
max-width: 600px;
/* Largeur maximale pour une meilleure apparence sur grands écrans */
margin: 10px auto;
/* Centrage avec une marge */
position: relative;
z-index: 1;
}
.sco-drop[open] {
z-index: 2;
/* Empilement au-dessus des autres détails */
}
.sco-drop summary {
font-weight: 600;
/* Texte plus épais */
color: #333;
/* Couleur de texte plus foncée pour le contraste */
padding: 7px 10px;
/* Plus de padding pour une meilleure ergonomie */
cursor: pointer;
list-style: none;
/* Enlève les puces */
outline: none;
/* Supprime la bordure de focus par défaut pour un look plus net */
user-select: none;
/* Empêche la sélection du texte */
text-align: center;
}
.sco-drop summary::-webkit-details-marker {
display: none;
/* Cache le triangle par défaut sur Chrome/Safari */
}
.sco-drop summary:focus {
outline: none;
/* Plus propre sans contour lors du focus */
}
.sco-drop ul {
list-style: none;
/* Enlève les puces */
margin: 5px 0;
padding: 0;
background-color: #fff;
/* Arrière-plan blanc pour le contenu */
position: absolute;
border-radius: 8px;
z-index: 1000;
border: 1px solid #e1e1e1;
/* Bordure plus douce */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
/* Ombre douce pour de la profondeur */
overflow-y: scroll;
max-height: 150px;
/* Hauteur maximale pour une meilleure apparence sur grands écrans */
}
.sco-drop li {
padding: 10px 20px;
/* Espacement intérieur pour les éléments de liste */
border-top: 1px solid #e1e1e1;
/* Séparateur subtil entre les éléments */
}
.sco-drop li:first-child {
border-top: none;
/* Pas de bordure en haut du premier élément */
}
</style> </style>
{% endblock styles %} {% endblock styles %}

View File

@ -2168,15 +2168,17 @@ def edit_assiduite_etud(assiduite_id: int):
form.disable_all() form.disable_all()
# peuplement moduleimpl_select # peuplement moduleimpl_select
modimpls_by_formsemestre = etud.get_modimpls_by_formsemestre(scu.annee_scolaire())
choices: OrderedDict = OrderedDict() choices: OrderedDict = OrderedDict()
choices[""] = [("", "Non spécifié"), ("autre", "Autre module (pas dans la liste)")] choices[""] = [("", "Non spécifié"), ("autre", "Autre module (pas dans la liste)")]
# Récupération des modulesimpl du semestre si existant.
if formsemestre:
# indique le nom du semestre dans le menu (optgroup) # indique le nom du semestre dans le menu (optgroup)
modimpls_from_formsemestre = etud.get_modimpls_from_formsemestre(formsemestre)
group_name: str = formsemestre.titre_annee() group_name: str = formsemestre.titre_annee()
choices[group_name] = [ choices[group_name] = [
(m.id, f"{m.module.code} {m.module.abbrev or m.module.titre or ''}") (m.id, f"{m.module.code} {m.module.abbrev or m.module.titre or ''}")
for m in modimpls_by_formsemestre[formsemestre.id] for m in modimpls_from_formsemestre
if m.module.ue.type == UE_STANDARD if m.module.ue.type == UE_STANDARD
] ]