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):
pieces[k] = separator + pieces[k]
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 :
* 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)
pieces["always_from"] = "comptes AS c"
#: À tester dans tous les cas
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:
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
......@@ -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",
"specific_from" : "",
"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
if byidbde:
# 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)
term_liked = like_replace(term) + "%"
term_regex = "^" + term
# 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
post_transform_term = lambda x : x
con, cur = BaseFonctions.getcursor()
......@@ -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
# NB : le solde est bien en centimes
if not hide_solde:
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(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
_degre_negatif(results)
else:
# 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
......@@ -381,3 +396,23 @@ def quick_search(term, old=False, byidbde=False, hide_solde=False, exclude=None)
results[i]["vieux"] = vieux
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):
self._debug(1, u"openclose_activite : activité {} {}".format(idact, action))
self._send(u"Activité {}".format(action))
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))
else:
......@@ -3687,9 +3687,6 @@ def search_pot(self, data):
term, idpot = data
byidbde = False
# Le flag 'x' a été utilisé: on s'exclut de la recherche
to_exclude = None
if (len(term) > 0) and (term[0] == "#"):
# C'est donc qu'on recherche par idbde
try:
......@@ -3700,51 +3697,22 @@ def search_pot(self, data):
_badparam(self, u"search_pot (tentative incorrecte d'utilisation du mode idbde : %s)" % (term,))
return
byidbde = True
acl_quick_search = self._has_acl(u"quick_search")
if acl_quick_search:
# 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)
self._debug(4, u"quick_search de {} ({}sold accounts, exclude {})".format(data[0], "not " * (not old), to_exclude))
adherents = ReadDatabase.quick_search(term, old, byidbde, byname=True)
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 = []
con, cur = BaseFonctions.getcursor()
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
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()
invites = ReadDatabase.search_invite(term, 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;")
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)
resultat = sorted(adherents + invites, key=lambda perso: (perso["terme"] if perso["type"]!="invite" else perso["nom"]).lower())
con, cur = BaseFonctions.getcursor()
# 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
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