[Scodoc-devel] [SVN] Scolar : [1557] Optimisation menu choix groupes (pour saisie notes)

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Mar 6 Sep 10:37:50 CEST 2016


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20160906/b38b0db8/attachment.html>
-------------- section suivante --------------
Modified: branches/ScoDoc7/TrivialFormulator.py
===================================================================
--- branches/ScoDoc7/TrivialFormulator.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/TrivialFormulator.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -55,7 +55,7 @@
           comment : comment, showed under input widget
           withcheckbox: if true, place a checkbox at the left of the input
                         elem. Checked items will be returned in 'tf-checked'
-          attributes: a liste of strings to put in the HTML element
+          attributes: a liste of strings to put in the HTML form element
           template: HTML template for element 
           HTML elements:
              input_type : 'text', 'textarea', 'password',
@@ -503,7 +503,10 @@
 					break;
             i = i + 1;
             while (i < elem.form.elements.length) {
-                if ((elem.form.elements[i].type == "text") && (!(elem.form.elements[i].disabled))) {
+                if ((elem.form.elements[i].type == "text") 
+                    && (!(elem.form.elements[i].disabled))
+                    && ($(elem.form.elements[i]).is(':visible')))
+                {
                     elem.form.elements[i].focus();
                     focused = true;
                     break;

Modified: branches/ScoDoc7/ZNotes.py
===================================================================
--- branches/ScoDoc7/ZNotes.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/ZNotes.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -2085,9 +2085,8 @@
         sem = sco_formsemestre.get_formsemestre(self, M['formsemestre_id'])
         if sem['etat'] != '1':
             return False # semestre verrouillé
-        
-        nt = self._getNotesCache().get_NotesTable(self, sem['formsemestre_id'])
-        if nt.sem_has_decisions():
+                
+        if sco_parcours_dut.formsemestre_has_decisions(self, sem['formsemestre_id']):
             # il y a des décisions de jury dans ce semestre !
             return authuser.has_permission(ScoEditAllNotes,self) or uid == sem['responsable_id']
         else:

Modified: branches/ScoDoc7/sco_formsemestre_status.py
===================================================================
--- branches/ScoDoc7/sco_formsemestre_status.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/sco_formsemestre_status.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -50,6 +50,7 @@
     items is a list of dicts:
     { 'title' :
       'url' :
+      'id'  :
       'enabled' : # True by default
       'helpmsg' :
       'submenu' : [ list of sub-items ]
@@ -62,12 +63,17 @@
                 cls = ' class="ui-state-disabled"'
             else:
                 cls = ''
+            the_id = item.get('id', '')
+            if the_id:
+                li_id = 'id="%s" ' % the_id
+            else:
+                li_id = ''
             if base_url and 'url' in item:
                 item['urlq'] = base_url + item['url']
             else:
                 item['urlq'] = item.get('url', '#')
             submenu = item.get('submenu', None)
-            H.append('<li ' + cls + '><a href="%(urlq)s">%(title)s</a>' % item)
+            H.append('<li ' + li_id + cls + '><a href="%(urlq)s">%(title)s</a>' % item)
             if submenu:
                 gen_menu_items(submenu)
             H.append('</li>')

Modified: branches/ScoDoc7/sco_groups_view.py
===================================================================
--- branches/ScoDoc7/sco_groups_view.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/sco_groups_view.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -90,7 +90,11 @@
                       )]
     # Menu choix groupe
     H.append("""<div id="group-tabs">""")
-    H.append( form_groups_choice(context, groups_infos) )
+    H.append( form_groups_choice(context, groups_infos, submit_on_change=True) )
+    # Note: le formulaire est soumis a chaque modif des groupes
+    # on pourrait faire comme pour le form de saisie des notes. Il faudrait pour cela:
+    #  - charger tous les etudiants au debut, quels que soient les groupes selectionnés
+    #  - ajouter du JS pour modifier les liens (arguments group_ids) quand le menu change
     
     # Tabs
     #H.extend( ("""<span>toto</span><ul id="toto"><li>item 1</li><li>item 2</li></ul>""",) )
@@ -125,19 +129,25 @@
     H.append( context.sco_footer(REQUEST) )
     return '\n'.join(H)
 
-def form_groups_choice(context, groups_infos, with_selectall_butt=False):
+def form_groups_choice(context, groups_infos, with_selectall_butt=False, submit_on_change=False):
     """form pour selection groupes
     group_ids est la liste des groupes actuellement sélectionnés
     et doit comporter au moins un élément, sauf si formsemestre_id est spécifié.
     (utilisé pour retrouver le semestre et proposer la liste des autres groupes)
+
+    Si submit_on_change, ajoute une classe "submit_on_change" qui est utilisee en JS
     """
     default_group_id = sco_groups.get_default_group(context, groups_infos.formsemestre_id)
-    
+
+    if submit_on_change:
+        klass = 'submit_on_change'
+    else:
+        klass = ''
     H = [ """<form id="group_selector" method="get">
     <input type="hidden" name="formsemestre_id" id="formsemestre_id" value="%s"/>
     <input type="hidden" name="default_group_id" id="default_group_id" value="%s"/>
-    Groupes: <select name="group_ids" id="group_ids_sel" class="multiselect" multiple="multiple">
-    """ % (groups_infos.formsemestre_id, default_group_id) ]
+    Groupes: <select name="group_ids" id="group_ids_sel" class="multiselect %s" multiple="multiple">
+    """ % (groups_infos.formsemestre_id, default_group_id, klass) ]
 
     n_members = len(sco_groups.get_group_members(context, default_group_id))
     if default_group_id in groups_infos.group_ids:

Modified: branches/ScoDoc7/sco_parcours_dut.py
===================================================================
--- branches/ScoDoc7/sco_parcours_dut.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/sco_parcours_dut.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -732,6 +732,15 @@
         cnx.rollback()
         raise
 
+def formsemestre_has_decisions(context, formsemestre_id):
+    """True s'il y a au moins une validation (decision de jury) dans ce semestre
+    equivalent to notes_table.sem_has_decisions() but much faster when nt not cached
+    """
+    cnx = context.GetDBConnexion()
+    validations = scolar_formsemestre_validation_list ( cnx, args={'formsemestre_id' : formsemestre_id} )
+    return len(validations) > 0
+
+    
 def etud_est_inscrit_ue(cnx, etudid, formsemestre_id, ue_id):
     """Vrai si l'étudiant est inscrit a au moins un module de cette UE dans ce semestre"""
     cursor = cnx.cursor(cursor_factory=ScoDocCursor)

Modified: branches/ScoDoc7/sco_saisie_notes.py
===================================================================
--- branches/ScoDoc7/sco_saisie_notes.py	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/sco_saisie_notes.py	2016-09-06 08:37:49 UTC (rev 1557)
@@ -463,11 +463,12 @@
     H.append( """<div class="saisienote_etape1">
         <span class="titredivsaisienote">Etape 1 : </span>
         <ul>
-        <li><a href="feuille_saisie_notes?evaluation_id=%s&%s" class="stdlink">obtenir le fichier tableur à remplir</a></li>
+        <li><a href="feuille_saisie_notes?evaluation_id=%s&%s" class="stdlink" id="lnk_feuille_saisie">obtenir le fichier tableur à remplir</a></li>
         <li>ou <a class="stdlink" href="saisie_notes?evaluation_id=%s">aller au formulaire de saisie</a></li>
         </ul>
         </div>
-        """ % (evaluation_id,groups_infos.groups_query_args,evaluation_id))
+        <form><input type="hidden" name="evaluation_id" id="formnotes_evaluation_id" value="%s"/></form>
+        """ % (evaluation_id,groups_infos.groups_query_args,evaluation_id,evaluation_id))
     
     H.append('''<div class="saisienote_etape2">
     <span class="titredivsaisienote">Etape 2 : chargement d'un fichier de notes</span>''' #'
@@ -668,6 +669,7 @@
     H.append('</td><td style="padding-left: 35px;">')
     H.append( makeMenu( "Autres opérations", [
         { 'title' : 'Saisie par fichier tableur',
+          'id' : 'menu_saisie_tableur',
           'url' : '/saisie_notes_tableur?evaluation_id=%s&%s' % (E['evaluation_id'], groups_infos.groups_query_args)
         },
         { 'title' : 'Voir toutes les notes du module',
@@ -704,7 +706,7 @@
     return '\n'.join(H)
 
 def _get_sorted_etuds(context, E, etudids, formsemestre_id):
-
+    sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
     NotesDB = context._notes_getall(E['evaluation_id']) # Notes existantes
     cnx = context.GetDBConnexion()
     etuds = []
@@ -716,6 +718,8 @@
         # infos inscription dans ce semestre
         e['inscr'] = context.do_formsemestre_inscription_list(
             {'etudid':etudid, 'formsemestre_id' : formsemestre_id})[0]
+        # Groupes auxquels appartient cet étudiant:
+        e['groups'] = sco_groups.get_etud_groups(context, etudid, sem)
         # Information sur absence (ne tient pas compte de la demi-journée)
         jour_iso = DateDMYtoISO(E['jour'])
         nbabs = context.Absences.CountAbs(etudid, jour_iso, jour_iso)
@@ -750,28 +754,23 @@
 def _form_saisie_notes(context, E, M, group_ids, REQUEST=None):
     """Formulaire HTML saisie des notes  dans l'évaluation E du moduleimpl M
     pour les groupes indiqués.
+
+    On charge tous les étudiants, ne seront montrés que ceux
+    des groupes sélectionnés grace a un filtre en javascript.
     """
     evaluation_id = E['evaluation_id']
     formsemestre_id = M['formsemestre_id']
     groups = sco_groups.listgroups(context, group_ids)
-    if None in [ g['group_name'] for g in groups ]: # tous les etudiants
-        getallstudents = True
-        gr_title = 'tous'
-        gr_title_filename = 'tous'
-    else:
-        getallstudents = False
-        gr_title = sco_groups.listgroups_abbrev(groups)
-        gr_title_filename = sco_groups.listgroups_filename(groups) 
-
+    
     etudids = sco_groups.do_evaluation_listeetuds_groups(
-        context, evaluation_id, groups, getallstudents=getallstudents, include_dems=True)
+        context, evaluation_id, getallstudents=True, include_dems=True)
     if not etudids:
         return '<div class="ue_warning"><span>Aucun étudiant sélectionné !</span></div>'
     
     # Decisions de jury existantes ?
     decisions_jury = { etudid : has_existing_decision(context, M, E, etudid)
                        for etudid in etudids }
-    nb_decisions = sum(decisions_jury.values()) # Nb de decisions de jury pour ce groupe
+    nb_decisions = sum(decisions_jury.values()) # Nb de decisions de jury (pour les inscrits à l'évaluation)
 
     etuds = _get_sorted_etuds(context, E, etudids, formsemestre_id)
     
@@ -795,13 +794,18 @@
     for e in etuds:
         etudid = e['etudid']
         disabled = (e['val'] == 'DEM')
+        etud_classes = []
         if disabled:
             classdem = ' etud_dem'
+            etud_classes.append('etud_dem')
             disabled_attr = 'disabled="%d"' % disabled
         else:
             classdem = ''
             disabled_attr = ''
-
+        # attribue a chaque element une classe css par groupe:
+        for group_info in e['groups']:
+            etud_classes.append( group_info['group_id'] )
+        
         label = '<span class="%s">' % classdem + e['nomprenom'] + '</span>'
           
         # Historique des saisies de notes:
@@ -822,13 +826,14 @@
         descr.append( ('note_'+etudid, 
                        { 'size' : 5, 'title' : label_link,
                          'explanation':explanation,
-                         'return_focus_next' : True,
+                         'return_focus_next' : True,                         
                          'attributes' : ['class="note%s"' % classdem, 
                                          disabled_attr,
                                          'data-last-saved-value=%s' % e['val'],
                                          'data-orig-value=%s' % e['val'],
                                          'data-etudid=%s' % etudid,
                                          ],
+                          'template' : '''<tr%(item_dom_attr)s class="etud_elem ''' + ' '.join(etud_classes) +  '''"><td class="tf-fieldlabel">%(label)s</td><td class="tf-field">%(elem)s</td></tr>'''
                          } ) )
     #
     H = []
@@ -875,18 +880,17 @@
     """
     authuser = REQUEST.AUTHENTICATED_USER
     log('save_note: evaluation_id=%s etudid=%s uid=%s value=%s'
-        % (evaluation_id, etudid, authuser, value))
+        % (evaluation_id, etudid, authuser, value))    
     E = context.do_evaluation_list( {'evaluation_id' : evaluation_id})[0]
     M = context.do_moduleimpl_list(args={ 'moduleimpl_id' : E['moduleimpl_id']})[0]
     Mod = context.do_module_list( args={ 'module_id' : M['module_id'] } )[0]
     Mod['url']="Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % M
-    
     result = { 'nbchanged' : 0 } # JSON
     # Check access: admin, respformation, or responsable_id
     if not context.can_edit_notes( authuser, E['moduleimpl_id'] ):
         result['status'] = 'unauthorized'
     else:
-        L, invalids, withoutnotes, absents, tosuppress = _check_notes( [(etudid, value)], E)
+        L, invalids, withoutnotes, absents, tosuppress = _check_notes( [(etudid, value)], E)        
         if L:
             nbchanged, nbsuppress, existing_decisions = _notes_add(context, authuser, evaluation_id, L, comment=comment, do_it=True)
             sco_news.add(context, REQUEST, 

Modified: branches/ScoDoc7/static/js/groups_view.js
===================================================================
--- branches/ScoDoc7/static/js/groups_view.js	2016-09-04 19:54:12 UTC (rev 1556)
+++ branches/ScoDoc7/static/js/groups_view.js	2016-09-06 08:37:49 UTC (rev 1557)
@@ -82,11 +82,31 @@
 }
 
 // Menu choix groupe:
+function toggle_visible_etuds() {
+    //
+    $(".etud_elem").hide();
+    var qargs = "";
+    $("#group_ids_sel option:selected").each( function(index, opt) {
+        var group_id = opt.value;
+        $("."+group_id).show();
+        qargs += "&group_ids=" + group_id;
+    });
+    // Update url saisie tableur:
+    var input_eval = $("#formnotes_evaluation_id");
+    if (input_eval.length > 0) {
+        var evaluation_id = input_eval[0].value;
+        $("#menu_saisie_tableur a").attr("href", "saisie_notes_tableur?evaluation_id=" + evaluation_id + qargs );
+        // lien feuille excel:
+        $("#lnk_feuille_saisie").attr("href", "feuille_saisie_notes?evaluation_id=" + evaluation_id + qargs );
+    }
+}
+
 $().ready(function() {
     $('#group_ids_sel').multiselect(
         {
             includeSelectAllOption: false,
             nonSelectedText:'choisir...',
+            // buttonContainer: '<div id="group_ids_sel_container"/>',
             onChange: function(element, checked){
                 if (checked == true) {
                     var default_group_id = $(".default_group")[0].value;
@@ -114,11 +134,21 @@
                             $("#group_ids_sel").multiselect('deselect', default_group_id);
                         }
                     }        
-                }         
-                submit_group_selector();
+                }    
+
+                toggle_visible_etuds();
+                // referme le menu apres chaque choix:
+                $("#group_selector .btn-group").removeClass('open');
+                
+                if ($("#group_ids_sel").hasClass("submit_on_change")) {
+                    submit_group_selector();
+                }
             }
         }
     );
+
+    // initial setup
+    toggle_visible_etuds();
 });
 
 // Trombinoscope


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