[scodoc-devel] [SVN] Scolar : [1730] - correction du calcul des ECTS en cas de redoublement dans le meme cursus .

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Mar 12 Déc 15:55:49 CET 2017


Une pièce jointe HTML a été nettoyée...
URL: https://listes.univ-paris13.fr/pipermail/scodoc-devel/attachments/20171212/9e483633/attachment.htm 
-------------- section suivante --------------
Modified: branches/ScoDoc7/sco_edit_ue.py
===================================================================
--- branches/ScoDoc7/sco_edit_ue.py	2017-12-12 13:11:16 UTC (rev 1729)
+++ branches/ScoDoc7/sco_edit_ue.py	2017-12-12 14:55:49 UTC (rev 1730)
@@ -208,6 +208,12 @@
     F = F[0]
     parcours = sco_codes_parcours.get_parcours_from_code(F['type_parcours'])
     locked = context.formation_has_locked_sems(formation_id)
+
+    ue_list = context.do_ue_list( args={ 'formation_id' : formation_id } )
+    # tri par semestre et numero:
+    _add_ue_semestre_id(context, ue_list)
+    ue_list.sort( key=lambda u: (u['semestre_id'], u['numero']))
+    has_duplicate_ue_codes = len(set([ue['ue_code'] for ue in ue_list])) != len(ue_list)
     
     perm_change = authuser.has_permission(ScoChangeFormation,context)
     # editable = (not locked) and perm_change
@@ -250,7 +256,10 @@
 </ul>""" % len(locked))
     if msg:
         H.append('<p class="msg">' + msg + '</p>' )
-
+        
+    if has_duplicate_ue_codes:
+        H.append("""<div class="ue_warning"><span>Attention: plusieurs UE de cette formation ont le même code. Il faut corriger cela ci-dessous, sinon les calculs d'ECTS seront erronés !</span></div>""")
+        
     # Description de la formation
     H.append('<div class="formation_descr">')
     H.append('<div class="fd_d"><span class="fd_t">Titre:</span><span class="fd_v">%(titre)s</span></div>' % F )
@@ -269,11 +278,6 @@
 
     H.append('<form><input type="checkbox" class="sco_tag_checkbox">montrer les tags</input></form>')
     
-    ue_list = context.do_ue_list( args={ 'formation_id' : formation_id } )
-    # tri par semestre et numero:
-    _add_ue_semestre_id(context, ue_list)
-    ue_list.sort( key=lambda u: (u['semestre_id'], u['numero']))
-    
     cur_ue_semestre_id = None    
     iue = 0
     for UE in ue_list:        

Modified: branches/ScoDoc7/sco_pvjury.py
===================================================================
--- branches/ScoDoc7/sco_pvjury.py	2017-12-12 13:11:16 UTC (rev 1729)
+++ branches/ScoDoc7/sco_pvjury.py	2017-12-12 14:55:49 UTC (rev 1730)
@@ -117,40 +117,49 @@
         alist.append( 'S' + str(aut['semestre_id']) )
     return ', '.join(alist)
 
-def _comp_sum_ects_by_ue_type(nt, decision_ues):
+def _comp_ects_by_ue_code_and_type(nt, decision_ues):
     """Calcul somme des ECTS validés dans ce semestre (sans les UE capitalisées)
     decision_ues est le resultat de nt.get_etud_decision_ues
-    
+    Chaque resultat est un dict: { ue_code : ects }
     """
     if not decision_ues:
-        return 0., {}
+        return {}, {}
     
-    ects = 0.
+    ects_by_ue_code = {}
     ects_by_ue_type = DictDefault(defaultvalue=0) # { ue_type : ects validés }
     for ue_id in decision_ues:
         d = decision_ues[ue_id]
-        ects += d['ects']
         ue = nt.uedict[ue_id]
+        ects_by_ue_code[ue['ue_code']] = d['ects']
         ects_by_ue_type[ue['type']] += d['ects']
     
-    return ects, ects_by_ue_type
+    return ects_by_ue_code, ects_by_ue_type
 
-def _comp_sum_ects_capitalises(nt, etudid):
+def _comp_ects_capitalises_by_ue_code(nt, etudid):
     """Calcul somme des ECTS des UE capitalisees
     """
     ues = nt.get_ues()
-    sum_ects = 0.
+    ects_by_ue_code = {}
     for ue in ues:
         ue_status = nt.get_etud_ue_status(etudid, ue['ue_id'])
         if ue_status['is_capitalized']:
             try:
-                ects_val = int(ue_status['ue']['ects'])
+                ects_val = float(ue_status['ue']['ects'])
             except (ValueError, TypeError):
                 ects_val = 0.
-            sum_ects += ects_val
+            ects_by_ue_code[ue['ue_code']] = ects_val
     
+    return ects_by_ue_code
+
+def _sum_ects_dicts( s, t ):
+    """Somme deux dictionnaires { ue_code : ects },
+    quand une UE de même code apparait deux fois, prend celle avec le plus d'ECTS.
+    """
+    sum_ects = sum(s.values()) + sum(t.values())
+    for ue_code in set(s).intersection(set(t)):
+        sum_ects += max(s[ue_code],t[ue_code]) - s[ue_code] - t[ue_code]
     return sum_ects
-
+        
 def dict_pvjury( context, formsemestre_id, etudids=None, with_prev=False, with_parcours_decisions=False ):
     """Données pour édition jury
     etudids == None => tous les inscrits, sinon donne la liste des ids
@@ -171,6 +180,7 @@
                         'prev_code' : code (calculé slt si with_prev),
                         'mention' : mention (en fct moy gen),
                         'sum_ects' : total ECTS acquis dans ce semestre (incluant les UE capitalisées)
+                        'sum_ects_capitalises' : somme des ECTS des UE capitalisees
                     }
                     ]
                   },
@@ -201,9 +211,10 @@
         d['decisions_ue'] = nt.get_etud_decision_ues(etudid)
         d['last_formsemestre_id'] = Se.get_semestres()[-1] # id du dernier semestre (chronologiquement) dans lequel il a été inscrit
         
-        d['sum_ects_capitalises'] = _comp_sum_ects_capitalises(nt, etudid)
-        sum_ects, ects_by_ue_type = _comp_sum_ects_by_ue_type(nt, d['decisions_ue'])
-        d['sum_ects'] = sum_ects + d['sum_ects_capitalises'] # total des ECTS capitalisé dans ce semestre et de ceux reçus par capitalisations antérieures
+        ects_capitalises_by_ue_code = _comp_ects_capitalises_by_ue_code(nt, etudid)
+        d['sum_ects_capitalises'] = sum(ects_capitalises_by_ue_code.values())
+        ects_by_ue_code, ects_by_ue_type = _comp_ects_by_ue_code_and_type(nt, d['decisions_ue'])
+        d['sum_ects'] = _sum_ects_dicts(ects_capitalises_by_ue_code, ects_by_ue_code)        
         d['sum_ects_by_type'] = ects_by_ue_type
         
         if d['decision_sem'] and sco_codes_parcours.code_semestre_validant(d['decision_sem']['code']):


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