diff --git a/modoboa/admin/models.py b/modoboa/admin/models.py index 66ab20dde..24c8496e7 100644 --- a/modoboa/admin/models.py +++ b/modoboa/admin/models.py @@ -1,5 +1,6 @@ # coding: utf-8 from django.db import models, IntegrityError +from django.db.models import Q from django.db.models.signals import pre_delete from django.dispatch import receiver from django.contrib.contenttypes.models import ContentType @@ -230,9 +231,10 @@ class User(DUser): return False return True - def get_identities(self): + def get_identities(self, squery=None): """Return all identities owned by this user + :param squery: an optional filter :return: a queryset """ from modoboa.lib.permissions import get_content_type @@ -241,12 +243,22 @@ class User(DUser): userct = get_content_type(self) ids = self.objectaccess_set.filter(content_type=userct) \ .values_list('object_id', flat=True) - result = User.objects.select_related().filter(pk__in=ids) + q = Q(pk__in=ids) + if squery: + q &= Q(username__contains=squery) + result = User.objects.select_related().filter(q) alct = get_content_type(Alias) ids = self.objectaccess_set.filter(content_type=alct) \ .values_list('object_id', flat=True) - return chain(result, Alias.objects.select_related().filter(pk__in=ids)) + q = Q(pk__in=ids) + if squery: + if squery.find('@') != -1: + local_part, domname = split_mailbox(squery) + q &= Q(address__contains=local_part, domain__name__contains=domname) + else: + q &= Q(address__contains=squery) + return chain(result, Alias.objects.select_related().filter(q)) def get_domains(self): diff --git a/modoboa/admin/views.py b/modoboa/admin/views.py index 1c42d17de..7e325a8e3 100644 --- a/modoboa/admin/views.py +++ b/modoboa/admin/views.py @@ -299,23 +299,7 @@ def delforward(request): @login_required @user_passes_test(lambda u: u.has_perm("auth.add_user") or u.has_perm("admin.add_alias")) def _identities(request): - idents_list = request.user.get_identities() - squery = request.GET.get("searchquery", None) - if squery: - uct = get_content_type(User) - uids = idents_list.filter(content_type=uct).values_list("object_id", flat=True) - objects = [u for u in User.objects.filter(pk__in=uids, username__contains=squery)] - alct = get_content_type(Alias) - alids = idents_list.filter(content_type=alct).values_list("object_id", flat=True) - if squery.find('@') != -1: - local_part, domname = split_mailbox(squery) - mbaliases = Alias.objects.filter(address__contains=local_part, - domain__name__contains=domname) - q = Q(address__contains=local_part, domain__name__contains=domname) - else: - q = Q(address__contains=squery) - objects += [al for al in Alias.objects.filter(Q(pk__in=alids) & q)] - + idents_list = request.user.get_identities(request.GET.get("searchquery", None)) objects = sorted(idents_list, key=lambda o: o.identity) paginator = Paginator(objects, int(parameters.get_admin("ITEMS_PER_PAGE")))