From 534af5a4217ca2119c1d4a8e407ad11fd9c37b20 Mon Sep 17 00:00:00 2001 From: Hayden Date: Sun, 10 Jan 2021 12:16:46 -0900 Subject: [PATCH] refactor ap scheduler and startup process --- .github/workflows/build-docs.yml | 4 ++-- .github/workflows/pytest.yml | 1 - mealie/app.py | 9 ++------- mealie/db/mongo_setup.py | 3 +++ mealie/db/sql/db_session.py | 26 ++++++++++++++++++++++++++ mealie/db/sql/model_base.py | 4 ++++ mealie/db/sql/recipe_models.py | 29 ++++++++++++++++++++++++++++- mealie/db/sql/sql_setup.py | 0 mealie/routes/setting_routes.py | 18 ++++-------------- mealie/scratch.py | 0 mealie/settings.py | 29 +++++++++++++++++++++++------ mealie/startup.py | 25 ++++++++++++++++++++++--- 12 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 mealie/db/sql/db_session.py create mode 100644 mealie/db/sql/model_base.py delete mode 100644 mealie/db/sql/sql_setup.py delete mode 100644 mealie/scratch.py diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 3a7a0116e..3712b2cff 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -2,7 +2,7 @@ name: Publish docs via GitHub Pages on: push: branches: - - main + - master jobs: build: @@ -17,4 +17,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CONFIG_FILE: docs/mkdocs.yml - EXTRA_PACKAGES: build-base \ No newline at end of file + EXTRA_PACKAGES: build-base diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index a85862aac..b3bcaa9cd 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -4,7 +4,6 @@ on: branches: - master - dev - - sqlite pull_request: branches: - master diff --git a/mealie/app.py b/mealie/app.py index e96f276f3..98b41ea91 100644 --- a/mealie/app.py +++ b/mealie/app.py @@ -14,12 +14,10 @@ from routes import ( static_routes, user_routes, ) -from routes.setting_routes import scheduler # ! This has to be imported for scheduling -from settings import PORT, PRODUCTION, docs_url, redoc_url +from settings import PORT, PRODUCTION, WEB_PATH, docs_url, redoc_url from utils.logger import logger -CWD = Path(__file__).parent -WEB_PATH = CWD.joinpath("dist") +startup.pre_start() app = FastAPI( title="Mealie", @@ -33,7 +31,6 @@ app = FastAPI( if PRODUCTION: app.mount("/static", StaticFiles(directory=WEB_PATH, html=True)) - # API Routes app.include_router(recipe_routes.router) app.include_router(meal_routes.router) @@ -50,8 +47,6 @@ def invalid_api(): app.include_router(static_routes.router) -startup.ensure_dirs() -startup.generate_default_theme() # Generate API Documentation if not PRODUCTION: diff --git a/mealie/db/mongo_setup.py b/mealie/db/mongo_setup.py index 329b0d39b..616a7d24b 100644 --- a/mealie/db/mongo_setup.py +++ b/mealie/db/mongo_setup.py @@ -1,5 +1,6 @@ import mongoengine from settings import DB_HOST, DB_PASSWORD, DB_PORT, DB_USERNAME, MEALIE_DB_NAME +from utils.logger import logger def global_init(): @@ -12,3 +13,5 @@ def global_init(): password=DB_PASSWORD, authentication_source="admin", ) + + logger.info("Mongo Data Initialized") diff --git a/mealie/db/sql/db_session.py b/mealie/db/sql/db_session.py new file mode 100644 index 000000000..2af97216b --- /dev/null +++ b/mealie/db/sql/db_session.py @@ -0,0 +1,26 @@ +from pathlib import Path + +import sqlalchemy as sa +import sqlalchemy.orm as orm +from settings import SQLITE + + +factory = None + +def global_init(db_file: Path): + if not SQLITE: + pass + + global factory + + if factory: + return + + if not db_file or not db_file.strip: + raise Exception("You must Specif a db file") + + conn_str = "sqlite:///" + db_file.absolute() + + engine = sa.create_engine(conn_str, echo=False) + + factory = orm.sessionmaker(bind=engine) diff --git a/mealie/db/sql/model_base.py b/mealie/db/sql/model_base.py new file mode 100644 index 000000000..29dc1b830 --- /dev/null +++ b/mealie/db/sql/model_base.py @@ -0,0 +1,4 @@ +import sqlalchemy.ext.declarative as dec + + +SqlAlchemyBase = dec.declarative_base() \ No newline at end of file diff --git a/mealie/db/sql/recipe_models.py b/mealie/db/sql/recipe_models.py index d8263ee98..13d55fcb5 100644 --- a/mealie/db/sql/recipe_models.py +++ b/mealie/db/sql/recipe_models.py @@ -1 +1,28 @@ -2 \ No newline at end of file +import mongoengine +import sqlalchemy as sa +from db.sql.model_base import SqlAlchemyBase + + +class RecipeSQLModel(SqlAlchemyBase): + __tablename__ = "recipes" + + name = sa.Column(sa.String, primar_key=True) + description = sa.Column(sa.String) + image = sa.Column(sa.String) + recipeYield = sa.Column(sa.String) + recipeIngredient = mongoengine.ListField(required=True, default=[]) + recipeInstructions = mongoengine.ListField(requiredd=True, default=[]) + totalTime = sa.Column(sa.String) + + # Mealie Specific + slug = sa.Column(sa.String) + categories = mongoengine.ListField(default=[]) + tags = mongoengine.ListField(default=[]) + dateAdded = mongoengine.DateTimeField(binary=True, default=datetime.date.today()) + notes = mongoengine.ListField(default=[]) + rating = sa.Column(sa.Integer) + orgURL = sa.Column(sa.String) + extras = mongoengine.DictField(required=False) + + def __repr__(self): + return f"SQL Entry Recipe {self.name}" diff --git a/mealie/db/sql/sql_setup.py b/mealie/db/sql/sql_setup.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/mealie/routes/setting_routes.py b/mealie/routes/setting_routes.py index 5d22531cf..99363f2cf 100644 --- a/mealie/routes/setting_routes.py +++ b/mealie/routes/setting_routes.py @@ -1,16 +1,10 @@ -from typing import List - -from db.mongo_setup import global_init from fastapi import APIRouter, HTTPException -from services.scheduler_services import Scheduler, post_webhooks +from services.scheduler_services import post_webhooks from services.settings_services import SiteSettings, SiteTheme +from startup import scheduler from utils.snackbar import SnackResponse router = APIRouter() -global_init() - -scheduler = Scheduler() -scheduler.startup_scheduler() @router.get("/api/site-settings/", tags=["Settings"]) @@ -42,18 +36,14 @@ async def update_settings(data: SiteSettings): return SnackResponse.success("Settings Updated") -@router.get( - "/api/site-settings/themes/", tags=["Themes"] -) +@router.get("/api/site-settings/themes/", tags=["Themes"]) async def get_all_themes(): """ Returns all site themes """ return SiteTheme.get_all() -@router.get( - "/api/site-settings/themes/{theme_name}/", tags=["Themes"] -) +@router.get("/api/site-settings/themes/{theme_name}/", tags=["Themes"]) async def get_single_theme(theme_name: str): """ Returns a named theme """ return SiteTheme.get_by_name(theme_name) diff --git a/mealie/scratch.py b/mealie/scratch.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/mealie/settings.py b/mealie/settings.py index 68a6bf038..ff2cd78b6 100644 --- a/mealie/settings.py +++ b/mealie/settings.py @@ -3,9 +3,15 @@ from pathlib import Path import dotenv -# Helpful Globas CWD = Path(__file__).parent + +# Register ENV +ENV = CWD.joinpath(".env") +dotenv.load_dotenv(ENV) + +# Helpful Globals DATA_DIR = CWD.joinpath("data") +WEB_PATH = CWD.joinpath("dist") IMG_DIR = DATA_DIR.joinpath("img") BACKUP_DIR = DATA_DIR.joinpath("backups") DEBUG_DIR = DATA_DIR.joinpath("debug") @@ -14,10 +20,6 @@ TEMPLATE_DIR = DATA_DIR.joinpath("templates") TEMP_DIR = DATA_DIR.joinpath("temp") -# Env Variables -ENV = CWD.joinpath(".env") -dotenv.load_dotenv(ENV) - # General PRODUCTION = os.environ.get("ENV") PORT = int(os.getenv("mealie_port", 9000)) @@ -30,6 +32,21 @@ else: docs_url = None redoc_url = None + +# DATABASE ENV +DATABASE_TYPE = os.getenv("db_type", "mongo") # mongo, sqlite +SQLITE = False +MONGO = False +if DATABASE_TYPE == "sqlite": + SQLITE = True + SQLITE_DB_FILE = DATA_DIR.joinpath("mealie.sqlite") +elif DATABASE_TYPE == "mongo": + MONGO = True +else: + raise Exception( + "Unable to determine database type. Acceptible options are 'mongo' or 'sqlite' " + ) + # Mongo Database MEALIE_DB_NAME = os.getenv("mealie_db_name", "mealie") DB_USERNAME = os.getenv("db_username", "root") @@ -37,6 +54,6 @@ DB_PASSWORD = os.getenv("db_password", "example") DB_HOST = os.getenv("db_host", "mongo") DB_PORT = os.getenv("db_port", 27017) -# SFTP Email Stuff +# SFTP Email Stuff - For use Later down the line! SFTP_USERNAME = os.getenv("sftp_username", None) SFTP_PASSWORD = os.getenv("sftp_password", None) diff --git a/mealie/startup.py b/mealie/startup.py index 6fa2fc92e..ab997d96e 100644 --- a/mealie/startup.py +++ b/mealie/startup.py @@ -1,12 +1,32 @@ import json from pathlib import Path +from db.mongo_setup import global_init as mongo_global_init +from db.sql.db_session import global_init as sql_global_init +from services.scheduler_services import Scheduler from services.settings_services import Colors, SiteTheme +from settings import DATA_DIR, MONGO, SQLITE from utils.logger import logger CWD = Path(__file__).parent -DATA_DIR = CWD.joinpath("data") -TEMP_DIR = CWD.joinpath("data", "temp") + +scheduler = None + + +def pre_start(): + if SQLITE: + from settings import SQLITE_DB_FILE + + sql_global_init(SQLITE_DB_FILE) + elif MONGO: + mongo_global_init() + + global scheduler + scheduler = Scheduler() + scheduler.startup_scheduler() + + ensure_dirs() + generate_default_theme() def ensure_dirs(): @@ -67,7 +87,6 @@ HTML_TEMPLATE = """ """ -CWD = Path(__file__).parent out_path = CWD.joinpath("temp", "index.html")