Merge pull request #127 from taigaio/bug/1188/issues-text-search

Fixing searchs, using an and for the words we search instead of an or
remotes/origin/enhancement/email-actions
Juanfran 2014-10-16 13:34:11 +02:00
commit 742598a4f8
2 changed files with 84 additions and 3 deletions

View File

@ -246,8 +246,11 @@ class QFilter(FilterBackend):
def filter_queryset(self, request, queryset, view):
q = request.QUERY_PARAMS.get('q', None)
if q:
if q.isdigit():
qs_args = [Q(ref=q)]
else:
qs_args = [Q(subject__icontains=x) for x in q.split()]
qs_args += [Q(ref=x) for x in q.split() if x.isdigit()]
queryset = queryset.filter(reduce(operator.or_, qs_args))
queryset = queryset.filter(reduce(operator.and_, qs_args))
return queryset

View File

@ -69,3 +69,81 @@ def test_api_filter_by_subject(client):
assert response.status_code == 200
assert number_of_issues == 1, number_of_issues
def test_api_filter_by_text_1(client):
f.create_issue()
issue = f.create_issue(subject="this is the issue one")
f.create_issue(subject="this is the issue two", owner=issue.owner)
url = reverse("issues-list") + "?q=one"
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 1
def test_api_filter_by_text_2(client):
f.create_issue()
issue = f.create_issue(subject="this is the issue one")
f.create_issue(subject="this is the issue two", owner=issue.owner)
url = reverse("issues-list") + "?q=this is the issue one"
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 1
def test_api_filter_by_text_3(client):
f.create_issue()
issue = f.create_issue(subject="this is the issue one")
f.create_issue(subject="this is the issue two", owner=issue.owner)
url = reverse("issues-list") + "?q=this is the issue"
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 2
def test_api_filter_by_text_4(client):
f.create_issue()
issue = f.create_issue(subject="this is the issue one")
f.create_issue(subject="this is the issue two", owner=issue.owner)
url = reverse("issues-list") + "?q=one two"
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 0
def test_api_filter_by_text_5(client):
f.create_issue()
issue = f.create_issue(subject="python 3")
url = reverse("issues-list") + "?q=python 3"
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 1
def test_api_filter_by_text_6(client):
f.create_issue()
issue = f.create_issue(subject="test")
url = reverse("issues-list") + "?q=%s"%(issue.ref)
client.login(issue.owner)
response = client.get(url)
number_of_issues = len(response.data)
assert response.status_code == 200
assert number_of_issues == 1