diff --git a/app/scodoc/ImportScolars.py b/app/scodoc/ImportScolars.py index d38218f5..1935701f 100644 --- a/app/scodoc/ImportScolars.py +++ b/app/scodoc/ImportScolars.py @@ -240,14 +240,14 @@ def students_import_excel( dest = "formsemestre_status?formsemestre_id=%s" % formsemestre_id else: dest = context.NotesURL() - H = [context.sco_header(REQUEST, page_title="Import etudiants")] + H = [html_sco_header.sco_header(context, REQUEST, page_title="Import etudiants")] H.append("
Import terminé !
") H.append('' % dest) - return "\n".join(H) + context.sco_footer(REQUEST) + return "\n".join(H) + html_sco_header.sco_footer(context, REQUEST) def scolars_import_excel_file( diff --git a/app/scodoc/ZEntreprises.py b/app/scodoc/ZEntreprises.py index 56be1de4..9a70012f 100644 --- a/app/scodoc/ZEntreprises.py +++ b/app/scodoc/ZEntreprises.py @@ -55,12 +55,12 @@ import sco_entreprises def entreprise_header(context, REQUEST=None, page_title=""): "common header for all Entreprises pages" - return context.sco_header(REQUEST, container=context, page_title=page_title) + return html_sco_header.sco_header(context, REQUEST, container=context, page_title=page_title) def entreprise_footer(context, REQUEST): "common entreprise footer" - return context.sco_footer(REQUEST) + return html_sco_header.sco_footer(context, REQUEST) class ZEntreprises( diff --git a/app/scodoc/ZScoDoc.py b/app/scodoc/ZScoDoc.py index 5aab6e8c..222e1157 100644 --- a/app/scodoc/ZScoDoc.py +++ b/app/scodoc/ZScoDoc.py @@ -74,6 +74,7 @@ except: import sco_utils as scu import VERSION +import mails from notes_log import log import sco_find_etud import sco_users @@ -94,6 +95,7 @@ from sco_permissions import ( ScoSuperAdmin, ) from sco_exceptions import ScoValueError, ScoLockedFormError, ScoGenError, AccessDenied +import html_sco_header class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Implicit): @@ -264,8 +266,8 @@ class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp if not REQUEST.AUTHENTICATED_USER.has_role("Manager"): raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération") H = [ - self.scodoc_top_html_header( - REQUEST, page_title="ScoDoc: changement mot de passe" + html_sco_header.scodoc_top_html_header( + self, REQUEST, page_title="ScoDoc: changement mot de passe" ) ] if message: @@ -367,54 +369,6 @@ class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp + """ supprimé du serveur web (la base de données n'est pas affectée)!""" ) - _top_level_css = """ - """ - - _html_begin = """ - - - -Problèmes et suggestions sur le logiciel: %s
-ScoDoc est un logiciel libre développé par Emmanuel Viennet.
-""" % ( - scu.SCO_USERS_LIST, - scu.SCO_USERS_LIST, - ) - - # sendEmail is not used through the web - def sendEmail(self, msg): - # sends an email to the address using the mailhost, if there is one - try: - mail_host = self.MailHost - except: - log("warning: sendEmail: no MailHost found !") - return - # a failed notification shouldn't cause a Zope error on a site. - try: - mail_host.send(msg.as_string()) - log("sendEmail: ok") - except Exception as e: - log("sendEmail: exception while sending message") - log(e) - pass - - def sendEmailFromException(self, msg): - # Send email by hand, as it seems to be not possible to use Zope Mail Host - # from an exception handler (see https://bugs.launchpad.net/zope2/+bug/246748) - log("sendEmailFromException") - try: - p = os.popen("sendmail -t", "w") # old brute force method - p.write(msg.as_string()) - exitcode = p.close() - if exitcode: - log("sendmail exit code: %s" % exitcode) - except: - log("an exception occurred sending mail") - security.declareProtected("View", "standard_error_message") def standard_error_message( @@ -736,18 +629,18 @@ Problème de connexion (identifiant, mot de passe): contacter votre responsa elif error_type in ("ScoValueError", "FormatError"): # Not a bug, presents a gentle message to the user: H = [ - self.standard_html_header(REQUEST), + html_sco_header.standard_html_header(), """%s
""" % error_value, ] if error_value.dest_url: H.append('' % error_value.dest_url) - H.append(self.standard_html_footer(REQUEST)) + H.append(html_sco_header.standard_html_footer()) return "\n".join(H) else: # Other exceptions, try carefully to build an error page... # log('exc A') H = [] try: - H.append(self.standard_html_header(REQUEST)) + H.append(html_sco_header.standard_html_header()) except: pass H.append( @@ -785,7 +678,7 @@ Problème de connexion (identifiant, mot de passe): contacter votre responsa % params ) try: - H.append(self.standard_html_footer(REQUEST)) + H.append(html_sco_header.standard_html_footer()) except: log("no footer found for error page") pass @@ -801,81 +694,12 @@ ErrorType: %(error_type)s % params ) - self.send_debug_alert(txt, REQUEST=REQUEST) + mails.send_debug_alert(context, txt, REQUEST=REQUEST) # --- log("done processing exception") # log( '\n page=\n' + '\n'.join(H) ) return "\n".join(H) - def _report_request(self, REQUEST, fmt="txt"): - """string describing current request for bug reports""" - QUERY_STRING = REQUEST.get("QUERY_STRING", "") - if QUERY_STRING: - QUERY_STRING = "?" + QUERY_STRING - if fmt == "txt": - REFERER = REQUEST.get("HTTP_REFERER", "") - HTTP_USER_AGENT = REQUEST.get("HTTP_USER_AGENT", "") - else: - REFERER = "na" - HTTP_USER_AGENT = "na" - - params = dict( - AUTHENTICATED_USER=REQUEST.get("AUTHENTICATED_USER", ""), - dt=time.asctime(), - URL=REQUEST.get("URL", ""), - QUERY_STRING=QUERY_STRING, - METHOD=REQUEST.get("REQUEST_METHOD", ""), - REFERER=REFERER, - HTTP_USER_AGENT=HTTP_USER_AGENT, - form=REQUEST.get("form", ""), - HTTP_X_FORWARDED_FOR=REQUEST.get("HTTP_X_FORWARDED_FOR", ""), - svn_version=scu.get_svn_version(self.file_path), - SCOVERSION=VERSION.SCOVERSION, - ) - txt = ( - """ -Version: %(SCOVERSION)s -User: %(AUTHENTICATED_USER)s -Date: %(dt)s -URL: %(URL)s%(QUERY_STRING)s -Method: %(METHOD)s - -REFERER: %(REFERER)s -Form: %(form)s -Origin: %(HTTP_X_FORWARDED_FOR)s -Agent: %(HTTP_USER_AGENT)s -""" - % params - ) - if fmt == "html": - txt = txt.replace("\n", "
-
-REQUEST.URL=%s
-REQUEST.URL0=%s
-
-
Hello, World !
perms: %s
'%str(scoperms)) - # # H.append('valid_roles: %s
'%str(self.valid_roles())) - # # H.append('ac_inherited_permissions=%s
'%str(self.ac_inherited_permissions(1))) - # def collect_roles(context, rd): - # for p in scoperms: - # name, value = p[:2] - # P = Permission(name, value, context) - # roles = list(P.getRoles()) - # if rd.has_key(name): - # rd[name] += roles - # else: - # rd[name] = roles - # if hasattr(context, "aq_parent"): - # collect_roles(context.aq_parent, rd) - - # b = "" - # rd = {} - # collect_roles(self, rd) - # b = "" + str(rd) + "
" - - # authuser = REQUEST.AUTHENTICATED_USER - # for p in scoperms: - # permname, _ = p[:2] - # b += "" + permname + " : " - # if authuser.has_permission(permname, self): - # b += "yes" - # else: - # b += "no" - # b += "
" - # b += "xxx
" + str(self.aq_parent.aq_parent) - - # return self.sco_header(REQUEST) + str(b) + self.sco_footer(REQUEST) - - # essais calendriers: - security.declareProtected(ScoView, "experimental_calendar") - experimental_calendar = sco_edt_cal.experimental_calendar - security.declareProtected(ScoView, "group_edt_json") - group_edt_json = sco_edt_cal.group_edt_json - - security.declareProtected(ScoView, "ScoURL") - - def ScoURL(self): - """base URL for this sco instance. - e.g. https://scodoc.xxx.fr/ScoDoc/DEPT/Scolarite - = page accueil département - """ - # absolute_url is the classic Zope method - # The avoid the burden of configuring a proxy zope object, we offer - # a custom configuration via scodoc_config - # XXX ne devrait pas marcher car l'URL dépend du département !!! - return scu.CONFIG.ABSOLUTE_URL or self.absolute_url() - - def NotesURL(self): - """URL of Notes - e.g. https://scodoc.xxx.fr/ScoDoc/DEPT/Scolarite/Notes - = url de base des requêtes de ZNotes - et page accueil programmes. - """ - return self.ScoURL() + "/Notes" - - def EntreprisesURL(self): - """URL of Enterprises - e.g. https://scodoc.xxx.fr/ScoDoc/DEPT/Scolarite/Entreprises - = url de base des requêtes de ZEntreprises - et page accueil Entreprises - """ - return self.ScoURL() + "/Entreprises" - - def AbsencesURL(self): - """URL of Absences""" - return self.ScoURL() + "/Absences" - - def UsersURL(self): - """URL of Users - e.g. https://scodoc.xxx.fr/ScoDoc/DEPT/Scolarite/Users - = url de base des requêtes ZScoUsers - et page accueil users - """ - return self.ScoURL() + "/Users" - - security.declareProtected(ScoView, "sco_header") - sco_header = html_sco_header.sco_header - security.declareProtected(ScoView, "sco_footer") - sco_footer = html_sco_header.sco_footer - - # -------------------------------------------------------------------- - # - # GESTION DE LA BD - # - # -------------------------------------------------------------------- - - security.declareProtected(ScoSuperAdmin, "GetDBConnexion") - GetDBConnexion = ndb.GetDBConnexion - - # A enlever après re-ecriture de ZEntreprises.py - security.declareProtected(ScoView, "TrivialFormulator") - - def TrivialFormulator( - self, - form_url, - values, - formdescription=(), - initvalues={}, - method="POST", - submitlabel="OK", - formid="tf", - cancelbutton=None, - readonly=False, - ): - "generator/validator of simple forms" - # obsolete, still used by dtml/entreprises old code... - return TrivialFormulator( - form_url, - values, - formdescription=formdescription, - initvalues=initvalues, - method=method, - submitlabel=submitlabel, - formid=formid, - cancelbutton=cancelbutton, - readonly=readonly, - ) - - # -------------------------------------------------------------------- - # - # SCOLARITE (top level) - # - # -------------------------------------------------------------------- - - security.declareProtected(ScoView, "about") - - def about(self, REQUEST): - "version info" - H = [ - """
© Emmanuel Viennet 1997-2021
-Version %s
- """ - % (scu.get_scodoc_version()) - ] - H.append( - 'Logiciel libre écrit en Python.
Utilise ReportLab pour générer les documents PDF, et pyExcelerator pour le traitement des documents Excel.
' - ) - H.append("- %(label)s - | - (format tableur) - Photos - | """ - % group - ) - H.append("(%d étudiants) | " % n_members) - - if with_absences: - H.append(FormAbs % group) - - H.append("
Aucun groupe dans cette partition') - if sco_groups.can_change_groups(self, REQUEST, formsemestre_id): - H.append( - ' (créer)' - % partition["partition_id"] - ) - H.append("
") - if sco_groups.can_change_groups(self, REQUEST, formsemestre_id): - H.append( - '' - % etud - ] - header = self.sco_header( - REQUEST, page_title="Changement adresse de %(nomprenom)s" % etud - ) - - tf = TrivialFormulator( - REQUEST.URL0, - REQUEST.form, - ( - ("adresse_id", {"input_type": "hidden"}), - ("etudid", {"input_type": "hidden"}), - ( - "email", - { - "size": 40, - "title": "e-mail", - "explanation": "adresse institutionnelle", - }, - ), - ( - "emailperso", - { - "size": 40, - "title": "e-mail", - "explanation": "adresse personnelle", - }, - ), - ( - "domicile", - {"size": 65, "explanation": "numéro, rue", "title": "Adresse"}, - ), - ("codepostaldomicile", {"size": 6, "title": "Code postal"}), - ("villedomicile", {"size": 20, "title": "Ville"}), - ("paysdomicile", {"size": 20, "title": "Pays"}), - ("", {"input_type": "separator", "default": " "}), - ("telephone", {"size": 13, "title": "Téléphone"}), - ("telephonemobile", {"size": 13, "title": "Mobile"}), - ), - initvalues=adr, - submitlabel="Valider le formulaire", - ) - dest_url = self.ScoURL() + "/ficheEtud?etudid=" + etudid - if tf[0] == 0: - return header + "\n".join(H) + tf[1] + self.sco_footer(REQUEST) - elif tf[0] == -1: - return REQUEST.RESPONSE.redirect(dest_url) - else: - if adrs: - scolars.adresse_edit(cnx, args=tf[2], context=self) - else: - scolars.adresse_create(cnx, args=tf[2]) - logdb(REQUEST, cnx, method="changeCoordonnees", etudid=etudid) - return REQUEST.RESPONSE.redirect(dest_url) - - # --- Gestion des groupes: - security.declareProtected(ScoView, "affectGroups") - affectGroups = sco_groups_edit.affectGroups - - security.declareProtected(ScoView, "XMLgetGroupsInPartition") - XMLgetGroupsInPartition = sco_groups.XMLgetGroupsInPartition - - security.declareProtected(ScoView, "formsemestre_partition_list") - formsemestre_partition_list = sco_groups.formsemestre_partition_list - - security.declareProtected(ScoView, "setGroups") - setGroups = sco_groups.setGroups - - security.declareProtected(ScoView, "createGroup") - createGroup = sco_groups.createGroup - - security.declareProtected(ScoView, "suppressGroup") - suppressGroup = sco_groups.suppressGroup - - security.declareProtected(ScoView, "group_set_name") - group_set_name = sco_groups.group_set_name - - security.declareProtected(ScoView, "group_rename") - group_rename = sco_groups.group_rename - - security.declareProtected(ScoView, "groups_auto_repartition") - groups_auto_repartition = sco_groups.groups_auto_repartition - - security.declareProtected(ScoView, "editPartitionForm") - editPartitionForm = sco_groups.editPartitionForm - - security.declareProtected(ScoView, "partition_delete") - partition_delete = sco_groups.partition_delete - - security.declareProtected(ScoView, "partition_set_attr") - partition_set_attr = sco_groups.partition_set_attr - - security.declareProtected(ScoView, "partition_move") - partition_move = sco_groups.partition_move - - security.declareProtected(ScoView, "partition_set_name") - partition_set_name = sco_groups.partition_set_name - - security.declareProtected(ScoView, "partition_rename") - partition_rename = sco_groups.partition_rename - - security.declareProtected(ScoView, "partition_create") - partition_create = sco_groups.partition_create - - security.declareProtected(ScoView, "etud_info_html") - etud_info_html = sco_page_etud.etud_info_html - - # --- Gestion des photos: - security.declareProtected(ScoView, "get_photo_image") - - get_photo_image = sco_photos.get_photo_image - - security.declareProtected(ScoView, "etud_photo_html") - - etud_photo_html = sco_photos.etud_photo_html - - security.declareProtected(ScoView, "etud_photo_orig_page") - - def etud_photo_orig_page(self, etudid=None, REQUEST=None): - "Page with photo in orig. size" - etud = self.getEtudInfo(etudid=etudid, filled=1, REQUEST=REQUEST)[0] - H = [ - self.sco_header(REQUEST, page_title=etud["nomprenom"]), - "
Photo actuelle (%(photoloc)s): - """ - % etud, - sco_photos.etud_photo_html( - self, etud, title="photo actuelle", REQUEST=REQUEST - ), - """
Le fichier ne doit pas dépasser 500Ko (recadrer l'image, format "portrait" de préférence).
-L'image sera automagiquement réduite pour obtenir une hauteur de 90 pixels.
- """, - ] - tf = TrivialFormulator( - REQUEST.URL0, - REQUEST.form, - ( - ("etudid", {"default": etudid, "input_type": "hidden"}), - ( - "photofile", - {"input_type": "file", "title": "Fichier image", "size": 20}, - ), - ), - submitlabel="Valider", - cancelbutton="Annuler", - ) - dest_url = self.ScoURL() + "/ficheEtud?etudid=" + etud["etudid"] - if tf[0] == 0: - return ( - "\n".join(H) - + tf[1] - + '' - % etudid - + self.sco_footer(REQUEST) - ) - elif tf[0] == -1: - return REQUEST.RESPONSE.redirect(dest_url) - else: - data = tf[2]["photofile"].read() - status, diag = sco_photos.store_photo(self, etud, data, REQUEST=REQUEST) - if status != 0: - return REQUEST.RESPONSE.redirect(dest_url) - else: - H.append('Erreur:' + diag + "
") - return "\n".join(H) + self.sco_footer(REQUEST) - - security.declareProtected(ScoEtudChangeAdr, "formSuppressPhoto") - - def formSuppressPhoto(self, etudid=None, REQUEST=None, dialog_confirmed=False): - """Formulaire suppression photo étudiant""" - etud = self.getEtudInfo(filled=1, REQUEST=REQUEST)[0] - if not dialog_confirmed: - return self.confirmDialog( - "Confirmer la suppression de la photo de %(nomprenom)s ?
" % etud, - dest_url="", - REQUEST=REQUEST, - cancel_url="ficheEtud?etudid=%s" % etudid, - parameters={"etudid": etudid}, - ) - - sco_photos.suppress_photo(self, etud, REQUEST=REQUEST) - - return REQUEST.RESPONSE.redirect( - self.ScoURL() + "/ficheEtud?etudid=" + etud["etudid"] - ) - - # - security.declareProtected(ScoEtudInscrit, "formDem") - - def formDem(self, etudid, formsemestre_id, REQUEST): - "Formulaire Démission Etudiant" - return self._formDem_of_Def( - etudid, - formsemestre_id, - REQUEST=REQUEST, - operation_name="Démission", - operation_method="doDemEtudiant", - ) - - security.declareProtected(ScoEtudInscrit, "formDef") - - def formDef(self, etudid, formsemestre_id, REQUEST): - "Formulaire Défaillance Etudiant" - return self._formDem_of_Def( - etudid, - formsemestre_id, - REQUEST=REQUEST, - operation_name="Défaillance", - operation_method="doDefEtudiant", - ) - - def _formDem_of_Def( - self, - etudid, - formsemestre_id, - REQUEST=None, - operation_name="", - operation_method="", - ): - "Formulaire démission ou défaillance Etudiant" - etud = self.getEtudInfo(etudid=etudid, filled=1, REQUEST=REQUEST)[0] - sem = sco_formsemestre.get_formsemestre(self, formsemestre_id) - if sem["etat"] != "1": - raise ScoValueError("Modification impossible: semestre verrouille") - - etud["formsemestre_id"] = formsemestre_id - etud["semtitre"] = sem["titremois"] - etud["nowdmy"] = time.strftime("%d/%m/%Y") - etud["operation_name"] = operation_name - # - header = self.sco_header( - REQUEST, - page_title="%(operation_name)s de %(nomprenom)s (du semestre %(semtitre)s)" - % etud, - ) - H = [ - '' - % etud - ] - H.append( - """
""" - % etud - ) - return header + "\n".join(H) + self.sco_footer(REQUEST) - - security.declareProtected(ScoEtudInscrit, "doDemEtudiant") - - def doDemEtudiant(self, etudid, formsemestre_id, event_date=None, REQUEST=None): - "Déclare la démission d'un etudiant dans le semestre" - return self._doDem_or_Def_Etudiant( - etudid, - formsemestre_id, - event_date=event_date, - etat_new="D", - operation_method="demEtudiant", - event_type="DEMISSION", - REQUEST=REQUEST, - ) - - security.declareProtected(ScoEtudInscrit, "doDefEtudiant") - - def doDefEtudiant(self, etudid, formsemestre_id, event_date=None, REQUEST=None): - "Déclare la défaillance d'un etudiant dans le semestre" - return self._doDem_or_Def_Etudiant( - etudid, - formsemestre_id, - event_date=event_date, - etat_new=sco_codes_parcours.DEF, - operation_method="defailleEtudiant", - event_type="DEFAILLANCE", - REQUEST=REQUEST, - ) - - def _doDem_or_Def_Etudiant( - self, - etudid, - formsemestre_id, - event_date=None, - etat_new="D", # 'D' or DEF - operation_method="demEtudiant", - event_type="DEMISSION", - REQUEST=None, - ): - "Démission ou défaillance d'un étudiant" - # marque 'D' ou DEF dans l'inscription au semestre et ajoute - # un "evenement" scolarite - cnx = self.GetDBConnexion() - # check lock - sem = sco_formsemestre.get_formsemestre(self, formsemestre_id) - if sem["etat"] != "1": - raise ScoValueError("Modification impossible: semestre verrouille") - # - ins = self.Notes.do_formsemestre_inscription_list( - {"etudid": etudid, "formsemestre_id": formsemestre_id} - )[0] - if not ins: - raise ScoException("etudiant non inscrit ?!") - ins["etat"] = etat_new - self.Notes.do_formsemestre_inscription_edit( - args=ins, formsemestre_id=formsemestre_id - ) - logdb(REQUEST, cnx, method=operation_method, etudid=etudid) - scolars.scolar_events_create( - cnx, - args={ - "etudid": etudid, - "event_date": event_date, - "formsemestre_id": formsemestre_id, - "event_type": event_type, - }, - ) - if REQUEST: - return REQUEST.RESPONSE.redirect("ficheEtud?etudid=" + etudid) - - security.declareProtected(ScoEtudInscrit, "doCancelDem") - - def doCancelDem( - self, etudid, formsemestre_id, dialog_confirmed=False, args=None, REQUEST=None - ): - "Annule une démission" - return self._doCancelDem_or_Def( - etudid, - formsemestre_id, - dialog_confirmed=dialog_confirmed, - args=args, - operation_name="démission", - etat_current="D", - etat_new="I", - operation_method="cancelDem", - event_type="DEMISSION", - REQUEST=REQUEST, - ) - - security.declareProtected(ScoEtudInscrit, "doCancelDef") - - def doCancelDef( - self, etudid, formsemestre_id, dialog_confirmed=False, args=None, REQUEST=None - ): - "Annule la défaillance de l'étudiant" - return self._doCancelDem_or_Def( - etudid, - formsemestre_id, - dialog_confirmed=dialog_confirmed, - args=args, - operation_name="défaillance", - etat_current=sco_codes_parcours.DEF, - etat_new="I", - operation_method="cancelDef", - event_type="DEFAILLANCE", - REQUEST=REQUEST, - ) - - def _doCancelDem_or_Def( - self, - etudid, - formsemestre_id, - dialog_confirmed=False, - args=None, - operation_name="", # "démission" ou "défaillance" - etat_current="D", - etat_new="I", - operation_method="cancelDem", - event_type="DEMISSION", - REQUEST=None, - ): - "Annule une demission ou une défaillance" - # check lock - sem = sco_formsemestre.get_formsemestre(self, formsemestre_id) - if sem["etat"] != "1": - raise ScoValueError("Modification impossible: semestre verrouille") - # verif - info = self.getEtudInfo(etudid, filled=True)[0] - ok = False - for i in info["ins"]: - if i["formsemestre_id"] == formsemestre_id: - if i["etat"] != etat_current: - raise ScoValueError("etudiant non %s !" % operation_name) - ok = True - break - if not ok: - raise ScoValueError("etudiant non inscrit ???") - if not dialog_confirmed: - return self.confirmDialog( - "Confirmer l'annulation de la %s ?
" % operation_name, - dest_url="", - REQUEST=REQUEST, - cancel_url="ficheEtud?etudid=%s" % etudid, - parameters={"etudid": etudid, "formsemestre_id": formsemestre_id}, - ) - # - ins = self.Notes.do_formsemestre_inscription_list( - {"etudid": etudid, "formsemestre_id": formsemestre_id} - )[0] - if ins["etat"] != etat_current: - raise ScoException("etudiant non %s !!!" % etat_current) # obviously a bug - ins["etat"] = etat_new - cnx = self.GetDBConnexion() - self.Notes.do_formsemestre_inscription_edit( - args=ins, formsemestre_id=formsemestre_id - ) - logdb(REQUEST, cnx, method=operation_method, etudid=etudid) - cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) - cursor.execute( - "delete from scolar_events where etudid=%(etudid)s and formsemestre_id=%(formsemestre_id)s and event_type='" - + event_type - + "'", - {"etudid": etudid, "formsemestre_id": formsemestre_id}, - ) - cnx.commit() - return REQUEST.RESPONSE.redirect("ficheEtud?etudid=%s" % etudid) - - security.declareProtected(ScoEtudInscrit, "etudident_create_form") - - def etudident_create_form(self, REQUEST=None): - "formulaire creation individuelle etudiant" - return self.etudident_create_or_edit_form(REQUEST, edit=False) - - security.declareProtected(ScoEtudInscrit, "etudident_edit_form") - - def etudident_edit_form(self, REQUEST=None): - "formulaire edition individuelle etudiant" - return self.etudident_create_or_edit_form(REQUEST, edit=True) - - security.declareProtected(ScoEtudInscrit, "etudident_create_or_edit_form") - - def etudident_create_or_edit_form(self, REQUEST, edit): - "Le formulaire HTML" - H = [self.sco_header(REQUEST, init_jquery_ui=True)] - F = self.sco_footer(REQUEST) - etudid = REQUEST.form.get("etudid", None) - cnx = self.GetDBConnexion() - descr = [] - if not edit: - # creation nouvel etudiant - initvalues = {} - submitlabel = "Ajouter cet étudiant" - H.append( - """En général, il est recommandé d'importer les étudiants depuis Apogée. - N'utilisez ce formulaire que pour les cas particuliers ou si votre établissement - n'utilise pas d'autre logiciel de gestion des inscriptions.
-L'étudiant créé ne sera pas inscrit. - Pensez à l'inscrire dans un semestre !
- """ - ) - else: - # edition donnees d'un etudiant existant - # setup form init values - if not etudid: - raise ValueError("missing etudid parameter") - descr.append(("etudid", {"default": etudid, "input_type": "hidden"})) - H.append( - '%s
- %s -Pas d'informations d'Apogée
" + A + F - elif tf[0] == -1: - return "\n".join(H) + tf[1] + "
" + A + F - # return '\n'.join(H) + '
" - + A - + F - ) - # log('NbHomonyms=%s' % NbHomonyms) - if not tf[2]["dont_check_homonyms"] and NbHomonyms > 0: - return ( - "\n".join(H) - + tf_error_message( - """Attention: il y a déjà un étudiant portant des noms et prénoms proches. Vous pouvez forcer la présence d'un homonyme en cochant "autoriser les homonymes" en bas du formulaire.""" - ) - + tf[1] - + "
" - + A - + F - ) - - if not edit: - etud = scolars.create_etud(self, cnx, args=tf[2], REQUEST=REQUEST) - etudid = etud["etudid"] - else: - # modif d'un etudiant - scolars.etudident_edit(cnx, tf[2], context=self, REQUEST=REQUEST) - etud = scolars.etudident_list(cnx, {"etudid": etudid})[0] - self.fillEtudsInfo([etud]) - # Inval semesters with this student: - to_inval = [s["formsemestre_id"] for s in etud["sems"]] - if to_inval: - self.Notes._inval_cache( - formsemestre_id_list=to_inval - ) # > etudident_create_or_edit - # - return REQUEST.RESPONSE.redirect("ficheEtud?etudid=" + etudid) - - security.declareProtected(ScoEtudInscrit, "etudident_delete") - - def etudident_delete(self, etudid, dialog_confirmed=False, REQUEST=None): - "Delete a student" - cnx = self.GetDBConnexion() - etuds = scolars.etudident_list(cnx, {"etudid": etudid}) - if not etuds: - raise ScoValueError("Etudiant inexistant !") - else: - etud = etuds[0] - self.fillEtudsInfo([etud]) - if not dialog_confirmed: - return self.confirmDialog( - """
Prenez le temps de vérifier que vous devez vraiment supprimer cet étudiant !
-Cette opération irréversible efface toute trace de l'étudiant: inscriptions, notes, absences... dans tous les semestres qu'il a fréquenté.
-Dans la plupart des cas, vous avez seulement besoin de le
Vérifier la fiche de %(nomprenom)s -
""" - % etud, - dest_url="", - REQUEST=REQUEST, - cancel_url="ficheEtud?etudid=%s" % etudid, - OK="Supprimer définitivement cet étudiant", - parameters={"etudid": etudid}, - ) - log("etudident_delete: etudid=%(etudid)s nomprenom=%(nomprenom)s" % etud) - # delete in all tables ! - tables = [ - "notes_appreciations", - "scolar_autorisation_inscription", - "scolar_formsemestre_validation", - "scolar_events", - "notes_notes_log", - "notes_notes", - "notes_moduleimpl_inscription", - "notes_formsemestre_inscription", - "group_membership", - "entreprise_contact", - "etud_annotations", - "scolog", - "admissions", - "adresse", - "absences", - "billet_absence", - "identite", - ] - cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) - for table in tables: - cursor.execute("delete from %s where etudid=%%(etudid)s" % table, etud) - cnx.commit() - # Inval semestres où il était inscrit: - to_inval = [s["formsemestre_id"] for s in etud["sems"]] - if to_inval: - self.Notes._inval_cache(formsemestre_id_list=to_inval) # > - return REQUEST.RESPONSE.redirect( - self.ScoURL() + r"?head_message=Etudiant%20supprimé" - ) - - security.declareProtected(ScoEtudInscrit, "check_group_apogee") - - def check_group_apogee( - self, group_id, REQUEST=None, etat=None, fix=False, fixmail=False - ): - """Verification des codes Apogee et mail de tout un groupe. - Si fix == True, change les codes avec Apogée. - - XXX A re-écrire pour API 2: prendre liste dans l'étape et vérifier à partir de cela. - """ - etat = etat or None - members, group, _, sem, _ = sco_groups.get_group_infos( - self, group_id, etat=etat - ) - formsemestre_id = group["formsemestre_id"] - - cnx = self.GetDBConnexion() - H = [ - self.Notes.html_sem_header( - REQUEST, "Etudiants du %s" % (group["group_name"] or "semestre"), sem - ), - 'Nom | Nom usuel | Prénom | NIP (ScoDoc) | Apogée | |
---|---|---|---|---|---|
%s | %s | %s | %s | %s | %s |
Retour au semestre - """ - % ( - REQUEST.URL0, - formsemestre_id, - scu.strnone(group_id), - scu.strnone(etat), - formsemestre_id, - ) - ) - H.append( - """ -
-Retour au semestre - """ - % ( - REQUEST.URL0, - formsemestre_id, - scu.strnone(group_id), - scu.strnone(etat), - formsemestre_id, - ) - ) - - return "\n".join(H) + self.sco_footer(REQUEST) - - security.declareProtected(ScoEtudInscrit, "form_students_import_excel") - - def form_students_import_excel(self, REQUEST, formsemestre_id=None): - "formulaire import xls" - if formsemestre_id: - sem = sco_formsemestre.get_formsemestre(self.Notes, formsemestre_id) - dest_url = ( - self.ScoURL() - + "/formsemestre_status?formsemestre_id=%s" % formsemestre_id - ) - else: - sem = None - dest_url = self.ScoURL() - if sem and sem["etat"] != "1": - raise ScoValueError("Modification impossible: semestre verrouille") - H = [ - self.sco_header(REQUEST, page_title="Import etudiants"), - """
A utiliser pour importer de nouveaux étudiants (typiquement au - premier semestre).
-Si les étudiants à inscrire sont déjà dans un autre - semestre, utiliser le menu "Inscriptions (passage des étudiants) - depuis d'autres semestres à partir du semestre destination. -
-Si vous avez un portail Apogée, il est en général préférable d'importer les - étudiants depuis Apogée, via le menu "Synchroniser avec étape Apogée". -
-- L'opération se déroule en deux étapes. Dans un premier temps, - vous téléchargez une feuille Excel type. Vous devez remplir - cette feuille, une ligne décrivant chaque étudiant. Ensuite, - vous indiquez le nom de votre fichier dans la case "Fichier Excel" - ci-dessous, et cliquez sur "Télécharger" pour envoyer au serveur - votre liste. -
- """, - ] # ' - if sem: - H.append( - """Les étudiants importés seront inscrits dans - le semestre %s
""" - % sem["titremois"] - ) - else: - H.append( - """ -Pour inscrire directement les étudiants dans un semestre de - formation, il suffit d'indiquer le code de ce semestre - (qui doit avoir été créé au préalable). Cliquez ici pour afficher les codes -
- """ - % (self.ScoURL()) - ) - - H.append("""Le fichier Excel décrivant les étudiants doit comporter les colonnes suivantes. -
Les colonnes peuvent être placées dans n'importe quel ordre, mais -le titre exact (tel que ci-dessous) doit être sur la première ligne. -
--Les champs avec un astérisque (*) doivent être présents (nulls non autorisés). -
- - --
Attribut | Type | Description | |
%s | %s | %s | %s |
@@ -258,7 +258,7 @@ Raison: (optionnel)
"menu_module": menu_module,
"disabled": "disabled" if disabled else "",
},
- context.sco_footer(REQUEST),
+ html_sco_header.sco_footer(context, REQUEST),
]
return "\n".join(H)
@@ -316,7 +316,7 @@ def doJustifAbsence(
nbadded += 1
#
H = [
- context.sco_header(
+ html_sco_header.sco_header(context,
REQUEST, page_title="Justification d'une absence pour %(nomprenom)s" % etud
),
"""Justification d'absences""", @@ -342,7 +342,7 @@ def doJustifAbsence( % etud ) H.append(sco_find_etud.form_search_etud(context, REQUEST)) - H.append(context.sco_footer(REQUEST)) + H.append(html_sco_header.sco_footer(context, REQUEST)) return "\n".join(H) @@ -352,7 +352,7 @@ def JustifAbsenceEtud(context, REQUEST=None): # etudid implied etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0] etudid = etud["etudid"] H = [ - context.sco_header( + html_sco_header.sco_header(context, REQUEST, page_title="Justification d'une absence pour %(nomprenom)s" % etud ), """
Absences de %s (à partir du %s)""" @@ -795,7 +795,7 @@ def ListeAbsEtud( H.append(tab_absjust.html()) else: H.append("""Pas d'absences justifiées""") - return "\n".join(H) + context.sco_footer(REQUEST) + return "\n".join(H) + html_sco_header.sco_footer(context, REQUEST) elif format == "text": T = [] @@ -828,7 +828,7 @@ def absences_index_html(context, REQUEST=None): authuser = REQUEST.AUTHENTICATED_USER H = [ - context.sco_header( + html_sco_header.sco_header(context, REQUEST, page_title="Gestion des absences", cssstyles=["css/calabs.css"], @@ -877,7 +877,7 @@ saisir les absences de toute cette semaine. """Vous n'avez pas l'autorisation d'ajouter, justifier ou supprimer des absences. """ ) - H.append(context.sco_footer(REQUEST)) + H.append(html_sco_header.sco_footer(context, REQUEST)) return "\n".join(H) diff --git a/app/scodoc/sco_apogee_compare.py b/app/scodoc/sco_apogee_compare.py index 25925420..f2f76c54 100644 --- a/app/scodoc/sco_apogee_compare.py +++ b/app/scodoc/sco_apogee_compare.py @@ -65,7 +65,7 @@ _help_txt = """ def apo_compare_csv_form(context, REQUEST=None): """Form: submit 2 CSV files to compare them.""" H = [ - context.sco_header(REQUEST, page_title="Comparaison de fichiers Apogée"), + html_sco_header.sco_header(context, REQUEST, page_title="Comparaison de fichiers Apogée"), """Comparaison de fichiers Apogée""", - context.sco_footer(REQUEST), + html_sco_header.sco_footer(context, REQUEST), ] return "\n".join(H) @@ -95,14 +95,14 @@ def apo_compare_csv(context, A_file, B_file, autodetect=True, REQUEST=None): B = _load_apo_data(B_file, autodetect=autodetect) H = [ - context.sco_header(REQUEST, page_title="Comparaison de fichiers Apogée"), + html_sco_header.sco_header(context, REQUEST, page_title="Comparaison de fichiers Apogée"), "Comparaison de fichiers Apogée", _help_txt, '',
_apo_compare_csv(context, A, B, REQUEST=None),
" ",
"""""",
- context.sco_footer(REQUEST),
+ html_sco_header.sco_footer(context, REQUEST),
]
return "\n".join(H)
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index 28fdae36..c9f1953b 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -299,7 +299,7 @@ def do_formsemestre_archive(
if data:
data = "\n".join(
[
- context.sco_header(
+ html_sco_header.sco_header(context,
REQUEST,
page_title="Moyennes archivées le %s" % date,
head_message="Moyennes archivées le %s" % date,
@@ -308,7 +308,7 @@ def do_formsemestre_archive(
'Valeurs archivées le %s' % date, '', data, - context.sco_footer(REQUEST), + html_sco_header.sco_footer(context, REQUEST), ] ) PVArchive.store(archive_id, "Tableau_moyennes.html", data) @@ -381,7 +381,7 @@ def formsemestre_archive(context, REQUEST, formsemestre_id, group_ids=[]): ) H = [ - context.html_sem_header( + html_sco_header.html_sem_header(context, REQUEST, "Archiver les PV et résultats du semestre", sem=sem, @@ -400,7 +400,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement. F = [ """Note: les documents sont aussi affectés par les réglages sur la page "Paramétrage" (accessible à l'administrateur du département). """, - context.sco_footer(REQUEST), + html_sco_header.sco_footer(context, REQUEST), ] descr = [ @@ -503,7 +503,7 @@ def formsemestre_list_archives(context, REQUEST, formsemestre_id): L.append(a) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) - H = [context.html_sem_header(REQUEST, "Archive des PV et résultats ", sem)] + H = [html_sco_header.html_sem_header(context, REQUEST, "Archive des PV et résultats ", sem)] if not L: H.append("aucune archive enregistrée ") else: @@ -529,7 +529,7 @@ def formsemestre_list_archives(context, REQUEST, formsemestre_id): H.append("") H.append("") - return "\n".join(H) + context.sco_footer(REQUEST) + return "\n".join(H) + html_sco_header.sco_footer(context, REQUEST) def formsemestre_get_archived_file( diff --git a/app/scodoc/sco_archives_etud.py b/app/scodoc/sco_archives_etud.py index 4e135437..61715348 100644 --- a/app/scodoc/sco_archives_etud.py +++ b/app/scodoc/sco_archives_etud.py @@ -131,7 +131,7 @@ def etud_upload_file_form(context, REQUEST, etudid): ) etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0] H = [ - context.sco_header( + html_sco_header.sco_header(context, REQUEST, page_title="Chargement d'un document associé à %(nomprenom)s" % etud, ), @@ -162,7 +162,7 @@ def etud_upload_file_form(context, REQUEST, etudid): cancelbutton="Annuler", ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect( context.NotesURL() + "/ficheEtud?etudid=" + etudid @@ -252,7 +252,7 @@ def etudarchive_generate_excel_sample(context, group_id=None, REQUEST=None): def etudarchive_import_files_form(context, group_id, REQUEST=None): """Formualaire pour importation fichiers d'un groupe""" H = [ - context.sco_header( + html_sco_header.sco_header(context, REQUEST, page_title="Import de fichiers associés aux étudiants" ), """Téléchargement de fichier associés aux étudiants@@ -276,7 +276,7 @@ def etudarchive_import_files_form(context, group_id, REQUEST=None): """ % group_id, ] - F = context.sco_footer(REQUEST) + F = html_sco_header.sco_footer(context, REQUEST) tf = TrivialFormulator( REQUEST.URL0, REQUEST.form, @@ -329,4 +329,4 @@ def etudarchive_import_files( r = sco_trombino.zip_excel_import_files( context, xlsfile, zipfile, REQUEST, callback, filename_title, page_title ) - return r + context.sco_footer(REQUEST) + return r + html_sco_header.sco_footer(context, REQUEST) diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py index 90c451cf..e41d0cbc 100644 --- a/app/scodoc/sco_bulletins.py +++ b/app/scodoc/sco_bulletins.py @@ -41,6 +41,7 @@ from email.header import Header from reportlab.lib.colors import Color +import mails import sco_utils as scu import notesdb as ndb from notes_log import log @@ -831,7 +832,7 @@ def formsemestre_bulletinetud( R.append('') # --- Pied de page - R.append(context.sco_footer(REQUEST)) + R.append(html_sco_header.sco_footer(context, REQUEST)) return "".join(R) @@ -1010,7 +1011,7 @@ def mail_bulletin(context, formsemestre_id, I, pdfdata, filename, recipient_addr email.encoders.encode_base64(att) msg.attach(att) log("mail bulletin a %s" % msg["To"]) - context.sendEmail(msg) + mails.sendEmail(context, msg) def _formsemestre_bulletinetud_header_html( @@ -1026,7 +1027,7 @@ def _formsemestre_bulletinetud_header_html( authuser = REQUEST.AUTHENTICATED_USER uid = str(authuser) H = [ - context.sco_header( + html_sco_header.sco_header(context, page_title="Bulletin de %(nomprenom)s" % etud, REQUEST=REQUEST, javascripts=[ @@ -1196,7 +1197,7 @@ def formsemestre_bulletins_choice( """Choix d'une version de bulletin""" sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) H = [ - context.html_sem_header(REQUEST, title, sem), + html_sco_header.html_sem_header(context, REQUEST, title, sem), """ """ - + context.sco_footer(REQUEST) + + html_sco_header.sco_footer(context, REQUEST) ) diff --git a/app/scodoc/sco_dept.py b/app/scodoc/sco_dept.py index 66a6fa79..1b9341a2 100644 --- a/app/scodoc/sco_dept.py +++ b/app/scodoc/sco_dept.py @@ -171,7 +171,7 @@ Chercher étape courante: Suppression de la formation %(titre)s (%(acronyme)s)""" % F, ] @@ -86,7 +86,7 @@ def formation_delete(context, formation_id=None, dialog_confirmed=False, REQUEST % context.NotesURL() ) - H.append(context.sco_footer(REQUEST)) + H.append(html_sco_header.sco_footer(context, REQUEST)) return "\n".join(H) @@ -99,7 +99,7 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None): """Edit or create a formation""" if create: H = [ - context.sco_header(REQUEST, page_title="Création d'une formation"), + html_sco_header.sco_header(context, REQUEST, page_title="Création d'une formation"), """Création d'une formationUne "formation" décrit une filière, comme un DUT ou une Licence. La formation se subdivise en unités pédagogiques (UE, matières, modules). Elle peut se diviser en plusieurs semestres (ou sessions), qui seront mis en place séparément. @@ -121,7 +121,7 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None): is_locked = context.formation_has_locked_sems(formation_id) submitlabel = "Modifier les valeurs" H = [ - context.sco_header(REQUEST, page_title="Modification d'une formation"), + html_sco_header.sco_header(context, REQUEST, page_title="Modification d'une formation"), """ Modification de la formation %(acronyme)s""" % initvalues, ] if is_locked: @@ -191,7 +191,7 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None): submitlabel=submitlabel, ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(context.NotesURL()) else: @@ -214,7 +214,7 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None): "Valeurs incorrectes: il existe déjà une formation avec même titre, acronyme et version." ) + tf[1] - + context.sco_footer(REQUEST) + + html_sco_header.sco_footer(context, REQUEST) ) # if create: diff --git a/app/scodoc/sco_edit_matiere.py b/app/scodoc/sco_edit_matiere.py index 98a86dfe..1c2f1ae4 100644 --- a/app/scodoc/sco_edit_matiere.py +++ b/app/scodoc/sco_edit_matiere.py @@ -40,7 +40,7 @@ def matiere_create(context, ue_id=None, REQUEST=None): """Creation d'une matiere""" UE = context.do_ue_list(args={"ue_id": ue_id})[0] H = [ - context.sco_header(REQUEST, page_title="Création d'une matière"), + html_sco_header.sco_header(context, REQUEST, page_title="Création d'une matière"), """Création d'une matière dans l'UE %(titre)s (%(acronyme)s)""" % UE, """Les matières sont des groupes de modules dans une UE d'une formation donnée. Les matières servent surtout pour la @@ -78,7 +78,7 @@ associé. dest_url = context.NotesURL() + "/ue_list?formation_id=" + UE["formation_id"] if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(dest_url) else: @@ -89,7 +89,7 @@ associé. "\n".join(H) + tf_error_message("Titre de matière déjà existant dans cette UE") + tf[1] - + context.sco_footer(REQUEST) + + html_sco_header.sco_footer(context, REQUEST) ) _ = context.do_matiere_create(tf[2], REQUEST) return REQUEST.RESPONSE.redirect(dest_url) @@ -100,7 +100,7 @@ def matiere_delete(context, matiere_id=None, REQUEST=None): M = context.do_matiere_list(args={"matiere_id": matiere_id})[0] UE = context.do_ue_list(args={"ue_id": M["ue_id"]})[0] H = [ - context.sco_header(REQUEST, page_title="Suppression d'une matière"), + html_sco_header.sco_header(context, REQUEST, page_title="Suppression d'une matière"), " Suppression de la matière %(titre)s" % M, " dans l'UE (%(acronyme)s))" % UE, ] @@ -114,7 +114,7 @@ def matiere_delete(context, matiere_id=None, REQUEST=None): cancelbutton="Annuler", ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(dest_url) else: @@ -138,7 +138,7 @@ def matiere_edit(context, matiere_id=None, REQUEST=None): ue_names = ["%(acronyme)s (%(titre)s)" % u for u in ues] ue_ids = [u["ue_id"] for u in ues] H = [ - context.sco_header(REQUEST, page_title="Modification d'une matière"), + html_sco_header.sco_header(context, REQUEST, page_title="Modification d'une matière"), """Modification de la matière %(titre)s""" % F, """(formation %(acronyme)s, version %(version)s)""" % Fo, ] @@ -182,7 +182,7 @@ associé. dest_url = context.NotesURL() + "/ue_list?formation_id=" + U["formation_id"] if tf[0] == 0: - return "\n".join(H) + tf[1] + help + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + help + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(dest_url) else: @@ -195,7 +195,7 @@ associé. "\n".join(H) + tf_error_message("Titre de matière déjà existant dans cette UE") + tf[1] - + context.sco_footer(REQUEST) + + html_sco_header.sco_footer(context, REQUEST) ) # changement d'UE ? diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index 41867211..1d513977 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -66,7 +66,7 @@ def module_create(context, matiere_id=None, REQUEST=None): parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) semestres_indices = range(1, parcours.NB_SEM + 1) H = [ - context.sco_header(REQUEST, page_title="Création d'un module"), + html_sco_header.sco_header(context, REQUEST, page_title="Création d'un module"), """Création d'un module dans la matière %(titre)s""" % M, """ (UE %(acronyme)s)""" % UE, _MODULE_HELP, @@ -170,7 +170,7 @@ def module_create(context, matiere_id=None, REQUEST=None): submitlabel="Créer ce module", ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) else: context.do_module_create(tf[2], REQUEST) return REQUEST.RESPONSE.redirect( @@ -187,7 +187,9 @@ def module_delete(context, module_id=None, REQUEST=None): raise ScoValueError("Module inexistant !") Mod = Mods[0] H = [ - context.sco_header(REQUEST, page_title="Suppression d'un module"), + html_sco_header.sco_header( + context, REQUEST, page_title="Suppression d'un module" + ), """Suppression du module %(titre)s (%(code)s)""" % Mod, ] @@ -201,7 +203,7 @@ def module_delete(context, module_id=None, REQUEST=None): cancelbutton="Annuler", ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(dest_url) else: @@ -226,7 +228,7 @@ def module_edit(context, module_id=None, REQUEST=None): if not Mod: raise ScoValueError("invalid module !") Mod = Mod[0] - unlocked = not context.module_is_locked(module_id) + unlocked = not module_is_locked(context, module_id) Fo = context.formation_list(args={"formation_id": Mod["formation_id"]})[0] parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) M = ndb.SimpleDictFetch( @@ -243,7 +245,8 @@ def module_edit(context, module_id=None, REQUEST=None): dest_url = context.NotesURL() + "/ue_list?formation_id=" + Mod["formation_id"] H = [ - context.sco_header( + html_sco_header.sco_header( + context, REQUEST, page_title="Modification du module %(titre)s" % Mod, cssstyles=["libjs/jQuery-tagEditor/jquery.tag-editor.css"], @@ -375,7 +378,7 @@ def module_edit(context, module_id=None, REQUEST=None): ) if tf[0] == 0: - return "\n".join(H) + tf[1] + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) elif tf[0] == -1: return REQUEST.RESPONSE.redirect(dest_url) else: @@ -412,7 +415,9 @@ def module_list(context, formation_id, REQUEST=None): raise ScoValueError("invalid formation !") F = context.formation_list(args={"formation_id": formation_id})[0] H = [ - context.sco_header(REQUEST, page_title="Liste des modules de %(titre)s" % F), + html_sco_header.sco_header( + context, REQUEST, page_title="Liste des modules de %(titre)s" % F + ), """Listes des modules dans la formation %(titre)s (%(acronyme)s)""" % F, '
" + title, " (formation %(acronyme)s, version %(version)s)" % Fo, """ @@ -186,7 +186,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None): if tf[0] == 0: X = """ """ - return "\n".join(H) + tf[1] + X + context.sco_footer(REQUEST) + return "\n".join(H) + tf[1] + X + html_sco_header.sco_footer(context, REQUEST) else: if create: if not tf[2]["ue_code"]: @@ -323,7 +323,7 @@ def ue_list(context, formation_id=None, msg="", REQUEST=None): "delete_small_dis_img", title="Suppression impossible (module utilisé)" ) H = [ - context.sco_header( + html_sco_header.sco_header(context, REQUEST, cssstyles=["libjs/jQuery-tagEditor/jquery.tag-editor.css"], javascripts=[ @@ -466,7 +466,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module '%s' % sco_codes_parcours.UE_TYPE_NAME[UE["type"]] ) - ue_editable = editable and not context.ue_is_locked(UE["ue_id"]) + ue_editable = editable and not ue_is_locked(context, UE["ue_id"]) if ue_editable: H.append( 'modifier' % UE @@ -479,20 +479,20 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module for Mat in Matlist: if not parcours.UE_IS_MODULE: H.append('
loading...
""",
- context.sco_footer(REQUEST),
+ html_sco_header.sco_footer(context, REQUEST),
""" |