From 5ffeae3e1fab446e71a87a4650e0eeb2d5bc4c5a Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Tue, 16 Feb 2021 22:07:56 +0100
Subject: [PATCH] Fix: autocomplete recherche etudiant

---
 sco_find_etud.py    | 12 ++++---
 static/js/scodoc.js | 87 +++++++++++++++++++++++----------------------
 2 files changed, 51 insertions(+), 48 deletions(-)

diff --git a/sco_find_etud.py b/sco_find_etud.py
index 52b5800b9..27ccf8370 100644
--- a/sco_find_etud.py
+++ b/sco_find_etud.py
@@ -108,7 +108,7 @@ def search_etud_in_dept(
     REQUEST=None,
 ):
     """Page recherche d'un etudiant
-    expnom est un regexp sur le nom ou un code_nip
+    expnom est un regexp sur le nom ou un code_nip ou un etudid
     dest_url est la page sur laquelle on sera redirigé après choix
     parameters spécifie des arguments additionnels à passer à l'URL (en plus de etudid)
     """
@@ -134,8 +134,10 @@ def search_etud_in_dept(
         etuds = search_etuds_infos(context, code_nip=expnom, REQUEST=REQUEST)
     elif expnom:
         etuds = search_etuds_infos(context, expnom=expnom, REQUEST=REQUEST)
-    else:
-        etuds = []
+    if expnom and not etuds:
+        etuds = context.getEtudInfo(filled=1, etudid=expnom, REQUEST=REQUEST)
+        if len(etuds) != 1:
+            etuds = []
     if len(etuds) == 1:
         # va directement a la destination
         return REQUEST.RESPONSE.redirect(
@@ -268,14 +270,14 @@ def search_etud_by_name(context, term, REQUEST=None):
         else:
             r = ndb.SimpleDictFetch(
                 context,
-                "SELECT nom, prenom FROM identite WHERE nom LIKE %(beginning)s ORDER BY nom",
+                "SELECT etudid, nom, prenom FROM identite WHERE nom LIKE %(beginning)s ORDER BY nom",
                 {"beginning": term + "%"},
             )
 
             data = [
                 {
                     "label": "%s %s" % (x["nom"], scolars.format_prenom(x["prenom"])),
-                    "value": x["nom"],
+                    "value": x["etudid"],
                 }
                 for x in r
             ]
diff --git a/static/js/scodoc.js b/static/js/scodoc.js
index 7ae653eee..c4def3d6d 100644
--- a/static/js/scodoc.js
+++ b/static/js/scodoc.js
@@ -1,7 +1,7 @@
 // JS for all ScoDoc pages (using jQuery UI)
 
 
-$(function() {
+$(function () {
     // Autocomplete recherche etudiants par nom
     $("#in-expnom").autocomplete(
         {
@@ -9,49 +9,50 @@ $(function() {
             minLength: 2, // min nb of chars before suggest
             position: { collision: 'flip' }, // automatic menu position up/down
             source: "search_etud_by_name",
-            select: function(event, ui) { 
-                $("#form-chercheetud").submit(); 
+            select: function (event, ui) {
+                $("#in-expnom").val(ui.item.value);
+                $("#form-chercheetud").submit();
             }
-        });    
-    
+        });
+
     // Date picker
     $(".datepicker").datepicker({
-        showOn: 'button', 
-        buttonImage: '/ScoDoc/static/icons/calendar_img.png', 
+        showOn: 'button',
+        buttonImage: '/ScoDoc/static/icons/calendar_img.png',
         buttonImageOnly: true,
-        dateFormat: 'dd/mm/yy',   
-        duration : 'fast',                   
+        dateFormat: 'dd/mm/yy',
+        duration: 'fast',
     });
-    $('.datepicker').datepicker('option', $.extend({showMonthAfterYear: false},
-                                                   $.datepicker.regional['fr']));
+    $('.datepicker').datepicker('option', $.extend({ showMonthAfterYear: false },
+        $.datepicker.regional['fr']));
 
     /* Barre menu */
-    var sco_menu_position = {my: "left top", at: "left bottom"};
+    var sco_menu_position = { my: "left top", at: "left bottom" };
     $("#sco_menu").menu({
         position: sco_menu_position,
-        blur: function() {
+        blur: function () {
             $(this).menu("option", "position", sco_menu_position);
         },
-        focus: function(e, ui) {
+        focus: function (e, ui) {
             if ($("#sco_menu").get(0) !== $(ui).get(0).item.parent().get(0)) {
-                $(this).menu("option", "position", {my: "left top", at: "right top"});
+                $(this).menu("option", "position", { my: "left top", at: "right top" });
             }
         }
-        }).mouseleave(function(x, y) {
-            $( "#sco_menu" ).menu('collapseAll');
-        });
+    }).mouseleave(function (x, y) {
+        $("#sco_menu").menu('collapseAll');
+    });
 
     $("#sco_menu > li > a > span").switchClass("ui-icon-carat-1-e", "ui-icon-carat-1-s");
 
     /* Les menus isoles dropdown */
     $(".sco_dropdown_menu").menu({
         position: sco_menu_position
-    }).mouseleave(function(x, y) {
-        $( ".sco_dropdown_menu" ).menu('collapseAll');
+    }).mouseleave(function (x, y) {
+        $(".sco_dropdown_menu").menu('collapseAll');
     }
-                 );
+    );
     $(".sco_dropdown_menu > li > a > span").switchClass("ui-icon-carat-1-e", "ui-icon-carat-1-s");
-    
+
 });
 
 
@@ -65,14 +66,14 @@ function sco_message(msg, color) {
         $('#sco_msg').css('color', color);
     }
     setTimeout(
-        function() {  
+        function () {
             $('#sco_msg').fadeOut(
                 'slow',
-                function() { 
+                function () {
                     $('#sco_msg').html('');
                 }
-            );  
-        }, 
+            );
+        },
         2000 // <-- duree affichage en milliseconds  
     );
 }
@@ -81,30 +82,30 @@ function sco_message(msg, color) {
 function get_query_args() {
     var s = window.location.search; // eg "?x=1&y=2"
     var vars = {};
-    s.replace( 
-		    /[?&]+([^=&]+)=?([^&]*)?/gi, // regexp
-		function( m, key, value ) { // callback
-			vars[key] = value !== undefined ? value : '';
-		}
+    s.replace(
+        /[?&]+([^=&]+)=?([^&]*)?/gi, // regexp
+        function (m, key, value) { // callback
+            vars[key] = value !== undefined ? value : '';
+        }
     );
     return vars;
 }
 
 
 // Tables (gen_tables)
-$(function() {
-    $('table.gt_table').DataTable( {
-        "paging" : false,
-        "searching" : false,
-        "info" : false,
+$(function () {
+    $('table.gt_table').DataTable({
+        "paging": false,
+        "searching": false,
+        "info": false,
         /* "autoWidth" : false, */
-        "fixedHeader" : {
+        "fixedHeader": {
             "header": true,
             "footer": true
         },
         "orderCellsTop": true, // cellules ligne 1 pour tri 
-        "aaSorting": [ ], // Prevent initial sorting
-    } );
+        "aaSorting": [], // Prevent initial sorting
+    });
 });
 
 
@@ -112,9 +113,9 @@ $(function() {
 function readOnlyTags(nodes) {
     // nodes are textareas, hide them and create a span showing tags
     for (var i = 0; i < nodes.length; i++) {
-	var node = $(nodes[i]);
-	node.hide();
-	var tags = nodes[i].value.split(',');
-	node.after('<span class="ro_tags"><span class="ro_tag">' + tags.join('</span><span class="ro_tag">') + '</span></span>');
+        var node = $(nodes[i]);
+        node.hide();
+        var tags = nodes[i].value.split(',');
+        node.after('<span class="ro_tags"><span class="ro_tag">' + tags.join('</span><span class="ro_tag">') + '</span></span>');
     }
 }