Reviewed-on: #924
This commit is contained in:
commit
ecd753fae7
@ -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.
|
||||||
|
@ -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 */
|
||||||
|
}
|
@ -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 = {
|
||||||
|
@ -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 %}
|
||||||
|
@ -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
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user