Skip to content

Commit e2e8cbb

Browse files
committed
Adding link to serialized data
1 parent 75de7f6 commit e2e8cbb

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

readthedocs/search/api.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from rest_framework import exceptions
33
from rest_framework.exceptions import ValidationError
44

5+
from readthedocs.projects.models import Project
56
from readthedocs.search.documents import PageDocument
67
from readthedocs.search.filters import SearchFilterBackend
78
from readthedocs.search.pagination import SearchPagination
@@ -37,3 +38,30 @@ def validate_query_params(self):
3738
errors[param] = ["This query param is required"]
3839

3940
raise ValidationError(errors)
41+
42+
def get_serializer_context(self):
43+
context = super(PageSearchAPIView, self).get_serializer_context()
44+
context['projects_info'] = self.get_projects_info()
45+
return context
46+
47+
def _get_all_projects(self):
48+
"""Return list of project and its subprojects."""
49+
project_slug = self.request.query_params.get('project')
50+
queryset = Project.objects.api(self.request.user).only('slug')
51+
52+
project = generics.get_object_or_404(queryset, slug=project_slug)
53+
subprojects = queryset.filter(superprojects__parent_id=project.id)
54+
55+
project_list = list(subprojects) + [project]
56+
return project_list
57+
58+
def get_projects_info(self):
59+
version_slug = self.request.query_params.get('version')
60+
all_projects = self._get_all_projects()
61+
projects_info = {}
62+
63+
for project in all_projects:
64+
data = {'docs_url': project.get_docs_url(version_slug=version_slug)}
65+
projects_info[project.slug] = data
66+
67+
return projects_info

readthedocs/search/filters.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from rest_framework import filters
22

3-
from readthedocs.search.utils import get_project_slug_list_or_404
4-
53

64
class SearchFilterBackend(filters.BaseFilterBackend):
75

@@ -12,10 +10,9 @@ def filter_queryset(self, request, queryset, view):
1210
# ``queryset`` is actually a Elasticsearch DSL ``Search`` object.
1311
# So change the variable name
1412
es_search = queryset
15-
project_slug = request.query_params.get('project')
1613
version_slug = request.query_params.get('version')
17-
project_slug_list = get_project_slug_list_or_404(project_slug=project_slug,
18-
user=request.user)
14+
projects_info = view.get_projects_info()
15+
project_slug_list = projects_info.keys()
1916
# Elasticsearch ``terms`` query can take multiple values as list,
2017
# while ``term`` query takes single value.
2118
filtered_es_search = (es_search.filter('terms', project=project_slug_list)

readthedocs/search/serializers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
from rest_framework import serializers
22

3+
from readthedocs.projects.models import Project
4+
35

46
class PageSearchSerializer(serializers.Serializer):
57
project = serializers.CharField()
68
version = serializers.CharField()
79
title = serializers.CharField()
810
path = serializers.CharField()
11+
link = serializers.SerializerMethodField()
912
highlight = serializers.SerializerMethodField()
1013

14+
def get_link(self, obj):
15+
projects_info = self.context.get('projects_info')
16+
if projects_info:
17+
project_data = projects_info[obj.project]
18+
docs_url = project_data['docs_url']
19+
return docs_url + obj.path
20+
1121
def get_highlight(self, obj):
1222
highlight = getattr(obj.meta, 'highlight', None)
1323
if highlight:

readthedocs/search/tests/test_api.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,6 @@ def test_doc_search_subprojects(self, api_client, all_projects):
124124
data = resp.data['results']
125125
assert len(data) == 1
126126
assert data[0]['project'] == subproject.slug
127+
# Check the link is the subproject document link
128+
document_link = subproject.get_docs_url(version_slug=version.slug)
129+
assert document_link in data[0]['link']

0 commit comments

Comments
 (0)