0001-manager-use-and-operator-to-combine-terms-fixes-2895.patch
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 |
- |