forked from crunk/distribusi-verse
crunk
5 months ago
6 changed files with 113 additions and 3 deletions
@ -1,8 +1,41 @@ |
|||
import os |
|||
|
|||
from flask import Blueprint, render_template |
|||
from whoosh.fields import * |
|||
from whoosh.index import open_dir |
|||
from whoosh.qparser import QueryParser |
|||
from search.forms.searchform import SearchForm |
|||
|
|||
searchpages = Blueprint( |
|||
"search", |
|||
__name__, |
|||
template_folder="templates/search", |
|||
static_folder="static", |
|||
) |
|||
|
|||
SCRIPT_DIR = os.path.dirname(__file__) |
|||
DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "../data")) |
|||
SEARCH_DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "searchdata")) |
|||
|
|||
@searchpages.route("/", methods=["GET", "POST"]) |
|||
def searchpage(): |
|||
searchform = SearchForm() |
|||
found_distribusis = [] |
|||
if searchform.validate_on_submit(): |
|||
found_distribusis = search(searchform.searchfield.data) |
|||
template = render_template( |
|||
"search.html", |
|||
searchform=searchform, |
|||
found_distribusis=found_distribusis, |
|||
) |
|||
return template |
|||
|
|||
|
|||
def search(searchinput): |
|||
"""search and get search result titles and return them as distribusi ids""" |
|||
ix = open_dir(SEARCH_DATA_DIR) |
|||
with ix.searcher() as searcher: |
|||
query = QueryParser("content", ix.schema).parse(searchinput) |
|||
search_results = searcher.search(query) |
|||
found_distribusis = [] |
|||
for result in search_results: |
|||
found_distribusis.append(result["title"]) |
|||
return found_distribusis |
|||
|
@ -0,0 +1,47 @@ |
|||
import os |
|||
from whoosh.fields import * |
|||
from whoosh.index import create_in |
|||
from whoosh.qparser import QueryParser |
|||
from models.distribusi_model import Distribusis |
|||
import flask_apscheduler |
|||
|
|||
|
|||
SCRIPT_DIR = os.path.dirname(__file__) |
|||
SEARCH_DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "searchdata")) |
|||
|
|||
def init_search_index(APP): |
|||
scheduler = flask_apscheduler.APScheduler() |
|||
scheduler.api_enabled = False |
|||
scheduler.init_app(APP) |
|||
scheduler.start() |
|||
index_distribusis(APP) |
|||
index_distribusi_files(APP) |
|||
|
|||
@scheduler.task("interval", id="update", minutes=60) |
|||
def update_search_index(): |
|||
index_distribusis(APP) |
|||
index_distribusi_files(APP) |
|||
|
|||
|
|||
def index_distribusis(APP): |
|||
schema = Schema( |
|||
title=TEXT(stored=True), path=ID(stored=True), content=TEXT |
|||
) |
|||
ix = create_in(SEARCH_DATA_DIR, schema) |
|||
writer = ix.writer() |
|||
distribusis = _visible_distribusis(APP) |
|||
for distribusi in distribusis: |
|||
writer.add_document(title=distribusi.distribusiname, path="/a", content=distribusi.description) |
|||
writer.commit() |
|||
|
|||
|
|||
def index_distribusi_files(APP): |
|||
APP.logger.info("searching distribusi files not implemented yet.") |
|||
|
|||
|
|||
def _visible_distribusis(APP): |
|||
with APP.app_context(): |
|||
distribusis = Distribusis.query.filter( |
|||
Distribusis.visible.isnot(False) |
|||
).all() |
|||
return distribusis |
@ -1,3 +1,23 @@ |
|||
{% extends "base/base.html" %} |
|||
{% block main %} |
|||
<div id="distribusiverse" class="maincontent"> |
|||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('search.searchpage') }}"> |
|||
{{ searchform.csrf_token }} |
|||
<fieldset class="required"> |
|||
{{ searchform.searchfield.label }} |
|||
{{ searchform.searchfield }} |
|||
{% for message in searchform.searchfield.errors %} |
|||
<div class="error">{{ message }}</div> |
|||
{% endfor %} |
|||
</fieldset> |
|||
<fieldset class="button required"> |
|||
{{ searchform.submit }} |
|||
</fieldset> |
|||
</form> |
|||
<div class="searchresults"> |
|||
{% for found_distribusis in found_distribusis %} |
|||
<p>{{found_distribusis}}</p> |
|||
{% endfor %} |
|||
</div> |
|||
</div> |
|||
{% endblock %} |
|||
|
Loading…
Reference in new issue