Projet

Général

Profil

0001-manager-use-and-operator-to-combine-terms-fixes-2895.patch

Benjamin Dauvergne, 18 janvier 2019 13:52

Télécharger (4,75 ko)

Voir les différences:

Subject: [PATCH] manager: use and operator to combine terms (fixes #28952)

 src/authentic2/manager/widgets.py | 19 +++++++++++++++---
 tests/test_manager.py             | 32 +++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 3 deletions(-)
src/authentic2/manager/widgets.py
1
import operator
2
from six.moves import reduce
3

  
1 4
from django_select2.forms import ModelSelect2Widget, ModelSelect2MultipleWidget
2 5

  
3 6
from django.contrib.auth import get_user_model
......
11 14

  
12 15

  
13 16
class SplitTermMixin(object):
17
    split_term_operator = operator.__or__
18

  
14 19
    def filter_queryset(self, term, queryset=None):
15 20
        if queryset is not None:
16
            qs = queryset.none()
21
            qs = queryset
17 22
        else:
18
            qs = self.get_queryset().none()
23
            qs = self.get_queryset()
24
        if not term.strip():
25
            return qs.all()
26
        queries = []
19 27
        for term in term.split():
20
            qs |= super(SplitTermMixin, self).filter_queryset(term, queryset=queryset)
28
            queries.append(super(SplitTermMixin, self).filter_queryset(term, queryset=qs))
29
        qs = reduce(self.split_term_operator, queries)
21 30
        return qs
22 31

  
23 32

  
......
79 88

  
80 89
class ChooseRoleWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2Widget):
81 90
    queryset = get_role_model().objects.exclude(slug__startswith='_')
91
    split_term_operator = operator.__and__
82 92
    search_fields = [
83 93
        'name__icontains',
84 94
        'service__name__icontains',
......
88 98

  
89 99
class ChooseRolesWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
90 100
    queryset = get_role_model().objects.exclude(slug__startswith='_')
101
    split_term_operator = operator.__and__
91 102
    search_fields = [
92 103
        'name__icontains',
93 104
        'service__name__icontains',
......
98 109
class ChooseRolesForChangeWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
99 110
    operations = ['change']
100 111
    queryset = get_role_model().objects.all()
112
    split_term_operator = 'AND'
101 113
    search_fields = [
102 114
        'name__icontains',
103 115
        'service__name__icontains',
......
107 119

  
108 120
class ChooseOUWidget(SecurityCheckMixin, ModelSelect2Widget):
109 121
    model = get_ou_model()
122
    split_term_operator = 'AND'
110 123
    search_fields = [
111 124
        'name__icontains',
112 125
    ]
tests/test_manager.py
1
# -*- coding: utf-8 -*-
2

  
1 3
import pytest
2 4
import json
3 5
from urlparse import urlparse
......
790 792
    response = app.get(url)
791 793

  
792 794
    assert querystring in response.location
795
    assert '<input type="hidden" name="next_url" value="%s">' % next_url in form.submit().body
796

  
797

  
798
def test_roles_widget(admin, app, db):
799
    from django.core import signing
800
    from django_rbac.utils import get_role_model, get_ou_model
801
    from authentic2.manager.forms import ChooseRoleForm
802

  
803
    login(app, admin, '/manage/')
804
    OU = get_ou_model()
805
    cassis = OU.objects.create(name=u'Cassis')
806
    la_bedoule = OU.objects.create(name=u'La Bédoule')
807
    cuges = OU.objects.create(name=u'Cuges')
808
    Role = get_role_model()
809
    Role.objects.create(ou=cassis, name=u'Administrateur')
810
    Role.objects.create(ou=la_bedoule, name=u'Administrateur')
811
    Role.objects.create(ou=cuges, name=u'Administrateur')
812

  
813
    form = ChooseRoleForm()
814
    assert form.as_p()
815
    field_id = signing.dumps(id(form.fields['role'].widget))
816
    url = reverse('django_select2-json')
817
    response = app.get(url, params={'field_id': field_id, 'term': 'Admin'})
818
    assert len(response.json['results']) == 3
819
    response = app.get(url, params={'field_id': field_id, 'term': 'Admin cass'})
820
    assert len(response.json['results']) == 1
821
    assert response.json['results'][0]['text'] == u'Cassis - Administrateur'
822
    response = app.get(url, params={'field_id': field_id, 'term': 'Admin édou'})
823
    assert len(response.json['results']) == 1
824
    assert response.json['results'][0]['text'] == u'La Bédoule - Administrateur'
793
-