Projet

Général

Profil

0001-manager-add-all-and-none-OU-filters-to-the-user-sear.patch

Benjamin Dauvergne, 25 octobre 2017 15:02

Télécharger (5,72 ko)

Voir les différences:

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(-)
src/authentic2/manager/app_settings.py
7 7
        'HOMEPAGE_URL': None,
8 8
        'ROLE_FORM_CLASS': None,
9 9
        'ROLES_SHOW_PERMISSIONS': False,
10
        'ROLE_MEMBERS_SHOW_ALL_OU': True,
10 11
        'ROLE_MEMBERS_FROM_OU': False,
11 12
        'SHOW_INTERNAL_ROLES': False,
12 13
        'USER_SEARCH_MINIMUM_CHARS': 0,
src/authentic2/manager/forms.py
2 2
import smtplib
3 3
import logging
4 4

  
5
from django.utils.translation import ugettext_lazy as _
5
from django.utils.translation import ugettext_lazy as _, pgettext
6 6
from django import forms
7 7
from django.contrib.contenttypes.models import ContentType
8 8
from django.db.models.query import Q
......
404 404
class OUSearchForm(FormWithRequest):
405 405
    ou_permission = None
406 406

  
407
    ou = forms.ModelChoiceField(queryset=get_ou_model().objects,
408
                                required=True, label=_('Organizational unit'))
407
    ou = forms.ChoiceField(label=_('Organizational unit'), required=False)
409 408

  
410 409
    def __init__(self, *args, **kwargs):
410
        self.show_all_ou = kwargs.get('show_all_ou', True)
411 411
        request = kwargs['request']
412
        ou_qs = (kwargs.pop('ou_queryset', None)
413
                 or request.user.ous_with_perm(self.ou_permission).order_by('name'))
412
        self.ou_qs = (kwargs.pop('ou_queryset', None)
413
                      or request.user.ous_with_perm(self.ou_permission).order_by('name'))
414 414
        data = kwargs.setdefault('data', {}).copy()
415 415
        kwargs['data'] = data
416
        if 'search-ou' not in data:
417
            if request.user.ou in ou_qs:
418
                data['search-ou'] = request.user.ou.pk
419
            elif len(ou_qs):
420
                data['search-ou'] = ou_qs[0].pk
416
        choices = []
417
        if self.show_all_ou:
418
            choices.append(('all', pgettext('organizational unit', 'All')))
419
        for ou in self.ou_qs:
420
            choices.append((str(ou.pk), unicode(ou)))
421
        if request.user.is_superuser:
422
            choices.append(('none', pgettext('organizational unit', 'None')))
423

  
424
        ou_key = self.add_prefix('ou')
425
        if ou_key not in data:
426
            if request.user.ou in self.ou_qs:
427
                data[ou_key] = str(request.user.ou.pk)
428
            elif len(self.ou_qs):
429
                data[ou_key] = choices[0][0]
421 430
        super(OUSearchForm, self).__init__(*args, **kwargs)
422
        if not request.user.is_superuser:
423
            self.fields['ou'].empty_label = None
424
        else:
425
            self.fields['ou'].required = False
426
        self.fields['ou'].queryset = ou_qs
427
        if len(ou_qs) < 2:
431
        self.fields['ou'].choices = choices
432
        if len(self.ou_qs) < 2:
428 433
            self.fields['ou'].widget.attrs['disabled'] = ''
429 434

  
430 435
    def filter_no_ou(self, qs):
431
        if self.request.user.is_superuser:
432
            qs = qs.filter(ou__isnull=True)
436
        if self.show_all_ou:
437
            return qs
438
        elif self.ou_qs:
439
            qs = qs.filter(ou=self.ou_qs[0])
433 440
        else:
434 441
            qs = qs.none()
435 442
        return qs
436 443

  
444
    def clean(self):
445
        ou = self.cleaned_data.get('ou')
446
        self.cleaned_data['ou_filter'] = ou
447
        try:
448
            ou_pk = int(ou)
449
        except ValueError:
450
            self.cleaned_data['ou'] = None
451
        else:
452
            for ou in self.ou_qs:
453
                if ou.pk == ou_pk:
454
                    self.cleaned_data['ou'] = ou
455
                    break
456
            else:
457
                self.cleaned_data['ou'] = None
458
        return self.cleaned_data
459

  
460
    def filter_by_ou(self, qs):
461
        if self.cleaned_data.get('ou_filter'):
462
            ou_filter = self.cleaned_data['ou_filter']
463
            ou = self.cleaned_data['ou']
464
            if ou_filter == 'all':
465
                pass
466
            elif ou_filter == 'none':
467
                qs = qs.filter(ou__isnull=True)
468
            elif ou:
469
                qs = qs.filter(ou=ou)
470
        else:
471
            qs = self.filter_no_ou(qs)
472
        return qs
473

  
437 474
    def filter(self, qs):
438 475
        if hasattr(super(OUSearchForm, self), 'filter'):
439 476
            qs = super(OUSearchForm, self).filter(qs)
440
        if self.cleaned_data.get('ou'):
441
            qs = qs.filter(ou=self.cleaned_data['ou'])
442
        else:
443
            qs = self.filter_no_ou(qs)
477
        qs = self.filter_by_ou(qs)
444 478
        return qs
445 479

  
446 480

  
src/authentic2/manager/templates/authentic2/manager/users.html
7 7

  
8 8
{% block appbar %}
9 9
  {{ block.super }}
10
   {% if view.can_add and search_form.cleaned_data.ou %}
10
    {% if view.can_add and search_form.cleaned_data.ou %}
11 11
     <a
12 12
        href="{% url "a2-manager-user-add" ou_pk=search_form.cleaned_data.ou.pk %}"
13 13
        id="add-user-btn">
14
-