899 lines
33 KiB
Python
899 lines
33 KiB
Python
|
# -*- mode: python -*-
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
##############################################################################
|
||
|
#
|
||
|
# Gestion scolarite IUT
|
||
|
#
|
||
|
# Copyright (c) 1999 - 2020 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
|
||
|
#
|
||
|
##############################################################################
|
||
|
|
||
|
""" Gestion des relations avec les entreprises
|
||
|
"""
|
||
|
import urllib
|
||
|
|
||
|
from sco_zope import *
|
||
|
|
||
|
# ---------------
|
||
|
|
||
|
from notesdb import *
|
||
|
from notes_log import log
|
||
|
from scolog import logdb
|
||
|
from sco_utils import *
|
||
|
import html_sidebar
|
||
|
|
||
|
from TrivialFormulator import TrivialFormulator, TF
|
||
|
import scolars
|
||
|
import string, re
|
||
|
import time, calendar
|
||
|
|
||
|
|
||
|
def _format_nom(nom):
|
||
|
"formatte nom (filtre en entree db) d'une entreprise"
|
||
|
if not nom:
|
||
|
return nom
|
||
|
nom = nom.decode(SCO_ENCODING)
|
||
|
return (nom[0].upper() + nom[1:]).encode(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,
|
||
|
ZEntrepriseInstance=None,
|
||
|
):
|
||
|
# list, then sort on date of last contact
|
||
|
R = EditableTable.list(
|
||
|
self, cnx, args=args, operator=operator, test=test, sortkey=sortkey
|
||
|
)
|
||
|
if sort_on_contact:
|
||
|
for r in R:
|
||
|
c = ZEntrepriseInstance.do_entreprise_contact_list(
|
||
|
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,
|
||
|
)
|
||
|
titles, 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},
|
||
|
)
|
||
|
|
||
|
# ---------------
|
||
|
|
||
|
|
||
|
class ZEntreprises(
|
||
|
ObjectManager, PropertyManager, RoleManager, Item, Persistent, Implicit
|
||
|
):
|
||
|
|
||
|
"ZEntreprises object"
|
||
|
|
||
|
meta_type = "ZEntreprises"
|
||
|
security = ClassSecurityInfo()
|
||
|
|
||
|
# This is the list of the methods associated to 'tabs' in the ZMI
|
||
|
# Be aware that The first in the list is the one shown by default, so if
|
||
|
# the 'View' tab is the first, you will never see your tabs by cliquing
|
||
|
# on the object.
|
||
|
manage_options = (
|
||
|
({"label": "Contents", "action": "manage_main"},)
|
||
|
+ PropertyManager.manage_options # add the 'Properties' tab
|
||
|
+ (
|
||
|
# this line is kept as an example with the files :
|
||
|
# dtml/manage_editZScolarForm.dtml
|
||
|
# html/ZScolar-edit.stx
|
||
|
# {'label': 'Properties', 'action': 'manage_editForm',},
|
||
|
{"label": "View", "action": "index_html"},
|
||
|
)
|
||
|
+ Item.manage_options # add the 'Undo' & 'Owner' tab
|
||
|
+ RoleManager.manage_options # add the 'Security' tab
|
||
|
)
|
||
|
|
||
|
# no permissions, only called from python
|
||
|
def __init__(self, id, title):
|
||
|
"initialise a new instance"
|
||
|
self.id = id
|
||
|
self.title = title
|
||
|
|
||
|
# The form used to edit this object
|
||
|
def manage_editZEntreprises(self, title, RESPONSE=None):
|
||
|
"Changes the instance values"
|
||
|
self.title = title
|
||
|
self._p_changed = 1
|
||
|
RESPONSE.redirect("manage_editForm")
|
||
|
|
||
|
# Ajout (dans l'instance) d'un dtml modifiable par Zope
|
||
|
def defaultDocFile(self, id, title, file):
|
||
|
f = open(file_path + "/dtml-editable/" + file + ".dtml")
|
||
|
file = f.read()
|
||
|
f.close()
|
||
|
self.manage_addDTMLMethod(id, title, file)
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_header")
|
||
|
|
||
|
def entreprise_header(self, REQUEST=None, page_title=""):
|
||
|
"common header for all Entreprises pages"
|
||
|
authuser = REQUEST.AUTHENTICATED_USER
|
||
|
# _read_only is used to modify pages properties (links, buttons)
|
||
|
# Python methods (do_xxx in this class) are also protected individualy)
|
||
|
if authuser.has_permission(ScoEntrepriseChange, self):
|
||
|
REQUEST.set("_read_only", False)
|
||
|
else:
|
||
|
REQUEST.set("_read_only", True)
|
||
|
return self.sco_header(REQUEST, container=self, page_title=page_title)
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_footer")
|
||
|
|
||
|
def entreprise_footer(self, REQUEST):
|
||
|
"common entreprise footer"
|
||
|
return self.sco_footer(REQUEST)
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "sidebar")
|
||
|
|
||
|
def sidebar(self, REQUEST):
|
||
|
"barre gauche (overide std sco sidebar)"
|
||
|
# rewritten from legacy DTML code
|
||
|
context = self
|
||
|
params = {"ScoURL": context.ScoURL()}
|
||
|
|
||
|
H = [
|
||
|
"""<div id="sidebar-container">
|
||
|
<div class="sidebar">""",
|
||
|
html_sidebar.sidebar_common(context, REQUEST),
|
||
|
"""<h2 class="insidebar"><a href="%(ScoURL)s/Entreprises" class="sidebar">Entreprises</a></h2>
|
||
|
<ul class="insidebar">"""
|
||
|
% params,
|
||
|
]
|
||
|
if not REQUEST["_read_only"]:
|
||
|
H.append(
|
||
|
"""<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_create" class="sidebar">Nouvelle entreprise</a> </li>"""
|
||
|
% params
|
||
|
)
|
||
|
|
||
|
H.append(
|
||
|
"""<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_contact_list" class="sidebar">Contacts</a> </li></ul> """
|
||
|
% params
|
||
|
)
|
||
|
|
||
|
# --- entreprise selectionnée:
|
||
|
if REQUEST.form.has_key("entreprise_id"):
|
||
|
entreprise_id = REQUEST.form["entreprise_id"]
|
||
|
E = context.do_entreprise_list(args={"entreprise_id": entreprise_id})
|
||
|
if E:
|
||
|
E = E[0]
|
||
|
params.update(E)
|
||
|
H.append(
|
||
|
"""<div class="entreprise-insidebar">
|
||
|
<h3 class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_edit?entreprise_id=%(entreprise_id)s" class="sidebar">%(nom)s</a></h2>
|
||
|
<ul class="insidebar">
|
||
|
<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_correspondant_list?entreprise_id=%(entreprise_id)s" class="sidebar">Corresp.</a></li>"""
|
||
|
% params
|
||
|
) # """
|
||
|
if not REQUEST["_read_only"]:
|
||
|
H.append(
|
||
|
"""<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_correspondant_create?entreprise_id=%(entreprise_id)s" class="sidebar">Nouveau Corresp.</a></li>"""
|
||
|
% params
|
||
|
)
|
||
|
H.append(
|
||
|
"""<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_contact_list?entreprise_id=%(entreprise_id)s" class="sidebar">Contacts</a></li>"""
|
||
|
% params
|
||
|
)
|
||
|
if not REQUEST["_read_only"]:
|
||
|
H.append(
|
||
|
"""<li class="insidebar"><a href="%(ScoURL)s/Entreprises/entreprise_contact_create?entreprise_id=%(entreprise_id)s" class="sidebar">Nouveau "contact"</a></li>"""
|
||
|
% params
|
||
|
)
|
||
|
H.append("</ul></div>")
|
||
|
|
||
|
#
|
||
|
H.append("""<br/><br/>%s""" % icontag("entreprise_side_img"))
|
||
|
if REQUEST["_read_only"]:
|
||
|
H.append("""<br/><em>(Lecture seule)</em>""")
|
||
|
H.append("""</div> </div> <!-- end of sidebar -->""")
|
||
|
return "".join(H)
|
||
|
|
||
|
# --------------------------------------------------------------------
|
||
|
#
|
||
|
# Entreprises : Methodes en DTML
|
||
|
#
|
||
|
# --------------------------------------------------------------------
|
||
|
# used to view content of the object
|
||
|
security.declareProtected(ScoEntrepriseView, "index_html")
|
||
|
index_html = DTMLFile("dtml/entreprises/index_html", globals())
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_contact_list")
|
||
|
entreprise_contact_list = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_contact_list", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_correspondant_list")
|
||
|
entreprise_correspondant_list = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_correspondant_list", globals()
|
||
|
)
|
||
|
# les methodes "edit" sont aussi en ScoEntrepriseView car elles permettent
|
||
|
# la visualisation (via variable _read_only positionnee dans entreprise_header)
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_contact_edit")
|
||
|
entreprise_contact_edit = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_contact_edit", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseView, "entreprise_correspondant_edit")
|
||
|
entreprise_correspondant_edit = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_correspondant_edit", globals()
|
||
|
)
|
||
|
|
||
|
# Acces en modification:
|
||
|
security.declareProtected(ScoEntrepriseChange, "entreprise_contact_create")
|
||
|
entreprise_contact_create = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_contact_create", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseChange, "entreprise_contact_delete")
|
||
|
entreprise_contact_delete = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_contact_delete", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_create")
|
||
|
entreprise_correspondant_create = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_correspondant_create", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_delete")
|
||
|
entreprise_correspondant_delete = DTMLFile(
|
||
|
"dtml/entreprises/entreprise_correspondant_delete", globals()
|
||
|
)
|
||
|
security.declareProtected(ScoEntrepriseChange, "entreprise_delete")
|
||
|
entreprise_delete = DTMLFile("dtml/entreprises/entreprise_delete", globals())
|
||
|
|
||
|
# --------------------------------------------------------------------
|
||
|
#
|
||
|
# Entreprises : Methodes en Python
|
||
|
#
|
||
|
# --------------------------------------------------------------------
|
||
|
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)
|
||
|
|
||
|
def do_entreprise_correspondant_listnames(self, args={}):
|
||
|
"-> liste des noms des correspondants (pour affichage menu)"
|
||
|
cnx = self.GetDBConnexion()
|
||
|
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,
|
||
|
"<b>%d etudiants</b> correspondent à ce nom (utilisez le code)"
|
||
|
% len(r),
|
||
|
)
|
||
|
elif len(r) > 1:
|
||
|
e = ['<ul class="entreprise_etud_list">']
|
||
|
for x in r:
|
||
|
e.append(
|
||
|
"<li>%s %s (code %s)</li>"
|
||
|
% (strupper(x[1]), x[2] or "", x[0].strip())
|
||
|
)
|
||
|
e.append("</ul>")
|
||
|
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)
|
||
|
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"),
|
||
|
"""<h2 class="entreprise_new">Création d'une entreprise</h2>""",
|
||
|
]
|
||
|
tf = TrivialFormulator(
|
||
|
REQUEST.URL0,
|
||
|
REQUEST.form,
|
||
|
(
|
||
|
("nom", {"size": 25, "title": "Nom de l'entreprise"}),
|
||
|
(
|
||
|
"adresse",
|
||
|
{"size": 30, "title": "Adresse", "explanation": "(numéro, rue)"},
|
||
|
),
|
||
|
("codepostal", {"size": 8, "title": "Code Postal"}),
|
||
|
("ville", {"size": 30, "title": "Ville"}),
|
||
|
("pays", {"size": 30, "title": "Pays", "default": "France"}),
|
||
|
(
|
||
|
"localisation",
|
||
|
{
|
||
|
"input_type": "menu",
|
||
|
"labels": ["Ile de France", "Province", "Etranger"],
|
||
|
"allowed_values": ["IDF", "Province", "Etranger"],
|
||
|
},
|
||
|
),
|
||
|
("secteur", {"size": 30, "title": "Secteur d'activités"}),
|
||
|
(
|
||
|
"privee",
|
||
|
{
|
||
|
"input_type": "menu",
|
||
|
"title": "Statut",
|
||
|
"labels": [
|
||
|
"Entreprise privee",
|
||
|
"Entreprise Publique",
|
||
|
"Association",
|
||
|
],
|
||
|
"allowed_values": ["privee", "publique", "association"],
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"plus10salaries",
|
||
|
{
|
||
|
"title": "Masse salariale",
|
||
|
"type": "integer",
|
||
|
"input_type": "menu",
|
||
|
"labels": [
|
||
|
"10 salariés ou plus",
|
||
|
"Moins de 10 salariés",
|
||
|
"Inconnue",
|
||
|
],
|
||
|
"allowed_values": [1, 0, -1],
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"qualite_relation",
|
||
|
{
|
||
|
"title": "Qualité relation IUT/Entreprise",
|
||
|
"input_type": "menu",
|
||
|
"default": "-1",
|
||
|
"labels": [
|
||
|
"Très bonne",
|
||
|
"Bonne",
|
||
|
"Moyenne",
|
||
|
"Mauvaise",
|
||
|
"Inconnue",
|
||
|
],
|
||
|
"allowed_values": ["100", "75", "50", "25", "-1"],
|
||
|
},
|
||
|
),
|
||
|
("contact_origine", {"size": 30, "title": "Origine du contact"}),
|
||
|
(
|
||
|
"note",
|
||
|
{"input_type": "textarea", "rows": 3, "cols": 40, "title": "Note"},
|
||
|
),
|
||
|
),
|
||
|
cancelbutton="Annuler",
|
||
|
submitlabel="Ajouter cette entreprise",
|
||
|
readonly=REQUEST["_read_only"],
|
||
|
)
|
||
|
if tf[0] == 0:
|
||
|
return "\n".join(H) + tf[1] + context.entreprise_footer(REQUEST)
|
||
|
elif tf[0] == -1:
|
||
|
return REQUEST.RESPONSE.redirect(REQUEST.URL1)
|
||
|
else:
|
||
|
self.do_entreprise_create(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]
|
||
|
H = [
|
||
|
self.entreprise_header(REQUEST, page_title="Entreprise"),
|
||
|
"""<h2 class="entreprise">%(nom)s</h2>""" % F,
|
||
|
]
|
||
|
tf = TrivialFormulator(
|
||
|
REQUEST.URL0,
|
||
|
REQUEST.form,
|
||
|
(
|
||
|
("entreprise_id", {"default": entreprise_id, "input_type": "hidden"}),
|
||
|
("start", {"default": 1, "input_type": "hidden"}),
|
||
|
(
|
||
|
"date_creation",
|
||
|
{"default": time.strftime("%Y-%m-%d"), "input_type": "hidden"},
|
||
|
),
|
||
|
("nom", {"size": 25, "title": "Nom de l'entreprise"}),
|
||
|
(
|
||
|
"adresse",
|
||
|
{"size": 30, "title": "Adresse", "explanation": "(numéro, rue)"},
|
||
|
),
|
||
|
("codepostal", {"size": 8, "title": "Code Postal"}),
|
||
|
("ville", {"size": 30, "title": "Ville"}),
|
||
|
("pays", {"size": 30, "title": "Pays", "default": "France"}),
|
||
|
(
|
||
|
"localisation",
|
||
|
{
|
||
|
"input_type": "menu",
|
||
|
"labels": ["Ile de France", "Province", "Etranger"],
|
||
|
"allowed_values": ["IDF", "Province", "Etranger"],
|
||
|
},
|
||
|
),
|
||
|
("secteur", {"size": 30, "title": "Secteur d'activités"}),
|
||
|
(
|
||
|
"privee",
|
||
|
{
|
||
|
"input_type": "menu",
|
||
|
"title": "Statut",
|
||
|
"labels": [
|
||
|
"Entreprise privee",
|
||
|
"Entreprise Publique",
|
||
|
"Association",
|
||
|
],
|
||
|
"allowed_values": ["privee", "publique", "association"],
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"plus10salaries",
|
||
|
{
|
||
|
"title": "Masse salariale",
|
||
|
"input_type": "menu",
|
||
|
"labels": [
|
||
|
"10 salariés ou plus",
|
||
|
"Moins de 10 salariés",
|
||
|
"Inconnue",
|
||
|
],
|
||
|
"allowed_values": ["1", "0", "-1"],
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"qualite_relation",
|
||
|
{
|
||
|
"title": "Qualité relation IUT/Entreprise",
|
||
|
"input_type": "menu",
|
||
|
"labels": [
|
||
|
"Très bonne",
|
||
|
"Bonne",
|
||
|
"Moyenne",
|
||
|
"Mauvaise",
|
||
|
"Inconnue",
|
||
|
],
|
||
|
"allowed_values": ["100", "75", "50", "25", "-1"],
|
||
|
},
|
||
|
),
|
||
|
("contact_origine", {"size": 30, "title": "Origine du contact"}),
|
||
|
(
|
||
|
"note",
|
||
|
{"input_type": "textarea", "rows": 3, "cols": 40, "title": "Note"},
|
||
|
),
|
||
|
),
|
||
|
cancelbutton="Annuler",
|
||
|
initvalues=F,
|
||
|
submitlabel="Modifier les valeurs",
|
||
|
readonly=readonly,
|
||
|
)
|
||
|
|
||
|
if tf[0] == 0:
|
||
|
H.append(tf[1])
|
||
|
Cl = self.do_entreprise_correspondant_list(
|
||
|
args={"entreprise_id": F["entreprise_id"]}
|
||
|
)
|
||
|
Cts = self.do_entreprise_contact_list(
|
||
|
args={"entreprise_id": F["entreprise_id"]}
|
||
|
)
|
||
|
if not readonly:
|
||
|
H.append(
|
||
|
"""<p>%s <a class="entreprise_delete" href="entreprise_delete?entreprise_id=%s">Supprimer cette entreprise</a> </p>"""
|
||
|
% (
|
||
|
icontag("delete_img", title="delete", border="0"),
|
||
|
F["entreprise_id"],
|
||
|
)
|
||
|
)
|
||
|
if len(Cl):
|
||
|
H.append(
|
||
|
"""<h3>%d correspondants dans l'entreprise %s (<a href="entreprise_correspondant_list?entreprise_id=%s">liste complète</a>) :</h3>
|
||
|
<ul>"""
|
||
|
% (len(Cl), F["nom"], F["entreprise_id"])
|
||
|
)
|
||
|
for c in Cl:
|
||
|
H.append(
|
||
|
"""<li><a href="entreprise_correspondant_edit?entreprise_corresp_id=%s">"""
|
||
|
% c["entreprise_corresp_id"]
|
||
|
)
|
||
|
if c["nom"]:
|
||
|
nom = (
|
||
|
c["nom"]
|
||
|
.decode(SCO_ENCODING)
|
||
|
.lower()
|
||
|
.capitalize()
|
||
|
.encode(SCO_ENCODING)
|
||
|
)
|
||
|
else:
|
||
|
nom = ""
|
||
|
if c["prenom"]:
|
||
|
prenom = (
|
||
|
c["prenom"]
|
||
|
.decode(SCO_ENCODING)
|
||
|
.lower()
|
||
|
.capitalize()
|
||
|
.encode(SCO_ENCODING)
|
||
|
)
|
||
|
else:
|
||
|
prenom = ""
|
||
|
H.append(
|
||
|
"""%s %s</a> (%s)</li>""" % (nom, prenom, c["fonction"])
|
||
|
)
|
||
|
H.append("</ul>")
|
||
|
if len(Cts):
|
||
|
H.append(
|
||
|
"""<h3>%d contacts avec l'entreprise %s (<a href="entreprise_contact_list?entreprise_id=%s">liste complète</a>) :</h3><ul>"""
|
||
|
% (len(Cts), F["nom"], F["entreprise_id"])
|
||
|
)
|
||
|
for c in Cts:
|
||
|
H.append(
|
||
|
"""<li><a href="entreprise_contact_edit?entreprise_contact_id=%s">%s</a> """
|
||
|
% (c["entreprise_contact_id"], c["date"])
|
||
|
)
|
||
|
if c["type_contact"]:
|
||
|
H.append(c["type_contact"])
|
||
|
if c["etudid"]:
|
||
|
etud = self.getEtudInfo(etudid=c["etudid"], filled=1)
|
||
|
if etud:
|
||
|
etud = etud[0]
|
||
|
H.append(
|
||
|
"""<a href="%s/ficheEtud?etudid=%s">%s</a>"""
|
||
|
% (self.ScoURL(), c["etudid"], etud["nomprenom"])
|
||
|
)
|
||
|
if c["description"]:
|
||
|
H.append("(%s)" % c["description"])
|
||
|
H.append("</li>")
|
||
|
H.append("</ul>")
|
||
|
return "\n".join(H) + context.entreprise_footer(REQUEST)
|
||
|
elif tf[0] == -1:
|
||
|
return REQUEST.RESPONSE.redirect(REQUEST.URL1 + "?start=" + start)
|
||
|
else:
|
||
|
self.do_entreprise_edit(tf[2])
|
||
|
return REQUEST.RESPONSE.redirect(REQUEST.URL1 + "?start=" + start)
|
||
|
|
||
|
# --- Misc tools.... ------------------
|
||
|
security.declareProtected(ScoEntrepriseView, "str_abbrev")
|
||
|
|
||
|
def str_abbrev(self, s, maxlen):
|
||
|
"abreviation"
|
||
|
if s == None:
|
||
|
return "?"
|
||
|
if len(s) < maxlen:
|
||
|
return s
|
||
|
return s[: maxlen - 3] + "..."
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "setPageSizeCookie")
|
||
|
|
||
|
def setPageSizeCookie(self, REQUEST=None):
|
||
|
"set page size cookie"
|
||
|
RESPONSE = REQUEST.RESPONSE
|
||
|
#
|
||
|
if REQUEST.form.has_key("entreprise_page_size"):
|
||
|
RESPONSE.setCookie(
|
||
|
"entreprise_page_size",
|
||
|
REQUEST.form["entreprise_page_size"],
|
||
|
path="/",
|
||
|
expires="Wed, 31-Dec-2025 23:55:00 GMT",
|
||
|
)
|
||
|
RESPONSE.redirect(REQUEST.form["target_url"])
|
||
|
|
||
|
security.declareProtected(ScoEntrepriseView, "make_link_create_corr")
|
||
|
|
||
|
def make_link_create_corr(self, entreprise_id):
|
||
|
"yet another stupid code snippet"
|
||
|
return (
|
||
|
'<a href="entreprise_correspondant_create?entreprise_id='
|
||
|
+ str(entreprise_id)
|
||
|
+ '">créer un nouveau correspondant</a>'
|
||
|
)
|
||
|
|
||
|
|
||
|
# --------------------------------------------------------------------
|
||
|
#
|
||
|
# Zope Product Administration
|
||
|
#
|
||
|
# --------------------------------------------------------------------
|
||
|
def manage_addZEntreprises(
|
||
|
self, id="id_ZEntreprises", title="The Title for ZEntreprises Object", REQUEST=None
|
||
|
):
|
||
|
"Add a ZEntreprises instance to a folder."
|
||
|
self._setObject(id, ZEntreprises(id, title))
|
||
|
if REQUEST is not None:
|
||
|
return self.manage_main(self, REQUEST)
|
||
|
# return self.manage_editForm(self, REQUEST)
|
||
|
|
||
|
|
||
|
# The form used to get the instance id from the user.
|
||
|
# manage_addZAbsencesForm = DTMLFile('dtml/manage_addZAbsencesForm', globals())
|