diff --git a/.gitignore b/.gitignore index 99fe9b65c..6aaeb2234 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ __pycache__/ docs/site/ mealie/temp/* mealie/temp/api.html +.temp/ mealie/data/backups/* diff --git a/mealie/app.py b/mealie/app.py index 739b313be..365079ed6 100644 --- a/mealie/app.py +++ b/mealie/app.py @@ -3,9 +3,16 @@ from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import utils.startup as startup -from routes import (backup_routes, meal_routes, migration_routes, - recipe_routes, setting_routes, static_routes, user_routes) -from settings import PORT, PRODUCTION, WEB_PATH, docs_url, redoc_url +from app_config import PORT, PRODUCTION, WEB_PATH, docs_url, redoc_url +from routes import ( + backup_routes, + meal_routes, + migration_routes, + recipe_routes, + setting_routes, + static_routes, + user_routes, +) from utils.api_docs import generate_api_docs from utils.logger import logger @@ -19,17 +26,25 @@ app = FastAPI( redoc_url=redoc_url, ) -# Mount Vue Frontend only in production -if PRODUCTION: + +def mount_static_files(): app.mount("/static", StaticFiles(directory=WEB_PATH, html=True)) -# API Routes -app.include_router(recipe_routes.router) -app.include_router(meal_routes.router) -app.include_router(setting_routes.router) -app.include_router(backup_routes.router) -app.include_router(user_routes.router) -app.include_router(migration_routes.router) + +def api_routers(): + # First + app.include_router(recipe_routes.router) + app.include_router(meal_routes.router) + app.include_router(setting_routes.router) + app.include_router(backup_routes.router) + app.include_router(user_routes.router) + app.include_router(migration_routes.router) + + +if PRODUCTION: + mount_static_files() + +api_routers() # API 404 Catch all CALL AFTER ROUTERS @app.get("/api/{full_path:path}", status_code=404, include_in_schema=False) diff --git a/mealie/settings.py b/mealie/app_config.py similarity index 97% rename from mealie/settings.py rename to mealie/app_config.py index b25141e12..84fbcf02c 100644 --- a/mealie/settings.py +++ b/mealie/app_config.py @@ -20,7 +20,7 @@ DEBUG_DIR = DATA_DIR.joinpath("debug") MIGRATION_DIR = DATA_DIR.joinpath("migration") TEMPLATE_DIR = DATA_DIR.joinpath("templates") TINYDB_DIR = DATA_DIR.joinpath("db") -TEMP_DIR = DATA_DIR.joinpath("temp") +TEMP_DIR = DATA_DIR.joinpath(".temp") REQUIRED_DIRS = [ DATA_DIR, diff --git a/mealie/data/db/mealie.sqlite b/mealie/data/db/mealie.sqlite index fba967d48..5a18fd1fa 100644 Binary files a/mealie/data/db/mealie.sqlite and b/mealie/data/db/mealie.sqlite differ diff --git a/mealie/db/db_base.py b/mealie/db/db_base.py index 462ac3ca3..e8a9a7281 100644 --- a/mealie/db/db_base.py +++ b/mealie/db/db_base.py @@ -2,7 +2,7 @@ import json from typing import Union import mongoengine -from settings import USE_MONGO, USE_SQL +from app_config import USE_MONGO, USE_SQL from sqlalchemy.orm.session import Session from db.sql.db_session import create_session diff --git a/mealie/db/db_mealplan.py b/mealie/db/db_mealplan.py index 00ed5e3cf..96907390f 100644 --- a/mealie/db/db_mealplan.py +++ b/mealie/db/db_mealplan.py @@ -1,6 +1,6 @@ from typing import List -from settings import USE_MONGO, USE_SQL +from app_config import USE_MONGO, USE_SQL from db.db_base import BaseDocument from db.db_setup import USE_MONGO, USE_SQL diff --git a/mealie/db/db_recipes.py b/mealie/db/db_recipes.py index 271b8893a..945ee079d 100644 --- a/mealie/db/db_recipes.py +++ b/mealie/db/db_recipes.py @@ -1,4 +1,4 @@ -from settings import USE_MONGO, USE_SQL +from app_config import USE_MONGO, USE_SQL from db.db_base import BaseDocument from db.mongo.recipe_models import RecipeDocument diff --git a/mealie/db/db_settings.py b/mealie/db/db_settings.py index 997ec595f..2f3089500 100644 --- a/mealie/db/db_settings.py +++ b/mealie/db/db_settings.py @@ -1,4 +1,4 @@ -from settings import USE_MONGO, USE_SQL +from app_config import USE_MONGO, USE_SQL from db.db_base import BaseDocument from db.db_setup import USE_MONGO, USE_SQL diff --git a/mealie/db/db_setup.py b/mealie/db/db_setup.py index 2f5ece9b8..aec393ecd 100644 --- a/mealie/db/db_setup.py +++ b/mealie/db/db_setup.py @@ -1,4 +1,4 @@ -from settings import DATA_DIR, USE_MONGO, USE_SQL +from app_config import DATA_DIR, USE_MONGO, USE_SQL from db.sql.db_session import globa_init as sql_global_init diff --git a/mealie/db/db_themes.py b/mealie/db/db_themes.py index bdb499856..14a378b76 100644 --- a/mealie/db/db_themes.py +++ b/mealie/db/db_themes.py @@ -1,4 +1,4 @@ -from settings import USE_MONGO, USE_SQL +from app_config import USE_MONGO, USE_SQL from db.db_base import BaseDocument from db.db_setup import USE_MONGO, USE_SQL diff --git a/mealie/db/mongo/mongo_setup.py b/mealie/db/mongo/mongo_setup.py index 616a7d24b..da584396e 100644 --- a/mealie/db/mongo/mongo_setup.py +++ b/mealie/db/mongo/mongo_setup.py @@ -1,5 +1,5 @@ import mongoengine -from settings import DB_HOST, DB_PASSWORD, DB_PORT, DB_USERNAME, MEALIE_DB_NAME +from app_config import DB_HOST, DB_PASSWORD, DB_PORT, DB_USERNAME, MEALIE_DB_NAME from utils.logger import logger diff --git a/mealie/models/backup_models.py b/mealie/models/backup_models.py index 9f2f49604..8502c3cf0 100644 --- a/mealie/models/backup_models.py +++ b/mealie/models/backup_models.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import List, Optional from pydantic import BaseModel @@ -16,14 +17,45 @@ class BackupJob(BaseModel): } +class LocalBackup(BaseModel): + name: str + date: datetime + + class Imports(BaseModel): - imports: List[str] + imports: List[LocalBackup] templates: List[str] class Config: schema_extra = { "example": { - "imports": ["sample_data.zip", "sampe_data2.zip"], + "imports": [ + { + "name": "AutoBackup_12-1-2020.zip", + "date": datetime.now(), + } + ], "templates": ["recipes.md", "custom_template.md"], } } + + +class ImportJob(BaseModel): + name: str + recipes: bool + force: bool = False + rebase: bool = False + themes: bool = False + settings: bool = False + + class Config: + schema_extra = { + "example": { + "name": "my_local_backup.zip", + "recipes": True, + "force": False, + "rebase": False, + "themes": False, + "settings": False + } + } diff --git a/mealie/services/backups/exports.py b/mealie/services/backups/exports.py index 28091c8c3..dbe19f3f8 100644 --- a/mealie/services/backups/exports.py +++ b/mealie/services/backups/exports.py @@ -7,7 +7,7 @@ from jinja2 import Template from services.meal_services import MealPlan from services.recipe_services import Recipe from services.settings_services import SiteSettings, SiteTheme -from settings import BACKUP_DIR, IMG_DIR, TEMP_DIR, TEMPLATE_DIR +from app_config import BACKUP_DIR, IMG_DIR, TEMP_DIR, TEMPLATE_DIR from utils.logger import logger diff --git a/mealie/services/backups/imports.py b/mealie/services/backups/imports.py index 2b1f7b370..3a82b899d 100644 --- a/mealie/services/backups/imports.py +++ b/mealie/services/backups/imports.py @@ -6,7 +6,7 @@ from typing import List from services.recipe_services import Recipe from services.settings_services import SiteSettings, SiteTheme -from settings import BACKUP_DIR, IMG_DIR, TEMP_DIR +from app_config import BACKUP_DIR, IMG_DIR, TEMP_DIR from utils.logger import logger @@ -74,7 +74,6 @@ class ImportDatabase: recipe_dict = json.loads(f.read()) recipe_dict = ImportDatabase._recipe_migration(recipe_dict) - recipe_obj = Recipe(**recipe_dict) recipe_obj.save_to_db() successful_imports.append(recipe.stem) diff --git a/mealie/services/migrations/chowdown.py b/mealie/services/migrations/chowdown.py index 061a2ac8c..24a3f85a5 100644 --- a/mealie/services/migrations/chowdown.py +++ b/mealie/services/migrations/chowdown.py @@ -4,7 +4,7 @@ from pathlib import Path import git import yaml from services.recipe_services import Recipe -from settings import IMG_DIR +from app_config import IMG_DIR try: from yaml import CLoader as Loader diff --git a/mealie/services/migrations/nextcloud.py b/mealie/services/migrations/nextcloud.py index 3cac03ef7..8d124b004 100644 --- a/mealie/services/migrations/nextcloud.py +++ b/mealie/services/migrations/nextcloud.py @@ -6,7 +6,7 @@ from pathlib import Path from services.recipe_services import Recipe from services.scrape_services import normalize_data, process_recipe_data -from settings import IMG_DIR, TEMP_DIR +from app_config import IMG_DIR, TEMP_DIR CWD = Path(__file__).parent MIGRTAION_DIR = CWD.parent.parent.joinpath("data", "migration") diff --git a/mealie/utils/api_docs.py b/mealie/utils/api_docs.py index 926e9359d..823afee0a 100644 --- a/mealie/utils/api_docs.py +++ b/mealie/utils/api_docs.py @@ -1,6 +1,6 @@ import json -from settings import BASE_DIR +from app_config import BASE_DIR """Script to export the ReDoc documentation page into a standalone HTML file.""" @@ -31,10 +31,11 @@ HTML_TEMPLATE = """ """ -out_path = BASE_DIR.joinpath("temp", "index.html") - def generate_api_docs(app): + out_dir = BASE_DIR.joinpath(".temp") + out_dir.mkdir(parents=True, exist_ok=True) + out_path = out_dir.joinpath("index.html") with open(out_path, "w") as fd: out_path.parent.mkdir(exist_ok=True) print(HTML_TEMPLATE % json.dumps(app.openapi()), file=fd) diff --git a/mealie/utils/startup.py b/mealie/utils/startup.py index f5aba560e..3eccdc943 100644 --- a/mealie/utils/startup.py +++ b/mealie/utils/startup.py @@ -1,6 +1,6 @@ from pathlib import Path -from settings import REQUIRED_DIRS +from app_config import REQUIRED_DIRS CWD = Path(__file__).parent