From b5af1535a07b6df0c18792ee1a0f5bfcc2cdd5c1 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 25 Oct 2017 14:52:11 +0200 Subject: [PATCH] manager: add all and none OU filters to the user search form (fixes #19228) --- src/authentic2/manager/app_settings.py | 1 + src/authentic2/manager/forms.py | 78 ++++++++++++++++------ .../templates/authentic2/manager/users.html | 2 +- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/authentic2/manager/app_settings.py b/src/authentic2/manager/app_settings.py index 731efeb..5f7af19 100644 --- a/src/authentic2/manager/app_settings.py +++ b/src/authentic2/manager/app_settings.py @@ -7,6 +7,7 @@ class AppSettings(object): 'HOMEPAGE_URL': None, 'ROLE_FORM_CLASS': None, 'ROLES_SHOW_PERMISSIONS': False, + 'ROLE_MEMBERS_SHOW_ALL_OU': True, 'ROLE_MEMBERS_FROM_OU': False, 'SHOW_INTERNAL_ROLES': False, 'USER_SEARCH_MINIMUM_CHARS': 0, diff --git a/src/authentic2/manager/forms.py b/src/authentic2/manager/forms.py index ba4b18d..3d47114 100644 --- a/src/authentic2/manager/forms.py +++ b/src/authentic2/manager/forms.py @@ -2,7 +2,7 @@ import hashlib import smtplib import logging -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _, pgettext from django import forms from django.contrib.contenttypes.models import ContentType from django.db.models.query import Q @@ -404,43 +404,77 @@ class HideOUFieldMixin(object): class OUSearchForm(FormWithRequest): ou_permission = None - ou = forms.ModelChoiceField(queryset=get_ou_model().objects, - required=True, label=_('Organizational unit')) + ou = forms.ChoiceField(label=_('Organizational unit'), required=False) def __init__(self, *args, **kwargs): + self.show_all_ou = kwargs.get('show_all_ou', True) request = kwargs['request'] - ou_qs = (kwargs.pop('ou_queryset', None) - or request.user.ous_with_perm(self.ou_permission).order_by('name')) + self.ou_qs = (kwargs.pop('ou_queryset', None) + or request.user.ous_with_perm(self.ou_permission).order_by('name')) data = kwargs.setdefault('data', {}).copy() kwargs['data'] = data - if 'search-ou' not in data: - if request.user.ou in ou_qs: - data['search-ou'] = request.user.ou.pk - elif len(ou_qs): - data['search-ou'] = ou_qs[0].pk + choices = [] + if self.show_all_ou: + choices.append(('all', pgettext('organizational unit', 'All'))) + for ou in self.ou_qs: + choices.append((str(ou.pk), unicode(ou))) + if request.user.is_superuser: + choices.append(('none', pgettext('organizational unit', 'None'))) + + ou_key = self.add_prefix('ou') + if ou_key not in data: + if request.user.ou in self.ou_qs: + data[ou_key] = str(request.user.ou.pk) + elif len(self.ou_qs): + data[ou_key] = choices[0][0] super(OUSearchForm, self).__init__(*args, **kwargs) - if not request.user.is_superuser: - self.fields['ou'].empty_label = None - else: - self.fields['ou'].required = False - self.fields['ou'].queryset = ou_qs - if len(ou_qs) < 2: + self.fields['ou'].choices = choices + if len(self.ou_qs) < 2: self.fields['ou'].widget.attrs['disabled'] = '' def filter_no_ou(self, qs): - if self.request.user.is_superuser: - qs = qs.filter(ou__isnull=True) + if self.show_all_ou: + return qs + elif self.ou_qs: + qs = qs.filter(ou=self.ou_qs[0]) else: qs = qs.none() return qs + def clean(self): + ou = self.cleaned_data.get('ou') + self.cleaned_data['ou_filter'] = ou + try: + ou_pk = int(ou) + except ValueError: + self.cleaned_data['ou'] = None + else: + for ou in self.ou_qs: + if ou.pk == ou_pk: + self.cleaned_data['ou'] = ou + break + else: + self.cleaned_data['ou'] = None + return self.cleaned_data + + def filter_by_ou(self, qs): + if self.cleaned_data.get('ou_filter'): + ou_filter = self.cleaned_data['ou_filter'] + ou = self.cleaned_data['ou'] + if ou_filter == 'all': + pass + elif ou_filter == 'none': + qs = qs.filter(ou__isnull=True) + elif ou: + qs = qs.filter(ou=ou) + else: + qs = self.filter_no_ou(qs) + return qs + def filter(self, qs): if hasattr(super(OUSearchForm, self), 'filter'): qs = super(OUSearchForm, self).filter(qs) - if self.cleaned_data.get('ou'): - qs = qs.filter(ou=self.cleaned_data['ou']) - else: - qs = self.filter_no_ou(qs) + qs = self.filter_by_ou(qs) return qs diff --git a/src/authentic2/manager/templates/authentic2/manager/users.html b/src/authentic2/manager/templates/authentic2/manager/users.html index 6a1e4fb..6d6d781 100644 --- a/src/authentic2/manager/templates/authentic2/manager/users.html +++ b/src/authentic2/manager/templates/authentic2/manager/users.html @@ -7,7 +7,7 @@ {% block appbar %} {{ block.super }} - {% if view.can_add and search_form.cleaned_data.ou %} + {% if view.can_add and search_form.cleaned_data.ou %} -- 2.1.4