diff --git a/frontend/src/components/FormHelpers/ImportOptions.vue b/frontend/src/components/FormHelpers/ImportOptions.vue index 333f5d5fdbd3..519037a46e53 100644 --- a/frontend/src/components/FormHelpers/ImportOptions.vue +++ b/frontend/src/components/FormHelpers/ImportOptions.vue @@ -42,6 +42,10 @@ export default { value: true, text: this.$t("group.groups"), }, + notifications: { + value: true, + text: this.$t("events.notification"), + }, }, }; }, @@ -57,6 +61,7 @@ export default { pages: this.options.pages.value, users: this.options.users.value, groups: this.options.groups.value, + notifications: this.options.notifications.value, }); }, }, diff --git a/frontend/src/components/UI/Dialogs/BackupDialog.vue b/frontend/src/components/UI/Dialogs/BackupDialog.vue index 83799fc5a700..6789154c46d2 100644 --- a/frontend/src/components/UI/Dialogs/BackupDialog.vue +++ b/frontend/src/components/UI/Dialogs/BackupDialog.vue @@ -98,6 +98,7 @@ export default { pages: true, users: true, groups: true, + notifications: true, }; this.availableTemplates = []; this.selectedTemplates = []; @@ -122,10 +123,13 @@ export default { themes: this.options.themes, users: this.options.users, groups: this.options.groups, + notifications: this.options.notifications, }, templates: this.selectedTemplates, }; + console.log(data); + if (await api.backups.create(data)) { this.$emit("created"); } diff --git a/frontend/src/components/UI/Dialogs/ImportDialog.vue b/frontend/src/components/UI/Dialogs/ImportDialog.vue index 4e80ac837a36..aab88a545949 100644 --- a/frontend/src/components/UI/Dialogs/ImportDialog.vue +++ b/frontend/src/components/UI/Dialogs/ImportDialog.vue @@ -97,6 +97,7 @@ export default { themes: this.options.themes, users: this.options.users, groups: this.options.groups, + notifications: this.options.notifications, }; this.loading = true; const importData = await this.importBackup(eventData); diff --git a/frontend/src/pages/Admin/Dashboard/BackupViewer.vue b/frontend/src/pages/Admin/Dashboard/BackupViewer.vue index a83c706e1b60..6ddc63330cf4 100644 --- a/frontend/src/pages/Admin/Dashboard/BackupViewer.vue +++ b/frontend/src/pages/Admin/Dashboard/BackupViewer.vue @@ -120,13 +120,7 @@ export default { let data = { tag: this.tag, - options: { - recipes: true, - settings: true, - themes: true, - users: true, - groups: true, - }, + options: {}, templates: [], }; diff --git a/mealie/routes/backup_routes.py b/mealie/routes/backup_routes.py index 4fef48f8d2fe..51eeb50d2a3e 100644 --- a/mealie/routes/backup_routes.py +++ b/mealie/routes/backup_routes.py @@ -46,6 +46,7 @@ def export_database(background_tasks: BackgroundTasks, data: BackupJob, session: export_themes=data.options.themes, export_users=data.options.users, export_groups=data.options.groups, + export_notifications=data.options.notifications, ) background_tasks.add_task( create_backup_event, "Database Backup", f"Manual Backup Created '{Path(export_path).name}'", session diff --git a/mealie/schema/backup.py b/mealie/schema/backup.py index 9b7b735c00d1..ab3859d4cb7f 100644 --- a/mealie/schema/backup.py +++ b/mealie/schema/backup.py @@ -11,6 +11,7 @@ class BackupOptions(BaseModel): themes: bool = True groups: bool = True users: bool = True + notifications: bool = True class Config: schema_extra = { diff --git a/mealie/schema/restore.py b/mealie/schema/restore.py index badb590d8099..f393860dc4d8 100644 --- a/mealie/schema/restore.py +++ b/mealie/schema/restore.py @@ -31,3 +31,7 @@ class UserImport(ImportBase): class CustomPageImport(ImportBase): pass + + +class NotificationImport(ImportBase): + pass diff --git a/mealie/services/backups/exports.py b/mealie/services/backups/exports.py index 321dd9e04e3a..c127ad6a397e 100644 --- a/mealie/services/backups/exports.py +++ b/mealie/services/backups/exports.py @@ -111,6 +111,7 @@ def backup_all( export_themes=True, export_users=True, export_groups=True, + export_notifications=True, ): db_export = ExportDatabase(tag=tag, templates=templates) @@ -140,6 +141,10 @@ def backup_all( all_themes = db.themes.get_all(session) db_export.export_items(all_themes, "themes") + if export_notifications: + all_notifications = db.event_notifications.get_all(session) + db_export.export_items(all_notifications, "notifications") + return db_export.finish_export() diff --git a/mealie/services/backups/imports.py b/mealie/services/backups/imports.py index 864a21fb4aa9..e497a04242c1 100644 --- a/mealie/services/backups/imports.py +++ b/mealie/services/backups/imports.py @@ -6,8 +6,17 @@ from typing import Callable from mealie.core.config import app_dirs from mealie.db.database import db +from mealie.schema.event_notifications import EventNotificationIn from mealie.schema.recipe import Recipe -from mealie.schema.restore import CustomPageImport, GroupImport, RecipeImport, SettingsImport, ThemeImport, UserImport +from mealie.schema.restore import ( + CustomPageImport, + GroupImport, + NotificationImport, + RecipeImport, + SettingsImport, + ThemeImport, + UserImport, +) from mealie.schema.settings import CustomPageOut, SiteSettings from mealie.schema.theme import SiteTheme from mealie.schema.user import UpdateGroup, UserInDB @@ -148,6 +157,24 @@ class ImportDatabase: return theme_imports + def import_notifications(self): + notify_file = self.import_dir.joinpath("notifications", "notifications.json") + notifications = ImportDatabase.read_models_file(notify_file, EventNotificationIn) + import_notifications = [] + + for notify in notifications: + import_status = self.import_model( + db_table=db.event_notifications, + model=notify, + return_model=NotificationImport, + name_attr="name", + search_key="notification_url", + ) + + import_notifications.append(import_status) + + return import_notifications + def import_settings(self): # ! Broken settings_file = self.import_dir.joinpath("settings", "settings.json") settings = ImportDatabase.read_models_file(settings_file, SiteSettings) @@ -304,6 +331,7 @@ def import_database( import_themes=True, import_users=True, import_groups=True, + import_notifications=True, force_import: bool = False, rebase: bool = False, ): @@ -333,6 +361,9 @@ def import_database( if import_users: user_report = import_session.import_users() + if import_notifications: + notification_report = import_session.import_notifications() + import_session.clean_up() return { @@ -342,4 +373,5 @@ def import_database( "pageImports": page_report, "groupImports": group_report, "userImports": user_report, + "notificationImports": notification_report, }