forked from ScoDoc/ScoDoc
choix groupe sur formulaire saisie absences hebdo
This commit is contained in:
parent
8711d88352
commit
264fd60336
108
ZAbsences.py
108
ZAbsences.py
@ -67,6 +67,7 @@ from sco_permissions import ScoAbsAddBillet, ScoAbsChange, ScoView
|
|||||||
from sco_exceptions import ScoValueError, ScoInvalidDateError
|
from sco_exceptions import ScoValueError, ScoInvalidDateError
|
||||||
from TrivialFormulator import TrivialFormulator, TF
|
from TrivialFormulator import TrivialFormulator, TF
|
||||||
from gen_tables import GenTable
|
from gen_tables import GenTable
|
||||||
|
import html_sco_header
|
||||||
import scolars
|
import scolars
|
||||||
import sco_formsemestre
|
import sco_formsemestre
|
||||||
import sco_moduleimpl
|
import sco_moduleimpl
|
||||||
@ -78,6 +79,8 @@ import sco_compute_moy
|
|||||||
import sco_abs
|
import sco_abs
|
||||||
from sco_abs import ddmmyyyy
|
from sco_abs import ddmmyyyy
|
||||||
|
|
||||||
|
CSSSTYLES = html_sco_header.BOOTSTRAP_MULTISELECT_CSS
|
||||||
|
|
||||||
|
|
||||||
def _toboolean(x):
|
def _toboolean(x):
|
||||||
"convert a value to boolean (ensure backward compat with OLD intranet code)"
|
"convert a value to boolean (ensure backward compat with OLD intranet code)"
|
||||||
@ -343,11 +346,17 @@ class ZAbsences(
|
|||||||
)
|
)
|
||||||
cnx.commit()
|
cnx.commit()
|
||||||
|
|
||||||
security.declareProtected(ScoView, "CountAbs")
|
def ListAbsInRange(
|
||||||
|
self, etudid, debut, fin, matin=None, moduleimpl_id=None, cursor=None
|
||||||
|
):
|
||||||
|
"""Liste des absences entre deux dates.
|
||||||
|
|
||||||
def CountAbs(self, etudid, debut, fin, matin=None, moduleimpl_id=None):
|
Args:
|
||||||
"""CountAbs
|
etudid
|
||||||
matin= 1 ou 0.
|
debut string iso date ("2020-03-12")
|
||||||
|
end string iso date ("2020-03-12")
|
||||||
|
matin None, True, False
|
||||||
|
moduleimpl_id
|
||||||
"""
|
"""
|
||||||
if matin != None:
|
if matin != None:
|
||||||
matin = _toboolean(matin)
|
matin = _toboolean(matin)
|
||||||
@ -358,10 +367,11 @@ class ZAbsences(
|
|||||||
modul = " AND A.MODULEIMPL_ID = %(moduleimpl_id)s "
|
modul = " AND A.MODULEIMPL_ID = %(moduleimpl_id)s "
|
||||||
else:
|
else:
|
||||||
modul = ""
|
modul = ""
|
||||||
|
if not cursor:
|
||||||
cnx = self.GetDBConnexion()
|
cnx = self.GetDBConnexion()
|
||||||
cursor = cnx.cursor(cursor_factory=notesdb.ScoDocCursor)
|
cursor = cnx.cursor(cursor_factory=notesdb.ScoDocCursor)
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""SELECT COUNT(*) AS NbAbs FROM (
|
"""
|
||||||
SELECT DISTINCT A.JOUR, A.MATIN
|
SELECT DISTINCT A.JOUR, A.MATIN
|
||||||
FROM ABSENCES A
|
FROM ABSENCES A
|
||||||
WHERE A.ETUDID = %(etudid)s
|
WHERE A.ETUDID = %(etudid)s
|
||||||
@ -370,13 +380,27 @@ class ZAbsences(
|
|||||||
+ modul
|
+ modul
|
||||||
+ """
|
+ """
|
||||||
AND A.JOUR BETWEEN %(debut)s AND %(fin)s
|
AND A.JOUR BETWEEN %(debut)s AND %(fin)s
|
||||||
) AS tmp
|
|
||||||
""",
|
""",
|
||||||
vars(),
|
vars(),
|
||||||
)
|
)
|
||||||
res = cursor.fetchone()[0]
|
res = cursor.dictfetchall()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
security.declareProtected(ScoView, "CountAbs")
|
||||||
|
|
||||||
|
def CountAbs(self, etudid, debut, fin, matin=None, moduleimpl_id=None):
|
||||||
|
"""CountAbs
|
||||||
|
matin= 1 ou 0.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer.
|
||||||
|
"""
|
||||||
|
return len(
|
||||||
|
self.ListAbsInRange(
|
||||||
|
etudid, debut, fin, matin=matin, moduleimpl_id=moduleimpl_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
security.declareProtected(ScoView, "CountAbsJust")
|
security.declareProtected(ScoView, "CountAbsJust")
|
||||||
|
|
||||||
def CountAbsJust(self, etudid, debut, fin, matin=None, moduleimpl_id=None):
|
def CountAbsJust(self, etudid, debut, fin, matin=None, moduleimpl_id=None):
|
||||||
@ -743,27 +767,48 @@ class ZAbsences(
|
|||||||
else:
|
else:
|
||||||
p = "du groupe"
|
p = "du groupe"
|
||||||
gr_tit = (
|
gr_tit = (
|
||||||
p + '<span class="fontred">' + groups_infos.groups_titles + "</span>"
|
p + ' <span class="fontred">' + groups_infos.groups_titles + "</span>"
|
||||||
)
|
)
|
||||||
|
|
||||||
H = [
|
H = [
|
||||||
self.sco_header(
|
self.sco_header(
|
||||||
page_title="Saisie hebdomadaire des absences",
|
page_title="Saisie hebdomadaire des absences",
|
||||||
init_qtip=True,
|
init_qtip=True,
|
||||||
javascripts=["js/etud_info.js", "js/abs_ajax.js"],
|
javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS
|
||||||
|
+ [
|
||||||
|
"js/etud_info.js",
|
||||||
|
"js/abs_ajax.js",
|
||||||
|
"js/groups_view.js",
|
||||||
|
],
|
||||||
|
cssstyles=CSSSTYLES,
|
||||||
no_side_bar=1,
|
no_side_bar=1,
|
||||||
REQUEST=REQUEST,
|
REQUEST=REQUEST,
|
||||||
),
|
),
|
||||||
"""<table border="0" cellspacing="16"><tr><td>
|
"""<table border="0" cellspacing="16"><tr><td>
|
||||||
<h2>Saisie des absences %s %s,
|
<h2>Saisie des absences %s %s,
|
||||||
<span class="fontred">semaine du lundi %s</span></h2>
|
<span class="fontred">semaine du lundi %s</span></h2>
|
||||||
|
<div>
|
||||||
<p><a href="index_html">Annuler</a></p>
|
<form id="group_selector" method="get">
|
||||||
|
<input type="hidden" name="formsemestre_id" id="formsemestre_id" value="%s"/>
|
||||||
<p>
|
<input type="hidden" name="datelundi" id="datelundi" value="%s"/>
|
||||||
<form action="doSignaleAbsenceGrHebdo" method="post" action="%s">
|
<input type="hidden" name="destination" id="destination" value="%s"/>
|
||||||
|
<input type="hidden" name="moduleimpl_id" id="moduleimpl_id_o" value="%s"/>
|
||||||
|
Groupes: %s
|
||||||
|
</form>
|
||||||
|
<form>
|
||||||
"""
|
"""
|
||||||
% (gr_tit, sem["titre_num"], datelundi, REQUEST.URL0),
|
% (
|
||||||
|
gr_tit,
|
||||||
|
sem["titre_num"],
|
||||||
|
datelundi,
|
||||||
|
groups_infos.formsemestre_id,
|
||||||
|
datelundi,
|
||||||
|
destination,
|
||||||
|
moduleimpl_id or "",
|
||||||
|
sco_groups_view.menu_groups_choice(
|
||||||
|
self, groups_infos, submit_on_change=True
|
||||||
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
#
|
#
|
||||||
modimpls_list = []
|
modimpls_list = []
|
||||||
@ -802,12 +847,12 @@ class ZAbsences(
|
|||||||
sel = "selected" # aucun module specifie
|
sel = "selected" # aucun module specifie
|
||||||
|
|
||||||
H.append(
|
H.append(
|
||||||
"""
|
"""Module concerné:
|
||||||
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">
|
<select id="moduleimpl_id" name="moduleimpl_id" onchange="change_moduleimpl('%(url)s')">
|
||||||
<option value="" %(sel)s>non spécifié</option>
|
<option value="" %(sel)s>non spécifié</option>
|
||||||
%(menu_module)s
|
%(menu_module)s
|
||||||
</select>
|
</select>
|
||||||
</p>"""
|
</div>"""
|
||||||
% {"menu_module": menu_module, "url": base_url, "sel": sel}
|
% {"menu_module": menu_module, "url": base_url, "sel": sel}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -831,7 +876,6 @@ class ZAbsences(
|
|||||||
REQUEST=None,
|
REQUEST=None,
|
||||||
):
|
):
|
||||||
"""Saisie des absences sur une journée sur un semestre (ou intervalle de dates) entier"""
|
"""Saisie des absences sur une journée sur un semestre (ou intervalle de dates) entier"""
|
||||||
# log('SignaleAbsenceGrSemestre: moduleimpl_id=%s destination=%s' % (moduleimpl_id, destination))
|
|
||||||
groups_infos = sco_groups_view.DisplayedGroupsInfos(
|
groups_infos = sco_groups_view.DisplayedGroupsInfos(
|
||||||
self, group_ids, REQUEST=REQUEST
|
self, group_ids, REQUEST=REQUEST
|
||||||
)
|
)
|
||||||
@ -1011,7 +1055,7 @@ class ZAbsences(
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
etuds: liste des étudiants
|
etuds: liste des étudiants
|
||||||
dates: liste de dates iso, par exemple: [ '2020-12-24', ... ]
|
dates: liste ordonnée de dates iso, par exemple: [ '2020-12-24', ... ]
|
||||||
moduleimpl_id: optionnel, module concerné.
|
moduleimpl_id: optionnel, module concerné.
|
||||||
"""
|
"""
|
||||||
H = [
|
H = [
|
||||||
@ -1048,6 +1092,8 @@ class ZAbsences(
|
|||||||
]
|
]
|
||||||
# Dates
|
# Dates
|
||||||
odates = [datetime.date(*[int(x) for x in d.split("-")]) for d in dates]
|
odates = [datetime.date(*[int(x) for x in d.split("-")]) for d in dates]
|
||||||
|
begin = dates[0]
|
||||||
|
end = dates[-1]
|
||||||
# Titres colonnes
|
# Titres colonnes
|
||||||
noms_jours = [] # eg [ "Lundi", "mardi", "Samedi", ... ]
|
noms_jours = [] # eg [ "Lundi", "mardi", "Samedi", ... ]
|
||||||
jn = sco_abs.day_names(self)
|
jn = sco_abs.day_names(self)
|
||||||
@ -1076,6 +1122,8 @@ class ZAbsences(
|
|||||||
'<tr><td><span class="redboldtext">Aucun étudiant inscrit !</span></td></tr>'
|
'<tr><td><span class="redboldtext">Aucun étudiant inscrit !</span></td></tr>'
|
||||||
)
|
)
|
||||||
i = 1
|
i = 1
|
||||||
|
cnx = self.GetDBConnexion()
|
||||||
|
cursor = cnx.cursor(cursor_factory=notesdb.ScoDocCursor)
|
||||||
for etud in etuds:
|
for etud in etuds:
|
||||||
i += 1
|
i += 1
|
||||||
etudid = etud["etudid"]
|
etudid = etud["etudid"]
|
||||||
@ -1101,17 +1149,20 @@ class ZAbsences(
|
|||||||
'<tr class="%s"><td><b class="etudinfo" id="%s"><a class="discretelink" href="ficheEtud?etudid=%s" target="new">%s</a></b>%s</td>'
|
'<tr class="%s"><td><b class="etudinfo" id="%s"><a class="discretelink" href="ficheEtud?etudid=%s" target="new">%s</a></b>%s</td>'
|
||||||
% (tr_class, etudid, etudid, etud["nomprenom"], capstr)
|
% (tr_class, etudid, etudid, etud["nomprenom"], capstr)
|
||||||
)
|
)
|
||||||
for date in dates:
|
etud_abs = self.ListAbsInRange(
|
||||||
|
etudid, begin, end, moduleimpl_id=moduleimpl_id, cursor=cursor
|
||||||
|
)
|
||||||
|
for d in odates:
|
||||||
|
date = d.strftime("%Y-%m-%d")
|
||||||
# matin
|
# matin
|
||||||
if self.CountAbs(etudid, date, date, True, moduleimpl_id=moduleimpl_id):
|
is_abs = {"jour": d, "matin": True} in etud_abs
|
||||||
|
if is_abs:
|
||||||
checked = "checked"
|
checked = "checked"
|
||||||
else:
|
else:
|
||||||
checked = ""
|
checked = ""
|
||||||
# bulle lors du passage souris
|
# bulle lors du passage souris
|
||||||
coljour = sco_abs.DAYNAMES[
|
coljour = sco_abs.DAYNAMES[(calendar.weekday(d.year, d.month, d.day))]
|
||||||
(calendar.weekday(int(date[:4]), int(date[5:7]), int(date[8:])))
|
datecol = coljour + " " + d.strftime("%d/%m/%Y")
|
||||||
]
|
|
||||||
datecol = coljour + " " + date[8:] + "/" + date[5:7] + "/" + date[:4]
|
|
||||||
bulle_am = '"' + etud["nomprenom"] + " - " + datecol + ' (matin)"'
|
bulle_am = '"' + etud["nomprenom"] + " - " + datecol + ' (matin)"'
|
||||||
bulle_pm = '"' + etud["nomprenom"] + " - " + datecol + ' (ap.midi)"'
|
bulle_pm = '"' + etud["nomprenom"] + " - " + datecol + ' (ap.midi)"'
|
||||||
|
|
||||||
@ -1127,9 +1178,8 @@ class ZAbsences(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
# après-midi
|
# après-midi
|
||||||
if self.CountAbs(
|
is_abs = {"jour": d, "matin": False} in etud_abs
|
||||||
etudid, date, date, False, moduleimpl_id=moduleimpl_id
|
if is_abs:
|
||||||
):
|
|
||||||
checked = "checked"
|
checked = "checked"
|
||||||
else:
|
else:
|
||||||
checked = ""
|
checked = ""
|
||||||
|
@ -534,14 +534,6 @@ class GenTable:
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
pdf_style_list += self.pdf_table_style
|
pdf_style_list += self.pdf_table_style
|
||||||
# log('len(Pt)=%s' % len(Pt))
|
|
||||||
# log( 'line lens=%s' % [ len(x) for x in Pt ] )
|
|
||||||
# log( 'style=\n%s' % pdf_style_list)
|
|
||||||
# col_min = min([x[1][0] for x in pdf_style_list])
|
|
||||||
# col_max = max([x[2][0] for x in pdf_style_list])
|
|
||||||
# lin_min = min([x[1][1] for x in pdf_style_list])
|
|
||||||
# lin_max = max([x[2][1] for x in pdf_style_list])
|
|
||||||
# log('col_min=%s col_max=%s lin_min=%s lin_max=%s' % (col_min, col_max, lin_min, lin_max))
|
|
||||||
T = Table(Pt, repeatRows=1, colWidths=self.pdf_col_widths, style=pdf_style_list)
|
T = Table(Pt, repeatRows=1, colWidths=self.pdf_col_widths, style=pdf_style_list)
|
||||||
|
|
||||||
objects = []
|
objects = []
|
||||||
|
@ -2,20 +2,20 @@
|
|||||||
// JS Ajax code for SignaleAbsenceGrSemestre
|
// JS Ajax code for SignaleAbsenceGrSemestre
|
||||||
// Contributed by YLB
|
// Contributed by YLB
|
||||||
|
|
||||||
function ajaxFunction(mod, etudid, dat){
|
function ajaxFunction(mod, etudid, dat) {
|
||||||
var ajaxRequest; // The variable that makes Ajax possible!
|
var ajaxRequest; // The variable that makes Ajax possible!
|
||||||
|
|
||||||
try{
|
try {
|
||||||
// Opera 8.0+, Firefox, Safari
|
// Opera 8.0+, Firefox, Safari
|
||||||
ajaxRequest = new XMLHttpRequest();
|
ajaxRequest = new XMLHttpRequest();
|
||||||
} catch (e){
|
} catch (e) {
|
||||||
// Internet Explorer Browsers
|
// Internet Explorer Browsers
|
||||||
try{
|
try {
|
||||||
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
|
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
try{
|
try {
|
||||||
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
|
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
} catch (e){
|
} catch (e) {
|
||||||
// Something went wrong
|
// Something went wrong
|
||||||
alert("Your browser broke!");
|
alert("Your browser broke!");
|
||||||
return false;
|
return false;
|
||||||
@ -23,22 +23,26 @@ function ajaxFunction(mod, etudid, dat){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Create a function that will receive data sent from the server
|
// Create a function that will receive data sent from the server
|
||||||
ajaxRequest.onreadystatechange = function(){
|
ajaxRequest.onreadystatechange = function () {
|
||||||
if(ajaxRequest.readyState == 4 && ajaxRequest.status == 200){
|
if (ajaxRequest.readyState == 4 && ajaxRequest.status == 200) {
|
||||||
document.getElementById("AjaxDiv").innerHTML=ajaxRequest.responseText;
|
document.getElementById("AjaxDiv").innerHTML = ajaxRequest.responseText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ajaxRequest.open("POST", "doSignaleAbsenceGrSemestre", true);
|
ajaxRequest.open("POST", "doSignaleAbsenceGrSemestre", true);
|
||||||
ajaxRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
|
ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
||||||
oForm = document.forms[0];
|
oForm = document.forms[1];
|
||||||
oSelectOne = oForm.elements["moduleimpl_id"];
|
oSelectOne = oForm.elements["moduleimpl_id"];
|
||||||
index = oSelectOne.selectedIndex;
|
index = oSelectOne.selectedIndex;
|
||||||
modul_id = oSelectOne.options[index].value;
|
modul_id = oSelectOne.options[index].value;
|
||||||
if (mod == 'add') {
|
if (mod == 'add') {
|
||||||
ajaxRequest.send("reply=0&moduleimpl_id=" + modul_id +"&abslist:list=" + etudid + ":" + dat);
|
ajaxRequest.send("reply=0&moduleimpl_id=" + modul_id + "&abslist:list=" + etudid + ":" + dat);
|
||||||
}
|
}
|
||||||
if (mod == 'remove') {
|
if (mod == 'remove') {
|
||||||
ajaxRequest.send("reply=0&moduleimpl_id=" + modul_id +"&etudids=" + etudid + "&dates=" + dat);
|
ajaxRequest.send("reply=0&moduleimpl_id=" + modul_id + "&etudids=" + etudid + "&dates=" + dat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----
|
||||||
|
function change_moduleimpl(url) {
|
||||||
|
document.location = url + '&moduleimpl_id=' + document.getElementById('moduleimpl_id').value;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user