[Scodoc-devel] [SVN] Scolar : [1517] Import maquettes Apogee: traitement du cas ou les id ne sont pas uniques

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Dim 10 Juil 10:21:07 CEST 2016


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20160710/a26c0943/attachment.html>
-------------- section suivante --------------
Modified: branches/ScoDoc7/debug.py
===================================================================
--- branches/ScoDoc7/debug.py	2016-07-09 20:59:20 UTC (rev 1516)
+++ branches/ScoDoc7/debug.py	2016-07-10 08:21:07 UTC (rev 1517)
@@ -99,3 +99,6 @@
         
         
 REQUEST = DummyRequest()
+
+# handful shorcut
+pp = pprint.pprint

Modified: branches/ScoDoc7/sco_apogee_csv.py
===================================================================
--- branches/ScoDoc7/sco_apogee_csv.py	2016-07-09 20:59:20 UTC (rev 1516)
+++ branches/ScoDoc7/sco_apogee_csv.py	2016-07-10 08:21:07 UTC (rev 1517)
@@ -126,6 +126,20 @@
         return ''
     return '%3.2f' % val
 
+class StringIOFileLineWrapper(object):
+    def __init__(self, data):
+        self.f = StringIO(data)
+        self.lineno = 0
+    def close(self):
+        return self.f.close()
+    def readline(self):
+        self.lineno += 1
+        return self.f.readline()
+
+class DictCol(dict):
+    "A dict, where we can add attributes"
+    pass
+
 class ApoElt:
     """Definition d'un Element Apogee
     sur plusieurs colonnes du fichier CSV
@@ -138,8 +152,13 @@
         self.code = cols[0]['Code']
         self.type_objet = cols[0]['Type Objet']
     def append(self, col):
+        assert col['Code'] == self.code
+        if col['Type Objet'] != self.type_objet:
+            log('Warning: ApoElt: duplicate id %s (%s and %s)' 
+                % (self.code, self.type_objet, col['Type Objet']) )
+            self.type_objet = col['Type Objet']
         self.cols.append(col)
-    def __str__(self):
+    def __repr__(self):
         return "ApoElt(code='%s', cols=%s)" % (self.code, pprint.pformat(self.cols))
 
 class EtuCol:
@@ -295,7 +314,7 @@
         if not data:
             raise ScoValueError('Fichier Apogée vide !')
         data_utf8 = data.decode(APO_ENCODING).encode(SCO_ENCODING)
-        f = StringIO(data_utf8) # pour traiter comme un fichier
+        f = StringIOFileLineWrapper(data_utf8) # pour traiter comme un fichier
          # check that we are at the begining of Apogee CSV
         line = f.readline().strip()
         if line != 'XX-APO_TITRES-XX':
@@ -335,10 +354,14 @@
         self.etuds = self.apo_read_etuds(f)
     
     def _group_elt_cols(self, cols):
-        "Return ordered dict of ApoElt from list of ApoCols"
+        """Return ordered dict of ApoElt from list of ApoCols.
+        Clé: id apogée, eg 'V1RT', 'V1GE2201', ...
+        Valeur: ApoElt, avec les attributs code, type_objet
+
+        Si les id Apogée ne sont pas uniques (ce n'est pas garanti), garde le premier 
+        """
         elts = collections.OrderedDict()
-        elt_by_col = {} # { col_id : 
-        for col_id in cols:
+        for col_id in sorted(cols.keys(), reverse=True):
             col = cols[col_id]
             if col['Code'] in elts:
                 elts[col['Code']].append(col)
@@ -485,7 +508,8 @@
         if int(m.group(1)) != i:
             raise FormatError('invalid column id: %s for index %s' % (col_id, i))
                 
-        cols[col_id] = dict(zip(col_keys, fs))
+        cols[col_id] = DictCol(zip(col_keys, fs))
+        cols[col_id].lineno = f.lineno # for debuging purpose
     
     return cols
 

Modified: branches/ScoDoc7/sco_etape_apogee.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee.py	2016-07-09 20:59:20 UTC (rev 1516)
+++ branches/ScoDoc7/sco_etape_apogee.py	2016-07-10 08:21:07 UTC (rev 1517)
@@ -331,4 +331,12 @@
 
 self=e
 col_id='apoL_c0129'
+
+# --
+import sco_portal_apogee
+context = go_dept(app, 'GEA').Notes
+#csv_data = sco_portal_apogee.get_maquette_apogee(context, etape='V1GE', annee_scolaire=2015)
+csv_data = open('/tmp/V1GE.txt').read()
+apo_data = sco_apogee_csv.ApoData(csv_data)
+
 """


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