Applying current filters to the export feature.

fixes #477
This commit is contained in:
Antoine Nguyen
2013-10-11 18:23:47 +02:00
parent 83aff0a10a
commit 7113510a60
4 changed files with 32 additions and 33 deletions
+19 -30
View File
@@ -56,61 +56,50 @@ def get_listing_page(objects, pagenum):
return page
def get_identities(user, args=None):
def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None):
"""Return all the identities owned by a user
:param user: the desired user
:param args: a args object
:param str searchquery: search pattern
:param list idtfilter: identity type filters
:param list grpfilter: group names filters
:return: a queryset
"""
from itertools import chain
if args:
squery = args.get("searchquery", None)
idtfilter = args.getlist("idtfilter", None)
grpfilter = args.getlist("grpfilter", None)
else:
squery = None
idtfilter = None
grpfilter = None
accounts = []
if not idtfilter or "account" in idtfilter:
if idtfilter is None or idtfilter == "account":
ids = user.objectaccess_set \
.filter(content_type=ContentType.objects.get_for_model(user)) \
.values_list('object_id', flat=True)
q = Q(pk__in=ids)
if squery:
q &= Q(username__icontains=squery) | Q(email__icontains=squery)
if grpfilter and len(grpfilter):
if "SuperAdmins" in grpfilter:
if searchquery is not None:
q &= Q(username__icontains=searchquery) \
| Q(email__icontains=searchquery)
if grpfilter is not None:
if grpfilter == "SuperAdmins":
q &= Q(is_superuser=True)
grpfilter.remove("SuperAdmins")
if len(grpfilter):
q |= Q(groups__name__in=grpfilter)
else:
q &= Q(groups__name__in=grpfilter)
q &= Q(groups__name=grpfilter)
accounts = User.objects.select_related().filter(q)
aliases = []
if not idtfilter or ("alias" in idtfilter
or "forward" in idtfilter
or "dlist" in idtfilter):
if idtfilter is None or (idtfilter in ["alias", "forward", "dlist"]):
alct = ContentType.objects.get_for_model(Alias)
ids = user.objectaccess_set.filter(content_type=alct) \
.values_list('object_id', flat=True)
q = Q(pk__in=ids)
if squery:
if '@' in squery:
local_part, domname = split_mailbox(squery)
if searchquery is not None:
if '@' in searchquery:
local_part, domname = split_mailbox(searchquery)
if local_part:
q &= Q(address__icontains=local_part)
if domname:
q &= Q(domain__name__icontains=domname)
else:
q &= Q(address__icontains=squery) | Q(domain__name__icontains=squery)
q &= Q(address__icontains=searchquery) | \
Q(domain__name__icontains=searchquery)
aliases = Alias.objects.select_related().filter(q)
if idtfilter:
aliases = [al for al in aliases if al.type in idtfilter]
if idtfilter is not None:
aliases = [al for al in aliases if al.type == idtfilter]
return chain(accounts, aliases)
@@ -48,6 +48,12 @@ def domains_menu(selection, user):
@register.simple_tag
def identities_menu(user):
"""Menu specific to the Identities page.
:param ``User`` user: the connecter user
:rtype: str
:return: the rendered menu
"""
entries = [
{"name": "identities",
"label": _("List identities"),
@@ -94,7 +100,8 @@ def identities_menu(user):
"img": "icon-share-alt",
"url": reverse("modoboa.extensions.admin.views.export.export_identities"),
"modal": True,
"modalcb": "admin.exportform_cb"}
"modalcb": "admin.exportform_cb"
}
]
return render_to_string('common/menulist.html', {
+1 -1
View File
@@ -47,7 +47,7 @@ def export_identities(request):
form.is_valid()
fp = cStringIO.StringIO()
csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"])
for ident in get_identities(request.user):
for ident in get_identities(request.user, **request.session['identities_filters']):
ident.to_csv(csvwriter)
content = fp.getvalue()
fp.close()
+4 -1
View File
@@ -29,7 +29,10 @@ from modoboa.extensions.admin.forms import (
lambda u: u.has_perm("core.add_user") or u.has_perm("admin.add_alias")
)
def _identities(request):
idents_list = get_identities(request.user, request.GET)
filters = dict((fname, request.GET.get(fname, None))
for fname in ['searchquery', 'idtfilter', 'grpfilter'])
request.session['identities_filters'] = filters
idents_list = get_identities(request.user, **filters)
sort_order, sort_dir = get_sort_order(request.GET, "identity",
["identity", "name_or_rcpt", "tags"])
if sort_order in ["identity", "name_or_rcpt"]: