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,
}