From 7113510a605c940dbdfb92fa137852a8f548118e Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 11 Oct 2013 18:23:47 +0200 Subject: [PATCH] Applying current filters to the export feature. fixes #477 --- modoboa/extensions/admin/lib.py | 49 +++++++------------ .../admin/templatetags/admin_tags.py | 9 +++- modoboa/extensions/admin/views/export.py | 2 +- modoboa/extensions/admin/views/identity.py | 5 +- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/modoboa/extensions/admin/lib.py b/modoboa/extensions/admin/lib.py index 8fbdfd7ca..a96850d77 100644 --- a/modoboa/extensions/admin/lib.py +++ b/modoboa/extensions/admin/lib.py @@ -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) diff --git a/modoboa/extensions/admin/templatetags/admin_tags.py b/modoboa/extensions/admin/templatetags/admin_tags.py index 9d23eee01..6736fbbe9 100644 --- a/modoboa/extensions/admin/templatetags/admin_tags.py +++ b/modoboa/extensions/admin/templatetags/admin_tags.py @@ -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', { diff --git a/modoboa/extensions/admin/views/export.py b/modoboa/extensions/admin/views/export.py index c6e9dade2..681a54bda 100644 --- a/modoboa/extensions/admin/views/export.py +++ b/modoboa/extensions/admin/views/export.py @@ -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() diff --git a/modoboa/extensions/admin/views/identity.py b/modoboa/extensions/admin/views/identity.py index 8ba173707..a2f1e1bc4 100644 --- a/modoboa/extensions/admin/views/identity.py +++ b/modoboa/extensions/admin/views/identity.py @@ -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"]: