manager: use and operator to combine terms (fixes #28952)
This commit is contained in:
parent
a855c86c29
commit
b03a76dfff
|
@ -1,3 +1,6 @@
|
||||||
|
import operator
|
||||||
|
from six.moves import reduce
|
||||||
|
|
||||||
from django_select2.forms import ModelSelect2Widget, ModelSelect2MultipleWidget
|
from django_select2.forms import ModelSelect2Widget, ModelSelect2MultipleWidget
|
||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
@ -11,13 +14,19 @@ from . import utils
|
||||||
|
|
||||||
|
|
||||||
class SplitTermMixin(object):
|
class SplitTermMixin(object):
|
||||||
|
split_term_operator = operator.__or__
|
||||||
|
|
||||||
def filter_queryset(self, term, queryset=None):
|
def filter_queryset(self, term, queryset=None):
|
||||||
if queryset is not None:
|
if queryset is not None:
|
||||||
qs = queryset.none()
|
qs = queryset
|
||||||
else:
|
else:
|
||||||
qs = self.get_queryset().none()
|
qs = self.get_queryset()
|
||||||
|
if not term.strip():
|
||||||
|
return qs.all()
|
||||||
|
queries = []
|
||||||
for term in term.split():
|
for term in term.split():
|
||||||
qs |= super(SplitTermMixin, self).filter_queryset(term, queryset=queryset)
|
queries.append(super(SplitTermMixin, self).filter_queryset(term, queryset=qs))
|
||||||
|
qs = reduce(self.split_term_operator, queries)
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
|
||||||
|
@ -79,6 +88,7 @@ class ChooseUsersWidget(SecurityCheckMixin, ModelSelect2MultipleWidget):
|
||||||
|
|
||||||
class ChooseRoleWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2Widget):
|
class ChooseRoleWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2Widget):
|
||||||
queryset = get_role_model().objects.exclude(slug__startswith='_')
|
queryset = get_role_model().objects.exclude(slug__startswith='_')
|
||||||
|
split_term_operator = operator.__and__
|
||||||
search_fields = [
|
search_fields = [
|
||||||
'name__icontains',
|
'name__icontains',
|
||||||
'service__name__icontains',
|
'service__name__icontains',
|
||||||
|
@ -88,6 +98,7 @@ class ChooseRoleWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2Widget):
|
||||||
|
|
||||||
class ChooseRolesWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
|
class ChooseRolesWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
|
||||||
queryset = get_role_model().objects.exclude(slug__startswith='_')
|
queryset = get_role_model().objects.exclude(slug__startswith='_')
|
||||||
|
split_term_operator = operator.__and__
|
||||||
search_fields = [
|
search_fields = [
|
||||||
'name__icontains',
|
'name__icontains',
|
||||||
'service__name__icontains',
|
'service__name__icontains',
|
||||||
|
@ -98,6 +109,7 @@ class ChooseRolesWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2Multiple
|
||||||
class ChooseRolesForChangeWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
|
class ChooseRolesForChangeWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect2MultipleWidget):
|
||||||
operations = ['change']
|
operations = ['change']
|
||||||
queryset = get_role_model().objects.all()
|
queryset = get_role_model().objects.all()
|
||||||
|
split_term_operator = 'AND'
|
||||||
search_fields = [
|
search_fields = [
|
||||||
'name__icontains',
|
'name__icontains',
|
||||||
'service__name__icontains',
|
'service__name__icontains',
|
||||||
|
@ -107,6 +119,7 @@ class ChooseRolesForChangeWidget(RoleLabelMixin, SecurityCheckMixin, ModelSelect
|
||||||
|
|
||||||
class ChooseOUWidget(SecurityCheckMixin, ModelSelect2Widget):
|
class ChooseOUWidget(SecurityCheckMixin, ModelSelect2Widget):
|
||||||
model = get_ou_model()
|
model = get_ou_model()
|
||||||
|
split_term_operator = 'AND'
|
||||||
search_fields = [
|
search_fields = [
|
||||||
'name__icontains',
|
'name__icontains',
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import json
|
import json
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
@ -805,3 +807,32 @@ def test_manager_edit_user_next_form_error(superuser_or_admin, app, ou1, simple_
|
||||||
form.set('email', 'jd') # erroneous
|
form.set('email', 'jd') # erroneous
|
||||||
resp = form.submit()
|
resp = form.submit()
|
||||||
assert '<input type="hidden" name="next" value="%s">' % next_url in resp.ubody
|
assert '<input type="hidden" name="next" value="%s">' % next_url in resp.ubody
|
||||||
|
|
||||||
|
|
||||||
|
def test_roles_widget(admin, app, db):
|
||||||
|
from django.core import signing
|
||||||
|
from django_rbac.utils import get_role_model, get_ou_model
|
||||||
|
from authentic2.manager.forms import ChooseRoleForm
|
||||||
|
|
||||||
|
login(app, admin, '/manage/')
|
||||||
|
OU = get_ou_model()
|
||||||
|
cassis = OU.objects.create(name=u'Cassis')
|
||||||
|
la_bedoule = OU.objects.create(name=u'La Bédoule')
|
||||||
|
cuges = OU.objects.create(name=u'Cuges')
|
||||||
|
Role = get_role_model()
|
||||||
|
Role.objects.create(ou=cassis, name=u'Administrateur')
|
||||||
|
Role.objects.create(ou=la_bedoule, name=u'Administrateur')
|
||||||
|
Role.objects.create(ou=cuges, name=u'Administrateur')
|
||||||
|
|
||||||
|
form = ChooseRoleForm()
|
||||||
|
assert form.as_p()
|
||||||
|
field_id = signing.dumps(id(form.fields['role'].widget))
|
||||||
|
url = reverse('django_select2-json')
|
||||||
|
response = app.get(url, params={'field_id': field_id, 'term': 'Admin'})
|
||||||
|
assert len(response.json['results']) == 3
|
||||||
|
response = app.get(url, params={'field_id': field_id, 'term': 'Admin cass'})
|
||||||
|
assert len(response.json['results']) == 1
|
||||||
|
assert response.json['results'][0]['text'] == u'Cassis - Administrateur'
|
||||||
|
response = app.get(url, params={'field_id': field_id, 'term': 'Admin édou'})
|
||||||
|
assert len(response.json['results']) == 1
|
||||||
|
assert response.json['results'][0]['text'] == u'La Bédoule - Administrateur'
|
||||||
|
|
Loading…
Reference in New Issue