diff --git a/serveur/ReadDatabase.py b/serveur/ReadDatabase.py index d6bd61effbdc5ed7e6c231b93078e973d1ae8955..c7ce3f2394eab3b4582c6fc47ae136903f2f5dcf 100644 --- a/serveur/ReadDatabase.py +++ b/serveur/ReadDatabase.py @@ -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 diff --git a/serveur/ServeurFonctions.py b/serveur/ServeurFonctions.py index 39b2df6b5399c560ca1387bde4ea06027d03bf69..9ee8c358649d0f5d83993177778f237fad0b4533 100644 --- a/serveur/ServeurFonctions.py +++ b/serveur/ServeurFonctions.py @@ -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