From 381313998a148ae79b604879f154d9950f4bd7f0 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Tue, 28 Apr 2015 14:59:44 +0200 Subject: [PATCH 01/11] Added search functionality from unicore-cms --- springboard/config.py | 1 + springboard/templates/atoms.html | 3 + springboard/templates/base.jinja2 | 6 + springboard/templates/molecules.html | 123 ++++++++++++++++++++ springboard/templates/organisms.html | 12 ++ springboard/templates/search_results.jinja2 | 24 ++++ springboard/utils.py | 112 ++++++++++++++++++ springboard/views.py | 45 +++++++ 8 files changed, 326 insertions(+) create mode 100644 springboard/templates/atoms.html create mode 100644 springboard/templates/molecules.html create mode 100644 springboard/templates/organisms.html create mode 100644 springboard/templates/search_results.jinja2 diff --git a/springboard/config.py b/springboard/config.py index 55059b7..b4522ec 100644 --- a/springboard/config.py +++ b/springboard/config.py @@ -4,6 +4,7 @@ def includeme(config): config.add_route('home', '/') config.add_route('category', '/category/{uuid}/') config.add_route('page', '/page/{uuid}/') + config.add_route('search', '/search/') # NB: /{slug}/ hides other /[^/]+/ routes - keep it last config.add_route('flat_page', '/{slug}/') config.add_route('api_notify', '/api/notify/', request_method='POST') diff --git a/springboard/templates/atoms.html b/springboard/templates/atoms.html new file mode 100644 index 0000000..b9f60a2 --- /dev/null +++ b/springboard/templates/atoms.html @@ -0,0 +1,3 @@ +{% macro image(src, srcset, alt) -%} + {{alt}} +{%- endmacro %} diff --git a/springboard/templates/base.jinja2 b/springboard/templates/base.jinja2 index 5839a51..4cf32d1 100644 --- a/springboard/templates/base.jinja2 +++ b/springboard/templates/base.jinja2 @@ -1,3 +1,5 @@ +{% import 'molecules.html' as molecules %} + @@ -43,5 +45,9 @@ {% endblock %} + {% block search %} + {{molecules.search_box(view)}} + {% endblock %} + diff --git a/springboard/templates/molecules.html b/springboard/templates/molecules.html new file mode 100644 index 0000000..34b2953 --- /dev/null +++ b/springboard/templates/molecules.html @@ -0,0 +1,123 @@ +{% import 'atoms.html' as atoms %} + +{% macro list_of_languages(view, languages, styling_classes) -%} + +{%- endmacro %} + +{% macro logo(view, src, styling_classes) -%} + +{%- endmacro %} + +{% macro banner_with_image(src) -%} + +{%- endmacro %} + + +{% macro list_of_site_links(view, dict, styling_classes) -%} + +{%- endmacro %} + +{% macro image_and_heading(view, cat, styling_classes) -%} +
+{{atoms.image( view.get_image_url(cat.image_host, cat.image, 45, 45), "" , "" ) }} +

{{cat.title}}

+
+{%- endmacro %} + +{% macro footer(message) -%} + +{%- endmacro %} + +{% macro search_box(view) -%} +
+ + +
+{%- endmacro %} + +{% macro page_number_navigator(view, paginator, p, query) -%} + + {% if paginator.has_previous_page() %} + < Previous + {% endif %} + + {% if paginator.show_start() %} + 1 + {% endif %} + + {% if paginator.needs_start_ellipsis() %} + ... + {% endif %} + + {% if paginator.page_numbers_left() %} + {% for number in paginator.page_numbers_left() %} + {{number + 1}} + {% endfor %} + {% endif %} + + {{p + 1}} + + {% if paginator.page_numbers_right() %} + {% for number in paginator.page_numbers_right() %} + {{number + 1}} + {% endfor %} + {% endif %} + + {% if paginator.needs_end_ellipsis() %} + ... + {% endif %} + + {% if paginator.show_end() %} + {{paginator.total_pages()}} + {% endif %} + + {% if paginator.has_next_page() %} + Next > + {% endif %} + +{%- endmacro %} + +{% macro message_for_no_results(query) -%} + {% if query %} +

No results found for {{query}}

+ {% else %} +

No results found!

+ {% endif %} +{%- endmacro %} + +{% macro search_summary(num_of_results, query) -%} + {% if num_of_results==1 %} +

1 search result for: {{query}}

+ {% elif num_of_results > 1 %} +

{{num_of_results}} search results for: {{query}}

+ {% endif %} +{%- endmacro %} + +{% macro article_summary(result, view) -%} + {% if result.primary_category %} +

{{view.get_category(result.primary_category).title}}

+ {% endif %} + {{result.title}} ... Read More > +{%- endmacro %} \ No newline at end of file diff --git a/springboard/templates/organisms.html b/springboard/templates/organisms.html new file mode 100644 index 0000000..ed25dd6 --- /dev/null +++ b/springboard/templates/organisms.html @@ -0,0 +1,12 @@ +{% import 'molecules.html' as molecules %} +{% import 'atoms.html' as atoms %} + +{% macro list_of_returned_articles(paginator, view) -%} + +{%- endmacro %} diff --git a/springboard/templates/search_results.jinja2 b/springboard/templates/search_results.jinja2 new file mode 100644 index 0000000..79760cb --- /dev/null +++ b/springboard/templates/search_results.jinja2 @@ -0,0 +1,24 @@ +{% extends "base.jinja2" %} +{% import 'atoms.html' as atoms %} +{% import 'molecules.html' as molecules %} +{% import 'organisms.html' as organisms %} + +{% block content %} +
+ +{% if paginator %} + + {{molecules.search_summary(paginator.total_count(), query)}} + + {% if paginator.total_pages() > 1 %} + {{molecules.page_number_navigator(view, paginator, p, query)}} + {% endif %} + + {{organisms.list_of_returned_articles(paginator, view)}} + +{% else %} + {{molecules.message_for_no_results(query)}} +{% endif %} + +
+{% endblock %} \ No newline at end of file diff --git a/springboard/utils.py b/springboard/utils.py index 7c67eae..6b6a1fe 100644 --- a/springboard/utils.py +++ b/springboard/utils.py @@ -1,5 +1,6 @@ from functools import wraps from urlparse import urlparse +import math def parse_repo_name(repo_url): @@ -38,3 +39,114 @@ def wrapper(self, *args, **kwargs): return context return wrapper return decorator + + +class Paginator(object): + + """A thing that helps us page through result sets""" + + def __init__(self, results, page, results_per_page=10, slider_value=5): + self.results = results + self.page = page + self.results_per_page = results_per_page + self.slider_value = slider_value + self.buffer_value = self.slider_value / 2 + + def total_count(self): + return len(self.results) + + def get_page(self): + return self.results[self.page * self.results_per_page: + (self.page + 1) * self.results_per_page] + + def has_next_page(self): + return ((self.page + 1) * self.results_per_page) < self.total_count() + + def has_previous_page(self): + return self.page + + def total_pages(self): + return int( + math.ceil( + float(self.total_count()) / float(self.results_per_page))) + + def page_numbers(self): + if (self.page - self.buffer_value) < 0: + return [page_number + for page_number in range( + 0, min([self.slider_value, self.total_pages()]))] + elif (self.page + self.buffer_value) >= self.total_pages(): + return [page_number + for page_number in range( + max((self.total_pages() - self.slider_value), 0), + self.total_pages()) + ] + else: + return range(self.page - self.buffer_value, + self.page + self.buffer_value + 1) + + def page_numbers_left(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[:page_numbers.index(self.page)] + + def page_numbers_right(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[page_numbers.index(self.page) + 1:] + + def needs_start_ellipsis(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[0] > 1 + + def needs_end_ellipsis(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[-1] < (self.total_pages() - 2) + + def show_start(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[0] > 0 + + def show_end(self): + page_numbers = self.page_numbers() + if not any(page_numbers): + return False + return page_numbers[-1] < self.total_pages() - 1 + + +class EGPaginator(Paginator): + + def total_count(self): + return self.results.count() + + def get_page(self): + return to_eg_objects(super(EGPaginator, self).get_page()) + + +class ResultGenerator(object): + + def __init__(self, es_results): + self.es_results = es_results + + def __iter__(self): + return (obj.get_object() for obj in self.es_results) + + def __len__(self): + return self.es_results.__len__() + + def __getitem__(self, k): + if isinstance(k, slice): + return ResultGenerator(self.es_results.__getitem__(k)) + return self.es_results.__getitem__(k).get_object() + + +def to_eg_objects(es_results): + return ResultGenerator(es_results) diff --git a/springboard/views.py b/springboard/views.py index 897fa1a..7f16209 100644 --- a/springboard/views.py +++ b/springboard/views.py @@ -8,6 +8,7 @@ from unicore.content.models import Category, Page from unicore.distribute.tasks import fastforward +from utils import EGPaginator from slugify import slugify @@ -51,6 +52,46 @@ def category(self): [category] = self.all_categories.filter(uuid=uuid) return self.context(category=category) + @view_config(route_name='search', + renderer='springboard:templates/search_results.jinja2') + def search(self): + + query = self.request.GET.get('q') + p = int(self.request.GET.get('p', 0)) + + empty_defaults = { + 'paginator': [], + 'query': query, + 'p': p, + } + + # handle query exception + if not query: + return empty_defaults + + all_results = self.workspace.S(Page).query( + content__query_string=query).filter(language=self.language) + + # no results found + if all_results.count() == 0: + return empty_defaults + + paginator = EGPaginator(all_results, p) + + # requested page number is out of range + total_pages = paginator.total_pages() + # sets the floor to 0 + p = p if p >= 0 else 0 + # sets the roof to `total_pages -1` + p = p if p < total_pages else total_pages - 1 + paginator = EGPaginator(all_results, p) + + return { + 'paginator': paginator, + 'query': query, + 'p': p, + } + @ga_context(lambda context: {'dt': context['page'].title, }) @view_config(route_name='page', renderer='springboard:templates/page.jinja2') @@ -74,3 +115,7 @@ def api_notify(self): fastforward.delay(self.workspace.working_dir, self.workspace.index_prefix) return {} + + def get_category(self, uuid): + [category] = self.workspace.S(Category).filter(uuid=uuid) + return category.get_object() From 5ac7bafa513f0c0580c37d094f90af0c7397d273 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Wed, 29 Apr 2015 11:04:21 +0200 Subject: [PATCH 02/11] Copied tests for paginator into utils from unicore-cms --- springboard/tests/test_utils.py | 79 ++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/springboard/tests/test_utils.py b/springboard/tests/test_utils.py index 52565f7..8aad350 100644 --- a/springboard/tests/test_utils.py +++ b/springboard/tests/test_utils.py @@ -1,6 +1,6 @@ from unittest import TestCase -from springboard.utils import parse_repo_name +from springboard.utils import parse_repo_name, Paginator class TestUtils(TestCase): @@ -18,3 +18,80 @@ def test_parse_repo_name(self): self.assertParsed('foo', 'ssh://git@domain:repo/foo') self.assertParsed('foo', 'http://domain/repo/foo') self.assertParsed('foo', 'https://domain/repo/foo') + + def test_first_page(self): + paginator = Paginator(range(100), 0) + self.assertTrue(paginator.has_next_page()) + self.assertFalse(paginator.has_previous_page()) + self.assertEqual(paginator.total_pages(), 10) + self.assertEqual(paginator.page_numbers(), [0, 1, 2, 3, 4]) + self.assertFalse(paginator.needs_start_ellipsis()) + self.assertTrue(paginator.needs_end_ellipsis()) + self.assertEqual(paginator.page_numbers_left(), []) + self.assertEqual(paginator.page_numbers_right(), [1, 2, 3, 4]) + + def test_last_page(self): + paginator = Paginator(range(100), 9) + self.assertFalse(paginator.has_next_page()) + self.assertTrue(paginator.has_previous_page()) + self.assertEqual(paginator.total_pages(), 10) + self.assertEqual(paginator.page_numbers(), [5, 6, 7, 8, 9]) + self.assertTrue(paginator.needs_start_ellipsis()) + self.assertFalse(paginator.needs_end_ellipsis()) + self.assertEqual(paginator.page_numbers_left(), [5, 6, 7, 8]) + self.assertEqual(paginator.page_numbers_right(), []) + + def test_middle_page(self): + paginator = Paginator(range(100), 4) + self.assertTrue(paginator.has_next_page()) + self.assertTrue(paginator.has_previous_page()) + self.assertEqual(paginator.total_pages(), 10) + self.assertEqual(paginator.page_numbers(), [2, 3, 4, 5, 6]) + self.assertTrue(paginator.needs_start_ellipsis()) + self.assertTrue(paginator.needs_end_ellipsis()) + self.assertEqual(paginator.page_numbers_left(), [2, 3]) + self.assertEqual(paginator.page_numbers_right(), [5, 6]) + + def test_show_start(self): + paginator = Paginator(range(100), 3) + self.assertTrue(paginator.show_start()) + self.assertFalse(paginator.needs_start_ellipsis()) + self.assertEqual(paginator.page_numbers_left(), [1, 2]) + self.assertEqual(paginator.page_numbers_right(), [4, 5]) + + def test_show_end(self): + paginator = Paginator(range(100), 7) + self.assertTrue(paginator.show_start()) + self.assertTrue(paginator.needs_start_ellipsis()) + self.assertEqual(paginator.page_numbers(), [5, 6, 7, 8, 9]) + self.assertEqual(paginator.page_numbers_left(), [5, 6]) + self.assertEqual(paginator.page_numbers_right(), [8, 9]) + self.assertFalse(paginator.show_end()) + self.assertFalse(paginator.needs_end_ellipsis()) + + def test_show_end_not_ellipsis(self): + paginator = Paginator(range(100), 6) + self.assertTrue(paginator.show_start()) + self.assertTrue(paginator.needs_start_ellipsis()) + self.assertEqual(paginator.page_numbers(), [4, 5, 6, 7, 8]) + self.assertEqual(paginator.page_numbers_left(), [4, 5]) + self.assertEqual(paginator.page_numbers_right(), [7, 8]) + self.assertTrue(paginator.show_end()) + self.assertFalse(paginator.needs_end_ellipsis()) + + def test_small_result_set(self): + paginator = Paginator(range(39), 0) + self.assertFalse(paginator.show_start()) + self.assertFalse(paginator.needs_start_ellipsis()) + self.assertFalse(paginator.show_end()) + self.assertFalse(paginator.needs_end_ellipsis()) + self.assertEqual(paginator.page_numbers_left(), []) + self.assertEqual(paginator.page_numbers_right(), [1, 2, 3]) + + def test_large_end_result_set(self): + paginator = Paginator(range(133), 12) + self.assertEqual(paginator.page_numbers(), [9, 10, 11, 12, 13]) + self.assertEqual(paginator.page_numbers_left(), [9, 10, 11]) + self.assertEqual(paginator.page_numbers_right(), [13]) + self.assertFalse(paginator.show_end()) + self.assertFalse(paginator.needs_end_ellipsis()) From b0be60bc630033382e71e5215146f6307236e20e Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Wed, 29 Apr 2015 13:09:49 +0200 Subject: [PATCH 03/11] added tests for everything except language tests --- springboard/tests/test_search.py | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 springboard/tests/test_search.py diff --git a/springboard/tests/test_search.py b/springboard/tests/test_search.py new file mode 100644 index 0000000..96da789 --- /dev/null +++ b/springboard/tests/test_search.py @@ -0,0 +1,78 @@ +from springboard.tests import SpringboardTestCase + + +from pyramid import testing +from unicore.content.models import Page + + +class TestSearch(SpringboardTestCase): + + def setUp(self): + self.workspace = self.mk_workspace() + self.config = testing.setUp(settings={ + 'unicore.repos_dir': self.working_dir, + 'unicore.content_repo_url': self.workspace.working_dir, + }) + + def tearDown(self): + testing.tearDown() + + def test_search_no_results(self): + self.app = self.mk_app(self.workspace) + + resp = self.app.get('/search/', params={'q': ''}, status=200) + self.assertTrue('No results found' in resp.body) + + def test_search_blank(self): + self.app = self.mk_app(self.workspace) + self.mk_pages(self.workspace) + + resp = self.app.get('/search/', params={'q': None}, status=200) + self.assertTrue('No results found' in resp.body) + + def test_search_2_results(self): + self.app = self.mk_app(self.workspace) + self.mk_pages(self.workspace, count=2) + resp = self.app.get('/search/', params={'q': 'sample'}, status=200) + + self.assertFalse('No results found' in resp.body) + self.assertTrue('Test Page 0' in resp.body) + self.assertTrue('Test Page 1' in resp.body) + + def test_search_multiple_results(self): + self.app = self.mk_app(self.workspace) + self.mk_pages(self.workspace, count=11) + resp = self.app.get('/search/', params={'q': 'sample'}, status=200) + self.assertTrue( + 'Next >' + in resp.body) + + def test_search_profanity(self): + self.app = self.mk_app(self.workspace) + self.mk_pages(self.workspace, count=2) + + resp = self.app.get('/search/', params={'q': 'kak'}, status=200) + + self.assertTrue('No results found' in resp.body) + + def test_search_added_page(self): + self.app = self.mk_app(self.workspace) + mother_page = Page({ + 'title': 'title for mother', 'language': 'eng_GB', 'position': 2, + 'content': 'Page for mother test page'}) + self.workspace.save(mother_page, 'Add mother page') + + self.workspace.refresh_index() + + resp = self.app.get('/search/', params={'q': 'mother'}, status=200) + + self.assertTrue('mother' in resp.body) + self.assertFalse('No results found' in resp.body) + + def test_pagination(self): + self.app = self.mk_app(self.workspace) + self.mk_pages(self.workspace, count=15, content='baby') + resp = self.app.get( + '/search/', params={'q': 'baby', 'p': '0'}, status=200) + self.assertFalse('Previous' in resp.body) + self.assertTrue('Next' in resp.body) From d8b6acfb7c8a18fceec48047d277bae57694f2ac Mon Sep 17 00:00:00 2001 From: Rizmari Versfeld Date: Thu, 30 Apr 2015 22:32:04 +0200 Subject: [PATCH 04/11] change get_object to to_object --- requirements.txt | 2 +- springboard/utils.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index ffca66d..5dfd33b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -elastic-git>=0.3.3 +elastic-git>=1.0.2 unicore.content unicore.google unicore.distribute diff --git a/springboard/utils.py b/springboard/utils.py index 6b6a1fe..0563bc1 100644 --- a/springboard/utils.py +++ b/springboard/utils.py @@ -137,7 +137,7 @@ def __init__(self, es_results): self.es_results = es_results def __iter__(self): - return (obj.get_object() for obj in self.es_results) + return (obj.to_object() for obj in self.es_results) def __len__(self): return self.es_results.__len__() @@ -145,7 +145,7 @@ def __len__(self): def __getitem__(self, k): if isinstance(k, slice): return ResultGenerator(self.es_results.__getitem__(k)) - return self.es_results.__getitem__(k).get_object() + return self.es_results.__getitem__(k).to_object() def to_eg_objects(es_results): From 80f86eac9b74d58329a45e39df495acf996b4270 Mon Sep 17 00:00:00 2001 From: Rizmari Versfeld Date: Mon, 4 May 2015 11:06:11 +0200 Subject: [PATCH 05/11] a last get_object removed --- springboard/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springboard/views.py b/springboard/views.py index 7f16209..2dfb46b 100644 --- a/springboard/views.py +++ b/springboard/views.py @@ -118,4 +118,4 @@ def api_notify(self): def get_category(self, uuid): [category] = self.workspace.S(Category).filter(uuid=uuid) - return category.get_object() + return category.to_object() From 1ce3d950b07c9f6abb1d48d7dd080e40fb14ff2a Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 25 May 2015 14:22:43 +0200 Subject: [PATCH 06/11] Corrected template stuff --- springboard/templates/molecules.html | 6 +++--- springboard/templates/search_results.jinja2 | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/springboard/templates/molecules.html b/springboard/templates/molecules.html index 34b2953..d513644 100644 --- a/springboard/templates/molecules.html +++ b/springboard/templates/molecules.html @@ -4,10 +4,10 @@ {%- endmacro %} @@ -120,4 +120,4 @@

{{cat.title}}

{{view.get_category(result.primary_category).title}}

{% endif %} {{result.title}} ... Read More > -{%- endmacro %} \ No newline at end of file +{%- endmacro %} diff --git a/springboard/templates/search_results.jinja2 b/springboard/templates/search_results.jinja2 index 79760cb..c077bb3 100644 --- a/springboard/templates/search_results.jinja2 +++ b/springboard/templates/search_results.jinja2 @@ -21,4 +21,4 @@ {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} From 9977ee423bbd0dacdef2032a94b13fd177f7a156 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 25 May 2015 14:23:10 +0200 Subject: [PATCH 07/11] Got search working --- springboard/views/core.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/springboard/views/core.py b/springboard/views/core.py index e20e953..1b40f3b 100644 --- a/springboard/views/core.py +++ b/springboard/views/core.py @@ -5,11 +5,10 @@ from pyramid.httpexceptions import HTTPFound from pyramid.response import Response -from springboard.utils import ga_context +from springboard.utils import ga_context, EGPaginator from springboard.views.base import SpringboardViews from unicore.distribute.tasks import fastforward -from utils import EGPaginator ONE_YEAR = 31536000 @@ -37,17 +36,17 @@ def search(self): query = self.request.GET.get('q') p = int(self.request.GET.get('p', 0)) - empty_defaults = { - 'paginator': [], - 'query': query, - 'p': p, - } + empty_defaults = self.context( + paginator=[], + query=query, + p=p, + ) # handle query exception if not query: return empty_defaults - all_results = self.workspace.S(Page).query( + all_results = self.all_pages.query( content__query_string=query).filter(language=self.language) # no results found @@ -64,11 +63,11 @@ def search(self): p = p if p < total_pages else total_pages - 1 paginator = EGPaginator(all_results, p) - return { - 'paginator': paginator, - 'query': query, - 'p': p, - } + return self.context( + paginator=paginator, + query=query, + p=p, + ) @ga_context(lambda context: {'dt': context['page'].title, }) @view_config(route_name='page', From 0c559dcb836dafb85b61d50c9956113d57964b77 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 8 Jun 2015 10:10:06 +0200 Subject: [PATCH 08/11] pulled and merged changes made in develop --- springboard/defaults.ini | 1 + springboard/filters.py | 6 ++++++ springboard/templates/molecules.html | 10 +++++----- springboard/templates/organisms.html | 2 +- springboard/templates/search_results.jinja2 | 2 +- springboard/views/base.py | 11 +++++++++++ springboard/views/core.py | 4 ++++ 7 files changed, 29 insertions(+), 7 deletions(-) diff --git a/springboard/defaults.ini b/springboard/defaults.ini index 53de605..4d2039b 100644 --- a/springboard/defaults.ini +++ b/springboard/defaults.ini @@ -21,6 +21,7 @@ jinja2.filters = display_language_name = springboard.filters:display_language_name_filter language_direction = springboard.filters:language_direction_filter paginate = springboard.filters:paginate_filter + get_category_object = springboard.filters:get_category_object_filter unicorehub.host = unicorehub.app_id = diff --git a/springboard/filters.py b/springboard/filters.py index 0aed351..14ff061 100644 --- a/springboard/filters.py +++ b/springboard/filters.py @@ -59,3 +59,9 @@ def language_direction_filter(locale): def paginate_filter(results, page, results_per_page=10, slider_value=5): return Paginator(results, page, results_per_page, slider_value) + + +@contextfilter +def get_category_object_filter(ctx, page): + [category] = ctx['all_categories'].filter(uuid=page.primary_category) + return category.to_object() diff --git a/springboard/templates/molecules.html b/springboard/templates/molecules.html index d513644..d36d648 100644 --- a/springboard/templates/molecules.html +++ b/springboard/templates/molecules.html @@ -115,9 +115,9 @@

{{cat.title}}

{% endif %} {%- endmacro %} -{% macro article_summary(result, view) -%} - {% if result.primary_category %} -

{{view.get_category(result.primary_category).title}}

- {% endif %} - {{result.title}} ... Read More > +{% macro article_summary(result, all_categories) -%} +{% if result.primary_category in all_categories %} +

{{(all_categories.filter(uuid=uuid)).title}}

+{% endif %} + {{result.title}} ... Read More > {%- endmacro %} diff --git a/springboard/templates/organisms.html b/springboard/templates/organisms.html index ed25dd6..59559b7 100644 --- a/springboard/templates/organisms.html +++ b/springboard/templates/organisms.html @@ -5,7 +5,7 @@
    {% for result in paginator.get_page() %}
  • - {{molecules.article_summary(result, view )}} + {{molecules.article_summary(result, all_categories)}}
  • {% endfor %}
diff --git a/springboard/templates/search_results.jinja2 b/springboard/templates/search_results.jinja2 index c077bb3..2346f97 100644 --- a/springboard/templates/search_results.jinja2 +++ b/springboard/templates/search_results.jinja2 @@ -14,7 +14,7 @@ {{molecules.page_number_navigator(view, paginator, p, query)}} {% endif %} - {{organisms.list_of_returned_articles(paginator, view)}} + {{organisms.list_of_returned_articles(paginator, relevant_categories)}} {% else %} {{molecules.message_for_no_results(query)}} diff --git a/springboard/views/base.py b/springboard/views/base.py index 11cb1b7..4fba89c 100644 --- a/springboard/views/base.py +++ b/springboard/views/base.py @@ -37,14 +37,25 @@ def __init__(self, request): } self.all_categories = SM(Category, **search_config).es( **self.es_settings) + print('----------------------------------------------------******') + print(self.all_categories) + print('----------------------------------------------------') self.all_pages = SM(Page, **search_config).es(**self.es_settings) +<<<<<<< Updated upstream self.all_localisations = SM(Localisation, **search_config).es( **self.es_settings) +======= + print('----------------------------------------------------') + print(self.all_pages) + print('----------------------------------------------------******') +>>>>>>> Stashed changes self.available_languages = config_list( self.settings.get('available_languages', '')) + print(self.available_languages) self.featured_languages = config_list( self.settings.get('featured_languages', '')) + print(self.featured_languages) self.display_languages = list( set(self.featured_languages) - set([self.language])) diff --git a/springboard/views/core.py b/springboard/views/core.py index 7c27e73..f45fd93 100644 --- a/springboard/views/core.py +++ b/springboard/views/core.py @@ -63,7 +63,11 @@ def search(self): p = p if p < total_pages else total_pages - 1 paginator = Paginator(all_results, p) + relevant_categories = self.all_categories.query().filter( + language=self.language) + return self.context( + relevant_categories=relevant_categories, paginator=paginator, query=query, p=p, From 37dcd6627c13ff7b5cde5f98172ba96ef61fd931 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 8 Jun 2015 11:56:38 +0200 Subject: [PATCH 09/11] Got category filter working, removed test print statements --- springboard/defaults.ini | 2 +- springboard/filters.py | 8 +++++--- springboard/templates/molecules.html | 4 ++-- springboard/templates/organisms.html | 2 +- springboard/templates/search_results.jinja2 | 3 +-- springboard/views/base.py | 12 ------------ 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/springboard/defaults.ini b/springboard/defaults.ini index 4d2039b..0a8a9f3 100644 --- a/springboard/defaults.ini +++ b/springboard/defaults.ini @@ -21,7 +21,7 @@ jinja2.filters = display_language_name = springboard.filters:display_language_name_filter language_direction = springboard.filters:language_direction_filter paginate = springboard.filters:paginate_filter - get_category_object = springboard.filters:get_category_object_filter + get_category_title = springboard.filters:get_category_title_filter unicorehub.host = unicorehub.app_id = diff --git a/springboard/filters.py b/springboard/filters.py index 14ff061..035d950 100644 --- a/springboard/filters.py +++ b/springboard/filters.py @@ -62,6 +62,8 @@ def paginate_filter(results, page, results_per_page=10, slider_value=5): @contextfilter -def get_category_object_filter(ctx, page): - [category] = ctx['all_categories'].filter(uuid=page.primary_category) - return category.to_object() +def get_category_title_filter(ctx, primary_category_uuid, all_categories): + for category in all_categories: + if primary_category_uuid == category.uuid: + return category.title + return '' diff --git a/springboard/templates/molecules.html b/springboard/templates/molecules.html index d36d648..9112990 100644 --- a/springboard/templates/molecules.html +++ b/springboard/templates/molecules.html @@ -116,8 +116,8 @@

{{cat.title}}

{%- endmacro %} {% macro article_summary(result, all_categories) -%} -{% if result.primary_category in all_categories %} -

{{(all_categories.filter(uuid=uuid)).title}}

+{% if result.primary_category %} +

{{result.primary_category|get_category_title(all_categories) }}

{% endif %} {{result.title}} ... Read More > {%- endmacro %} diff --git a/springboard/templates/organisms.html b/springboard/templates/organisms.html index 59559b7..e5d3ab2 100644 --- a/springboard/templates/organisms.html +++ b/springboard/templates/organisms.html @@ -1,7 +1,7 @@ {% import 'molecules.html' as molecules %} {% import 'atoms.html' as atoms %} -{% macro list_of_returned_articles(paginator, view) -%} +{% macro list_of_returned_articles(paginator, all_categories) -%}
    {% for result in paginator.get_page() %}
  • diff --git a/springboard/templates/search_results.jinja2 b/springboard/templates/search_results.jinja2 index 2346f97..c84b04f 100644 --- a/springboard/templates/search_results.jinja2 +++ b/springboard/templates/search_results.jinja2 @@ -14,8 +14,7 @@ {{molecules.page_number_navigator(view, paginator, p, query)}} {% endif %} - {{organisms.list_of_returned_articles(paginator, relevant_categories)}} - + {{organisms.list_of_returned_articles(paginator, all_categories)}} {% else %} {{molecules.message_for_no_results(query)}} {% endif %} diff --git a/springboard/views/base.py b/springboard/views/base.py index 4fba89c..9c042a1 100644 --- a/springboard/views/base.py +++ b/springboard/views/base.py @@ -37,25 +37,13 @@ def __init__(self, request): } self.all_categories = SM(Category, **search_config).es( **self.es_settings) - print('----------------------------------------------------******') - print(self.all_categories) - print('----------------------------------------------------') self.all_pages = SM(Page, **search_config).es(**self.es_settings) -<<<<<<< Updated upstream self.all_localisations = SM(Localisation, **search_config).es( **self.es_settings) - -======= - print('----------------------------------------------------') - print(self.all_pages) - print('----------------------------------------------------******') ->>>>>>> Stashed changes self.available_languages = config_list( self.settings.get('available_languages', '')) - print(self.available_languages) self.featured_languages = config_list( self.settings.get('featured_languages', '')) - print(self.featured_languages) self.display_languages = list( set(self.featured_languages) - set([self.language])) From 3b42277970c330e3f828a8de4c2fb0536bbb8ee4 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 8 Jun 2015 12:21:58 +0200 Subject: [PATCH 10/11] Added test for searching in selected language --- springboard/tests/test_search.py | 43 +++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/springboard/tests/test_search.py b/springboard/tests/test_search.py index 96da789..d2a8bcb 100644 --- a/springboard/tests/test_search.py +++ b/springboard/tests/test_search.py @@ -9,10 +9,21 @@ class TestSearch(SpringboardTestCase): def setUp(self): self.workspace = self.mk_workspace() - self.config = testing.setUp(settings={ + settings = { 'unicore.repos_dir': self.working_dir, - 'unicore.content_repo_url': self.workspace.working_dir, - }) + 'unicore.content_repo_urls': self.workspace.working_dir, + 'available_languages': '\n'.join([ + 'eng_GB', + 'swa_KE', + 'spa_ES', + ]), + 'featured_languages': '\n'.join([ + 'spa_ES', + 'eng_GB', + ]) + } + self.config = testing.setUp(settings=settings) + self.app = self.mk_app(self.workspace, settings=settings) def tearDown(self): testing.tearDown() @@ -76,3 +87,29 @@ def test_pagination(self): '/search/', params={'q': 'baby', 'p': '0'}, status=200) self.assertFalse('Previous' in resp.body) self.assertTrue('Next' in resp.body) + + def test_search_language_filter(self): + [category_eng] = self.mk_categories( + self.workspace, count=1, language='eng_GB', + title='English Category') + self.mk_pages( + self.workspace, count=1, language='eng_GB', + primary_category=category_eng.uuid, + content='Page for mother test page') + [category_spa] = self.mk_categories( + self.workspace, count=1, language='spa_ES', + title='Spanish Category') + self.mk_pages( + self.workspace, count=1, language='spa_ES', + primary_category=category_spa.uuid, + content='Page for mother test page') + + self.app.get('/locale/?language=eng_GB', status=302) + resp = self.app.get('/search/', params={'q': 'mother'}, status=200) + self.assertTrue('English Category' in resp.body) + self.assertFalse('Spanish Category' in resp.body) + + self.app.get('/locale/?language=spa_ES', status=302) + resp = self.app.get('/search/', params={'q': 'mother'}, status=200) + self.assertTrue('Spanish Category' in resp.body) + self.assertFalse('English Category' in resp.body) From 65ded89d2de3ccf8219eb3569bf290bae9f45491 Mon Sep 17 00:00:00 2001 From: nathanbegbie Date: Mon, 8 Jun 2015 14:17:09 +0200 Subject: [PATCH 11/11] removed return statement with coverage issue --- springboard/filters.py | 1 - 1 file changed, 1 deletion(-) diff --git a/springboard/filters.py b/springboard/filters.py index 035d950..11bd6f6 100644 --- a/springboard/filters.py +++ b/springboard/filters.py @@ -66,4 +66,3 @@ def get_category_title_filter(ctx, primary_category_uuid, all_categories): for category in all_categories: if primary_category_uuid == category.uuid: return category.title - return ''