From ddad451489cda212254e7602a65b2aaa51a194ba Mon Sep 17 00:00:00 2001 From: hay-kot Date: Sun, 28 Mar 2021 11:00:14 -0800 Subject: [PATCH] Site Pages Import/Export --- .../components/Admin/Backup/ImportOptions.vue | 5 ++ .../Backup/ImportSummaryDialog/index.vue | 48 ++++++++----------- mealie/routes/backup_routes.py | 11 ++--- mealie/schema/backup.py | 1 + mealie/schema/restore.py | 4 ++ mealie/services/backups/exports.py | 14 +++--- mealie/services/backups/imports.py | 28 ++++++++--- 7 files changed, 64 insertions(+), 47 deletions(-) diff --git a/frontend/src/components/Admin/Backup/ImportOptions.vue b/frontend/src/components/Admin/Backup/ImportOptions.vue index 4db4f2119..9228f20d9 100644 --- a/frontend/src/components/Admin/Backup/ImportOptions.vue +++ b/frontend/src/components/Admin/Backup/ImportOptions.vue @@ -26,6 +26,10 @@ export default { value: true, text: this.$t("general.settings"), }, + pages: { + value: true, + text: "Pages", + }, themes: { value: true, text: this.$t("general.themes"), @@ -50,6 +54,7 @@ export default { recipes: this.options.recipes.value, settings: this.options.settings.value, themes: this.options.themes.value, + pages: this.options.pages.value, users: this.options.users.value, groups: this.options.groups.value, }); diff --git a/frontend/src/components/Admin/Backup/ImportSummaryDialog/index.vue b/frontend/src/components/Admin/Backup/ImportSummaryDialog/index.vue index 491ba2843..8714c6fea 100644 --- a/frontend/src/components/Admin/Backup/ImportSummaryDialog/index.vue +++ b/frontend/src/components/Admin/Backup/ImportSummaryDialog/index.vue @@ -28,38 +28,14 @@ {{ $t("general.recipes") }} {{ $t("general.themes") }} {{ $t("general.settings") }} + Pages {{ $t("general.users") }} {{ $t("general.groups") }} - + - - - - - - - - - - - - - - - - + @@ -82,6 +58,7 @@ export default { settingsData: [], userData: [], groupData: [], + pageData: [], importHeaders: [ { text: "Status", @@ -118,15 +95,29 @@ export default { groupNumbers() { return this.calculateNumbers(this.$t("general.groups"), this.groupData); }, + pageNumbers() { + return this.calculateNumbers("Pages", this.pageData); + }, allNumbers() { return [ this.recipeNumbers, - this.settingsNumbers, this.themeNumbers, + this.settingsNumbers, + this.pageNumbers, this.userNumbers, this.groupNumbers, ]; }, + allTables() { + return [ + this.recipeData, + this.themeData, + this.settingsData, + this.pageData, + this.userData, + this.groupData, + ]; + }, }, methods: { @@ -146,6 +137,7 @@ export default { this.settingsData = importData.settingsImports; this.userData = importData.userImports; this.groupData = importData.groupImports; + this.pageData = importData.pageImports; this.dialog = true; }, }, diff --git a/mealie/routes/backup_routes.py b/mealie/routes/backup_routes.py index 17aa937d2..8c186a737 100644 --- a/mealie/routes/backup_routes.py +++ b/mealie/routes/backup_routes.py @@ -18,14 +18,11 @@ router = APIRouter(prefix="/api/backups", tags=["Backups"]) def available_imports(): """Returns a list of avaiable .zip files for import into Mealie.""" imports = [] - templates = [] for archive in BACKUP_DIR.glob("*.zip"): backup = LocalBackup(name=archive.name, date=archive.stat().st_ctime) imports.append(backup) - for template in TEMPLATE_DIR.glob("*.*"): - templates.append(template.name) - + templates = [template.name for template in TEMPLATE_DIR.glob("*.*")] imports.sort(key=operator.attrgetter("date"), reverse=True) return Imports(imports=imports, templates=templates) @@ -40,6 +37,7 @@ def export_database(data: BackupJob, session: Session = Depends(generate_session templates=data.templates, export_recipes=data.options.recipes, export_settings=data.options.settings, + export_pages=data.options.pages, export_themes=data.options.themes, export_users=data.options.users, export_groups=data.options.groups, @@ -82,11 +80,12 @@ async def upload_nextcloud_zipfile(file_name: str): def import_database(file_name: str, import_data: ImportJob, session: Session = Depends(generate_session)): """ Import a database backup file generated from Mealie. """ - imported = imports.import_database( + return imports.import_database( session=session, archive=import_data.name, import_recipes=import_data.recipes, import_settings=import_data.settings, + import_pages=import_data.pages, import_themes=import_data.themes, import_users=import_data.users, import_groups=import_data.groups, @@ -94,8 +93,6 @@ def import_database(file_name: str, import_data: ImportJob, session: Session = D rebase=import_data.rebase, ) - return imported - @router.delete("/{file_name}/delete", status_code=200) def delete_backup(file_name: str): diff --git a/mealie/schema/backup.py b/mealie/schema/backup.py index 12c0f3b3e..9b7b735c0 100644 --- a/mealie/schema/backup.py +++ b/mealie/schema/backup.py @@ -7,6 +7,7 @@ from pydantic import BaseModel class BackupOptions(BaseModel): recipes: bool = True settings: bool = True + pages: bool = True themes: bool = True groups: bool = True users: bool = True diff --git a/mealie/schema/restore.py b/mealie/schema/restore.py index f57fdd3fa..badb590d8 100644 --- a/mealie/schema/restore.py +++ b/mealie/schema/restore.py @@ -27,3 +27,7 @@ class GroupImport(ImportBase): class UserImport(ImportBase): pass + + +class CustomPageImport(ImportBase): + pass diff --git a/mealie/services/backups/exports.py b/mealie/services/backups/exports.py index 8d0e5ba04..1753e1140 100644 --- a/mealie/services/backups/exports.py +++ b/mealie/services/backups/exports.py @@ -4,11 +4,11 @@ from datetime import datetime from pathlib import Path from typing import Union +from fastapi.logger import logger +from jinja2 import Template from mealie.core.config import BACKUP_DIR, IMG_DIR, TEMP_DIR, TEMPLATE_DIR from mealie.db.database import db from mealie.db.db_setup import create_session -from fastapi.logger import logger -from jinja2 import Template from pydantic.main import BaseModel @@ -101,6 +101,7 @@ def backup_all( templates=None, export_recipes=True, export_settings=True, + export_pages=True, export_themes=True, export_users=True, export_groups=True, @@ -125,6 +126,10 @@ def backup_all( all_settings = db.settings.get_all(session) db_export.export_items(all_settings, "settings") + if export_pages: + all_pages = db.custom_pages.get_all(session) + db_export.export_items(all_pages, "pages") + if export_themes: all_themes = db.themes.get_all(session) db_export.export_items(all_themes, "themes") @@ -136,10 +141,7 @@ def auto_backup_job(): for backup in BACKUP_DIR.glob("Auto*.zip"): backup.unlink() - templates = [] - for template in TEMPLATE_DIR.iterdir(): - templates.append(template) - + templates = [template for template in TEMPLATE_DIR.iterdir()] session = create_session() backup_all(session=session, tag="Auto", templates=templates) logger.info("Auto Backup Called") diff --git a/mealie/services/backups/imports.py b/mealie/services/backups/imports.py index ca99e8480..97ff3f1ed 100644 --- a/mealie/services/backups/imports.py +++ b/mealie/services/backups/imports.py @@ -7,8 +7,8 @@ from typing import Callable, List from mealie.core.config import BACKUP_DIR, IMG_DIR, TEMP_DIR from mealie.db.database import db from mealie.schema.recipe import Recipe -from mealie.schema.restore import GroupImport, RecipeImport, SettingsImport, ThemeImport, UserImport -from mealie.schema.settings import SiteSettings +from mealie.schema.restore import CustomPageImport, GroupImport, RecipeImport, SettingsImport, ThemeImport, UserImport +from mealie.schema.settings import CustomPageOut, SiteSettings from mealie.schema.theme import SiteTheme from mealie.schema.user import UpdateGroup, UserInDB from pydantic.main import BaseModel @@ -42,7 +42,6 @@ class ImportDatabase: with zipfile.ZipFile(self.archive, "r") as zip_ref: zip_ref.extractall(self.import_dir) - pass else: raise Exception("Import file does not exist") @@ -95,9 +94,7 @@ class ImportDatabase: try: if "" in recipe_dict["categories"]: - recipe_dict["categories"] = [ - cat for cat in recipe_dict["categories"] if cat != "" - ] + recipe_dict["categories"] = [cat for cat in recipe_dict["categories"] if cat != ""] except: pass @@ -149,6 +146,19 @@ class ImportDatabase: return [import_status] + def import_pages(self): + pages_file = self.import_dir.joinpath("pages", "pages.json") + pages = ImportDatabase.read_models_file(pages_file, CustomPageOut) + + page_imports = [] + for page in pages: + import_stats = self.import_model( + db_table=db.custom_pages, model=page, return_model=CustomPageImport, name_attr="name", search_key="slug" + ) + page_imports.append(import_stats) + + return page_imports + def import_groups(self): groups_file = self.import_dir.joinpath("groups", "groups.json") groups = ImportDatabase.read_models_file(groups_file, UpdateGroup) @@ -273,6 +283,7 @@ def import_database( archive, import_recipes=True, import_settings=True, + import_pages=True, import_themes=True, import_users=True, import_groups=True, @@ -293,6 +304,10 @@ def import_database( if import_themes: theme_report = import_session.import_themes() + if import_pages: + print("IMport Pages") + page_report = import_session.import_pages() + group_report = [] if import_groups: group_report = import_session.import_groups() @@ -307,6 +322,7 @@ def import_database( "recipeImports": recipe_report, "settingsImports": settings_report, "themeImports": theme_report, + "pageImports": page_report, "groupImports": group_report, "userImports": user_report, }