67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
import os
|
|
from whoosh.fields import *
|
|
from whoosh.index import create_in, open_dir
|
|
from whoosh.qparser import QueryParser
|
|
from models.distribusi_model import Distribusis
|
|
from models.distribusi_file_model import DistribusiFiles
|
|
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()
|
|
|
|
schema = Schema(
|
|
title=TEXT(stored=True), path=ID(stored=True), content=TEXT
|
|
)
|
|
ix = create_in(SEARCH_DATA_DIR, schema)
|
|
writer = ix.writer()
|
|
index_distribusis(APP, writer)
|
|
index_distribusi_files(APP, writer)
|
|
writer.commit(optimize=True)
|
|
|
|
@scheduler.task("interval", id="update", minutes=60)
|
|
def update_search_index():
|
|
ix = open_dir(SEARCH_DATA_DIR)
|
|
update_writer = ix.writer()
|
|
index_distribusis(APP, update_writer)
|
|
index_distribusi_files(APP, update_writer)
|
|
update_writer.commit(optimize=True)
|
|
|
|
|
|
def index_distribusis(APP, writer):
|
|
distribusis = _visible_distribusis(APP)
|
|
for distribusi in distribusis:
|
|
writer.add_document(
|
|
title=distribusi.distribusiname,
|
|
path="/a",
|
|
content=distribusi.description,
|
|
)
|
|
|
|
|
|
def index_distribusi_files(APP, writer):
|
|
with APP.app_context():
|
|
for distribusi_file in DistribusiFiles.query.all():
|
|
APP.logger.info(
|
|
f"adding distribusi file {distribusi_file.path} to search index"
|
|
)
|
|
writer.add_document(
|
|
title=distribusi_file.path,
|
|
path="/b",
|
|
content=distribusi_file.description,
|
|
)
|
|
|
|
|
|
def _visible_distribusis(APP):
|
|
with APP.app_context():
|
|
distribusis = Distribusis.query.filter(
|
|
Distribusis.visible.isnot(False)
|
|
).all()
|
|
return distribusis
|