[scodoc-devel] [SVN] Scolar : [1800] Cache definition etapes Apogee en cas de panne intermitente du portail

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Sam 22 Sep 22:51:46 CEST 2018


Une pièce jointe HTML a été nettoyée...
URL: https://listes.univ-paris13.fr/pipermail/scodoc-devel/attachments/20180922/1dafa3dc/attachment.htm 
-------------- section suivante --------------
Modified: branches/ScoDoc7/sco_portal_apogee.py
===================================================================
--- branches/ScoDoc7/sco_portal_apogee.py	2018-09-20 17:09:57 UTC (rev 1799)
+++ branches/ScoDoc7/sco_portal_apogee.py	2018-09-22 20:51:46 UTC (rev 1800)
@@ -30,6 +30,8 @@
 
 from sco_utils import *
 
+SCO_CACHE_ETAPE_FILENAME = os.path.join( SCO_TMPDIR, 'last_etapes.xml' )
+
 def has_portal(context):
     "True if we are connected to a portal"
     return get_portal_url(context)
@@ -304,6 +306,28 @@
                     etapes[dept] = { code : intitule }
     return etapes
 
+def _parse_etapes_from_xml(context, doc):
+    """
+    may raise exception if invalid xml doc
+    """
+    xml_etapes_by_dept = context.get_preference('xml_etapes_by_dept')
+    # parser XML    
+    dom = xml.dom.minidom.parseString(doc)
+    infos = {}
+    if dom.childNodes[0].nodeName != u'etapes':
+        raise ValueError
+    if xml_etapes_by_dept:
+        # Ancien format XML avec des sections par departement:
+        for d in dom.childNodes[0].childNodes:
+            if d.nodeType == d.ELEMENT_NODE:
+                dept = d.nodeName.encode(SCO_ENCODING)
+                _xml_list_codes(infos, dept, d.childNodes)
+    else:
+        # Toutes les étapes:
+        dept = ''
+        _xml_list_codes(infos, '', dom.childNodes[0].childNodes)
+    return infos
+
 def get_etapes_apogee(context):
     """Liste des etapes apogee
     { departement : { code_etape : intitule } }
@@ -315,27 +339,22 @@
         return {}
     portal_timeout = context.get_preference('portal_timeout')
     doc = query_portal(etapes_url, timeout=portal_timeout)
-
-    xml_etapes_by_dept = context.get_preference('xml_etapes_by_dept')
-    # parser XML    
+    
     try:
-        dom = xml.dom.minidom.parseString(doc)
-        infos = {}
-        if dom.childNodes[0].nodeName != u'etapes':
-            raise ValueError
-        if xml_etapes_by_dept:
-            # Ancien format XML avec des sections par departement:
-            for d in dom.childNodes[0].childNodes:
-                if d.nodeType == d.ELEMENT_NODE:
-                    dept = d.nodeName.encode(SCO_ENCODING)
-                    _xml_list_codes(infos, dept, d.childNodes)
-        else:
-            # Toutes les étapes:
-            dept = ''
-            _xml_list_codes(infos, '', dom.childNodes[0].childNodes)
+        infos = _parse_etapes_from_xml(context, doc)
+        # cache le resultat (utile si le portail repond de façon intermitente)
+        if infos:            
+            open( SCO_CACHE_ETAPE_FILENAME, 'w' ).write(doc)
     except:
         log('invalid XML response from getEtapes Web Service\n%s' % etapes_url)
-        return get_default_etapes(context)
+        # Avons nous la copie d'une réponse récente ?
+        try:
+            doc = open( SCO_CACHE_ETAPE_FILENAME ).read()
+            infos = _parse_etapes_from_xml(context, doc)
+            log('using last saved version from ' + SCO_CACHE_ETAPE_FILENAME)
+        except:
+            # derniere chance: utilise étapes par défaut livrées avec ScoDoc
+            return get_default_etapes(context)
     return infos
 
 def _xml_list_codes(target_dict, dept, nodes):

Modified: branches/ScoDoc7/sco_utils.py
===================================================================
--- branches/ScoDoc7/sco_utils.py	2018-09-20 17:09:57 UTC (rev 1799)
+++ branches/ScoDoc7/sco_utils.py	2018-09-22 20:51:46 UTC (rev 1800)
@@ -181,6 +181,11 @@
 # ----- Global lock for critical sections (except notes_tables caches)
 GSL = thread.allocate_lock() # Global ScoDoc Lock
 
+# ----- Repertoire tmp
+SCO_TMPDIR = os.path.join( *[ os.environ['INSTANCE_HOME'], 'var', 'scodoc', 'tmp' ])
+if not os.path.exists(SCO_TMPDIR):
+    os.mkdir( SCO_TMPDIR, 0744 )
+
 # ----- Lecture du fichier de configuration
 SCO_SRCDIR = os.path.split(VERSION.__file__)[0]
 if SCO_SRCDIR:


Plus d'informations sur la liste de diffusion scodoc-devel