From df6297d40fbe76fea293cb584e0a0d43e6c22127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 13 Mar 2018 12:24:29 +0100 Subject: [PATCH] Fixed project search The project ID wasn't used at all when searching in a project's context. --- pillar/api/search/queries.py | 4 +++- pillar/api/search/routes.py | 3 ++- src/scripts/elasticsearch.js | 23 ++++++++++++----------- src/scripts/tutti/4_search.js | 7 +++++++ src/templates/nodes/search.pug | 26 +++++++------------------- 5 files changed, 31 insertions(+), 32 deletions(-) diff --git a/pillar/api/search/queries.py b/pillar/api/search/queries.py index 36d2610b..5f657e75 100644 --- a/pillar/api/search/queries.py +++ b/pillar/api/search/queries.py @@ -55,7 +55,7 @@ def nested_bool(must: list, should: list, terms: dict, *, index_alias: str) -> S return search -def do_node_search(query: str, terms: dict, page: int) -> dict: +def do_node_search(query: str, terms: dict, page: int, project_id: str='') -> dict: """ Given user query input and term refinements search for public published nodes @@ -73,6 +73,8 @@ def do_node_search(query: str, terms: dict, page: int) -> dict: ] must = [] + if project_id: + must.append({'term': {'project.id': project_id}}) if not query: should = [] diff --git a/pillar/api/search/routes.py b/pillar/api/search/routes.py index 62b21f01..78ca0e20 100644 --- a/pillar/api/search/routes.py +++ b/pillar/api/search/routes.py @@ -42,10 +42,11 @@ def _page_index() -> int: @blueprint_search.route('/') def search_nodes(): searchword = request.args.get('q', '') + project_id = request.args.get('project', '') terms = _term_filters() page_idx = _page_index() - result = queries.do_node_search(searchword, terms, page_idx) + result = queries.do_node_search(searchword, terms, page_idx, project_id) return jsonify(result) diff --git a/src/scripts/elasticsearch.js b/src/scripts/elasticsearch.js index de391ecc..8ccef89e 100644 --- a/src/scripts/elasticsearch.js +++ b/src/scripts/elasticsearch.js @@ -17,26 +17,28 @@ $(document).ready(function() { var sliderTemplate = Hogan.compile($('#slider-template').text()); var paginationTemplate = Hogan.compile($('#pagination-template').text()); - // something elasticy! + // defined in tutti/4_search.js var search = elasticSearcher; // what are we looking for? users? assets (default) what = $inputField.attr('what'); - // Input binding - $inputField.on('keyup change', function() { - var query = $inputField.val(); - + function do_search(query) { if (query === undefined) { return; } - toggleIconEmptyInput(!query.trim()); - // what could be like "/users" - search.setQuery(query, what); - // setURLParams(search); + search.setQuery(query, what); // what could be like "/users" + var pid = ProjectUtils.projectId(); + if (pid) search.setProjectID(pid); search.execute(); + } + + // Input binding + $inputField.on('keyup change', function() { + var query = $inputField.val(); + do_search(query); }).focus(); search.on('results', function(content) { @@ -330,6 +332,5 @@ $(document).ready(function() { } // do empty search to fill aggregations - search.setQuery('', what); - search.execute(); + do_search(''); }); diff --git a/src/scripts/tutti/4_search.js b/src/scripts/tutti/4_search.js index 09c5a8c0..e36288d5 100644 --- a/src/scripts/tutti/4_search.js +++ b/src/scripts/tutti/4_search.js @@ -8,6 +8,7 @@ var elasticSearcher = (function() { var deze = { query:"", + project_id:"", url:"", newhits: [], terms: {}, @@ -21,6 +22,10 @@ var elasticSearcher = (function() { } }), + setProjectID: (function(pid){ + deze.project_id = pid; + }), + setCurrentPage: (function(page){ if(page === undefined){ return; @@ -66,6 +71,7 @@ var elasticSearcher = (function() { params = { q: deze.query, page: deze.page, + project: deze.project_id, }; //add term filters Object.assign(params, deze.terms); @@ -105,6 +111,7 @@ var elasticSearcher = (function() { execute: deze.execute, on: deze.on, setQuery: deze.setQuery, + setProjectID: deze.setProjectID, setCurrentPage: deze.setCurrentPage, query: deze.query, page: deze.page, diff --git a/src/templates/nodes/search.pug b/src/templates/nodes/search.pug index 5de2e1bd..c87ae9d4 100644 --- a/src/templates/nodes/search.pug +++ b/src/templates/nodes/search.pug @@ -23,6 +23,10 @@ meta(name="twitter:description", content="{{project.summary}}") | {% endblock %} | {% block body %} +| {% if project %} +script. + document.body.dataset["projectId"] = "{{project._id}}"; +| {% endif %} #search-container @@ -171,27 +175,11 @@ script(type="text/template", id="stats-template") | {% block footer_scripts %} script(src="//releases.flowplayer.org/6.0.5/flowplayer.min.js", async) -script(). - var APPLICATION_ID = '{{config.ALGOLIA_USER}}'; - var SEARCH_ONLY_API_KEY = '{{config.ALGOLIA_PUBLIC_KEY}}'; - var INDEX_NAME = '{{config.ALGOLIA_INDEX_NODES}}'; - var sortByCountDesc = null; - var FACET_CONFIG = [ - { name: 'node_type', title: 'Type', disjunctive: false, sortFunction: sortByCountDesc }, - { name: 'media', title: 'Media', disjunctive: false, sortFunction: sortByCountDesc }, - { name: 'tags', title: 'Tags', disjunctive: false, sortFunction: sortByCountDesc }, - { name: 'is_free', title: 'Free Access', disjunctive: false, sortFunction: sortByCountDesc }, - ]; - {% if project %} - FACET_CONFIG.push({ name: 'project._id', title: 'Project', disjunctive: false, hidden: true, value: '{{project._id}}' }) - {% endif %} - script(src="{{ url_for('static_pillar', filename='assets/js/vendor/hogan.common-3.0.0.js') }}") script(src="{{ url_for('static_pillar', filename='assets/js/elasticsearch.min.js') }}") -script(type="text/javascript"). - - function displayUser(userId) { +script. + function displayNode(userId) { var url = '/nodes/' + userId + '/view'; $.get(url, function(dataHtml){ @@ -215,7 +203,7 @@ script(type="text/javascript"). } $(this).find('#search-loading').addClass('active'); - displayUser($(this).data('hit-id')); + displayNode($(this).data('hit-id')); $('.search-hit').removeClass('active'); $(this).addClass('active'); });