Site Pages Import/Export

This commit is contained in:
hay-kot 2021-03-28 11:00:14 -08:00
commit ddad451489
7 changed files with 64 additions and 47 deletions

View file

@ -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,
});

View file

@ -28,38 +28,14 @@
<v-tab>{{ $t("general.recipes") }}</v-tab>
<v-tab>{{ $t("general.themes") }}</v-tab>
<v-tab>{{ $t("general.settings") }}</v-tab>
<v-tab> Pages </v-tab>
<v-tab>{{ $t("general.users") }}</v-tab>
<v-tab>{{ $t("general.groups") }}</v-tab>
</v-tabs>
<v-tabs-items v-model="tab">
<v-tab-item>
<v-tab-item v-for="(table, index) in allTables" :key="index">
<v-card flat>
<DataTable :data-headers="importHeaders" :data-set="recipeData" />
</v-card>
</v-tab-item>
<v-tab-item>
<v-card>
<DataTable
:data-headers="importHeaders"
:data-set="themeData"
/> </v-card
></v-tab-item>
<v-tab-item>
<v-card
><DataTable
:data-headers="importHeaders"
:data-set="settingsData"
/>
</v-card>
</v-tab-item>
<v-tab-item>
<v-card
><DataTable :data-headers="importHeaders" :data-set="userData" />
</v-card>
</v-tab-item>
<v-tab-item>
<v-card
><DataTable :data-headers="importHeaders" :data-set="groupData" />
<DataTable :data-headers="importHeaders" :data-set="table" />
</v-card>
</v-tab-item>
</v-tabs-items>
@ -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;
},
},

View file

@ -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):

View file

@ -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

View file

@ -27,3 +27,7 @@ class GroupImport(ImportBase):
class UserImport(ImportBase):
pass
class CustomPageImport(ImportBase):
pass

View file

@ -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")

View file

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