forked from ScoDoc/ScoDoc
Merge branch 'table' of https://scodoc.org/git/ScoDoc/ScoDoc into bac_a_sable_prod
This commit is contained in:
commit
ed05c1f7fe
@ -51,7 +51,9 @@ class Formation(db.Model):
|
|||||||
)
|
)
|
||||||
ues = db.relationship("UniteEns", backref="formation", lazy="dynamic")
|
ues = db.relationship("UniteEns", backref="formation", lazy="dynamic")
|
||||||
formsemestres = db.relationship("FormSemestre", lazy="dynamic", backref="formation")
|
formsemestres = db.relationship("FormSemestre", lazy="dynamic", backref="formation")
|
||||||
ues = db.relationship("UniteEns", lazy="dynamic", backref="formation")
|
ues = db.relationship(
|
||||||
|
"UniteEns", lazy="dynamic", backref="formation", order_by="UniteEns.numero"
|
||||||
|
)
|
||||||
modules = db.relationship("Module", lazy="dynamic", backref="formation")
|
modules = db.relationship("Module", lazy="dynamic", backref="formation")
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
@ -276,7 +276,8 @@ class UniteEns(db.Model):
|
|||||||
ues_meme_niveau = [
|
ues_meme_niveau = [
|
||||||
ue
|
ue
|
||||||
for ue in parcour.ues
|
for ue in parcour.ues
|
||||||
if ue.formation_id == self.formation_id
|
if ue.id != self.id
|
||||||
|
and ue.formation_id == self.formation_id
|
||||||
and ue.niveau_competence_id == niveau.id
|
and ue.niveau_competence_id == niveau.id
|
||||||
]
|
]
|
||||||
if ues_meme_niveau:
|
if ues_meme_niveau:
|
||||||
@ -295,8 +296,9 @@ class UniteEns(db.Model):
|
|||||||
2 * (self.semestre_idx % 2) - 1
|
2 * (self.semestre_idx % 2) - 1
|
||||||
)
|
)
|
||||||
if ues_meme_niveau[0].semestre_idx != other_semestre_idx:
|
if ues_meme_niveau[0].semestre_idx != other_semestre_idx:
|
||||||
msg = f"""Niveau "{
|
msg = f"""Erreur: niveau "{
|
||||||
niveau.libelle}" associé à une autre année du {msg_parc}"""
|
niveau.libelle}" déjà associé à une autre UE du semestre S{
|
||||||
|
ues_meme_niveau[0].semestre_idx} du {msg_parc}"""
|
||||||
log(
|
log(
|
||||||
f"check_niveau_unique_dans_parcours(niveau_id={niveau.id}): "
|
f"check_niveau_unique_dans_parcours(niveau_id={niveau.id}): "
|
||||||
+ msg
|
+ msg
|
||||||
|
@ -386,7 +386,7 @@ class ApoEtud(dict):
|
|||||||
# - Note: moyenne des moyennes générales des deux semestres
|
# - Note: moyenne des moyennes générales des deux semestres
|
||||||
# (pas vraiment de sens, mais faute de mieux)
|
# (pas vraiment de sens, mais faute de mieux)
|
||||||
# on pourrait aussi bien prendre seulement la note du dernier semestre (S2 ou S4).
|
# on pourrait aussi bien prendre seulement la note du dernier semestre (S2 ou S4).
|
||||||
# XXX APOBUT: à modifier pour prendre moyenne indicative annuelle
|
# XXX APOBUT: à modifier pour prendre moyenne indicative annuelle ? non
|
||||||
#
|
#
|
||||||
# - Résultat jury:
|
# - Résultat jury:
|
||||||
# si l'autre est validé, code du semestre courant (ex: S1 (ADM), S2 (AJ) => année AJ)
|
# si l'autre est validé, code du semestre courant (ex: S1 (ADM), S2 (AJ) => année AJ)
|
||||||
@ -404,6 +404,7 @@ class ApoEtud(dict):
|
|||||||
if self.is_apc:
|
if self.is_apc:
|
||||||
cur_decision = {} # comp_elt_semestre sera vide.
|
cur_decision = {} # comp_elt_semestre sera vide.
|
||||||
else:
|
else:
|
||||||
|
# Non BUT
|
||||||
cur_decision = self.cur_res.get_etud_decision_sem(etudid)
|
cur_decision = self.cur_res.get_etud_decision_sem(etudid)
|
||||||
if not cur_decision:
|
if not cur_decision:
|
||||||
# pas de decision => pas de résultat annuel
|
# pas de decision => pas de résultat annuel
|
||||||
@ -492,6 +493,9 @@ class ApoEtud(dict):
|
|||||||
formsemestre_id=formsemestre.id, etudid=self.etud["etudid"]
|
formsemestre_id=formsemestre.id, etudid=self.etud["etudid"]
|
||||||
).first()
|
).first()
|
||||||
)
|
)
|
||||||
|
self.is_nar = (
|
||||||
|
self.validation_annee_but and self.validation_annee_but.code == NAR
|
||||||
|
)
|
||||||
|
|
||||||
def etud_set_semestres_de_etape(self, apo_data: "ApoData"):
|
def etud_set_semestres_de_etape(self, apo_data: "ApoData"):
|
||||||
"""Set .cur_sem and .autre_sem et charge les résultats.
|
"""Set .cur_sem and .autre_sem et charge les résultats.
|
||||||
|
@ -37,6 +37,7 @@ div.les_parcours>div.parc>a:visited {
|
|||||||
.parcour_formation {
|
.parcour_formation {
|
||||||
margin-left: 16px;
|
margin-left: 16px;
|
||||||
margin-right: 16px;
|
margin-right: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
min-width: 1200px;
|
min-width: 1200px;
|
||||||
max-width: 1600px;
|
max-width: 1600px;
|
||||||
}
|
}
|
||||||
@ -119,6 +120,7 @@ span.parc {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
/* color: rgb(92, 87, 255); */
|
/* color: rgb(92, 87, 255); */
|
||||||
color: white;
|
color: white;
|
||||||
|
margin-right: 8px;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
background-color: #09c;
|
background-color: #09c;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -223,7 +223,7 @@ div.head_message {
|
|||||||
color: green;
|
color: green;
|
||||||
}
|
}
|
||||||
|
|
||||||
.message_curtom {
|
.message_custom {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 100%;
|
bottom: 100%;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
@ -237,6 +237,18 @@ div.head_message {
|
|||||||
transform: translate(-50%, 0);
|
transform: translate(-50%, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.message_error {
|
||||||
|
position: fixed;
|
||||||
|
top: 16px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
z-index: 10;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 10px 10px 10px 10px;
|
||||||
|
background: rgb(212, 0, 0);
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
div.passwd_warn {
|
div.passwd_warn {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -2318,11 +2330,12 @@ span.notes_module_list_buts {
|
|||||||
div.formation_parcs {
|
div.formation_parcs {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
|
margin-right: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.formation_parcs>div {
|
div.formation_parcs>div {
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
margin-left: 8px;
|
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #09c;
|
background-color: #09c;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
|
@ -53,7 +53,9 @@ function set_ue_parcour(checkbox) {
|
|||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.status) {
|
if (data.status == 404) {
|
||||||
|
sco_error_message(data.message);
|
||||||
|
} else {
|
||||||
sco_message(data.message);
|
sco_message(data.message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -67,17 +67,22 @@ $(function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Affiche un message transitoire
|
// Affiche un message transitoire (duration milliseconds, 0 means infinity)
|
||||||
function sco_message(msg) {
|
function sco_message(msg, className = "message_custom", duration = 0) {
|
||||||
var div = document.createElement("div");
|
var div = document.createElement("div");
|
||||||
div.className = "message_curtom";
|
div.className = className;
|
||||||
div.innerHTML = msg;
|
div.innerHTML = msg;
|
||||||
document.querySelector("body").appendChild(div);
|
document.querySelector("body").appendChild(div);
|
||||||
|
if (duration) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
div.remove();
|
div.remove();
|
||||||
}, 3000);
|
}, 3000);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sco_error_message(msg) {
|
||||||
|
sco_message(msg, className = "message_error", duration = 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function get_query_args() {
|
function get_query_args() {
|
||||||
|
@ -64,12 +64,13 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container flashes">
|
<div class="container flashes">
|
||||||
{% include "flashed_messages.j2" %}
|
{% include "flashed_messages.j2" %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
|
||||||
{# application content needs to be provided in the app_content block #}
|
{# application content needs to be provided in the app_content block #}
|
||||||
|
<div class="container">
|
||||||
{% block app_content %}{% endblock %}
|
{% block app_content %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
var flashes = document.getElementsByClassName("flashes")[0];
|
var flashes = document.getElementsByClassName("flashes")[0];
|
||||||
|
@ -86,7 +86,6 @@
|
|||||||
<div class="niveau comp-c{{color_idx}}-{{annee}}"
|
<div class="niveau comp-c{{color_idx}}-{{annee}}"
|
||||||
style="--color: var(--col-c{{color_idx}}-{{annee}});">
|
style="--color: var(--col-c{{color_idx}}-{{annee}});">
|
||||||
<div class="titre_niveau n{{annee}}">
|
<div class="titre_niveau n{{annee}}">
|
||||||
{{niv['niveau'].libelle if niv['niveau'] else ''}}
|
|
||||||
<span class="parcs">
|
<span class="parcs">
|
||||||
{% if niv['niveau'].is_tronc_commun %}
|
{% if niv['niveau'].is_tronc_commun %}
|
||||||
<span class="parc">TC</span>
|
<span class="parc">TC</span>
|
||||||
@ -99,6 +98,7 @@
|
|||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
|
{{niv['niveau'].libelle if niv['niveau'] else ''}}
|
||||||
</div>
|
</div>
|
||||||
<div class="ue impair u{{annee}}1">
|
<div class="ue impair u{{annee}}1">
|
||||||
{{ menu_ue(niv, "impair", 2*annee-1) }}
|
{{ menu_ue(niv, "impair", 2*annee-1) }}
|
||||||
|
@ -58,7 +58,13 @@
|
|||||||
</span>
|
</span>
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
|
{% if ue.type != codes_cursus.UE_SPORT %}
|
||||||
|
<div class="formation_parcs">
|
||||||
|
{% for parc in ue.parcours %}
|
||||||
|
<div>{{ parc.code }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% if editable and not ue.is_locked() %}
|
{% if editable and not ue.is_locked() %}
|
||||||
<a class="stdlink" href="{{ url_for('notes.ue_edit',
|
<a class="stdlink" href="{{ url_for('notes.ue_edit',
|
||||||
scodoc_dept=g.scodoc_dept, ue_id=ue.id)
|
scodoc_dept=g.scodoc_dept, ue_id=ue.id)
|
||||||
@ -80,13 +86,8 @@
|
|||||||
<a class="stdlink" href="{{
|
<a class="stdlink" href="{{
|
||||||
url_for('notes.parcour_formation', scodoc_dept=g.scodoc_dept,
|
url_for('notes.parcour_formation', scodoc_dept=g.scodoc_dept,
|
||||||
formation_id=formation.id )
|
formation_id=formation.id )
|
||||||
}}">modifier</a>
|
}}">modifier associations</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="formation_parcs">
|
|
||||||
{% for parc in ue.parcours %}
|
|
||||||
<div>{{ parc.code }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Tests unitaires
|
# Tests unitaires
|
||||||
# Le BUT Info a 4 parcours qui partagent certains niveaux de compétences
|
# Le BUT Info a 4 parcours qui partagent certains niveaux de compétences
|
||||||
# mais à ce sniveaux sont asscoiés des UEs dont les coefficients des ressources
|
# mais à ces niveaux sont associés des UEs dont les coefficients des ressources
|
||||||
# varient selon le parcours.
|
# varient selon le parcours.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user