[Scodoc-devel] [SVN] Scolar : [1539]

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Mer 27 Juil 16:08:16 CEST 2016


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20160727/50deb917/attachment.html>
-------------- section suivante --------------
Modified: branches/ScoDoc7/config/postupgrade-db.py
===================================================================
--- branches/ScoDoc7/config/postupgrade-db.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/config/postupgrade-db.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -442,6 +442,9 @@
     annee_scolaire int default NULL, -- 2016
     sem_id int default NULL -- 0, 1, 2
     ) WITH OIDS;""", ] )
+    check_field(cnx, 'notes_semset', 'annee_scolaire',
+                ['alter table notes_semset add column annee_scolaire integer default NULL',
+                 ])
     check_table( cnx, 'notes_semset_formsemestre', [
         """CREATE TABLE notes_semset_formsemestre (
     formsemestre_id text REFERENCES notes_formsemestre(formsemestre_id) ON DELETE CASCADE,

Modified: branches/ScoDoc7/sco_apogee_csv.py
===================================================================
--- branches/ScoDoc7/sco_apogee_csv.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/sco_apogee_csv.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -267,6 +267,7 @@
         nt = context._getNotesCache().get_NotesTable(context, sem['formsemestre_id'])
         if etudid not in nt.identdict:
             return None # etudiant non inscrit dans ce semestre
+        
         decision = nt.get_etud_decision_sem(self.etud['etudid'])
         if not decision:
             # pas de decision de jury, on n'enregistre rien
@@ -360,6 +361,7 @@
     def setup(self, context):
         """Recherche semestres ScoDoc concernés
         """
+        self.context = context
         self.sems_etape = comp_apo_sems(context, self.etape_apogee, self.annee_scolaire )
         self.etape_formsemestre_ids = { s['formsemestre_id'] for s in self.sems_etape }
         if self.periode != None:
@@ -494,6 +496,7 @@
 
     def list_unknown_elements(self):
         """Liste des codes des elements Apogee non trouvés dans ScoDoc
+        (après traitement de tous les étudiants)
         """
         s = set()
         for e in self.etuds:
@@ -502,9 +505,51 @@
         L = list(s)
         L.sort()
         return L
+
+    def list_elements(self):
+        """Liste les codes des elemenst Apogée de la maquette
+        et ceux des semestres ScoDoc associés
+        Retourne deux ensembles
+        """
+        maq_elems = { self.cols[col_id]['Code'] for col_id in self.col_ids[4:] }
+        # l'ensemble de tous les codes des elements apo des semestres:
+        sem_elems = reduce( set.union, self.get_codes_by_sem().values() )
+        
+        return maq_elems, sem_elems
     
+    def get_codes_by_sem(self):
+        """Pour chaque semestre associé, donne l'ensemble des codes Apogée qui s'y trouvent
+        (dans le semestre, les UE et les modules)
+        """
+        codes_by_sem = {}
+        for sem in self.sems_etape:
+            s = set()
+            codes_by_sem[sem['formsemestre_id']] = s
+            for col_id in self.col_ids[4:]:
+                code = self.cols[col_id]['Code'] # 'V1RT'
+                # associé à l'étape, l'année ou les semestre:
+                if ( sco_formsemestre.sem_has_etape(sem, code) 
+                    or (code in sem['elt_sem_apo'].split(','))
+                    or (code in sem['elt_annee_apo'].split(','))):
+                    s.add(code)
+                    continue
+                # associé à une UE:
+                nt = self.context._getNotesCache().get_NotesTable(self.context, sem['formsemestre_id'])
+                for ue in nt.get_ues():
+                    if ue['code_apogee'] == code:
+                        s.add(code)
+                        continue
+                # associé à un module:
+                modimpls = nt.get_modimpls()
+                for modimpl in modimpls:
+                    if modimpl['module']['code_apogee'] == code:
+                        s.add(code)
+                        continue
+        #log('codes_by_sem=%s' % pprint.pformat(codes_by_sem))
+        return codes_by_sem
+    
     def build_cr_table(self):
-        """Table compte rencodu des décisions
+        """Table compte rendu des décisions
         """
         CR = [] # tableau compte rendu des decisions
         for e in self.etuds:

Modified: branches/ScoDoc7/sco_etape_apogee.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/sco_etape_apogee.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -208,8 +208,13 @@
     nips_ok = set_nips.intersection(apo_nips)
     nips_no_apo = set_nips - apo_nips # dans ScoDoc mais pas dans cette maquette Apogée
     nips_no_sco = apo_nips - set_nips # dans Apogée mais pas dans ScoDoc
+
+
+    # Elements Apogee vs ScoDoc
+    apo_data.setup(context)
+    maq_elems, sem_elems = apo_data.list_elements()
     
-    return nips_ok, apo_nips, nips_no_apo, nips_no_sco 
+    return nips_ok, apo_nips, nips_no_apo, nips_no_sco, maq_elems, sem_elems 
 
 def apo_csv_semset_check(context, semset, allow_missing_apo=False): # was apo_csv_check
     """
@@ -236,12 +241,16 @@
     nips_no_apo = set_nips.copy() # dans ScoDoc mais pas dans Apogée
     nips_no_sco = set() # dans Apogée mais pas dans ScoDoc
     etapes_apo_nips = [] # liste des nip de chaque maquette
+    maq_elems = set()
+    sem_elems = set()
     for etape_apo in etapes_apo:
-        et_nips_ok, et_apo_nips, et_nips_no_apo, et_nips_no_sco = apo_csv_check_etape(context, semset, set_nips, etape_apo)
+        et_nips_ok, et_apo_nips, et_nips_no_apo, et_nips_no_sco, et_maq_elems, et_sem_elems = apo_csv_check_etape(context, semset, set_nips, etape_apo)
         nips_ok |= et_nips_ok
         nips_no_apo -= et_apo_nips
         nips_no_sco |= et_nips_no_sco
         etapes_apo_nips.append(et_apo_nips)
+        maq_elems |= et_maq_elems
+        sem_elems |= et_sem_elems
     
     # doublons: etudiants mentionnés dans plusieurs maquettes Apogée:
     apo_dups = set()
@@ -257,7 +266,7 @@
                       and ((not nips_no_apo) or allow_missing_apo)
                       and (not apo_dups) )
     
-    return ok_for_export, etapes_missing_csv, semset['etuds_without_nip'], nips_ok, nips_no_apo, nips_no_sco, apo_dups
+    return ok_for_export, etapes_missing_csv, semset['etuds_without_nip'], nips_ok, nips_no_apo, nips_no_sco, apo_dups, maq_elems, sem_elems
 
 
 def apo_csv_retreive_etuds_by_nip(context, semset, nips):

Modified: branches/ScoDoc7/sco_etape_apogee_view.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee_view.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/sco_etape_apogee_view.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -57,7 +57,7 @@
     
     tab_archives = table_apo_csv_list( context, semset, REQUEST=REQUEST)
 
-    ok_for_export, etapes_missing_csv, etuds_without_nip, nips_ok, nips_no_apo, nips_no_sco, apo_dups = sco_etape_apogee.apo_csv_semset_check(context, semset, allow_missing_apo)
+    ok_for_export, etapes_missing_csv, etuds_without_nip, nips_ok, nips_no_apo, nips_no_sco, apo_dups, maq_elems, sem_elems = sco_etape_apogee.apo_csv_semset_check(context, semset, allow_missing_apo)
 
     ok_for_export &= semset['jury_ok']
     
@@ -86,8 +86,8 @@
         </form>''' % (semset_id,)
         )
     # Récupération sur portail:
-    portal_url = sco_portal_apogee.get_portal_url(context)
-    if portal_url: # portail configuré
+    maquette_url = sco_portal_apogee.get_maquette_url(context)
+    if maquette_url: # portail configuré
         menu_etapes = '''<option value=""></option>'''
         menu_etapes += ''.join(
             [ '<option value="%s">%s</option>' % (et, et) 
@@ -172,7 +172,7 @@
     H.append(""" >autoriser export même si étudiants manquants dans Apogée</input></form>""")
 
     
-    H.append('<div>')
+    H.append('<div id="apo_export">')
     if semset and ok_for_export:        
         H.append('''<form class="form_apo_export" action="apo_csv_export_results" method="get">
             <input type="submit" value="Export vers Apogée">
@@ -181,7 +181,24 @@
     
     H.append('</div>')
 
-
+    # Elements:
+    H.append('<div id="apo_elements">')
+    H.append('<p>Elements Apogée: <span class="apo_elems">%s</span></p>'
+             % ', '.join(sorted(maq_elems)))
+    H.append('<p>Elements ScoDoc: <span class="apo_elems">%s</span></p>'
+             % ', '.join(sorted(sem_elems)))
+    missing = maq_elems - sem_elems
+    if missing:
+        formation_ids = { sem['formation_id'] for sem in semset.sems }
+        formations = [ context.formation_list(formation_id=i)[0] for i in formation_ids ]
+        log('formations=%s' % formations)
+        H.append('<div class="apo_csv_status_nok"><span class="fontred">Elements manquants: </span><span class="apo_elems">%s</span>'
+             % ', '.join(sorted(missing)))
+        H.append(' <span class="fontred">ces éléments de la maquette Apogée ne sont pas déclarés dans ScoDoc.</span> Vous pouvez le faire en éditant les programme pédagogiques ')
+        H.append(', '.join( [
+            '<a class="stdlink"  href="ue_list?formation_id=%(formation_id)s">%(acronyme)s v%(version)s</a>'
+            % f for f in formations ]))
+        H.append('</div>')
     H.append('</div>')
     
     # Aide:
@@ -193,8 +210,8 @@
     <p>
     Les fichiers ("maquettes") Apogée sont de type CSV, du texte codé en %s.
     </p>
-    <p>On a un fichier par étape Apogée. Pour les obtenir, se débrouiller avec 
-    Apogée. Leur contenu ressemble à cela:</p>
+    <p>On a un fichier par étape Apogée. Pour les obtenir, soit on peut les télécharger directement (si votre ScoDoc est interfacé avec Apogée), soit se débrouiller pour exporter le fichier 
+    texte depuis Apogée. Son contenu ressemble à cela:</p>
     <pre class="small_pre_acc">
  XX-APO_TITRES-XX
  apoC_annee	2007/2008
@@ -444,7 +461,7 @@
         return sendCSVFile(REQUEST, csv_data, etape_apo + '.txt')
     apo_data = sco_apogee_csv.ApoData(csv_data)
     
-    ok_for_export, etapes_missing_csv, etuds_without_nip, nips_ok, nips_no_apo, nips_no_sco, apo_dups = sco_etape_apogee.apo_csv_semset_check(context, semset)
+    ok_for_export, etapes_missing_csv, etuds_without_nip, nips_ok, nips_no_apo, nips_no_sco, apo_dups, maq_elems, sem_elems = sco_etape_apogee.apo_csv_semset_check(context, semset)
     
     H = [ context.sco_header(REQUEST, page_title='Maquette Apogée enregistrée pour %s' % etape_apo,
                              init_qtip = True,

Modified: branches/ScoDoc7/sco_formsemestre_status.py
===================================================================
--- branches/ScoDoc7/sco_formsemestre_status.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/sco_formsemestre_status.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -358,32 +358,27 @@
           ]
     return '\n'.join(H)
 
-
-# Element HTML decrivant un semestre (barre de menu et infos)
-def formsemestre_page_title(context, REQUEST):
-    """Element HTML decrivant un semestre (barre de menu et infos)
-    Cherche dans REQUEST si un semestre est défini (formsemestre_id ou moduleimpl ou evaluation ou group)
+def retreive_formsemestre_from_request(context, REQUEST):
+    """Cherche si on a de quoi déduire le semestre affiché à partir des
+    arguments de la requête: 
+    formsemestre_id ou moduleimpl ou evaluation ou group_id ou partition_id
     """
-    try:
-        notes = context.Notes
-    except:
-        notes = context
     # Search formsemestre
     group_ids = REQUEST.form.get('group_ids', [])
     if REQUEST.form.has_key('formsemestre_id'):
         formsemestre_id = REQUEST.form['formsemestre_id']
     elif REQUEST.form.has_key('moduleimpl_id'):
-        modimpl = notes.do_moduleimpl_list({'moduleimpl_id' : REQUEST.form['moduleimpl_id']})
+        modimpl = context.do_moduleimpl_list({'moduleimpl_id' : REQUEST.form['moduleimpl_id']})
         if not modimpl:
-            return '' # suppressed ?
+            return None # suppressed ?
         modimpl = modimpl[0]
         formsemestre_id = modimpl['formsemestre_id']
     elif REQUEST.form.has_key('evaluation_id'):
-        E = notes.do_evaluation_list({'evaluation_id' : REQUEST.form['evaluation_id']})
+        E = context.do_evaluation_list({'evaluation_id' : REQUEST.form['evaluation_id']})
         if not E:
-            return '' # evaluation suppressed ?
+            return None # evaluation suppressed ?
         E = E[0]
-        modimpl = notes.do_moduleimpl_list({'moduleimpl_id' : E['moduleimpl_id']})[0]
+        modimpl = context.do_moduleimpl_list({'moduleimpl_id' : E['moduleimpl_id']})[0]
         formsemestre_id = modimpl['formsemestre_id']
     elif REQUEST.form.has_key('group_id'):
         group = sco_groups.get_group(context, REQUEST.form['group_id'])        
@@ -401,7 +396,20 @@
         partition = sco_groups.get_partition(context, REQUEST.form['partition_id'])
         formsemestre_id = partition['formsemestre_id']
     else:
-        return '' # no current formsemestre
+        return None # no current formsemestre
+
+    return formsemestre_id
+    
+# Element HTML decrivant un semestre (barre de menu et infos)
+def formsemestre_page_title(context, REQUEST):
+    """Element HTML decrivant un semestre (barre de menu et infos)
+    Cherche dans REQUEST si un semestre est défini (formsemestre_id ou moduleimpl ou evaluation ou group)
+    """
+    try:
+        context = context.Notes
+    except:
+        pass
+    formsemestre_id = retreive_formsemestre_from_request(context, REQUEST)
     #
     if not formsemestre_id:
         return ''
@@ -419,7 +427,7 @@
         """<div class="infos">
 <span class="semtitle"><a class="stdlink" title="%(session_id)s" href="%(notes_url)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(titre)s</a><a title="%(etape_apo_str)s">%(num_sem)s</a>%(modalitestr)s</span><span class="dates"><a title="du %(date_debut)s au %(date_fin)s ">%(mois_debut)s - %(mois_fin)s</a></span><span class="resp"><a title="%(nomcomplet)s">%(resp)s</a></span><span class="nbinscrits"><a class="discretelink" href="%(notes_url)s/formsemestre_lists?formsemestre_id=%(formsemestre_id)s">%(nbinscrits)d inscrits</a></span><span class="lock">%(locklink)s</span></div>""" % sem,
 
-        formsemestre_status_menubar(notes, sem, REQUEST),
+        formsemestre_status_menubar(context, sem, REQUEST),
 
         """</div>"""
           ]

Modified: branches/ScoDoc7/sco_page_etud.py
===================================================================
--- branches/ScoDoc7/sco_page_etud.py	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/sco_page_etud.py	2016-07-27 14:08:15 UTC (rev 1539)
@@ -39,6 +39,7 @@
 import sco_groups
 import sco_formsemestre
 from scolars import format_telephone, format_pays, make_etud_args
+import sco_formsemestre_status
 from sco_formsemestre_status import makeMenu
 from sco_bulletins import etud_descr_situation_semestre
 import sco_parcours_dut
@@ -374,6 +375,13 @@
     """An HTML div with basic information and links about this etud.
     Used for popups information windows.
     """
+    # try:
+    #     context = context.Notes
+    # except:
+    #     pass
+    # formsemestre_id = sco_formsemestre_status.retreive_formsemestre_from_request(context, REQUEST)
+    # log('etud_info_html: formsemestre_id=%s' % formsemestre_id)
+    
     with_photo = int(with_photo)
     etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
     photo_html = sco_photos.etud_photo_html(context, etud, title='fiche de '+etud['nom'], REQUEST=REQUEST)

Modified: branches/ScoDoc7/static/css/scodoc.css
===================================================================
--- branches/ScoDoc7/static/css/scodoc.css	2016-07-26 13:46:28 UTC (rev 1538)
+++ branches/ScoDoc7/static/css/scodoc.css	2016-07-27 14:08:15 UTC (rev 1539)
@@ -2105,6 +2105,7 @@
   background-color: rgb(90%,90%,90%);
   color: rgb(40%,20%,0%);
   margin-top: 30px;
+  margin-bottom: 30px;
 }
 
 /* ---- check absences / evaluations ---- */
@@ -2398,6 +2399,11 @@
    padding-left: 22px;
 }
 
+div#apo_elements span.apo_elems {
+    font-family: "Andale Mono", "Courier";
+    font-weight: normal;
+    font-size: 9pt;
+}
 
 div.apo_csv_jury_nok li {
   color: red;


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