From d6b6ab3ea7d0c23f4837ce4650ddbeaf233cab0f Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 15 Jan 2021 23:08:27 +0100 Subject: [PATCH] Port all Entreprise DTML methods to Python --- ZEntreprises.py | 921 ++++++++++++++++++++++++++++++++++++++---- notesdb.py | 24 +- static/css/scodoc.css | 20 + 3 files changed, 885 insertions(+), 80 deletions(-) diff --git a/ZEntreprises.py b/ZEntreprises.py index 3f1389778..5eb610aaf 100644 --- a/ZEntreprises.py +++ b/ZEntreprises.py @@ -26,23 +26,33 @@ ############################################################################## """ Gestion des relations avec les entreprises + +Note: Code très ancien, porté de Zope/DTML, peu utilisable + +=> Voir si des départements utilisent encore ce module et envisager de le supprimer. + """ import urllib +import string +import re +import time +import calendar from sco_zope import * +from sco_permissions import ScoEntrepriseView, ScoEntrepriseChange # --------------- from notesdb import * from notes_log import log from scolog import logdb -from sco_utils import * +from sco_utils import SCO_ENCODING +import sco_utils as scu import html_sidebar - +import VERSION +from gen_tables import GenTable from TrivialFormulator import TrivialFormulator, TF import scolars -import string, re -import time, calendar def _format_nom(nom): @@ -78,10 +88,19 @@ class EntreprisesEditor(EditableTable): sortkey=None, sort_on_contact=False, ZEntrepriseInstance=None, + limit="", + offset="", ): # list, then sort on date of last contact R = EditableTable.list( - self, cnx, args=args, operator=operator, test=test, sortkey=sortkey + self, + cnx, + args=args, + operator=operator, + test=test, + sortkey=sortkey, + limit=limit, + offset=offset, ) if sort_on_contact: for r in R: @@ -323,7 +342,7 @@ class ZEntreprises( H.append("") # - H.append("""

%s""" % icontag("entreprise_side_img")) + H.append("""

%s""" % scu.icontag("entreprise_side_img")) if REQUEST["_read_only"]: H.append("""
(Lecture seule)""") H.append(""" """) @@ -331,55 +350,835 @@ class ZEntreprises( # -------------------------------------------------------------------- # - # Entreprises : Methodes en DTML + # Entreprises : Vues # # -------------------------------------------------------------------- - # used to view content of the object security.declareProtected(ScoEntrepriseView, "index_html") - index_html = DTMLFile("dtml/entreprises/index_html", globals()) + + def index_html( + self, REQUEST=None, etud_nom=None, limit=50, offset="", format="html" + ): + """Accueil module entreprises""" + # Traduit du DTML - utilise table standard + if limit: + limit = int(limit) + if offset: + offset = int(offset or 0) + + if etud_nom: + entreprises = self.do_entreprise_list_by_etud( + args=REQUEST.form, sort_on_contact=True + ) + table_navigation = "" + else: + entreprises = self.do_entreprise_list( + args=REQUEST.form, + test="~*", + sort_on_contact=True, + limit=limit, + offset=offset, + ) + # Liens navigation précédent/suivant + webparams = {"limit": limit} + if offset: + webparams["offset"] = max((offset or 0) - limit, 0) + prev_lnk = 'précédentes' % ( + REQUEST.URL0 + "?" + urllib.urlencode(webparams) + ) + else: + prev_lnk = "" + if len(entreprises) >= limit: + webparams["offset"] = (offset or 0) + limit + next_lnk = 'suivantes' % ( + REQUEST.URL0 + "?" + urllib.urlencode(webparams) + ) + else: + next_lnk = "" + table_navigation = ( + '
' + + prev_lnk + + '' + + next_lnk + + "
" + ) + # Ajout des liens sur la table: + for e in entreprises: + e["_nom_target"] = "entreprise_edit?entreprise_id=%(entreprise_id)s" % e + e["correspondants"] = self.do_entreprise_correspondant_list( + args={"entreprise_id": e["entreprise_id"]} + ) + e["nbcorr"] = "%d corr." % len(e["correspondants"]) + e["_nbcorr_target"] = ( + "entreprise_correspondant_list?entreprise_id=%(entreprise_id)s" % e + ) + e["contacts"] = self.do_entreprise_contact_list( + args={"entreprise_id": e["entreprise_id"]} + ) + e["nbcontact"] = "%d contacts." % len(e["contacts"]) + e["_nbcontact_target"] = ( + "entreprise_contact_list?entreprise_id=%(entreprise_id)s" % e + ) + tab = GenTable( + rows=entreprises, + columns_ids=("nom", "ville", "secteur", "nbcorr", "nbcontact"), + titles={ + "nom": "Entreprise", + "ville": "Ville", + "secteur": "Secteur", + "nbcorr": "Corresp.", + "contacts": "Contacts", + }, + origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr(), + filename=scu.make_filename( + "entreprises_%s" % self.get_preference("DeptName") + ), + caption="Entreprises du département %s" % self.get_preference("DeptName"), + html_sortable=True, + html_class="entreprise_list table_leftalign", + html_with_td_classes=True, + html_next_section=table_navigation, + base_url=REQUEST.URL0 + "?", + preferences=self.get_preferences(), + ) + if format != "html": + return tab.make_page(self, format=format, REQUEST=REQUEST) + else: + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Suivi relations entreprises

""", + """
""", + tab.html(), + """
""", + self.entreprise_footer(REQUEST), + ] + return "\n".join(H) 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: + def entreprise_contact_list(self, entreprise_id=None, format="html", REQUEST=None): + """Liste des contacts de l'entreprise""" + H = [self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises")] + if entreprise_id: + E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0] + C = self.do_entreprise_contact_list(args={"entreprise_id": entreprise_id}) + H.append( + """

Listes des contacts avec l'entreprise %(nom)s

+ """ + % E + ) + else: + C = self.do_entreprise_contact_list(args={}) + H.append( + """

Listes des contacts

+ """ + ) + for c in C: + c[ + "_date_target" + ] = "%s/entreprise_contact_edit?entreprise_contact_id=%s" % ( + REQUEST.URL1, + c["entreprise_contact_id"], + ) + c["entreprise"] = self.do_entreprise_list( + args={"entreprise_id": c["entreprise_id"]} + )[0] + if c["etudid"]: + c["etud"] = self.getEtudInfo(etudid=c["etudid"], filled=1)[0] + c["etudnom"] = c["etud"]["nomprenom"] + c["_etudnom_target"] = "%s/ficheEtud?etudid=%s" % ( + REQUEST.URL1, + c["etudid"], + ) + else: + c["etud"] = None + c["etudnom"] = "" + + tab = GenTable( + rows=C, + columns_ids=("date", "type_contact", "etudnom", "description"), + titles={ + "date": "Date", + "type_contact": "Object", + "etudnom": "Étudiant", + "description": "Description", + }, + origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr(), + filename=scu.make_filename("contacts_%s" % self.get_preference("DeptName")), + caption="", + html_sortable=True, + html_class="contact_list table_leftalign", + html_with_td_classes=True, + base_url=REQUEST.URL0 + "?", + preferences=self.get_preferences(), + ) + if format != "html": + return tab.make_page(self, format=format, REQUEST=REQUEST) + + H.append(tab.html()) + + if not REQUEST["_read_only"]: # portage DTML, à modifier + if entreprise_id: + H.append( + """

nouveau "contact"

+ """ + % E + ) + + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + + security.declareProtected(ScoEntrepriseView, "entreprise_correspondant_list") + + def entreprise_correspondant_list( + self, + entreprise_id=None, + format="html", + REQUEST=None, + ): + """Liste des correspondants de l'entreprise""" + E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0] + H = [ + self.entreprise_header(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} + ) + 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["nom_entreprise"] = E["nom"] + l = [] + if c["phone1"]: + l.append(c["phone1"]) + if c["phone2"]: + l.append(c["phone2"]) + if c["mobile"]: + l.append(c["mobile"]) + c["telephones"] = " / ".join(l) + c["mails"] = " ".join( + [ + '%s' % (c["mail1"], c["mail1"]) + if c["mail1"] + else "", + '%s' % (c["mail2"], c["mail2"]) + if c["mail2"] + else "", + ] + ) + c["modifier"] = ( + 'modifier' + % c["entreprise_corresp_id"] + ) + c["supprimer"] = ( + 'supprimer' + % c["entreprise_corresp_id"] + ) + tab = GenTable( + rows=correspondants, + columns_ids=( + "nomprenom", + "nom_entreprise", + "fonction", + "telephones", + "mails", + "note", + "modifier", + "supprimer", + ), + titles={ + "nomprenom": "Nom", + "nom_entreprise": "Entreprise", + "fonction": "Fonction", + "telephones": "Téléphone", + "mails": "Mail", + "note": "Note", + "modifier": "", + "supprimer": "", + }, + origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr(), + filename=scu.make_filename( + "correspondants_%s_%s" % (E["nom"], self.get_preference("DeptName")) + ), + caption="", + html_sortable=True, + html_class="contact_list table_leftalign", + html_with_td_classes=True, + base_url=REQUEST.URL0 + "?", + preferences=self.get_preferences(), + ) + if format != "html": + return tab.make_page(self, format=format, REQUEST=REQUEST) + + H.append(tab.html()) + + if not REQUEST["_read_only"]: # portage DTML, à modifier + H.append( + """

Ajouter un correspondant dans l'entreprise %(nom)s

+ """ + % E + ) + + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + + security.declareProtected(ScoEntrepriseView, "entreprise_contact_edit") + + def entreprise_contact_edit(self, entreprise_contact_id, REQUEST=None): + """Form edit contact""" + c = self.do_entreprise_contact_list( + args={"entreprise_contact_id": entreprise_contact_id} + )[0] + link_create_corr = ( + 'créer un nouveau correspondant' + % (REQUEST.URL1, c["entreprise_id"]) + ) + E = self.do_entreprise_list(args={"entreprise_id": c["entreprise_id"]})[0] + correspondants = self.do_entreprise_correspondant_listnames( + args={"entreprise_id": c["entreprise_id"]} + ) + [("inconnu", "")] + + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Suivi entreprises

+

Contact avec entreprise %(nom)s

""" + % E, + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + ( + ( + "entreprise_contact_id", + {"default": entreprise_contact_id, "input_type": "hidden"}, + ), + ( + "entreprise_id", + {"input_type": "hidden", "default": c["entreprise_id"]}, + ), + ( + "type_contact", + { + "input_type": "menu", + "title": "Objet", + "allowed_values": ( + "Prospection", + "Stage étudiant", + "Contrat Apprentissage", + "Projet", + "Autre", + ), + }, + ), + ( + "date", + { + "size": 12, + "title": "Date du contact (j/m/a)", + "allow_null": False, + }, + ), + ( + "entreprise_corresp_id", + { + "input_type": "menu", + "title": "Correspondant entreprise", + "explanation": link_create_corr, + "allow_null": True, + "labels": [x[0] for x in correspondants], + "allowed_values": [x[1] for x in correspondants], + }, + ), + ( + "etudiant", + { + "size": 16, + "title": "Etudiant concerné", + "allow_null": True, + "default": c["etudid"], + "explanation": "nom (si pas ambigu) ou code", + }, + ), + ( + "enseignant", + {"size": 16, "title": "Enseignant (tuteur)", "allow_null": True}, + ), + ( + "description", + { + "input_type": "textarea", + "rows": 3, + "cols": 40, + "title": "Description", + }, + ), + ), + cancelbutton="Annuler", + initvalues=c, + submitlabel="Modifier les valeurs", + readonly=REQUEST["_read_only"], + ) + + if tf[0] == 0: + H.append(tf[1]) + if not REQUEST["_read_only"]: # portage DTML, à modifier + H.append( + """

Supprimer ce contact

""" + % entreprise_contact_id + ) + elif tf[0] == -1: + REQUEST.RESPONSE.redirect(REQUEST.URL1) + else: + etudok = self.do_entreprise_check_etudiant(tf[2]["etudiant"]) + if etudok[0] == 0: + H.append("""

%s

""" % etudok[1]) + else: + tf[2].update({"etudid": etudok[1]}) + self.do_entreprise_contact_edit(tf[2]) + REQUEST.RESPONSE.redirect( + REQUEST.URL1 + + "/entreprise_contact_list?entreprise_id=" + + str(c["entreprise_id"]) + ) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + + security.declareProtected(ScoEntrepriseView, "entreprise_correspondant_edit") + + def entreprise_correspondant_edit(self, entreprise_corresp_id, REQUEST=None): + """Form édition d'un correspondant""" + # F -> c + c = self.do_entreprise_correspondant_list( + args={"entreprise_corresp_id": entreprise_corresp_id} + )[0] + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Édition contact entreprise

""", + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + ( + ( + "entreprise_corresp_id", + {"default": entreprise_corresp_id, "input_type": "hidden"}, + ), + ( + "civilite", + { + "input_type": "menu", + "labels": ["M.", "Mme"], + "allowed_values": ["M.", "Mme"], + }, + ), + ("nom", {"size": 25, "title": "Nom", "allow_null": False}), + ("prenom", {"size": 25, "title": "Prénom"}), + ( + "fonction", + { + "input_type": "menu", + "allowed_values": ( + "Directeur", + "RH", + "Resp. Administratif", + "Tuteur", + "Autre", + ), + "explanation": "fonction via à vis de l'IUT", + }, + ), + ( + "phone1", + { + "size": 14, + "title": "Téléphone 1", + }, + ), + ( + "phone2", + { + "size": 14, + "title": "Téléphone 2", + }, + ), + ( + "mobile", + { + "size": 14, + "title": "Tél. mobile", + }, + ), + ( + "fax", + { + "size": 14, + "title": "Fax", + }, + ), + ( + "mail1", + { + "size": 25, + "title": "e-mail", + }, + ), + ( + "mail2", + { + "size": 25, + "title": "e-mail 2", + }, + ), + ( + "note", + {"input_type": "textarea", "rows": 3, "cols": 40, "title": "Note"}, + ), + ), + cancelbutton="Annuler", + initvalues=c, + submitlabel="Modifier les valeurs", + readonly=REQUEST["_read_only"], + ) + if tf[0] == 0: + H.append(tf[1]) + elif tf[0] == -1: + REQUEST.RESPONSE.redirect( + "%s/entreprise_correspondant_list?entreprise_id=%s" + % (REQUEST.URL1, c["entreprise_id"]) + ) + else: + self.do_entreprise_correspondant_edit(tf[2]) + REQUEST.RESPONSE.redirect( + "%s/entreprise_correspondant_list?entreprise_id=%s" + % (REQUEST.URL1, c["entreprise_id"]) + ) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + security.declareProtected(ScoEntrepriseChange, "entreprise_contact_create") - entreprise_contact_create = DTMLFile( - "dtml/entreprises/entreprise_contact_create", globals() - ) + + 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} + ) + if not correspondants: + correspondants = [("inconnu", "")] + curtime = time.strftime("%d/%m/%Y") + link_create_corr = ( + 'créer un nouveau correspondant' + % (REQUEST.URL1, entreprise_id) + ) + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Nouveau "contact" avec l'entreprise %(nom)s

""" + % E, + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + ( + ("entreprise_id", {"input_type": "hidden", "default": entreprise_id}), + ( + "type_contact", + { + "input_type": "menu", + "title": "Objet", + "allowed_values": ( + "Prospection", + "Stage étudiant", + "Contrat Apprentissage DUT GTR1", + "Contrat Apprentissage DUT GTR2", + "Contrat Apprentissage Licence SQRT", + "Projet", + "Autre", + ), + "default": "Stage étudiant", + }, + ), + ( + "date", + { + "size": 12, + "title": "Date du contact (j/m/a)", + "allow_null": False, + "default": curtime, + }, + ), + ( + "entreprise_corresp_id", + { + "input_type": "menu", + "title": "Correspondant entreprise", + "explanation": link_create_corr, + "allow_null": True, + "labels": [x[0] for x in correspondants], + "allowed_values": [x[1] for x in correspondants], + }, + ), + ( + "etudiant", + { + "size": 16, + "title": "Etudiant concerné", + "allow_null": True, + "explanation": "nom (si pas ambigu) ou code", + }, + ), + ( + "enseignant", + {"size": 16, "title": "Enseignant (tuteur)", "allow_null": True}, + ), + ( + "description", + { + "input_type": "textarea", + "rows": 3, + "cols": 40, + "title": "Description", + }, + ), + ), + cancelbutton="Annuler", + submitlabel="Ajouter ce contact", + readonly=REQUEST["_read_only"], + ) + 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"]) + if etudok[0] == 0: + H.append("""

%s

""" % etudok[1]) + else: + tf[2].update({"etudid": etudok[1]}) + self.do_entreprise_contact_create(tf[2]) + REQUEST.RESPONSE.redirect(REQUEST.URL1) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + security.declareProtected(ScoEntrepriseChange, "entreprise_contact_delete") - entreprise_contact_delete = DTMLFile( - "dtml/entreprises/entreprise_contact_delete", globals() - ) + + def entreprise_contact_delete(self, entreprise_contact_id, REQUEST=None): + """Form delete contact""" + c = self.do_entreprise_contact_list( + args={"entreprise_contact_id": entreprise_contact_id} + )[0] + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Suppression du contact

""", + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + (("entreprise_contact_id", {"input_type": "hidden"}),), + initvalues=c, + submitlabel="Confirmer la suppression", + cancelbutton="Annuler", + readonly=REQUEST["_read_only"], + ) + 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"]) + REQUEST.RESPONSE.redirect(REQUEST.URL1) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_create") - entreprise_correspondant_create = DTMLFile( - "dtml/entreprises/entreprise_correspondant_create", globals() - ) + + def entreprise_correspondant_create(self, entreprise_id, REQUEST=None): + """Form création correspondant""" + E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0] + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Nouveau correspondant l'entreprise %(nom)s

""" + % E, + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + ( + ("entreprise_id", {"input_type": "hidden", "default": entreprise_id}), + ( + "civilite", + { + "input_type": "menu", + "labels": ["M.", "Mme"], + "allowed_values": ["M.", "Mme"], + }, + ), + ("nom", {"size": 25, "title": "Nom", "allow_null": False}), + ("prenom", {"size": 25, "title": "Prénom"}), + ( + "fonction", + { + "input_type": "menu", + "allowed_values": ( + "Directeur", + "RH", + "Resp. Administratif", + "Tuteur", + "Autre", + ), + "default": "Tuteur", + "explanation": "fonction via à vis de l'IUT", + }, + ), + ( + "phone1", + { + "size": 14, + "title": "Téléphone 1", + }, + ), + ( + "phone2", + { + "size": 14, + "title": "Téléphone 2", + }, + ), + ( + "mobile", + { + "size": 14, + "title": "Tél. mobile", + }, + ), + ( + "fax", + { + "size": 14, + "title": "Fax", + }, + ), + ( + "mail1", + { + "size": 25, + "title": "e-mail", + }, + ), + ( + "mail2", + { + "size": 25, + "title": "e-mail 2", + }, + ), + ( + "note", + {"input_type": "textarea", "rows": 3, "cols": 40, "title": "Note"}, + ), + ), + cancelbutton="Annuler", + submitlabel="Ajouter ce correspondant", + readonly=REQUEST["_read_only"], + ) + 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]) + REQUEST.RESPONSE.redirect(REQUEST.URL1) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + security.declareProtected(ScoEntrepriseChange, "entreprise_correspondant_delete") - entreprise_correspondant_delete = DTMLFile( - "dtml/entreprises/entreprise_correspondant_delete", globals() - ) + + 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} + )[0] + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Suppression du correspondant %(nom)s %(prenom)s

""" % c, + ] + tf = TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + (("entreprise_corresp_id", {"input_type": "hidden"}),), + initvalues=c, + submitlabel="Confirmer la suppression", + cancelbutton="Annuler", + readonly=REQUEST["_read_only"], + ) + 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"]) + REQUEST.RESPONSE.redirect(REQUEST.URL1) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) + security.declareProtected(ScoEntrepriseChange, "entreprise_delete") - entreprise_delete = DTMLFile("dtml/entreprises/entreprise_delete", globals()) + + def entreprise_delete(self, entreprise_id, REQUEST=None): + """Form delete entreprise""" + E = self.do_entreprise_list(args={"entreprise_id": entreprise_id})[0] + H = [ + self.entreprise_header(REQUEST=REQUEST, page_title="Suivi entreprises"), + """

Suppression de l'entreprise %(nom)s

+

Attention: supression définitive de l'entreprise, de ses correspondants et contacts. +

""" + % E, + ] + Cl = self.do_entreprise_correspondant_list( + args={"entreprise_id": entreprise_id} + ) + if Cl: + H.append( + """

Correspondants dans l'entreprise qui seront supprimés:

""") + + Cts = self.do_entreprise_contact_list(args={"entreprise_id": entreprise_id}) + if Cts: + H.append( + """

Contacts avec l'entreprise qui seront supprimés:

""") + tf = self.TrivialFormulator( + REQUEST.URL0, + REQUEST.form, + (("entreprise_id", {"input_type": "hidden"}),), + initvalues=E, + submitlabel="Confirmer la suppression", + cancelbutton="Annuler", + readonly=REQUEST["_read_only"], + ) + 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"]) + REQUEST.RESPONSE.redirect(REQUEST.URL1) + H.append(self.entreprise_footer(REQUEST)) + return "\n".join(H) # -------------------------------------------------------------------- # - # Entreprises : Methodes en Python + # Entreprises : Actions # # -------------------------------------------------------------------- security.declareProtected(ScoEntrepriseChange, "do_entreprise_create") @@ -521,7 +1320,7 @@ class ZEntreprises( for x in r: e.append( "
  • %s %s (code %s)
  • " - % (strupper(x[1]), x[2] or "", x[0].strip()) + % (scu.strupper(x[1]), x[2] or "", x[0].strip()) ) e.append("") return ( @@ -780,7 +1579,7 @@ class ZEntreprises( H.append( """

    %s Supprimer cette entreprise

    """ % ( - icontag("delete_img", title="delete", border="0"), + scu.icontag("delete_img", title="delete", border="0"), F["entreprise_id"], ) ) @@ -850,42 +1649,6 @@ class ZEntreprises( 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 ( - 'créer un nouveau correspondant' - ) - # -------------------------------------------------------------------- # diff --git a/notesdb.py b/notesdb.py index 5bdbcf40a..09e51a3be 100644 --- a/notesdb.py +++ b/notesdb.py @@ -141,6 +141,8 @@ def DBSelectArgs( distinct=True, aux_tables=[], id_name=None, + limit="", + offset="", ): """Select * from table where values match dict vals. Returns cnx, columns_names, list of tuples @@ -155,6 +157,12 @@ def DBSelectArgs( distinct = " distinct " else: distinct = "" + if limit != "": + limit = " LIMIT %d" % limit + if not offset: + offset = "" + if offset != "": + offset = " OFFSET %d" % offset operator = " " + operator + " " # liste des tables (apres "from") tables = [table] + [x[0] for x in aux_tables] @@ -195,7 +203,17 @@ def DBSelectArgs( if cond: cond = " where " + cond # - req = "select " + distinct + ", ".join(what) + " from " + tables + cond + orderby + req = ( + "select " + + distinct + + ", ".join(what) + + " from " + + tables + + cond + + orderby + + limit + + offset + ) # open('/tmp/select.log','a').write( req % vals + '\n' ) try: cursor.execute(req, vals) @@ -329,6 +347,8 @@ class EditableTable: test="=", sortkey=None, disable_formatting=False, + limit="", + offset="", ): "returns list of dicts" # REQLOG.write('%s: %s by %s (%s) %d\n'%(self.table_name,args,sys._getframe(1).f_code.co_name, sys._getframe(2).f_code.co_name, REQN)) @@ -347,6 +367,8 @@ class EditableTable: operator=operator, aux_tables=self.aux_tables, id_name=self.id_name, + limit=limit, + offset=offset, ) for r in res: self.format_output(r, disable_formatting=disable_formatting) diff --git a/static/css/scodoc.css b/static/css/scodoc.css index 7eebc65f8..48dd4df81 100644 --- a/static/css/scodoc.css +++ b/static/css/scodoc.css @@ -2039,7 +2039,14 @@ table.entreprise_list, table.corr_list, table.contact_list { /* border-style: solid; */ border-spacing: 0px 0px; padding: 0px; + margin-left: 0px; } + +table.entreprise_list td.nbcorr a, table.entreprise_list td.nbcontact a, table.contact_list td.etudnom a, table.contact_list td a { + color: navy; + text-decoration: underline; +} + tr.entreprise_list_even, tr.corr_list_even, tr.contact_list_even { background-color: rgb(85%,85%,95%); } @@ -2047,6 +2054,19 @@ tr.entreprise_list_odd, tr.corr_list_odd, tr.contact_list_odd { background-color: rgb(90%,90%, 90%); } +span.table_nav_mid { + flex-grow: 1; /* Set the middle element to grow and stretch */ +} +span.table_nav_prev, span.table_nav_next { + width: 11em; /* A fixed width as the default */ +} + +div.table_nav { + width: 100%; + display: flex; + justify-content: space-between; +} + td.entreprise_descr, td.corr_descr, td.contact_descr { padding-left: 2em; }