Commit b6e2fe8a authored by Praibait's avatar Praibait

Factorisation du code ; Ajout de la recherche par nom/prénom ; Correction code d'erreur

parent 610c1f29
...@@ -217,7 +217,27 @@ def _forge_request(skeleton, pieces): ...@@ -217,7 +217,27 @@ def _forge_request(skeleton, pieces):
pieces[k] = separator + pieces[k] pieces[k] = separator + pieces[k]
return skeleton % pieces return skeleton % pieces
def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None): def _degre_negatif(comptes):
con, cur = BaseFonctions.getcursor()
cur.execute("SELECT solde_negatif, solde_tres_negatif, solde_pas_plus_negatif FROM configurations WHERE used = true;")
neg, tres_neg, pas_plus_neg = cur.fetchone()
for i in range(len(comptes)):
c = comptes[i]
c = dict(c)
solde = c["solde"]
if solde >= neg:
c["negatif"] = 0
elif solde >= tres_neg:
c["negatif"] = 1
elif solde >= pas_plus_neg:
c["negatif"] = 2
else:
c["negatif"] = 3
comptes[i] = c
def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None, byname=False):
"""Effectue une recherche simple : """Effectue une recherche simple :
* sur les pseudos, les alias et l'historique * sur les pseudos, les alias et l'historique
...@@ -255,7 +275,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None) ...@@ -255,7 +275,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
pieces["always_from"] = "comptes AS c" pieces["always_from"] = "comptes AS c"
#: À tester dans tous les cas #: À tester dans tous les cas
pieces["always_where"] = "NOT (c.bloque OR c.deleted) AND c.idbde >= 0" pieces["always_where"] = "NOT (c.bloque OR c.deleted) AND c.idbde >= 0"
#: Sauf si on est dans le cas de recherche byidbde, on affiche aussi les comptes bloqués #: Sauf si on est dans le cas de recherche byidbde, on affiche aussi les comptes bloqués
if byidbde: if byidbde:
pieces["always_where"] = "NOT c.deleted AND c.idbde >= 0" pieces["always_where"] = "NOT c.deleted AND c.idbde >= 0"
# On gère le flag o ici, parce qu'il est commun aux deux méthodes de recherche # On gère le flag o ici, parce qu'il est commun aux deux méthodes de recherche
...@@ -296,8 +316,14 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None) ...@@ -296,8 +316,14 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
"idbde" : {"specific_select" : "c.idbde AS terme, c.idbde", "idbde" : {"specific_select" : "c.idbde AS terme, c.idbde",
"specific_from" : "", "specific_from" : "",
"specific_where" : "CAST(idbde AS text) LIKE %(term_liked)s"}, "specific_where" : "CAST(idbde AS text) LIKE %(term_liked)s"},
"nom" : {"specific_select" : "c.nom AS terme, c.idbde",
"specific_from" : "",
"specific_where" : _forge_test("c.nom", is_regex)},
"prenom" : {"specific_select" : "c.prenom AS terme, c.idbde",
"specific_from" : "",
"specific_where" : _forge_test("c.prenom", is_regex)}
} }
# Ensuite on différencie le cas idbde de l'autre # Ensuite on différencie le cas idbde de l'autre
if byidbde: if byidbde:
# On transformer l'entier id en chaîne et on ajoute le "%" (= filtre begin) # On transformer l'entier id en chaîne et on ajoute le "%" (= filtre begin)
...@@ -313,7 +339,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None) ...@@ -313,7 +339,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
term_liked = like_replace(term) + "%" term_liked = like_replace(term) + "%"
term_regex = "^" + term term_regex = "^" + term
# On recherche sur les pseudos, puis les alias, puis les historiques # On recherche sur les pseudos, puis les alias, puis les historiques
search_types = ["pseudo", "alias", "historique"] search_types = ["pseudo", "alias", "historique"] + ["nom", "prenom"] if byname else []
# On ne modifie pas les chaînes trouvées # On ne modifie pas les chaînes trouvées
post_transform_term = lambda x : x post_transform_term = lambda x : x
con, cur = BaseFonctions.getcursor() con, cur = BaseFonctions.getcursor()
...@@ -344,18 +370,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None) ...@@ -344,18 +370,7 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
# ça sert à les afficher de couleurs différentes # ça sert à les afficher de couleurs différentes
# NB : le solde est bien en centimes # NB : le solde est bien en centimes
if not hide_solde: if not hide_solde:
cur.execute("SELECT solde_negatif, solde_tres_negatif, solde_pas_plus_negatif FROM configurations WHERE used = true;") _degre_negatif(results)
neg, tres_neg, pas_plus_neg = cur.fetchone()
for i in range(len(results)):
solde = results[i]["solde"]
if solde >= neg:
results[i]["negatif"] = 0
elif solde >= tres_neg:
results[i]["negatif"] = 1
elif solde >= pas_plus_neg:
results[i]["negatif"] = 2
else:
results[i]["negatif"] = 3
else: else:
# Rappel : tout utilisateur qui peut faire un don a le droit de faire un quick_search, mais pas de voir les soldes # Rappel : tout utilisateur qui peut faire un don a le droit de faire un quick_search, mais pas de voir les soldes
# donc on enlève les soldes dans ce cas # donc on enlève les soldes dans ce cas
...@@ -381,3 +396,23 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None) ...@@ -381,3 +396,23 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
results[i]["vieux"] = vieux results[i]["vieux"] = vieux
return results return results
def search_invite(term, idact):
""" Fonction de recherche des invités à une activité
term : terme de recherche. Match sur nom, prénomde l'invité et sur le pseudo de l'inviteur
idact : id de l'activité concernée
Retourne la liste des invités à cette activités avec le degré de négativité de leur inviteur"""
invites = []
con, cur = BaseFonctions.getcursor()
cur.execute(u"""SELECT 'invite' AS type, i.id AS idbde, i.nom, i.prenom,
c.idbde AS Ridbde, c.nom AS Rnom, c.prenom AS Rprenom, c.pseudo AS pseudo, c.solde AS solde
FROM invites AS i
JOIN comptes AS c
ON i.responsable=c.idbde
WHERE i.activite={0} AND (i.nom ILIKE '{1}%' OR i.prenom ILIKE '{1}%' OR pseudo ILIKE '{1}%' OR c.nom ILIKE '{1}%' OR c.prenom ILIKE '{1}%');""".format(idact, term))
invites = cur.fetchall()
_degre_negatif(invites)
return invites
...@@ -3246,7 +3246,7 @@ def openclose_activite(self, data): ...@@ -3246,7 +3246,7 @@ def openclose_activite(self, data):
self._debug(1, u"openclose_activite : activité {} {}".format(idact, action)) self._debug(1, u"openclose_activite : activité {} {}".format(idact, action))
self._send(u"Activité {}".format(action)) self._send(u"Activité {}".format(action))
else: else:
self._send(None, 403, u"On ne peut pas ouvrir une activité sans liste d'invités.") self._send(None, 750, u"On ne peut pas ouvrir une activité sans liste d'invités.")
self._debug(3, u"Impossible d'ouvrir {} : pas de liste d'invités".format(idact)) self._debug(3, u"Impossible d'ouvrir {} : pas de liste d'invités".format(idact))
else: else:
...@@ -3687,9 +3687,6 @@ def search_pot(self, data): ...@@ -3687,9 +3687,6 @@ def search_pot(self, data):
term, idpot = data term, idpot = data
byidbde = False byidbde = False
# Le flag 'x' a été utilisé: on s'exclut de la recherche
to_exclude = None
if (len(term) > 0) and (term[0] == "#"): if (len(term) > 0) and (term[0] == "#"):
# C'est donc qu'on recherche par idbde # C'est donc qu'on recherche par idbde
try: try:
...@@ -3700,51 +3697,22 @@ def search_pot(self, data): ...@@ -3700,51 +3697,22 @@ def search_pot(self, data):
_badparam(self, u"search_pot (tentative incorrecte d'utilisation du mode idbde : %s)" % (term,)) _badparam(self, u"search_pot (tentative incorrecte d'utilisation du mode idbde : %s)" % (term,))
return return
byidbde = True byidbde = True
acl_quick_search = self._has_acl(u"quick_search") acl_quick_search = self._has_acl(u"quick_search")
if acl_quick_search: if acl_quick_search:
# Quicksearch du terme de recherche dans les adhérents # Quicksearch du terme de recherche dans les adhérents
adherents = ReadDatabase.quick_search(term, old, byidbde, hide_solde=(not acl_quick_search), exclude=to_exclude) adherents = ReadDatabase.quick_search(term, old, byidbde, byname=True)
self._debug(4, u"quick_search de {} ({}sold accounts, exclude {})".format(data[0], "not " * (not old), to_exclude)) self._debug(4, u"quick_search de {} ({}sold accounts)".format(data[0], "not " * (not old)))
# On récupère la liste des invités au [Pot] et on effectue une recherche dedans si c'est pas par idbde # Quicksearch des invités au pot dans la table invites
invites = [] invites = []
con, cur = BaseFonctions.getcursor()
if not byidbde: if not byidbde:
cur.execute(u"""SELECT i.id AS idbde, i.nom, i.prenom, c.idbde AS Ridbde, c.nom AS Rnom, c.prenom AS Rprenom, c.pseudo AS pseudo, c.solde AS solde invites = ReadDatabase.search_invite(term, idpot)
FROM invites AS i
JOIN comptes AS c
ON i.responsable=c.idbde
WHERE i.activite={0} AND (i.nom ILIKE '{1}%' OR i.prenom ILIKE '{1}%' OR pseudo ILIKE '{1}%');""".format(idpot, term))
invites = cur.fetchall()
self._debug(4, u"invites_search de {} (idpot : {})".format(data[0], idpot)) self._debug(4, u"invites_search de {} (idpot : {})".format(data[0], idpot))
cur.execute("SELECT solde_negatif, solde_tres_negatif, solde_pas_plus_negatif FROM configurations WHERE used = true;") resultat = sorted(adherents + invites, key=lambda perso: (perso["terme"] if perso["type"]!="invite" else perso["nom"]).lower())
neg, tres_neg, pas_plus_neg = cur.fetchone()
for i in range(len(invites)):
invites[i] = dict(invites[i])
invites[i]["type"] = u"invite"
solde = invites[i]["solde"]
if solde >= neg:
invites[i]["negatif"] = 0
elif solde >= tres_neg:
invites[i]["negatif"] = 1
elif solde >= pas_plus_neg:
invites[i]["negatif"] = 2
else:
invites[i]["negatif"] = 3
# Fusion des deux listes
def order_by_pseudo(gen):
try:
return gen["terme"].lower()
except:
return gen["pseudo"].lower()
resultat = sorted(adherents + invites, key=order_by_pseudo)
con, cur = BaseFonctions.getcursor()
# On récupère la liste des personnes déjà rentrées au pot # On récupère la liste des personnes déjà rentrées au pot
cur.execute(u"""SELECT idbde AS id, heure_entree AS heure cur.execute(u"""SELECT idbde AS id, heure_entree AS heure
FROM entree_activites FROM entree_activites
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment