import csv import os import tomllib import flask_apscheduler from application.csvparser import CsvParser from flask import Flask from flask_bcrypt import Bcrypt from flask_login import LoginManager from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy from flask_wtf.csrf import CSRFProtect from whoosh.fields import * from whoosh.index import create_in from whoosh.qparser import QueryParser db = SQLAlchemy() migrate = Migrate() bcrypt = Bcrypt() login_manager = LoginManager() SCRIPT_DIR = os.path.dirname(__file__) DATA_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "data")) def create_app(): settings = settings_from_file() APP = Flask(__name__, static_folder="static") APP.config["SECRET_KEY"] = os.urandom(24) APP.config["UPLOAD_FOLDER"] = "tmpupload" APP.config["IMAGE_FOLDER"] = "static/images" APP.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///libraryusers.db" APP.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True APP.config["LIBRARY_FILENAME"] = settings["libaryfilename"] APP.config["TITLE"] = settings["title"] csrf = CSRFProtect(APP) csrf.init_app(APP) login_manager.init_app(APP) db.init_app(APP) migrate.init_app(APP, db, render_as_batch=True) bcrypt.init_app(APP) scheduler = flask_apscheduler.APScheduler() scheduler.api_enabled = False scheduler.init_app(APP) scheduler.start() index_books(APP.config["LIBRARY_FILENAME"], APP.config["IMAGE_FOLDER"]) @scheduler.task("interval", id="update", minutes=10) def update(): index_books(APP.config["LIBRARY_FILENAME"], APP.config["IMAGE_FOLDER"]) @APP.context_processor def inject_title(): return dict(title=APP.config["TITLE"]) return APP def get_app(): APP = Flask(__name__, static_folder="static") return APP def index_books(filename: str, image_folder: str): csvparser = CsvParser(filename, image_folder) filename = os.path.join(DATA_DIR, csvparser.csv_file) schema = Schema( title=TEXT(stored=True), path=ID(stored=True), content=TEXT ) ix = create_in(DATA_DIR, schema) writer = ix.writer() with open(filename, "r", encoding="utf_8_sig") as libcsv: csv_as_dict = csv.DictReader(libcsv) for row in csv_as_dict: rowcontent = csvparser.concatenate_csv_row(row) writer.add_document(title=row["Id"], path="/a", content=rowcontent) writer.commit() def settings_from_file(): settings = {} if os.path.isfile("settings_development.toml"): with open("settings_development.toml", "rb") as settings_file: return tomllib.load(settings_file) with open("settings.toml", "rb") as settings_file: return tomllib.load(settings_file)