[scodoc-devel] [SVN] Scolar : [1791] - Import étudiants via Excel : import groupes avec specification de la partition;

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Ven 24 Aou 14:57:26 CEST 2018


Une pièce jointe HTML a été nettoyée...
URL: https://listes.univ-paris13.fr/pipermail/scodoc-devel/attachments/20180824/fcbf36b5/attachment.htm 
-------------- section suivante --------------
Modified: branches/ScoDoc7/ImportScolars.py
===================================================================
--- branches/ScoDoc7/ImportScolars.py	2018-08-23 13:54:14 UTC (rev 1790)
+++ branches/ScoDoc7/ImportScolars.py	2018-08-24 12:57:26 UTC (rev 1791)
@@ -99,16 +99,17 @@
 def sco_import_generate_excel_sample( fmt,
                                       with_codesemestre=True,
                                       only_tables=None,
+                                      with_groups=True,
                                       exclude_cols=[],
                                       extra_cols=[],
                                       group_ids=[],
                                       context=None,
                                       REQUEST=None):
-    """generates an excel document based on format fmt
+    """Generates an excel document based on format fmt
     (format is the result of sco_import_format())
     If not None, only_tables can specify a list of sql table names
     (only columns from these tables will be generated)
-    If group_id, indique les codes nom et prenom des etudiants de ce groupe
+    If group_ids, liste les etudiants de ces groupes
     """    
     style = sco_excel.Excel_MakeStyle(bold=True)
     style_required = sco_excel.Excel_MakeStyle(bold=True, color='red')
@@ -127,6 +128,9 @@
         else:
             titlesStyles.append(style_required)
         titles.append(name)
+    if with_groups and 'groupes' not in titles:
+        titles.append('groupes')
+        titlesStyles.append(style)
     titles += extra_cols
     titlesStyles += [style]*len(extra_cols)
     if group_ids and context:
@@ -141,8 +145,12 @@
             etud = context.getEtudInfo(etudid=i['etudid'], filled=True)[0]
             l = []
             for field in titles:
-                key = strlower(field).split()[0]
-                l.append(etud.get(key, ''))
+                if field == 'groupes':
+                    sco_groups.etud_add_group_infos(context, etud, groups_infos.formsemestre, sep=';')
+                    l.append(etud['partitionsgroupes'])
+                else:
+                    key = strlower(field).split()[0]
+                    l.append(etud.get(key, ''))
             lines.append(l)
     else:
         lines = [[]] # empty content, titles only

Modified: branches/ScoDoc7/ZScolar.py
===================================================================
--- branches/ScoDoc7/ZScolar.py	2018-08-23 13:54:14 UTC (rev 1790)
+++ branches/ScoDoc7/ZScolar.py	2018-08-24 12:57:26 UTC (rev 1791)
@@ -1897,12 +1897,12 @@
              les autres lignes de la feuille seront ignorées. Et seules les colonnes intéressant ScoDoc 
              seront importées: il est inutile d'éliminer les autres.
              <br/>
-              <em>Seules les données admission seront modifiées (et pas l'identité de l'étudiant).</em>
+              <em>Seules les données "admission" seront modifiées (et pas l'identité de l'étudiant).</em>
              <br/>
               <em>Les colonnes "nom" et "prenom" sont requises, ou bien une colonne "etudid".</em>
              </p>
              <p>
-             Avant d'importer vos données, il est recommander d'enregistrer les informations actuelles:
+             Avant d'importer vos données, il est recommandé d'enregistrer les informations actuelles:
              <a href="import_generate_admission_sample?formsemestre_id=%(formsemestre_id)s">exporter les données actuelles de ScoDoc</a> (ce fichier peut être ré-importé après d'éventuelles modifications)
              </p>
              """ % { 'formsemestre_id' : formsemestre_id }

Modified: branches/ScoDoc7/sco_groups.py
===================================================================
--- branches/ScoDoc7/sco_groups.py	2018-08-23 13:54:14 UTC (rev 1790)
+++ branches/ScoDoc7/sco_groups.py	2018-08-24 12:57:26 UTC (rev 1791)
@@ -155,7 +155,7 @@
     return group_id
 
 def get_sem_groups(context, formsemestre_id): 
-    """Returns groups for this sem."""
+    """Returns groups for this sem (in all partitions)."""
     return SimpleDictFetch(context, 'SELECT gd.*, p.* FROM group_descr gd, partition p WHERE p.formsemestre_id=%(formsemestre_id)s AND p.partition_id = gd.partition_id', {'formsemestre_id' : formsemestre_id })
 
 def get_group_members(context, group_id, etat=None):  
@@ -283,7 +283,7 @@
             R[info['etudid']] = { info['partition_id'] : info[attr] }
     return R
 
-def etud_add_group_infos(context, etud, sem):
+def etud_add_group_infos(context, etud, sem, sep=' '):
     """Add informations on partitions and group memberships to etud (a dict with an etudid)
     """
     etud['partitions'] = odict() # partition_id : group + partition_name
@@ -298,8 +298,10 @@
             etud['partitions'][info['partition_id']] = info
     
     # resume textuel des groupes:        
-    etud['groupes'] = ' '.join( [ g['group_name'] for g in infos if g['group_name'] != None ] )
-
+    etud['groupes'] = sep.join( [ g['group_name'] for g in infos if g['group_name'] != None ] )
+    etud['partitionsgroupes'] = sep.join( [ g['partition_name'] + ':' + g['group_name']
+                                            for g in infos if g['group_name'] != None ] )
+    
     return etud
 
 def get_etud_groups_in_partition(context, partition_id):
@@ -1075,19 +1077,39 @@
         return ''
 
 class GroupIdInferer:
+    """Sert à retrouver l'id d'un groupe dans un semestre donné
+    à partir de son nom.
+    Attention: il peut y avoir plusieurs groupes de même nom
+    dans des partitions différentes. Dans ce cas, prend le dernier listé.
+    On peut indiquer la partition en écrivant
+    partition_name:group_name
+    """
     def __init__(self, context, formsemestre_id):
         groups = get_sem_groups(context, formsemestre_id)
-        name2group_id = {}
+        self.name2group_id = {}
+        self.partitionname2group_id = {}
         for group in groups:
-            name2group_id[group['group_name']] = group['group_id']
-        self.name2group_id = name2group_id
+            self.name2group_id[group['group_name']] = group['group_id']
+            self.partitionname2group_id[(group['partition_name'], group['group_name'])] = group['group_id']
     
     def __getitem__(self, name):
-        """Get group_id from group_name, or None is nonexistent"""
-        group_id = self.name2group_id.get(name, None)
-        if group_id is None and name[-2:] == '.0':
-            # si nom groupe numerique, excel ajoute parfois ".0" !
-            name = name[:-2]
-            group_id = self.name2group_id.get(name, None)
+        """Get group_id from group_name, or None is nonexistent.
+        The group name can be prefixed by the partition's name, using
+        syntax partition_name:group_name
+        """
+        l = name.split(':', 1)
+        if len(l) > 1:
+            partition_name, group_name = l
+        else:
+            partition_name = None
+            group_name = name
+        if partition_name is None:
+            group_id = self.name2group_id.get(group_name, None)
+            if group_id is None and name[-2:] == '.0':
+                # si nom groupe numerique, excel ajoute parfois ".0" !
+                group_name = group_name[:-2]
+                group_id = self.name2group_id.get(group_name, None)
+        else:
+            group_id = self.partitionname2group_id.get((partition_name, group_name), None)
         return group_id
 


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