From 52b513bc2a451cc4d70ad0548103cc9405e5bea3 Mon Sep 17 00:00:00 2001 From: crunk Date: Fri, 14 Jul 2023 21:16:30 +0200 Subject: [PATCH] search as part of flask --- library/page.py | 10 +++++-- library/search.py | 22 ++++++++++++++ library/searchtest.py | 56 ----------------------------------- library/static/js/dropdown.js | 4 ++- library/static/js/search.js | 55 +++++++++++++++++++++++----------- library/templates/index.html | 2 +- 6 files changed, 70 insertions(+), 79 deletions(-) create mode 100644 library/search.py delete mode 100644 library/searchtest.py diff --git a/library/page.py b/library/page.py index d9ff29b..7930b14 100644 --- a/library/page.py +++ b/library/page.py @@ -2,6 +2,7 @@ import datetime +import json import os import bcrypt @@ -19,6 +20,7 @@ from csvparser.csvparser import (editborrowedby, getfullpublication, getlicenses, getpublications, gettypes, getyears, writepublication) from rnrfeed.rnrfeeder import getevents, getlatestevent +from search import search from uploadform import PublicationForm APP = create_app() @@ -87,9 +89,11 @@ def show_book(publicationID): ) -@APP.route("/search", methods=["GET"]) -def searchbooks(): - return +@APP.route("/search/", methods=["GET"]) +def searchbooks(search_query): + print(f"Searched for {search_query}") + search_results = search(search_query) + return json.dumps(search_results) @APP.route("/pastevents") diff --git a/library/search.py b/library/search.py new file mode 100644 index 0000000..486edf8 --- /dev/null +++ b/library/search.py @@ -0,0 +1,22 @@ +import os + +from whoosh.fields import * +from whoosh.index import open_dir +from whoosh.qparser import QueryParser + +from csvparser.csvparser import getfullpublication + +SCRIPT_DIR = os.path.dirname(__file__) +DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "data")) + + +def search(searchinput): + """search and get search result titles and return them as book ids""" + ix = open_dir(DATA_DIR) + with ix.searcher() as searcher: + query = QueryParser("content", ix.schema).parse(searchinput) + search_results = searcher.search(query) + searched_book_ids = [] + for book in search_results: + searched_book_ids.append(book["title"]) + return searched_book_ids diff --git a/library/searchtest.py b/library/searchtest.py deleted file mode 100644 index 27af0d8..0000000 --- a/library/searchtest.py +++ /dev/null @@ -1,56 +0,0 @@ -from whoosh.index import create_in -from whoosh.fields import * -from whoosh.qparser import QueryParser - -import csv -import os -import argparse -from csvparser.csvparser import getfullpublication - -SCRIPT_DIR = os.path.dirname(__file__) -DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "data")) - - -def index_csv_file(): - filename = os.path.join(DATA_DIR, "varlib.csv") - with open(filename, 'r', encoding='utf_8_sig') as libcsv: - csv_as_dict = csv.DictReader(libcsv) - for row in csv_as_dict: - rowcontent = concatenate_csv_row(row) - writer.add_document(title=row["Id"], path=u"/a", content=rowcontent) - writer.commit() - -def search(searchinput): - with ix.searcher() as searcher: - query = QueryParser("content", ix.schema).parse(searchinput) - results = searcher.search(query) - bookid = results[0]['title'] - for book in results: - bookid = book['title'] - print(f"result found: {bookid}") - publication = getfullpublication(bookid) - print(f"{publication['Author']} - {publication['Title']}") - - -def concatenate_csv_row(row): - rowcontent = [] - rowcontent.append(row["Publication"]) - rowcontent.append(row["Author"]) - rowcontent.append(row["Fields"]) - rowcontent.append(row["Type"]) - rowcontent.append(row["Publishers"]) - rowcontent.append(row["Highlights"]) - rowcontent.append(row["Comments"]) - return ' '.join(rowcontent) - -parser = argparse.ArgumentParser() -parser.add_argument("-s", "--search", type=str) -args = parser.parse_args() -searchinput = args.search - -schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) -ix = create_in(DATA_DIR, schema) -writer = ix.writer() -index_csv_file() -print(searchinput) -search(searchinput) diff --git a/library/static/js/dropdown.js b/library/static/js/dropdown.js index 03614fc..cbed73e 100644 --- a/library/static/js/dropdown.js +++ b/library/static/js/dropdown.js @@ -1,4 +1,3 @@ -// Filter section ===================== old school code divider ================ filterSelection("all", "None"); function filterSelection(c, id) { @@ -29,11 +28,14 @@ function resetDropDownButtons(){ document.getElementById("License").innerText = "License"; document.getElementById("PubType").innerText = "Type"; document.getElementById("Year").innerText = "Year"; + document.getElementById('booksearch').value= ""; + document.getElementById('booksearch').placeholder = "🔍 Search.."; allactivebuttons = document.getElementsByClassName("activebtn"); for(var i = 0;allactivebuttons.length; i++) { removeClass(allactivebuttons[i], "activebtn"); } } + function addClass(element, name) { var i, arr1, arr2; arr1 = element.className.split(" "); diff --git a/library/static/js/search.js b/library/static/js/search.js index e8c77ee..7280289 100644 --- a/library/static/js/search.js +++ b/library/static/js/search.js @@ -1,23 +1,42 @@ let searchInput = document.getElementById('booksearch'); -let timeout = null; -// Listen for keystroke events -searchInput.addEventListener('keyup', function (e) { - // Clear the timeout if it has already been set. - clearTimeout(timeout); - // Make a new timeout set to go off in 1000ms (1 second) - timeout = setTimeout(function () { - if (searchInput.value.length > 2) { - searchTags(searchInput.value); - } else { - clearSearchTags(); - } - }, 1000); -}); +var allpublications = document.getElementsByClassName("filter"); -function searchTags(searchInput) { - console.log(searchInput); +const ENTER_KEY_CODE = 13; + +searchInput.addEventListener('keyup', function(e) { + if (e.keyCode === ENTER_KEY_CODE) { + if (searchInput.value.length > 2) { + searchBooks(searchInput.value); + } else { + clearSearchBooks(); + } + } +}) + +function searchBooks(searchQuery) { + let searchUrl = `search/${searchQuery}` + fetch(searchUrl) + .then(response => response.json()) + .then(searchdata => { + console.log(`book ids: ${searchdata} found for ${searchQuery}`); + if (searchdata === undefined || searchdata.length == 0) return; + for (i = 0; i < allpublications.length; i++) { + removeClass(allpublications[i], "show"); + } + searchdata.forEach(bookid => { + showBookId(bookid) + }); + }) } -function clearSearchTags() { - console.log("stop search"); +function showBookId(bookid) { + let book = document.getElementById(bookid) + addClass(book, "show"); +} + + +function clearSearchBooks() { + for (i = 0; i < allpublications.length; i++) { + addClass(allpublications[i], "show"); + } } diff --git a/library/templates/index.html b/library/templates/index.html index c2170bb..1559049 100644 --- a/library/templates/index.html +++ b/library/templates/index.html @@ -5,7 +5,7 @@
{% for id, pubinfo in publications.items() %} -
+