recherche étudiant inter-département

This commit is contained in:
Emmanuel Viennet 2021-07-28 10:51:18 +03:00
parent 9646452457
commit 748caf8ada
5 changed files with 51 additions and 30 deletions

View File

@ -33,10 +33,11 @@ def unquote(s):
return s.replace("&", "&") return s.replace("&", "&")
def open_dept_connection(): def open_dept_connection(scodoc_dept=None):
"""Open a connection to the current dept db""" """Open a connection to the current dept db (g.scodoc_dept)
# log("open_dept_connection to " + scu.get_db_cnx_string()) or to the argument scodoc_dept
return psycopg2.connect(scu.get_db_cnx_string()) """
return psycopg2.connect(scu.get_db_cnx_string(scodoc_dept))
def close_dept_connection(): def close_dept_connection():
@ -46,7 +47,16 @@ def close_dept_connection():
g.db_conn.close() g.db_conn.close()
# Essai bien plus simple pour Flask: def set_sco_dept(scodoc_dept):
"""Set "context" to given dept
open db connection
"""
g.scodoc_dept = scodoc_dept
if hasattr(g, "db_conn"):
close_dept_connection()
g.db_conn = open_dept_connection()
def GetDBConnexion(autocommit=True): # on n'utilise plus autocommit def GetDBConnexion(autocommit=True): # on n'utilise plus autocommit
return g.db_conn return g.db_conn

View File

@ -28,6 +28,7 @@
"""Recherche d'étudiants """Recherche d'étudiants
""" """
from flask import url_for, g from flask import url_for, g
from flask_login import current_user
from scodoc_manager import sco_mgr from scodoc_manager import sco_mgr
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
@ -98,8 +99,8 @@ def form_search_etud(
def search_etud_in_dept(context, expnom="", REQUEST=None): def search_etud_in_dept(context, expnom="", REQUEST=None):
"""Page recherche d'un etudiant. """Page recherche d'un etudiant.
Affiche la fiche de l'étudiant, ou, si la recherche donne plusieurs résultats, la liste des étudianst Affiche la fiche de l'étudiant, ou, si la recherche donne plusieurs résultats,
correspondants. la liste des étudiants correspondants.
Appelée par boite de recherche barre latérale gauche. Appelée par boite de recherche barre latérale gauche.
Args: Args:
@ -109,9 +110,9 @@ def search_etud_in_dept(context, expnom="", REQUEST=None):
etuds = sco_etud.get_etud_info(filled=1, etudid=expnom, REQUEST=REQUEST) etuds = sco_etud.get_etud_info(filled=1, etudid=expnom, REQUEST=REQUEST)
if len(etuds) != 1: if len(etuds) != 1:
if scu.is_valid_code_nip(expnom): if scu.is_valid_code_nip(expnom):
etuds = search_etuds_infos(context, code_nip=expnom, REQUEST=REQUEST) etuds = search_etuds_infos(code_nip=expnom)
else: else:
etuds = search_etuds_infos(context, expnom=expnom, REQUEST=REQUEST) etuds = search_etuds_infos(expnom=expnom)
else: else:
etuds = [] # si expnom est trop court, n'affiche rien etuds = [] # si expnom est trop court, n'affiche rien
@ -188,7 +189,7 @@ def search_etud_in_dept(context, expnom="", REQUEST=None):
# Was chercheEtudsInfo() # Was chercheEtudsInfo()
def search_etuds_infos(context, expnom=None, code_nip=None, REQUEST=None): def search_etuds_infos(expnom=None, code_nip=None):
"""recherche les étudiants correspondants à expnom ou au code_nip """recherche les étudiants correspondants à expnom ou au code_nip
et ramene liste de mappings utilisables en DTML. et ramene liste de mappings utilisables en DTML.
""" """
@ -270,36 +271,31 @@ def form_search_etud_in_accessible_depts(context, REQUEST):
""" """
def search_etud_in_accessible_depts(context, expnom=None, code_nip=None, REQUEST=None): def search_etud_in_accessible_depts(expnom=None, code_nip=None):
""" """
context est le ZScoDoc
result is a list of (sorted) etuds, one list per dept. result is a list of (sorted) etuds, one list per dept.
""" """
result = [] result = []
accessible_depts = [] accessible_depts = []
depts = sco_mgr.get_dept_ids() depts = sco_mgr.get_dept_ids()
for dept in depts: for dept in depts:
# log('%s searching %s' % (str(REQUEST.AUTHENTICATED_USER),dept)) if current_user.has_permission(Permission.ScoView, dept=dept):
if REQUEST.AUTHENTICATED_USER.has_permission(Permission.ScoView, dept=dept):
if expnom or code_nip: if expnom or code_nip:
accessible_depts.append(dept.Scolarite.DeptId()) accessible_depts.append(dept)
etuds = search_etuds_infos( ndb.set_sco_dept(dept)
dept.Scolarite, expnom=expnom, code_nip=code_nip, REQUEST=REQUEST etuds = search_etuds_infos(expnom=expnom, code_nip=code_nip)
)
else: else:
etuds = [] etuds = []
result.append(etuds) result.append(etuds)
return result, accessible_depts return result, accessible_depts
def table_etud_in_accessible_depts(context, expnom=None, REQUEST=None): def table_etud_in_accessible_depts(expnom=None):
""" """
Page avec table étudiants trouvés, dans tous les departements. Page avec table étudiants trouvés, dans tous les departements.
Attention: nous sommes ici au niveau de ScoDoc, pas dans un département Attention: nous sommes ici au niveau de ScoDoc, pas dans un département
""" """
result, accessible_depts = search_etud_in_accessible_depts( result, accessible_depts = search_etud_in_accessible_depts(expnom=expnom)
context, expnom=expnom, REQUEST=REQUEST
)
H = [ H = [
"""<div class="table_etud_in_accessible_depts">""", """<div class="table_etud_in_accessible_depts">""",
"""<h3>Recherche multi-département de "<tt>%s</tt>"</h3>""" % expnom, """<h3>Recherche multi-département de "<tt>%s</tt>"</h3>""" % expnom,
@ -330,15 +326,18 @@ def table_etud_in_accessible_depts(context, expnom=None, REQUEST=None):
else: else:
ss = "" ss = ""
H.append( H.append(
"""<p>(recherche menée dans le%s département%s: %s)</p><p> f"""<p>(recherche menée dans le{ss} département{ss}:
<a href=".." class="stdlink">Retour à l'accueil</a></p>""" {", ".join(accessible_depts)})
% (ss, ss, ", ".join(accessible_depts)) </p>
<p>
<a href="{url_for("scodoc.index")}" class="stdlink">Retour à l'accueil</a>
</p>
</div>
"""
) )
H.append("</div>")
return ( return (
html_sco_header.scodoc_top_html_header( html_sco_header.scodoc_top_html_header(
context, REQUEST, page_title="Choix d'un étudiant" None, None, page_title="Choix d'un étudiant"
) )
+ "\n".join(H) + "\n".join(H)
+ html_sco_header.standard_html_footer() + html_sco_header.standard_html_footer()

View File

@ -322,8 +322,8 @@ def get_dept_id():
raise sco_exceptions.ScoInvalidDept("département invalide: %s" % g.scodoc_dept) raise sco_exceptions.ScoInvalidDept("département invalide: %s" % g.scodoc_dept)
def get_db_cnx_string(): def get_db_cnx_string(scodoc_dept=None):
return "dbname=SCO" + g.scodoc_dept return "dbname=SCO" + (scodoc_dept or g.scodoc_dept)
def ScoURL(): def ScoURL():

View File

@ -20,12 +20,14 @@
{% endfor %} {% endfor %}
</ul> </ul>
{% if current_user.is_authenticated %}
<form action="table_etud_in_accessible_depts" method="POST"> <form action="table_etud_in_accessible_depts" method="POST">
<b>Chercher étudiant:</b> <b>Chercher étudiant:</b>
<input type="text" name="expnom" width="12" spellcheck="false" value=""> <input type="text" name="expnom" width="12" spellcheck="false" value="">
<input type="submit" value="Chercher"> <input type="submit" value="Chercher">
<br />(entrer une partie du nom ou le code NIP, cherche dans tous les départements autorisés) <br />(entrer une partie du nom ou le code NIP, cherche dans tous les départements autorisés)
</form> </form>
{% endif %}
<div style="margin-top: 1cm; font-size: 120%;"> <div style="margin-top: 1cm; font-size: 120%;">
<p><a href="/ScoDoc/static/mobile">Version mobile (expérimentale, à vos risques et périls)</a></p> <p><a href="/ScoDoc/static/mobile">Version mobile (expérimentale, à vos risques et périls)</a></p>

View File

@ -32,11 +32,14 @@ Emmanuel Viennet, 2021
""" """
import flask import flask
from flask import render_template from flask import render_template
from flask import request
from flask_login.utils import login_required
from scodoc_manager import sco_mgr from scodoc_manager import sco_mgr
from app.views import scodoc_bp as bp from app.views import scodoc_bp as bp
from app.scodoc import VERSION from app.scodoc import VERSION
from app.scodoc import sco_find_etud
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
@ -51,3 +54,10 @@ def index():
dept_ids=dept_ids, dept_ids=dept_ids,
Permission=Permission, Permission=Permission,
) )
@bp.route("/ScoDoc/table_etud_in_accessible_depts", methods=["POST"])
@login_required
def table_etud_in_accessible_depts():
"""recherche étudiants sur plusieurs départements"""
return sco_find_etud.table_etud_in_accessible_depts(expnom=request.form["expnom"])