[scodoc-devel] [SVN] Scolar : [1674] - Fix: export Apogee: decisions des LP non exportees (bug introduit il y a 10 jours);

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Jeu 20 Juil 10:28:52 CEST 2017


Une pièce jointe HTML a été nettoyée...
URL: https://listes.univ-paris13.fr/pipermail/scodoc-devel/attachments/20170720/1e597ed8/attachment.htm 
-------------- section suivante --------------
Modified: branches/ScoDoc7/sco_apogee_csv.py
===================================================================
--- branches/ScoDoc7/sco_apogee_csv.py	2017-07-18 13:25:37 UTC (rev 1673)
+++ branches/ScoDoc7/sco_apogee_csv.py	2017-07-20 08:28:52 UTC (rev 1674)
@@ -84,6 +84,10 @@
 from cStringIO import StringIO
 from zipfile import ZipFile
 import pprint
+try:
+    from chardet import detect as chardet_detect
+except:
+    chardet_detect = None
 
 import sco_formsemestre
 import sco_formsemestre_status
@@ -96,8 +100,8 @@
 from sco_utils import *
 
 APO_PORTAL_ENCODING = 'utf8' # encodage du fichier CSV Apogée (était 'ISO-8859-1' avant jul. 2016)
-APO_INPUT_ENCODING  = 'ISO-8859-1'
-APO_OUTPUT_ENCODING = APO_INPUT_ENCODING
+APO_INPUT_ENCODING  = 'ISO-8859-1' #
+APO_OUTPUT_ENCODING = APO_INPUT_ENCODING # encodage des fichiers Apogee générés
 APO_DECIMAL_SEP = ',' # separateur décimal: virgule
 APO_SEP = '\t'
 APO_NEWLINE = '\r\n'
@@ -130,6 +134,36 @@
         return ''
     return ('%3.2f' % val).replace('.', APO_DECIMAL_SEP)
 
+def guess_data_encoding(text, threshold=0.6):
+    """Guess string encoding, using chardet heuristics.
+    Returns encoding, or None if detection failed (confidence below threshold,
+    or chardet not installed)
+    """
+    if not chardet_detect:
+        return None # package not installed
+    r = chardet_detect(text)
+    if r['confidence'] < threshold:
+        return None
+    else:
+        return r['encoding']
+    
+def fix_data_encoding(text, default_source_encoding=APO_INPUT_ENCODING,
+    dest_encoding=APO_INPUT_ENCODING):
+    """Try to ensure that text is using dest_encoding
+    returns converted text, and a message describing the conversion. 
+    """
+    message = ''
+    detected_encoding = guess_data_encoding(text)
+    if not detected_encoding:
+        if default_source_encoding != dest_encoding:
+            message = 'converting from %s to %s' % (default_source_encoding, dest_encoding)
+            text = text.decode(default_source_encoding).encode(dest_encoding)
+    else:
+        if detected_encoding != dest_encoding:
+            message = 'converting from detected %s to %s' % (detected_encoding, dest_encoding)
+            text = text.decode(detected_encoding).encode(dest_encoding)
+    return text, message
+
 class StringIOFileLineWrapper(object):
     def __init__(self, data):
         self.f = StringIO(data)
@@ -418,8 +452,28 @@
 
         Renvoie le semestre "courant" et l'autre semestre, ou None s'il n'y en a pas.
         """
-        if apo_data.cur_semestre_id <= 0:
-            return None, None # non pertinent pour sessions sans semestres
+        # Cherche le semestre "courant":
+        cur_sems = [ sem for sem in self.etud['sems']
+                     if ((sem['semestre_id'] == apo_data.cur_semestre_id)
+                         and (apo_data.etape_apogee in sem['etapes'])
+                         and (sco_formsemestre.sem_in_annee_scolaire(context, sem, apo_data.annee_scolaire))) ]
+        if not cur_sems:
+            cur_sem = None
+        else:
+            # prend le plus recent avec decision
+            cur_sem = None
+            for sem in cur_sems:
+                nt = context._getNotesCache().get_NotesTable(context, sem['formsemestre_id'])
+                decision = nt.get_etud_decision_sem(self.etud['etudid'])
+                if decision:
+                    cur_sem = sem
+                    break
+            if cur_sem is None:
+                cur_sem = cur_sems[0] # aucun avec decison, prend le plus recent
+        
+        if apo_data.cur_semestre_id <= 0:            
+            return cur_sem, None # "autre_sem" non pertinent pour sessions sans semestres
+        
         if apo_data.jury_intermediaire: # jury de janvier
             # Le semestre suivant: exemple 2 si on est en jury de S1
             autre_semestre_id = apo_data.cur_semestre_id + 1
@@ -465,26 +519,7 @@
                     break
             if autre_sem is None:
                 autre_sem = autres_sems[0] # aucun avec decision, prend le plus recent
-
-        # Cherche le semestre "courant":
-        cur_sems = [ sem for sem in self.etud['sems']
-                     if ((sem['semestre_id'] == apo_data.cur_semestre_id)
-                         and (apo_data.etape_apogee in sem['etapes'])
-                         and (sco_formsemestre.sem_in_annee_scolaire(context, sem, apo_data.annee_scolaire))) ]
-        if not cur_sems:
-            cur_sem = None
-        else:
-            # prend le plus recent avec decision
-            cur_sem = None
-            for sem in cur_sems:
-                nt = context._getNotesCache().get_NotesTable(context, sem['formsemestre_id'])
-                decision = nt.get_etud_decision_sem(self.etud['etudid'])
-                if decision:
-                    cur_sem = sem
-                    break
-            if cur_sem is None:
-                cur_sem = cur_sems[0] # aucun avec decison, prend le plus recent
-
+        
         return cur_sem, autre_sem
 
 

Modified: branches/ScoDoc7/sco_etape_apogee.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee.py	2017-07-18 13:25:37 UTC (rev 1673)
+++ branches/ScoDoc7/sco_etape_apogee.py	2017-07-20 08:28:52 UTC (rev 1674)
@@ -91,7 +91,7 @@
 
 def apo_csv_store(context, csv_data, annee_scolaire, sem_id):
     """
-    csv_data: maquette content, as a string, encoding givne by APO_INPUT_ENCODING (latin-1, not utf8)
+    csv_data: maquette content, as a string, encoding given by APO_INPUT_ENCODING (latin-1, not utf8)
     annee_scolaire: int (2016)
     sem_id: 0 (année ?), 1 (premier semestre de l'année) ou 2 (deuxième semestre)
     :return: etape_apo du fichier CSV stocké

Modified: branches/ScoDoc7/sco_etape_apogee_view.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee_view.py	2017-07-18 13:25:37 UTC (rev 1673)
+++ branches/ScoDoc7/sco_etape_apogee_view.py	2017-07-20 08:28:52 UTC (rev 1674)
@@ -434,6 +434,10 @@
 
     if csvfile:
         data = csvfile.read()
+        # check encoding (although documentation states that users SHOULD upload LATIN1)
+        data, message = sco_apogee_csv.fix_data_encoding(data)
+        if message:
+            log('view_apo_csv_store: %s' % message)
     
     if not data:
         raise ScoValueError('view_apo_csv_store: no data')


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