diff --git a/src/pilgrim/service/backup_service.py b/src/pilgrim/service/backup_service.py new file mode 100644 index 0000000..8bc0bbb --- /dev/null +++ b/src/pilgrim/service/backup_service.py @@ -0,0 +1,33 @@ +import sqlite3 +import zipfile +from pathlib import Path + + +from pilgrim.utils.directory_manager import DirectoryManager + + +class BackupService: + def __init__(self, session): + self.session = session + + def create_backup(self): + db_path = DirectoryManager.get_database_path() + if not db_path.exists(): + raise FileNotFoundError("No Database Found") + conn = self.session.connection().connection + dump = "\n".join(line for line in conn.iterdump()) + filename = str(DirectoryManager.get_config_directory()) + "/backup.zip" + diaries_root_path = DirectoryManager.get_diaries_root() + + try: + with zipfile.ZipFile(filename, "w",zipfile.ZIP_DEFLATED) as zipf: + zipf.writestr("database.sql", dump) + if diaries_root_path.exists(): + for file_path in diaries_root_path.rglob('*'): + if file_path.is_file(): + arcname = file_path.relative_to(diaries_root_path.parent) + zipf.write(file_path, arcname=arcname) + return True, None + except Exception as e: + return False, str(e) + diff --git a/src/pilgrim/ui/screens/diary_list_screen.py b/src/pilgrim/ui/screens/diary_list_screen.py index b4912e9..d87ba93 100644 --- a/src/pilgrim/ui/screens/diary_list_screen.py +++ b/src/pilgrim/ui/screens/diary_list_screen.py @@ -14,6 +14,8 @@ from pilgrim.ui.screens.edit_diary_modal import EditDiaryModal from pilgrim.ui.screens.new_diary_modal import NewDiaryModal from pilgrim.ui.screens.edit_entry_screen import EditEntryScreen +from pilgrim.service.backup_service import BackupService + class DiaryListScreen(Screen): TITLE = "Pilgrim - Main" @@ -298,3 +300,13 @@ class DiaryListScreen(Screen): self.notify("Invalid diary ID") else: self.notify("Select a diary to open the settings") + + + def action_backup(self): + session = self.app.service_manager.get_session() + backup_service = BackupService(session) + if session: + result = backup_service.create_backup() + else: + self.notify("You must be logged in to perform this action") + self.notify(f"Backup result: {result}") diff --git a/src/pilgrim/ui/ui.py b/src/pilgrim/ui/ui.py index 5557993..ee613a9 100644 --- a/src/pilgrim/ui/ui.py +++ b/src/pilgrim/ui/ui.py @@ -37,6 +37,11 @@ class UIApp(App): "Open About Pilgrim", screen.action_about_cmd ) + yield SystemCommand( + "Backup Database", + "Backup the Database", + screen.action_backup + ) elif isinstance(screen, AboutScreen): yield SystemCommand(