forked from ScoDoc/DocScoDoc
Absences: option pour rendre le module concerné obligatoire
This commit is contained in:
parent
1ed7e3567e
commit
e682b37494
45
ZAbsences.py
45
ZAbsences.py
@ -951,6 +951,7 @@ class ZAbsences(
|
||||
)
|
||||
|
||||
formsemestre_id = groups_infos.formsemestre_id
|
||||
require_module = self.get_preference("abs_require_module", formsemestre_id)
|
||||
etuds = [
|
||||
self.getEtudInfo(etudid=m["etudid"], filled=True)[0]
|
||||
for m in groups_infos.members
|
||||
@ -1042,7 +1043,9 @@ class ZAbsences(
|
||||
% {"menu_module": menu_module, "url": base_url, "sel": sel}
|
||||
)
|
||||
|
||||
H += self._gen_form_saisie_groupe(etuds, datessem, destination, moduleimpl_id)
|
||||
H += self._gen_form_saisie_groupe(
|
||||
etuds, datessem, destination, moduleimpl_id, require_module
|
||||
)
|
||||
|
||||
H.append(self.sco_footer(REQUEST))
|
||||
return "\n".join(H)
|
||||
@ -1072,6 +1075,7 @@ class ZAbsences(
|
||||
)
|
||||
|
||||
formsemestre_id = groups_infos.formsemestre_id
|
||||
require_module = self.get_preference("abs_require_module", formsemestre_id)
|
||||
etuds = [
|
||||
self.getEtudInfo(etudid=m["etudid"], filled=True)[0]
|
||||
for m in groups_infos.members
|
||||
@ -1200,19 +1204,32 @@ class ZAbsences(
|
||||
sel = "selected" # aucun module specifie
|
||||
H.append(
|
||||
"""<p>
|
||||
Module concerné par ces absences (optionnel): <select id="moduleimpl_id" name="moduleimpl_id" onchange="document.location='%(url)s&moduleimpl_id='+document.getElementById('moduleimpl_id').value">
|
||||
Module concerné par ces absences (%(optionel_txt)s):
|
||||
<select id="moduleimpl_id" name="moduleimpl_id"
|
||||
onchange="document.location='%(url)s&moduleimpl_id='+document.getElementById('moduleimpl_id').value">
|
||||
<option value="" %(sel)s>non spécifié</option>
|
||||
%(menu_module)s
|
||||
</select>
|
||||
</p>"""
|
||||
% {"menu_module": menu_module, "url": base_url, "sel": sel}
|
||||
% {
|
||||
"menu_module": menu_module,
|
||||
"url": base_url,
|
||||
"sel": sel,
|
||||
"optionel_txt": '<span class="redboldtext">requis</span>'
|
||||
if require_module
|
||||
else "optionnel",
|
||||
}
|
||||
)
|
||||
|
||||
H += self._gen_form_saisie_groupe(etuds, dates, destination, moduleimpl_id)
|
||||
H += self._gen_form_saisie_groupe(
|
||||
etuds, dates, destination, moduleimpl_id, require_module
|
||||
)
|
||||
H.append(self.sco_footer(REQUEST))
|
||||
return "\n".join(H)
|
||||
|
||||
def _gen_form_saisie_groupe(self, etuds, dates, destination="", moduleimpl_id=None):
|
||||
def _gen_form_saisie_groupe(
|
||||
self, etuds, dates, destination="", moduleimpl_id=None, require_module=False
|
||||
):
|
||||
"""Formulaire saisie absences
|
||||
|
||||
Args:
|
||||
@ -1223,6 +1240,9 @@ class ZAbsences(
|
||||
H = [
|
||||
"""
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
$(".abs_form_table input").prop( "disabled", %s );
|
||||
});
|
||||
function colorize(obj) {
|
||||
if (obj.checked) {
|
||||
obj.parentNode.className = 'absent';
|
||||
@ -1244,7 +1264,10 @@ class ZAbsences(
|
||||
<table rules="cols" frame="box" class="abs_form_table">
|
||||
<tr><th class="formabs_contetud">%d étudiants</th>
|
||||
"""
|
||||
% len(etuds)
|
||||
% (
|
||||
"true" if (require_module and not moduleimpl_id) else "false",
|
||||
len(etuds),
|
||||
)
|
||||
]
|
||||
# Dates
|
||||
odates = [datetime.date(*[int(x) for x in d.split("-")]) for d in dates]
|
||||
@ -1404,7 +1427,7 @@ class ZAbsences(
|
||||
if x:
|
||||
return "matin"
|
||||
else:
|
||||
return "après midi"
|
||||
return "après-midi"
|
||||
|
||||
def descr_exams(a):
|
||||
if not a.has_key("evals"):
|
||||
@ -1817,12 +1840,12 @@ ou entrez une date pour visualiser les absents un jour donné :
|
||||
if b["abs_begin"].hour < 12:
|
||||
m = " matin"
|
||||
else:
|
||||
m = " après midi"
|
||||
m = " après-midi"
|
||||
b["abs_begin_str"] = b["abs_begin"].strftime("%d/%m/%Y") + m
|
||||
if b["abs_end"].hour < 12:
|
||||
m = " matin"
|
||||
else:
|
||||
m = " après midi"
|
||||
m = " après-midi"
|
||||
b["abs_end_str"] = b["abs_end"].strftime("%d/%m/%Y") + m
|
||||
if b["etat"] == 0:
|
||||
if b["justified"] == 0:
|
||||
@ -1949,7 +1972,7 @@ ou entrez une date pour visualiser les absents un jour donné :
|
||||
def _ProcessBilletAbsence(self, billet, estjust, description, REQUEST):
|
||||
"""Traite un billet: ajoute absence(s) et éventuellement justificatifs,
|
||||
et change l'état du billet à 1.
|
||||
NB: actuellement, les heures ne sont utilisées que pour déterminer si matin et/ou après midi.
|
||||
NB: actuellement, les heures ne sont utilisées que pour déterminer si matin et/ou après-midi.
|
||||
"""
|
||||
cnx = self.GetDBConnexion()
|
||||
if billet["etat"] != 0:
|
||||
@ -1961,7 +1984,7 @@ ou entrez une date pour visualiser les absents un jour donné :
|
||||
datedebut = billet["abs_begin"].strftime("%d/%m/%Y")
|
||||
datefin = billet["abs_end"].strftime("%d/%m/%Y")
|
||||
dates = self.DateRangeISO(datedebut, datefin)
|
||||
# commence apres midi ?
|
||||
# commence après-midi ?
|
||||
if dates and billet["abs_begin"].hour > 11:
|
||||
self._AddAbsence(
|
||||
billet["etudid"], dates[0], 0, estjust, REQUEST, description=description
|
||||
|
@ -127,16 +127,47 @@ def SignaleAbsenceEtud(context, REQUEST=None): # etudid implied
|
||||
# brute-force portage from very old dtml code ...
|
||||
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
|
||||
etudid = etud["etudid"]
|
||||
disabled = False
|
||||
if not etud["cursem"]:
|
||||
require_module = context.get_preference(
|
||||
"abs_require_module"
|
||||
) # on utilise la pref globale car pas de sem courant
|
||||
if require_module:
|
||||
menu_module = """<div class="ue_warning">Pas inscrit dans un semestre courant,
|
||||
et l'indication du module est requise. Donc pas de saisie d'absence possible !</div>"""
|
||||
disabled = True
|
||||
else:
|
||||
menu_module = ""
|
||||
else:
|
||||
formsemestre_id = etud["cursem"]["formsemestre_id"]
|
||||
require_module = context.get_preference("abs_require_module", formsemestre_id)
|
||||
nt = context.Notes._getNotesCache().get_NotesTable(
|
||||
context.Notes, formsemestre_id
|
||||
)
|
||||
ues = nt.get_ues(etudid=etudid)
|
||||
menu_module = """<p><select name="moduleimpl_id">
|
||||
<option value="NULL" selected>(Module)</option>"""
|
||||
if require_module:
|
||||
menu_module = """
|
||||
<script type="text/javascript">
|
||||
function form_enable_disable() {
|
||||
if ( $("select#sel_moduleimpl_id").val() == "NULL" ) {
|
||||
$("#butsubmit").prop("disabled", true);
|
||||
} else {
|
||||
$("#butsubmit").prop("disabled", false);
|
||||
};
|
||||
}
|
||||
$(document).ready(function() {
|
||||
form_enable_disable();
|
||||
});
|
||||
</script>
|
||||
<p>Module:
|
||||
<select id="sel_moduleimpl_id" name="moduleimpl_id"
|
||||
onChange="form_enable_disable();">"""
|
||||
else:
|
||||
menu_module = (
|
||||
"""<p>Module: <select id="sel_moduleimpl_id" name="moduleimpl_id">"""
|
||||
)
|
||||
menu_module += """<option value="NULL" selected>(Module)</option>"""
|
||||
|
||||
for ue in ues:
|
||||
modimpls = nt.get_modimpls(ue_id=ue["ue_id"])
|
||||
for modimpl in modimpls:
|
||||
@ -171,35 +202,40 @@ def SignaleAbsenceEtud(context, REQUEST=None): # etudid implied
|
||||
<input type="hidden" name="etudid" value="%(etudid)s">
|
||||
<p>
|
||||
<table><tr>
|
||||
<td>Date début : </td>
|
||||
<td>Date début : </td>
|
||||
<td><input type="text" name="datedebut" size="10" class="datepicker"/> <em>j/m/a</em></td>
|
||||
<td> Date Fin (optionnel):</td>
|
||||
<td> Date fin (optionnelle):</td>
|
||||
<td><input type="text" name="datefin" size="10" class="datepicker"/> <em>j/m/a</em></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
<input type="radio" name="demijournee" value="2" checked>journée(s)
|
||||
<input type="radio" name="demijournee" value="2" checked>Journée(s)
|
||||
<input type="radio" name="demijournee" value="1">Matin(s)
|
||||
<input type="radio" name="demijournee" value="0">Après midi
|
||||
<input type="radio" name="demijournee" value="0">Après-midi
|
||||
|
||||
%(menu_module)s
|
||||
|
||||
<p>
|
||||
<input type="checkbox" name="estjust"/>Absence justifiée.
|
||||
<input type="checkbox" name="estjust"/>Absence justifiée.
|
||||
<br/>
|
||||
Raison: <input type="text" name="description" size="42"/> (optionnel)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<input type="submit" value="Envoyer"/>
|
||||
<input id="butsubmit" type="submit" value="Envoyer" disable="%(disabled)s"/>
|
||||
<em>
|
||||
<p>Seuls les modules du semestre en cours apparaissent.</p><p> Evitez de saisir une absence pour un module qui n'est pas en place à cette date.</p>
|
||||
<p>Toutes les dates sont au format jour/mois/annee</p>
|
||||
<p>Seuls les modules du semestre en cours apparaissent.</p>
|
||||
<p>Évitez de saisir une absence pour un module qui n'est pas en place à cette date.</p>
|
||||
<p>Toutes les dates sont au format jour/mois/annee.</p>
|
||||
</em>
|
||||
|
||||
</form>
|
||||
"""
|
||||
% {"etudid": etud["etudid"], "menu_module": menu_module},
|
||||
% {
|
||||
"etudid": etud["etudid"],
|
||||
"menu_module": menu_module,
|
||||
"disabled": "disabled" if disabled else "",
|
||||
},
|
||||
context.sco_footer(REQUEST),
|
||||
]
|
||||
return "\n".join(H)
|
||||
@ -311,7 +347,7 @@ def JustifAbsenceEtud(context, REQUEST=None): # etudid implied
|
||||
</table>
|
||||
<br/>
|
||||
|
||||
<input type="radio" name="demijournee" value="2" checked>journée(s)
|
||||
<input type="radio" name="demijournee" value="2" checked>Journée(s)
|
||||
<input type="radio" name="demijournee" value="1">Matin(s)
|
||||
<input type="radio" name="demijournee" value="0">Après midi
|
||||
|
||||
@ -473,7 +509,7 @@ def doAnnuleJustif(
|
||||
dates = context.DateRangeISO(datedebut0, datefin0)
|
||||
nbadded = 0
|
||||
for jour in dates:
|
||||
# Attention: supprime matin et après midi
|
||||
# Attention: supprime matin et après-midi
|
||||
if demijournee == "2":
|
||||
context._AnnuleJustif(etudid, jour, False, REQUEST=REQUEST)
|
||||
context._AnnuleJustif(etudid, jour, True, REQUEST=REQUEST)
|
||||
@ -553,7 +589,6 @@ def formChoixSemestreGroupe(context, all=False):
|
||||
if not sems:
|
||||
raise ScoValueError("aucun semestre !")
|
||||
H = ['<select name="group_ids">']
|
||||
nbgroups = 0
|
||||
for sem in sems:
|
||||
for p in sco_groups.get_partitions_list(context, sem["formsemestre_id"]):
|
||||
for group in sco_groups.get_partition_groups(context, p):
|
||||
|
@ -305,6 +305,17 @@ PREFS = (
|
||||
"only_global": True, # devrait etre par semestre, mais demanderait modif gestion absences
|
||||
},
|
||||
),
|
||||
(
|
||||
"abs_require_module", # affecte l'UI mais pas les fonctions de base
|
||||
{
|
||||
"initvalue": 0,
|
||||
"title": "Imposer l'indication du module lors de la saisie des absences",
|
||||
"input_type": "boolcheckbox",
|
||||
"labels": ["non", "oui"],
|
||||
"category": "abs",
|
||||
"only_global": False,
|
||||
},
|
||||
),
|
||||
(
|
||||
"handle_billets_abs",
|
||||
{
|
||||
@ -369,7 +380,6 @@ PREFS = (
|
||||
"title": "Notifier à:",
|
||||
"explanation": "e-mail à qui envoyer des notification d'absences (en sus des autres destinataires éventuels, comme le chef etc.)",
|
||||
"size": 40,
|
||||
"explanation": "utilisé pour envoi mail absences",
|
||||
"category": "abs",
|
||||
},
|
||||
),
|
||||
|
Loading…
Reference in New Issue
Block a user