Skip to content

Commit

Permalink
Merge pull request #58 from andela/bg—customize-search-functionality-…
Browse files Browse the repository at this point in the history
…165963466

bug(#165963466): Customising data representation in the search functionality
  • Loading branch information
abulojoshua1 committed May 13, 2019
2 parents 52a38df + 2dff2e4 commit 223f8c2
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 86 deletions.
4 changes: 2 additions & 2 deletions authors/apps/articles/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class SearchJSONRenderer(JSONRenderer):
article_formatting = ArticleJSONRenderer()

def render(self, data, media_type=None, renderer_context=None):
if "articles" in data.keys():
for item in data["articles"]:
if "results" in data.keys():
for item in data["results"]:
item = self.article_formatting._single_article_formatting(item)
return json.dumps(data)
50 changes: 19 additions & 31 deletions authors/apps/articles/tests/test_article_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,57 +365,45 @@ def test_search_for_article(self):
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)

# Search for an article
test_data = {
"search_string": "o"
}
response = client.put(reverse('articles:search-article'),
test_data, **self.header_user1, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
response = client.put(reverse('articles:search-article'),
**self.header_user1, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

my_url = '/api/articles/user/search/?query=tags,author,title,description,body'
respo1 = client.put(
my_url = '/api/articles/author/search/?query=o'
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)
my_url = '/api/articles/user/search/?query=tags'
respo1 = client.put(
my_url = '/api/articles/title/search/?query=o'
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)
my_url = '/api/articles/user/search/?query=author'
respo1 = client.put(
my_url = '/api/articles/body/search/?query=o'
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)
my_url = '/api/articles/user/search/?query=title'
respo1 = client.put(
my_url = '/api/articles/tags/search/?query=o'
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)
my_url = '/api/articles/user/search/?query=description'
respo1 = client.put(
my_url = '/api/articles/description/search/?query=o'
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)
my_url = '/api/articles/user/search/?query=body'
respo1 = client.put(
my_url = '/api/articles/description/search/?query='
respo1 = client.get(
my_url,
test_data,
**self.header_user1,
format='json',
)
self.assertEqual(respo1.status_code, status.HTTP_200_OK)

self.assertEqual(respo1.status_code, status.HTTP_400_BAD_REQUEST)
2 changes: 1 addition & 1 deletion authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@
views.GetUserBookmarksView.as_view(), name="get_bookmarks"),
path('<slug:slug>/report/',
views.ReportAnArticle.as_view(), name="report-article"),
path('user/search/',
path('<slug:slug>/search/',
views.SearchForArticles.as_view(), name="search-article"),
]
91 changes: 39 additions & 52 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -801,73 +801,60 @@ class SearchForArticles(generics.ListAPIView):
serializer_class = TheArticleSerializer
permission_classes = (AllowAny,)
renderer_classes = (SearchJSONRenderer,)
pagination_class = LimitOffsetPagination

def put(self, request, *args, **kwargs):
def get(self, request, slug):
'''Searches for the search_string given in the following areas
[tags, author, title, description,body] if either is
supplied else it returns all articles given the search_string'''
search_string = request.data.get('search_string', '')
my_query_params = request.query_params.get('query', None)
query_fields = []
payload = {
"article_author_hits": 0,
"article_body_hits": 0,
"article_tag_hits": 0,
"article_description_hits": 0,
"article_title_hits": 0,
"total_articles": 0,
"articles": []
}
search_fields = []
if (my_query_params):
search_fields = my_query_params.split(",")
search_string = request.query_params.get('query', None)
payload = []
if not search_string:
payload = {
reply = {
"message": "Please enter a search string."
}
return Response(payload, status=status.HTTP_400_BAD_REQUEST)

if('title' in search_fields) or (not search_fields):
query = Article.objects.filter(title__icontains=search_string)
payload["article_title_hits"] = len(query)
query_fields = list(set(query_fields + list(query)))
if('body' in search_fields) or (not search_fields):
query = Article.objects.filter(body__icontains=search_string)
payload["article_body_hits"] = len(query)
query_fields = list(set(query_fields + list(query)))
if('author' in search_fields) or (not search_fields):
query = Article.objects.filter(
author__user__username__icontains=search_string
return Response(reply, status=status.HTTP_400_BAD_REQUEST)

if slug == "author":
payload = Article.objects.filter(
author__user__username__icontains=search_string, published=True,
activated=True
)
payload["article_author_hits"] = len(query)
query_fields = list(set(query_fields + list(query)))
if('description' in search_fields) or (not search_fields):
query = Article.objects.filter(
description__icontains=search_string
if slug == "title":
payload = Article.objects.filter(
title__icontains=search_string, published=True,
activated=True
)
if slug == "body":
payload = Article.objects.filter(
body__icontains=search_string, published=True,
activated=True
)
if slug == "description":
payload = Article.objects.filter(
description__icontains=search_string, published=True,
activated=True
)
payload["article_description_hits"] = len(query)
query_fields = list(set(query_fields + list(query)))

matching_tags = []
if('tags' in search_fields) or (not search_fields):
matching_tags = list(Tag.objects.filter(
tag__icontains=search_string
))
if matching_tags:
count = 0
matching_tags = list(Tag.objects.filter(
tag__icontains=search_string
))
if matching_tags and slug == "tags":
for item in matching_tags:
query = Article.objects.filter(
tags__id__icontains=item.id
tags__id__icontains=item.id, published=True,
activated=True
)
payload = list(
set(payload + list(query))
)
query_fields = list(set(query_fields + list(query)))
count += len(query)
payload["article_tag_hits"] = count

paginator = self.pagination_class()
page = paginator.paginate_queryset(payload, request)

serializer = self.serializer_class(
query_fields, many=True,
page, many=True,
context={"current_user": request.user, "request": request}
)
payload["total_articles"] = len(query_fields)
payload["articles"] = serializer.data
return paginator.get_paginated_response(serializer.data)

return Response(payload, status=status.HTTP_200_OK)

0 comments on commit 223f8c2

Please sign in to comment.