Merge pull request #419 from taigaio/issue/3125/searchs-api
Issue/3125/searchs apiremotes/origin/enhancement/email-actions
commit
65d1db1c33
|
@ -56,11 +56,12 @@ class SearchViewSet(viewsets.ViewSet):
|
||||||
futures_list.append(wiki_pages_future)
|
futures_list.append(wiki_pages_future)
|
||||||
|
|
||||||
for future in futures.as_completed(futures_list):
|
for future in futures.as_completed(futures_list):
|
||||||
|
data = []
|
||||||
try:
|
try:
|
||||||
data = future.result()
|
data = future.result()
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
print('%s generated an exception: %s' % (future.result_key, exc))
|
print('%s generated an exception: %s' % (future.result_key, exc))
|
||||||
else:
|
finally:
|
||||||
result[future.result_key] = data
|
result[future.result_key] = data
|
||||||
|
|
||||||
result["count"] = sum(map(lambda x: len(x), result.values()))
|
result["count"] = sum(map(lambda x: len(x), result.values()))
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import models, migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('wiki', '0001_initial'),
|
|
||||||
('userstories', '0009_remove_userstory_is_archived'),
|
|
||||||
('issues', '0005_auto_20150623_1923'),
|
|
||||||
('tasks', '0006_auto_20150623_1923'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RunSQL(
|
|
||||||
"""
|
|
||||||
CREATE INDEX "userstories_full_text_idx" ON userstories_userstory USING gin(to_tsvector('simple', coalesce(subject, '') || ' ' || coalesce(ref) || ' ' || coalesce(description, '')));
|
|
||||||
""",
|
|
||||||
reverse_sql="""DROP INDEX IF EXISTS "userstories_full_text_idx";"""
|
|
||||||
),
|
|
||||||
migrations.RunSQL(
|
|
||||||
"""
|
|
||||||
CREATE INDEX "tasks_full_text_idx" ON tasks_task USING gin(to_tsvector('simple', coalesce(subject, '') || ' ' || coalesce(ref) || ' ' || coalesce(description, '')));
|
|
||||||
""",
|
|
||||||
reverse_sql="""DROP INDEX IF EXISTS "tasks_full_text_idx";"""
|
|
||||||
),
|
|
||||||
migrations.RunSQL(
|
|
||||||
"""
|
|
||||||
CREATE INDEX "issues_full_text_idx" ON issues_issue USING gin(to_tsvector('simple', coalesce(subject, '') || ' ' || coalesce(ref) || ' ' || coalesce(description, '')));
|
|
||||||
""",
|
|
||||||
reverse_sql="""DROP INDEX IF EXISTS "issues_full_text_idx";"""
|
|
||||||
),
|
|
||||||
migrations.RunSQL(
|
|
||||||
"""
|
|
||||||
CREATE INDEX "wikipages_full_text_idx" ON wiki_wikipage USING gin(to_tsvector('simple', coalesce(slug, '') || ' ' || coalesce(content, '')));
|
|
||||||
""",
|
|
||||||
reverse_sql="""DROP INDEX IF EXISTS "wikipages_full_text_idx";"""
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -23,12 +23,12 @@ MAX_RESULTS = getattr(settings, "SEARCHES_MAX_RESULTS", 150)
|
||||||
|
|
||||||
def search_user_stories(project, text):
|
def search_user_stories(project, text):
|
||||||
model_cls = apps.get_model("userstories", "UserStory")
|
model_cls = apps.get_model("userstories", "UserStory")
|
||||||
where_clause = ("to_tsvector('simple', coalesce(userstories_userstory.subject, '') || ' ' || "
|
where_clause = ("to_tsvector(coalesce(userstories_userstory.subject) || ' ' || "
|
||||||
"coalesce(userstories_userstory.ref) || ' ' || "
|
"coalesce(userstories_userstory.ref) || ' ' || "
|
||||||
"coalesce(userstories_userstory.description, '')) @@ to_tsquery(%s)")
|
"coalesce(userstories_userstory.description, '')) "
|
||||||
|
"@@ plainto_tsquery(%s)")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
text += ":*"
|
|
||||||
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
||||||
.filter(project_id=project.pk)[:MAX_RESULTS])
|
.filter(project_id=project.pk)[:MAX_RESULTS])
|
||||||
|
|
||||||
|
@ -37,12 +37,11 @@ def search_user_stories(project, text):
|
||||||
|
|
||||||
def search_tasks(project, text):
|
def search_tasks(project, text):
|
||||||
model_cls = apps.get_model("tasks", "Task")
|
model_cls = apps.get_model("tasks", "Task")
|
||||||
where_clause = ("to_tsvector('simple', coalesce(tasks_task.subject, '') || ' ' || "
|
where_clause = ("to_tsvector(coalesce(tasks_task.subject, '') || ' ' || "
|
||||||
"coalesce(tasks_task.ref) || ' ' || "
|
"coalesce(tasks_task.ref) || ' ' || "
|
||||||
"coalesce(tasks_task.description, '')) @@ to_tsquery(%s)")
|
"coalesce(tasks_task.description, '')) @@ plainto_tsquery(%s)")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
text += ":*"
|
|
||||||
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
||||||
.filter(project_id=project.pk)[:MAX_RESULTS])
|
.filter(project_id=project.pk)[:MAX_RESULTS])
|
||||||
|
|
||||||
|
@ -51,12 +50,11 @@ def search_tasks(project, text):
|
||||||
|
|
||||||
def search_issues(project, text):
|
def search_issues(project, text):
|
||||||
model_cls = apps.get_model("issues", "Issue")
|
model_cls = apps.get_model("issues", "Issue")
|
||||||
where_clause = ("to_tsvector('simple', coalesce(issues_issue.subject) || ' ' || "
|
where_clause = ("to_tsvector(coalesce(issues_issue.subject) || ' ' || "
|
||||||
"coalesce(issues_issue.ref) || ' ' || "
|
"coalesce(issues_issue.ref) || ' ' || "
|
||||||
"coalesce(issues_issue.description)) @@ to_tsquery(%s)")
|
"coalesce(issues_issue.description, '')) @@ plainto_tsquery(%s)")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
text += ":*"
|
|
||||||
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
||||||
.filter(project_id=project.pk)[:MAX_RESULTS])
|
.filter(project_id=project.pk)[:MAX_RESULTS])
|
||||||
|
|
||||||
|
@ -65,11 +63,11 @@ def search_issues(project, text):
|
||||||
|
|
||||||
def search_wiki_pages(project, text):
|
def search_wiki_pages(project, text):
|
||||||
model_cls = apps.get_model("wiki", "WikiPage")
|
model_cls = apps.get_model("wiki", "WikiPage")
|
||||||
where_clause = ("to_tsvector('simple', coalesce(wiki_wikipage.slug) || ' ' || coalesce(wiki_wikipage.content)) "
|
where_clause = ("to_tsvector(coalesce(wiki_wikipage.slug) || ' ' || "
|
||||||
"@@ to_tsquery(%s)")
|
"coalesce(wiki_wikipage.content, '')) "
|
||||||
|
"@@ plainto_tsquery(%s)")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
text += ":*"
|
|
||||||
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
return (model_cls.objects.extra(where=[where_clause], params=[text])
|
||||||
.filter(project_id=project.pk)[:MAX_RESULTS])
|
.filter(project_id=project.pk)[:MAX_RESULTS])
|
||||||
|
|
||||||
|
|
|
@ -74,11 +74,11 @@ def searches_initial_data():
|
||||||
m.tsk2 = f.TaskFactory.create(project=m.project1)
|
m.tsk2 = f.TaskFactory.create(project=m.project1)
|
||||||
m.tsk3 = f.TaskFactory.create(project=m.project1, subject="Back to the future")
|
m.tsk3 = f.TaskFactory.create(project=m.project1, subject="Back to the future")
|
||||||
|
|
||||||
m.iss1 = f.IssueFactory.create(project=m.project1, subject="Design and Frontend")
|
m.iss1 = f.IssueFactory.create(project=m.project1, subject="Backend and Frontend")
|
||||||
m.iss2 = f.IssueFactory.create(project=m.project2)
|
m.iss2 = f.IssueFactory.create(project=m.project2)
|
||||||
m.iss3 = f.IssueFactory.create(project=m.project1, subject="Green Frog")
|
m.iss3 = f.IssueFactory.create(project=m.project1)
|
||||||
|
|
||||||
m.wiki1 = f.WikiPageFactory.create(project=m.project1, content="Final Frontier")
|
m.wiki1 = f.WikiPageFactory.create(project=m.project1)
|
||||||
m.wiki2 = f.WikiPageFactory.create(project=m.project1, content="Frontend, future")
|
m.wiki2 = f.WikiPageFactory.create(project=m.project1, content="Frontend, future")
|
||||||
m.wiki3 = f.WikiPageFactory.create(project=m.project2)
|
m.wiki3 = f.WikiPageFactory.create(project=m.project2)
|
||||||
|
|
||||||
|
@ -131,20 +131,6 @@ def test_search_text_query_in_my_project(client, searches_initial_data):
|
||||||
assert len(response.data["wikipages"]) == 0
|
assert len(response.data["wikipages"]) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_search_partial_text_query_in_my_project(client, searches_initial_data):
|
|
||||||
data = searches_initial_data
|
|
||||||
|
|
||||||
client.login(data.member1.user)
|
|
||||||
|
|
||||||
response = client.get(reverse("search-list"), {"project": data.project1.id, "text": "fron"})
|
|
||||||
assert response.status_code == 200
|
|
||||||
assert response.data["count"] == 3
|
|
||||||
assert len(response.data["userstories"]) == 0
|
|
||||||
assert len(response.data["tasks"]) == 0
|
|
||||||
assert len(response.data["issues"]) == 1
|
|
||||||
assert len(response.data["wikipages"]) == 2
|
|
||||||
|
|
||||||
|
|
||||||
def test_search_text_query_with_an_invalid_project_id(client, searches_initial_data):
|
def test_search_text_query_with_an_invalid_project_id(client, searches_initial_data):
|
||||||
data = searches_initial_data
|
data = searches_initial_data
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue