From d6fa3e57de99c7f0768efd2c3eb0db78ba2d19fb Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet Ajouter un correspondant dans l'entreprise %(nom)s %s %s Attention: supression définitive de l'entreprise, de ses correspondants et contacts.
Suivi relations entreprises
""",
"""Listes des contacts avec l'entreprise %(nom)s
"""
% E
)
else:
- C = self.do_entreprise_contact_list(args={})
+ C = sco_entreprises.do_entreprise_contact_list(self, args={})
H.append(
"""Listes des contacts
"""
@@ -465,8 +301,8 @@ class ZEntreprises(
REQUEST.URL1,
c["entreprise_contact_id"],
)
- c["entreprise"] = self.do_entreprise_list(
- args={"entreprise_id": c["entreprise_id"]}
+ c["entreprise"] = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": c["entreprise_id"]}
)[0]
if c["etudid"]:
c["etud"] = self.getEtudInfo(etudid=c["etudid"], filled=1)[0]
@@ -502,7 +338,7 @@ class ZEntreprises(
H.append(tab.html())
- if not REQUEST["_read_only"]: # portage DTML, à modifier
+ if REQUEST.AUTHENTICATED_USER.has_permission(ScoEntrepriseChange, self):
if entreprise_id:
H.append(
"""
@@ -510,7 +346,7 @@ class ZEntreprises(
% E
)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
security.declareProtected(ScoEntrepriseView, "entreprise_correspondant_list")
@@ -522,23 +358,28 @@ class ZEntreprises(
REQUEST=None,
):
"""Liste des correspondants de l'entreprise"""
- E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0]
+ E = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": entreprise_id}
+ )[0]
H = [
- self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"),
+ entreprise_header(self, REQUEST=REQUEST, page_title="Suivi entreprises"),
"""
Listes des correspondants dans l'entreprise %(nom)s
"""
% E,
]
- correspondants = self.do_entreprise_correspondant_list(
- args={"entreprise_id": entreprise_id}
+ correspondants = sco_entreprises.do_entreprise_correspondant_list(
+ self, args={"entreprise_id": entreprise_id}
)
for c in correspondants:
c["nomprenom"] = c["nom"].upper() + " " + c["nom"].capitalize()
- c["_nomprenom_target"] = (
- "%s/entreprise_correspondant_edit?entreprise_corresp_id=%s"
- % (REQUEST.URL1, c["entreprise_corresp_id"]),
+ c[
+ "_nomprenom_target"
+ ] = "%s/entreprise_correspondant_edit?entreprise_corresp_id=%s" % (
+ REQUEST.URL1,
+ c["entreprise_corresp_id"],
)
+
c["nom_entreprise"] = E["nom"]
l = []
if c["phone1"]:
@@ -559,11 +400,11 @@ class ZEntreprises(
]
)
c["modifier"] = (
- 'modifier'
+ 'modifier'
% c["entreprise_corresp_id"]
)
c["supprimer"] = (
- 'supprimer'
+ 'supprimer'
% c["entreprise_corresp_id"]
)
tab = GenTable(
@@ -604,34 +445,36 @@ class ZEntreprises(
H.append(tab.html())
- if not REQUEST["_read_only"]: # portage DTML, à modifier
+ if REQUEST.AUTHENTICATED_USER.has_permission(ScoEntrepriseChange, self):
H.append(
"""Suivi entreprises
Contact avec entreprise %(nom)s
"""
% E,
@@ -708,12 +551,14 @@ class ZEntreprises(
cancelbutton="Annuler",
initvalues=c,
submitlabel="Modifier les valeurs",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
- if not REQUEST["_read_only"]: # portage DTML, à modifier
+ if REQUEST.AUTHENTICATED_USER.has_permission(ScoEntrepriseChange, self):
H.append(
""""""
% entreprise_contact_id
@@ -721,30 +566,31 @@ class ZEntreprises(
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- etudok = self.do_entreprise_check_etudiant(tf[2]["etudiant"])
+ etudok = sco_entreprises.do_entreprise_check_etudiant(
+ self, tf[2]["etudiant"]
+ )
if etudok[0] == 0:
H.append("""Édition contact entreprise
""",
]
tf = TrivialFormulator(
@@ -829,7 +675,9 @@ class ZEntreprises(
cancelbutton="Annuler",
initvalues=c,
submitlabel="Modifier les valeurs",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
@@ -839,21 +687,23 @@ class ZEntreprises(
% (REQUEST.URL1, c["entreprise_id"])
)
else:
- self.do_entreprise_correspondant_edit(tf[2])
+ sco_entreprises.do_entreprise_correspondant_edit(self, tf[2])
REQUEST.RESPONSE.redirect(
"%s/entreprise_correspondant_list?entreprise_id=%s"
% (REQUEST.URL1, c["entreprise_id"])
)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
security.declareProtected(ScoEntrepriseChange, "entreprise_contact_create")
def entreprise_contact_create(self, entreprise_id, REQUEST=None):
"""Form création contact"""
- E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0]
- correspondants = self.do_entreprise_correspondant_listnames(
- args={"entreprise_id": entreprise_id}
+ E = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": entreprise_id}
+ )[0]
+ correspondants = sco_entreprises.do_entreprise_correspondant_listnames(
+ self, args={"entreprise_id": entreprise_id}
)
if not correspondants:
correspondants = [("inconnu", "")]
@@ -863,7 +713,7 @@ class ZEntreprises(
% (REQUEST.URL1, entreprise_id)
)
H = [
- self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"),
+ entreprise_header(self, REQUEST=REQUEST, page_title="Suivi entreprises"),
"""Nouveau "contact" avec l'entreprise %(nom)s
"""
% E,
]
@@ -934,32 +784,36 @@ class ZEntreprises(
),
cancelbutton="Annuler",
submitlabel="Ajouter ce contact",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- etudok = self.do_entreprise_check_etudiant(tf[2]["etudiant"])
+ etudok = sco_entreprises.do_entreprise_check_etudiant(
+ self, tf[2]["etudiant"]
+ )
if etudok[0] == 0:
H.append("""Suppression du contact
""",
]
tf = TrivialFormulator(
@@ -969,25 +823,31 @@ class ZEntreprises(
initvalues=c,
submitlabel="Confirmer la suppression",
cancelbutton="Annuler",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- self.do_entreprise_contact_delete(c["entreprise_contact_id"])
+ sco_entreprises.do_entreprise_contact_delete(
+ self, c["entreprise_contact_id"]
+ )
REQUEST.RESPONSE.redirect(REQUEST.URL1)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_create")
def entreprise_correspondant_create(self, entreprise_id, REQUEST=None):
"""Form création correspondant"""
- E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0]
+ E = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": entreprise_id}
+ )[0]
H = [
- self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"),
+ entreprise_header(self, REQUEST=REQUEST, page_title="Suivi entreprises"),
"""Nouveau correspondant l'entreprise %(nom)s
"""
% E,
]
@@ -1070,27 +930,29 @@ class ZEntreprises(
),
cancelbutton="Annuler",
submitlabel="Ajouter ce correspondant",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- self.do_entreprise_correspondant_create(tf[2])
+ sco_entreprises.do_entreprise_correspondant_create(self, tf[2])
REQUEST.RESPONSE.redirect(REQUEST.URL1)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_delete")
def entreprise_correspondant_delete(self, entreprise_corresp_id, REQUEST=None):
"""Form delete correspondant"""
- c = self.do_entreprise_correspondant_list(
- args={"entreprise_corresp_id": entreprise_corresp_id}
+ c = sco_entreprises.do_entreprise_correspondant_list(
+ self, args={"entreprise_corresp_id": entreprise_corresp_id}
)[0]
H = [
- self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"),
+ entreprise_header(self, REQUEST=REQUEST, page_title="Suivi entreprises"),
"""Suppression du correspondant %(nom)s %(prenom)s
""" % c,
]
tf = TrivialFormulator(
@@ -1100,32 +962,38 @@ class ZEntreprises(
initvalues=c,
submitlabel="Confirmer la suppression",
cancelbutton="Annuler",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- self.do_entreprise_correspondant_delete(c["entreprise_corresp_id"])
+ sco_entreprises.do_entreprise_correspondant_delete(
+ self, c["entreprise_corresp_id"]
+ )
REQUEST.RESPONSE.redirect(REQUEST.URL1)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
security.declareProtected(ScoEntrepriseChange, "entreprise_delete")
def entreprise_delete(self, entreprise_id, REQUEST=None):
"""Form delete entreprise"""
- E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0]
+ E = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": entreprise_id}
+ )[0]
H = [
- self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"),
+ entreprise_header(self, REQUEST=REQUEST, page_title="Suivi entreprises"),
"""Suppression de l'entreprise %(nom)s
Contacts avec l'entreprise qui seront supprimés:
"""
@@ -1150,233 +1020,27 @@ class ZEntreprises(
initvalues=E,
submitlabel="Confirmer la suppression",
cancelbutton="Annuler",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
H.append(tf[1])
elif tf[0] == -1:
REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- self.do_entreprise_delete(E["entreprise_id"])
+ sco_entreprises.do_entreprise_delete(self, E["entreprise_id"])
REQUEST.RESPONSE.redirect(REQUEST.URL1)
- H.append(self.entreprise_footer(REQUEST))
+ H.append(entreprise_footer(self, REQUEST))
return "\n".join(H)
- # --------------------------------------------------------------------
- #
- # Entreprises : Actions
- #
- # --------------------------------------------------------------------
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_create")
-
- def do_entreprise_create(self, args):
- "entreprise_create"
- cnx = self.GetDBConnexion()
- r = _entreprisesEditor.create(cnx, args)
- return r
-
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_delete")
-
- def do_entreprise_delete(self, oid):
- "entreprise_delete"
- cnx = self.GetDBConnexion()
- _entreprisesEditor.delete(cnx, oid)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_list")
-
- def do_entreprise_list(self, **kw):
- "entreprise_list"
- cnx = self.GetDBConnexion()
- kw["ZEntrepriseInstance"] = self
- return _entreprisesEditor.list(cnx, **kw)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_list_by_etud")
-
- def do_entreprise_list_by_etud(self, **kw):
- "entreprise_list_by_etud"
- cnx = self.GetDBConnexion()
- return _entreprisesEditor.list_by_etud(cnx, **kw)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_edit")
-
- def do_entreprise_edit(self, *args, **kw):
- "entreprise_edit"
- cnx = self.GetDBConnexion()
- _entreprisesEditor.edit(cnx, *args, **kw)
-
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_correspondant_create")
-
- def do_entreprise_correspondant_create(self, args):
- "entreprise_correspondant_create"
- cnx = self.GetDBConnexion()
- r = _entreprise_correspEditor.create(cnx, args)
- return r
-
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_correspondant_delete")
-
- def do_entreprise_correspondant_delete(self, oid):
- "entreprise_correspondant_delete"
- cnx = self.GetDBConnexion()
- _entreprise_correspEditor.delete(cnx, oid)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_correspondant_list")
-
- def do_entreprise_correspondant_list(self, **kw):
- "entreprise_correspondant_list"
- cnx = self.GetDBConnexion()
- return _entreprise_correspEditor.list(cnx, **kw)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_correspondant_edit")
-
- def do_entreprise_correspondant_edit(self, *args, **kw):
- "entreprise_correspondant_edit"
- cnx = self.GetDBConnexion()
- _entreprise_correspEditor.edit(cnx, *args, **kw)
-
- security.declareProtected(
- ScoEntrepriseView, "do_entreprise_correspondant_listnames"
- )
-
- def do_entreprise_correspondant_listnames(self, args={}):
- "-> liste des noms des correspondants (pour affichage menu)"
- C = self.do_entreprise_correspondant_list(args=args)
- return [
- (x["prenom"] + " " + x["nom"], str(x["entreprise_corresp_id"])) for x in C
- ]
-
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_contact_create")
-
- def do_entreprise_contact_create(self, args):
- "entreprise_contact_create"
- cnx = self.GetDBConnexion()
- r = _entreprise_contactEditor.create(cnx, args)
- return r
-
- security.declareProtected(ScoEntrepriseChange, "do_entreprise_contact_delete")
-
- def do_entreprise_contact_delete(self, oid):
- "entreprise_contact_delete"
- cnx = self.GetDBConnexion()
- _entreprise_contactEditor.delete(cnx, oid)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_contact_list")
-
- def do_entreprise_contact_list(self, **kw):
- "entreprise_contact_list"
- cnx = self.GetDBConnexion()
- return _entreprise_contactEditor.list(cnx, **kw)
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_contact_edit")
-
- def do_entreprise_contact_edit(self, *args, **kw):
- "entreprise_contact_edit"
- cnx = self.GetDBConnexion()
- _entreprise_contactEditor.edit(cnx, *args, **kw)
-
- #
- security.declareProtected(ScoEntrepriseView, "do_entreprise_check_etudiant")
-
- def do_entreprise_check_etudiant(self, etudiant):
- """Si etudiant est vide, ou un ETUDID valide, ou un nom unique,
- retourne (1, ETUDID).
- Sinon, retourne (0, 'message explicatif')
- """
- etudiant = etudiant.strip().translate(
- None, "'()"
- ) # suppress parens and quote from name
- if not etudiant:
- return 1, None
- cnx = self.GetDBConnexion()
- cursor = cnx.cursor(cursor_factory=ScoDocCursor)
- cursor.execute(
- "select etudid, nom, prenom from identite where upper(nom) ~ upper(%(etudiant)s) or etudid=%(etudiant)s",
- {"etudiant": etudiant},
- )
- r = cursor.fetchall()
- if len(r) < 1:
- return 0, 'Aucun etudiant ne correspond à "%s"' % etudiant
- elif len(r) > 10:
- return (
- 0,
- "%d etudiants correspondent à ce nom (utilisez le code)"
- % len(r),
- )
- elif len(r) > 1:
- e = ['
")
- return "\n".join(H) + context.entreprise_footer(REQUEST)
+ return "\n".join(H) + entreprise_footer(self, REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(REQUEST.URL1 + "?start=" + start)
else:
- self.do_entreprise_edit(tf[2])
+ sco_entreprises.do_entreprise_edit(self, tf[2])
return REQUEST.RESPONSE.redirect(REQUEST.URL1 + "?start=" + start)
diff --git a/ZScolar.py b/ZScolar.py
index c39d8bd..8d43078 100644
--- a/ZScolar.py
+++ b/ZScolar.py
@@ -599,7 +599,7 @@ UE11 Découverte métiers (code UCOD46, 16 ECTS, Apo ')
FA.append('")
diff --git a/sco_abs.py b/sco_abs.py
index 8d97d94..21538e6 100644
--- a/sco_abs.py
+++ b/sco_abs.py
@@ -43,6 +43,11 @@ import sco_formsemestre
import sco_compute_moy
+def is_work_saturday(context):
+ "Vrai si le samedi est travaillé"
+ return int(context.get_preference("work_saturday"))
+
+
def MonthNbDays(month, year):
"returns nb of days in month"
if month > 7:
@@ -173,6 +178,39 @@ class ddmmyyyy:
# d = ddmmyyyy( '21/12/99' )
+def DateRangeISO(context, date_beg, date_end, workable=1):
+ """returns list of dates in [date_beg,date_end]
+ workable = 1 => keeps only workable days"""
+ if not date_beg:
+ raise ScoValueError("pas de date spécifiée !")
+ if not date_end:
+ date_end = date_beg
+ r = []
+ work_saturday = is_work_saturday(context)
+ cur = ddmmyyyy(date_beg, work_saturday=work_saturday)
+ end = ddmmyyyy(date_end, work_saturday=work_saturday)
+ while cur <= end:
+ if (not workable) or cur.iswork():
+ r.append(cur)
+ cur = cur.next()
+
+ return map(lambda x: x.ISO(), r)
+
+
+def day_names(context):
+ """Returns week day names.
+ If work_saturday property is set, include saturday
+ """
+ if is_work_saturday(context):
+ return ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"]
+ else:
+ return ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"]
+
+
+def next_iso_day(context, date):
+ "return date after date"
+ d = ddmmyyyy(date, fmt="iso", work_saturday=is_work_saturday(context))
+ return d.next().ISO()
def YearTable(
@@ -207,7 +245,7 @@ def YearTable(
events,
halfday,
dayattributes,
- context.is_work_saturday(),
+ is_work_saturday(context),
pad_width=pad_width,
)
)
diff --git a/sco_abs_views.py b/sco_abs_views.py
index 9ede1d3..a76e225 100644
--- a/sco_abs_views.py
+++ b/sco_abs_views.py
@@ -28,12 +28,16 @@
"""Pages HTML gestion absences
(la plupart portées du DTML)
"""
+import datetime
from stripogram import html2text, html2safehtml
+
from gen_tables import GenTable
-from notesdb import *
-from sco_utils import *
+from notesdb import DateISOtoDMY
+import sco_utils as scu
+from sco_exceptions import ScoValueError
+from sco_permissions import ScoAbsChange
from notes_log import log
import sco_groups
import sco_find_etud
@@ -58,7 +62,7 @@ def doSignaleAbsence(
etudid = etud["etudid"]
description_abs = description
- dates = context.DateRangeISO(datedebut, datefin)
+ dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0
for jour in dates:
if demijournee == "2":
@@ -248,7 +252,7 @@ def doJustifAbsence(
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
etudid = etud["etudid"]
description_abs = description
- dates = context.DateRangeISO(datedebut, datefin)
+ dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0
for jour in dates:
if demijournee == "2":
@@ -371,7 +375,7 @@ def doAnnuleAbsence(
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
etudid = etud["etudid"]
- dates = context.DateRangeISO(datedebut, datefin)
+ dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0
for jour in dates:
if demijournee == "2":
@@ -506,7 +510,7 @@ def doAnnuleJustif(
"""Annulation d'une justification"""
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
etudid = etud["etudid"]
- dates = context.DateRangeISO(datedebut0, datefin0)
+ dates = sco_abs.DateRangeISO(context, datedebut0, datefin0)
nbadded = 0
for jour in dates:
# Attention: supprime matin et après-midi
@@ -571,7 +575,7 @@ def EtatAbsences(context, REQUEST=None):
"""
- % (AnneeScolaire(REQUEST), datetime.datetime.now().strftime("%d/%m/%Y")),
+ % (scu.AnneeScolaire(REQUEST), datetime.datetime.now().strftime("%d/%m/%Y")),
context.sco_footer(REQUEST),
]
return "\n".join(H)
@@ -610,7 +614,7 @@ def CalAbs(context, REQUEST=None): # etud implied
# crude portage from 1999 DTML
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
etudid = etud["etudid"]
- anneescolaire = int(AnneeScolaire(REQUEST))
+ anneescolaire = int(scu.AnneeScolaire(REQUEST))
datedebut = str(anneescolaire) + "-08-31"
datefin = str(anneescolaire + 1) + "-07-31"
nbabs = context.CountAbs(etudid=etudid, debut=datedebut, fin=datefin)
@@ -693,7 +697,7 @@ def ListeAbsEtud(
En format 'text': texte avec liste d'absences (pour mails).
"""
absjust_only = int(absjust_only) # si vrai, table absjust seule (export xls ou pdf)
- datedebut = "%s-08-31" % AnneeScolaire(REQUEST)
+ datedebut = "%s-08-31" % scu.AnneeScolaire(REQUEST)
etud = context.getEtudInfo(etudid=etudid, filled=True)[0]
@@ -714,7 +718,7 @@ def ListeAbsEtud(
html_class="table_leftalign",
table_id="tab_absnonjust",
base_url=base_url_nj,
- filename="abs_" + make_filename(etud["nomprenom"]),
+ filename="abs_" + scu.make_filename(etud["nomprenom"]),
caption="Absences non justifiées de %(nomprenom)s" % etud,
preferences=context.get_preferences(),
)
@@ -725,7 +729,7 @@ def ListeAbsEtud(
html_class="table_leftalign",
table_id="tab_absjust",
base_url=base_url_j,
- filename="absjust_" + make_filename(etud["nomprenom"]),
+ filename="absjust_" + scu.make_filename(etud["nomprenom"]),
caption="Absences justifiées de %(nomprenom)s" % etud,
preferences=context.get_preferences(),
)
@@ -830,7 +834,7 @@ def absences_index_html(context, REQUEST=None):
% REQUEST.URL0,
formChoixSemestreGroupe(context),
"']
- for x in r:
- e.append(
- "
")
- return (
- 0,
- "Les étudiants suivants correspondent: préciser le nom complet ou le code\n"
- + "\n".join(e),
- )
- else: # une seule reponse !
- return 1, r[0][0].strip()
-
- security.declareProtected(ScoEntrepriseView, "do_entreprise_list_by_contact")
-
- def do_entreprise_list_by_contact(
- self, args={}, operator="and", test="=", sortkey=None
- ):
- """Recherche dans entreprises, avec date de contact"""
- # (fonction ad-hoc car requete sur plusieurs tables)
- raise NotImplementedError
- # XXXXX fonction non achevee , non testee...
-
- # cnx = self.GetDBConnexion()
- # cursor = cnx.cursor(cursor_factory=ScoDocCursor)
- # if sortkey:
- # orderby = " order by " + sortkey
- # else:
- # orderby = ""
- # vals = dictfilter(args, self.dbfields)
- # # DBSelect
- # what = ["*"]
- # operator = " " + operator + " "
- # cond = " E.entreprise_id = C.entreprise_id "
- # if vals:
- # cond += " where " + operator.join(
- # ["%s%s%%(%s)s" % (x, test, x) for x in vals.keys() if vals[x] != None]
- # )
- # cnuls = " and ".join(
- # ["%s is NULL" % x for x in vals.keys() if vals[x] is None]
- # )
- # if cnuls:
- # cond = cond + " and " + cnuls
- # else:
- # cond += ""
- # cursor.execute(
- # "select distinct"
- # + ", ".join(what)
- # + " from entreprises E, entreprise_contact C "
- # + cond
- # + orderby,
- # vals,
- # )
- # titles, res = [x[0] for x in cursor.description], cursor.fetchall()
- # #
- # R = []
- # for r in res:
- # d = {}
- # for i in range(len(titles)):
- # v = r[i]
- # # value not formatted ! (see EditableTable.list())
- # d[titles[i]] = v
- # R.append(d)
- # return R
-
# -------- Formulaires: traductions du DTML
security.declareProtected(ScoEntrepriseChange, "entreprise_create")
def entreprise_create(self, REQUEST=None):
"""Form. création entreprise"""
- context = self
H = [
- self.entreprise_header(REQUEST, page_title="Création d'une entreprise"),
+ entreprise_header(self, REQUEST, page_title="Création d'une entreprise"),
"""Création d'une entreprise
""",
]
tf = TrivialFormulator(
@@ -1451,26 +1115,29 @@ class ZEntreprises(
),
cancelbutton="Annuler",
submitlabel="Ajouter cette entreprise",
- readonly=REQUEST["_read_only"],
+ readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
+ ScoEntrepriseChange, self
+ ),
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + context.entreprise_footer(REQUEST)
+ return "\n".join(H) + tf[1] + entreprise_footer(self, REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(REQUEST.URL1)
else:
- self.do_entreprise_create(tf[2])
+ sco_entreprises.do_entreprise_create(self, tf[2])
return REQUEST.RESPONSE.redirect(REQUEST.URL1)
security.declareProtected(ScoEntrepriseView, "entreprise_edit")
def entreprise_edit(self, entreprise_id, REQUEST=None, start=1):
"""Form. edit entreprise"""
- context = self
authuser = REQUEST.AUTHENTICATED_USER
readonly = not authuser.has_permission(ScoEntrepriseChange, self)
- F = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0]
+ F = sco_entreprises.do_entreprise_list(
+ self, args={"entreprise_id": entreprise_id}
+ )[0]
H = [
- self.entreprise_header(REQUEST, page_title="Entreprise"),
+ entreprise_header(self, REQUEST, page_title="Entreprise"),
"""%(nom)s
""" % F,
]
tf = TrivialFormulator(
@@ -1555,11 +1222,11 @@ class ZEntreprises(
if tf[0] == 0:
H.append(tf[1])
- Cl = self.do_entreprise_correspondant_list(
- args={"entreprise_id": F["entreprise_id"]}
+ Cl = sco_entreprises.do_entreprise_correspondant_list(
+ self, args={"entreprise_id": F["entreprise_id"]}
)
- Cts = self.do_entreprise_contact_list(
- args={"entreprise_id": F["entreprise_id"]}
+ Cts = sco_entreprises.do_entreprise_contact_list(
+ self, args={"entreprise_id": F["entreprise_id"]}
)
if not readonly:
H.append(
@@ -1628,9 +1295,9 @@ class ZEntreprises(
H.append("(%s)" % c["description"])
H.append("")
H.append("
Sélectionner le groupe d'étudiants, puis cliquez sur une semaine pour saisir les absences de toute cette semaine.
""", @@ -843,3 +847,16 @@ saisir les absences de toute cette semaine. H.append(context.sco_footer(REQUEST)) return "\n".join(H) + + +def cal_select_week(context, year=None, REQUEST=None): + "display calendar allowing week selection" + if not year: + year = scu.AnneeScolaire(REQUEST) + sems = sco_formsemestre.do_formsemestre_list(context) + if not sems: + js = "" + else: + js = 'onmouseover="highlightweek(this);" onmouseout="deselectweeks();" onclick="wclick(this);"' + C = sco_abs.YearTable(context, int(year), dayattributes=js) + return C diff --git a/sco_entreprises.py b/sco_entreprises.py new file mode 100644 index 0000000..fdbef5e --- /dev/null +++ b/sco_entreprises.py @@ -0,0 +1,326 @@ +# -*- mode: python -*- +# -*- coding: utf-8 -*- + +############################################################################## +# +# Gestion scolarite IUT +# +# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Emmanuel Viennet emmanuel.viennet@viennet.net +# +############################################################################## + +"""Fonctions sur les entreprises +""" +# codes anciens déplacés de ZEntreprise +import datetime + +import sco_utils as scu +from notesdb import ScoDocCursor, EditableTable, DateISOtoDMY, DateDMYtoISO + + +def _format_nom(nom): + "formatte nom (filtre en entree db) d'une entreprise" + if not nom: + return nom + nom = nom.decode(scu.SCO_ENCODING) + return (nom[0].upper() + nom[1:]).encode(scu.SCO_ENCODING) + + +class EntreprisesEditor(EditableTable): + def delete(self, cnx, oid): + "delete correspondants and contacts, then self" + # first, delete all correspondants and contacts + cursor = cnx.cursor(cursor_factory=ScoDocCursor) + cursor.execute( + "delete from entreprise_contact where entreprise_id=%(entreprise_id)s", + {"entreprise_id": oid}, + ) + cursor.execute( + "delete from entreprise_correspondant where entreprise_id=%(entreprise_id)s", + {"entreprise_id": oid}, + ) + cnx.commit() + EditableTable.delete(self, cnx, oid) + + def list( + self, + cnx, + args={}, + operator="and", + test="=", + sortkey=None, + sort_on_contact=False, + context=None, + limit="", + offset="", + ): + # list, then sort on date of last contact + R = EditableTable.list( + self, + cnx, + args=args, + operator=operator, + test=test, + sortkey=sortkey, + limit=limit, + offset=offset, + ) + if sort_on_contact: + for r in R: + c = do_entreprise_contact_list( + context, + args={"entreprise_id": r["entreprise_id"]}, + disable_formatting=True, + ) + if c: + r["date"] = max([x["date"] or datetime.date.min for x in c]) + else: + r["date"] = datetime.date.min + # sort + R.sort(lambda r1, r2: cmp(r2["date"], r1["date"])) + for r in R: + r["date"] = DateISOtoDMY(r["date"]) + return R + + def list_by_etud( + self, cnx, args={}, sort_on_contact=False, disable_formatting=False + ): + "cherche rentreprise ayant eu contact avec etudiant" + cursor = cnx.cursor(cursor_factory=ScoDocCursor) + cursor.execute( + "select E.*, I.nom as etud_nom, I.prenom as etud_prenom, C.date from entreprises E, entreprise_contact C, identite I where C.entreprise_id = E.entreprise_id and C.etudid = I.etudid and I.nom ~* %(etud_nom)s ORDER BY E.nom", + args, + ) + _, res = [x[0] for x in cursor.description], cursor.dictfetchall() + R = [] + for r in res: + r["etud_prenom"] = r["etud_prenom"] or "" + d = {} + for key in r: + v = r[key] + # format value + if not disable_formatting and self.output_formators.has_key(key): + v = self.output_formators[key](v) + d[key] = v + R.append(d) + # sort + if sort_on_contact: + R.sort( + lambda r1, r2: cmp( + r2["date"] or datetime.date.min, r1["date"] or datetime.date.min + ) + ) + for r in R: + r["date"] = DateISOtoDMY(r["date"] or datetime.date.min) + return R + + +_entreprisesEditor = EntreprisesEditor( + "entreprises", + "entreprise_id", + ( + "entreprise_id", + "nom", + "adresse", + "ville", + "codepostal", + "pays", + "contact_origine", + "secteur", + "privee", + "localisation", + "qualite_relation", + "plus10salaries", + "note", + "date_creation", + ), + sortkey="nom", + input_formators={"nom": _format_nom}, +) + +# ----------- Correspondants +_entreprise_correspEditor = EditableTable( + "entreprise_correspondant", + "entreprise_corresp_id", + ( + "entreprise_corresp_id", + "entreprise_id", + "civilite", + "nom", + "prenom", + "fonction", + "phone1", + "phone2", + "mobile", + "fax", + "mail1", + "mail2", + "note", + ), + sortkey="nom", +) + + +# ----------- Contacts +_entreprise_contactEditor = EditableTable( + "entreprise_contact", + "entreprise_contact_id", + ( + "entreprise_contact_id", + "date", + "type_contact", + "entreprise_id", + "entreprise_corresp_id", + "etudid", + "description", + "enseignant", + ), + sortkey="date", + output_formators={"date": DateISOtoDMY}, + input_formators={"date": DateDMYtoISO}, +) + + +def do_entreprise_create(context, args): + "entreprise_create" + cnx = context.GetDBConnexion() + r = _entreprisesEditor.create(cnx, args) + return r + + +def do_entreprise_delete(context, oid): + "entreprise_delete" + cnx = context.GetDBConnexion() + _entreprisesEditor.delete(cnx, oid) + + +def do_entreprise_list(context, **kw): + "entreprise_list" + cnx = context.GetDBConnexion() + kw["context"] = context + return _entreprisesEditor.list(cnx, **kw) + + +def do_entreprise_list_by_etud(context, **kw): + "entreprise_list_by_etud" + cnx = context.GetDBConnexion() + return _entreprisesEditor.list_by_etud(cnx, **kw) + + +def do_entreprise_edit(context, *args, **kw): + "entreprise_edit" + cnx = context.GetDBConnexion() + _entreprisesEditor.edit(cnx, *args, **kw) + + +def do_entreprise_correspondant_create(context, args): + "entreprise_correspondant_create" + cnx = context.GetDBConnexion() + r = _entreprise_correspEditor.create(cnx, args) + return r + + +def do_entreprise_correspondant_delete(context, oid): + "entreprise_correspondant_delete" + cnx = context.GetDBConnexion() + _entreprise_correspEditor.delete(cnx, oid) + + +def do_entreprise_correspondant_list(context, **kw): + "entreprise_correspondant_list" + cnx = context.GetDBConnexion() + return _entreprise_correspEditor.list(cnx, **kw) + + +def do_entreprise_correspondant_edit(context, *args, **kw): + "entreprise_correspondant_edit" + cnx = context.GetDBConnexion() + _entreprise_correspEditor.edit(cnx, *args, **kw) + + +def do_entreprise_correspondant_listnames(context, args={}): + "-> liste des noms des correspondants (pour affichage menu)" + C = do_entreprise_correspondant_list(context, args=args) + return [(x["prenom"] + " " + x["nom"], str(x["entreprise_corresp_id"])) for x in C] + + +def do_entreprise_contact_delete(context, oid): + "entreprise_contact_delete" + cnx = context.GetDBConnexion() + _entreprise_contactEditor.delete(cnx, oid) + + +def do_entreprise_contact_list(context, **kw): + "entreprise_contact_list" + cnx = context.GetDBConnexion() + return _entreprise_contactEditor.list(cnx, **kw) + + +def do_entreprise_contact_edit(context, *args, **kw): + "entreprise_contact_edit" + cnx = context.GetDBConnexion() + _entreprise_contactEditor.edit(cnx, *args, **kw) + + +def do_entreprise_contact_create(context, args): + "entreprise_contact_create" + cnx = context.GetDBConnexion() + r = _entreprise_contactEditor.create(cnx, args) + return r + + +def do_entreprise_check_etudiant(context, etudiant): + """Si etudiant est vide, ou un ETUDID valide, ou un nom unique, + retourne (1, ETUDID). + Sinon, retourne (0, 'message explicatif') + """ + etudiant = etudiant.strip().translate( + None, "'()" + ) # suppress parens and quote from name + if not etudiant: + return 1, None + cnx = context.GetDBConnexion() + cursor = cnx.cursor(cursor_factory=ScoDocCursor) + cursor.execute( + "select etudid, nom, prenom from identite where upper(nom) ~ upper(%(etudiant)s) or etudid=%(etudiant)s", + {"etudiant": etudiant}, + ) + r = cursor.fetchall() + if len(r) < 1: + return 0, 'Aucun etudiant ne correspond à "%s"' % etudiant + elif len(r) > 10: + return ( + 0, + "%d etudiants correspondent à ce nom (utilisez le code)" % len(r), + ) + elif len(r) > 1: + e = ['