Compare commits

..
8 changed files with 110 additions and 14 deletions
+22
View File
@@ -1,3 +1,4 @@
import re
from datetime import datetime from datetime import datetime
from typing import List from typing import List
@@ -54,3 +55,24 @@ class EntryService:
self.session.commit() self.session.commit()
return excluded return excluded
return None return None
def delete_references_for_specific_photo(self, entry: Entry, photo_hash: str) -> Entry:
regex = r"\[\[photo::" + re.escape(photo_hash) + r"\]\]"
entry.text = re.sub(regex, lambda match: ' ' * len(match.group(0)), entry.text)
self.session.commit()
self.session.refresh(entry)
return entry
def delete_all_photo_references(self, entry: Entry, commit=True) -> Entry:
if not entry.photos:
return entry
photo_hashes = {photo.photo_hash[:8] for photo in entry.photos}
regex = r"\[\[photo::(" + "|".join(re.escape(h) for h in photo_hashes) + r")\]\]"
entry.text = re.sub(regex, lambda match: ' ' * len(match.group(0)), entry.text)
if commit:
self.session.commit()
self.session.refresh(entry)
return entry
+2 -1
View File
@@ -141,7 +141,7 @@ class PhotoService:
return original return original
return None return None
def delete(self, photo_src: Photo) -> Photo | None: def delete(self, photo_src: Photo, commit=True) -> Photo | None:
excluded = self.read_by_id(photo_src.id) excluded = self.read_by_id(photo_src.id)
if excluded: if excluded:
# Store photo data before deletion # Store photo data before deletion
@@ -162,6 +162,7 @@ class PhotoService:
file_path.unlink() file_path.unlink()
self.session.delete(excluded) self.session.delete(excluded)
if commit:
self.session.commit() self.session.commit()
return deleted_photo return deleted_photo
@@ -3,12 +3,16 @@ import re
import shutil import shutil
from pathlib import Path from pathlib import Path
from pilgrim.models.entry import Entry
from pilgrim.utils import DirectoryManager from pilgrim.utils import DirectoryManager
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from pilgrim.models.travel_diary import TravelDiary from pilgrim.models.travel_diary import TravelDiary
from unidecode import unidecode from unidecode import unidecode
from pilgrim.service.photo_service import PhotoService
from pilgrim.service.entry_service import EntryService
class TravelDiaryService: class TravelDiaryService:
def __init__(self, session): def __init__(self, session):
self.session = session self.session = session
@@ -147,3 +151,32 @@ class TravelDiaryService:
self.session.rollback() self.session.rollback()
raise ValueError(f"Could not delete diary: {str(e)}") raise ValueError(f"Could not delete diary: {str(e)}")
return None return None
def delete_all_entries(self,travel_diary: TravelDiary):
diary = self.read_by_id(travel_diary.id)
if diary is not None:
diary.entries = []
self.session.commit()
return True
return False
def delete_all_photos(self,travel_diary: TravelDiary):
diary = self.read_by_id(travel_diary.id)
photo_service = PhotoService(self.session)
entry_service = EntryService(self.session)
if diary is not None:
for entry in list(diary.entries):
entry_service.delete_all_photo_references(entry,commit=False)
for photo in list(diary.photos):
photo_service.delete(photo,commit=False)
self.session.commit()
return True
return False
@@ -35,7 +35,7 @@ class SettingsScreen(Screen):
self.save_button = Button("Save",id="DiarySettingsScreen-SaveButton" ) self.save_button = Button("Save",id="DiarySettingsScreen-SaveButton" )
self.cancel_button = Button("Cancel",id="DiarySettingsScreen-cancel_button") self.cancel_button = Button("Cancel",id="DiarySettingsScreen-cancel_button")
self.apply_button = Button("Apply",id="DiarySettingsScreen-ApplyButton") self.apply_button = Button("Apply",id="DiarySettingsScreen-ApplyButton")
self.backup_diary_button = Button("Backup Diary")
self.delete_diary_button = Button("Delete Diary",id="DiarySettingsScreen-DeleteDiaryButton") self.delete_diary_button = Button("Delete Diary",id="DiarySettingsScreen-DeleteDiaryButton")
self.delete_all_entries_button = Button("Delete All Entries",id="DiarySettingsScreen-DeleteAllEntriesButton") self.delete_all_entries_button = Button("Delete All Entries",id="DiarySettingsScreen-DeleteAllEntriesButton")
self.delete_all_photos_button = Button("Delete All Photos",id="DiarySettingsScreen-DeleteAllPhotosButton") self.delete_all_photos_button = Button("Delete All Photos",id="DiarySettingsScreen-DeleteAllPhotosButton")
@@ -47,12 +47,6 @@ class SettingsScreen(Screen):
id="DiarySettingsScreen-DeleteDiaryButtonContainer", id="DiarySettingsScreen-DeleteDiaryButtonContainer",
classes="DiarySettingsScreen-DeleteDiaryButtonContainer Button_Container" classes="DiarySettingsScreen-DeleteDiaryButtonContainer Button_Container"
) )
self.backup_diary_button_container = Container(
Label("Backup Diary:"),
self.backup_diary_button,
id="DiarySettingsScreen-BackupDiaryButtonContainer",
classes="DiarySettingsScreen-BackupDiaryButtonContainer Button_Container"
)
self.delete_all_entries_button_container = Container( self.delete_all_entries_button_container = Container(
Label("Delete All Entries:"), Label("Delete All Entries:"),
self.delete_all_entries_button, self.delete_all_entries_button,
@@ -3,6 +3,7 @@ from textual.widgets import Button
from textual import on from textual import on
from pilgrim.ui.screens.modals.delete_yes_confirmation_modal import DeleteYesConfirmationModal from pilgrim.ui.screens.modals.delete_yes_confirmation_modal import DeleteYesConfirmationModal
@@ -10,11 +11,23 @@ class DeleteAllEntriesModal(DeleteYesConfirmationModal):
def __init__(self,diary_id:int): def __init__(self,diary_id:int):
super().__init__(diary_id) super().__init__(diary_id)
self.head_text.update("Are you sure you want to delete all entries from this diary?") self.head_text.update("Are you sure you want to delete all entries from this diary?")
self.delete_button.add_class("DeleteDiaryModal-DeleteButton")
@on(Button.Pressed, "#DeleteDiaryModal-DeleteButton") @on(Button.Pressed, ".DeleteDiaryModal-DeleteButton")
def on_delete_button_pressed(self, event): def on_delete_button_pressed(self, event):
self.result = True
self.dismiss()
from pilgrim.ui.screens.diary_list_screen import DiaryListScreen
self.result = True
self._delete_entries()
self.dismiss()
self.app.push_screen(DiaryListScreen())
def _delete_entries(self):
diary = self.app.service_manager.get_travel_diary_service().read_by_id(self.diary_id)
if self.app.service_manager.get_travel_diary_service().delete_all_entries(diary):
self.notify("All entries deleted successfully")
else:
self.notify("Failed to delete all entries")
@@ -10,11 +10,23 @@ class DeleteAllPhotosModal(DeleteYesConfirmationModal):
def __init__(self,diary_id:int): def __init__(self,diary_id:int):
super().__init__(diary_id) super().__init__(diary_id)
self.head_text.update("Are you sure you want to delete all photos from this diary?") self.head_text.update("Are you sure you want to delete all photos from this diary?")
self.delete_button.add_class("DeleteDiaryModal-DeleteButton")
@on(Button.Pressed, "#DeleteDiaryModal-DeleteButton") @on(Button.Pressed, ".DeleteDiaryModal-DeleteButton")
def on_delete_button_pressed(self, event): def on_delete_button_pressed(self, event):
self.result = True
self.dismiss()
from pilgrim.ui.screens.diary_list_screen import DiaryListScreen
self.result = True
self._delete_all_photo()
self.dismiss()
self.app.push_screen(DiaryListScreen())
def _delete_all_photo(self):
diary = self.app.service_manager.get_travel_diary_service().read_by_id(self.diary_id)
if self.app.service_manager.get_travel_diary_service().delete_all_photos(diary):
self.notify("All photos deleted successfully")
else:
self.notify("Failed to delete all photos")
@@ -5,6 +5,8 @@ from textual.binding import Binding
from textual import on from textual import on
class DeleteDiaryModal(Screen): class DeleteDiaryModal(Screen):
BINDINGS = [ BINDINGS = [
@@ -44,11 +46,19 @@ class DeleteDiaryModal(Screen):
else: else:
self.delete_button.disabled = True self.delete_button.disabled = True
@on(Button.Pressed,"#DeleteDiaryModal-DeleteButton") @on(Button.Pressed,"#DeleteDiaryModal-DeleteButton")
def on_delete_button_pressed(self, event): def on_delete_button_pressed(self, event):
self.result = True self.result = True
self._delete_diary()
self.dismiss() self.dismiss()
from pilgrim.ui.screens.diary_list_screen import DiaryListScreen
self.app.push_screen(DiaryListScreen())
@on(Button.Pressed,"#DeleteDiaryModal-CancelButton") @on(Button.Pressed,"#DeleteDiaryModal-CancelButton")
def on_cancel_button_pressed(self, event): def on_cancel_button_pressed(self, event):
@@ -57,3 +67,11 @@ class DeleteDiaryModal(Screen):
def action_cancel(self): def action_cancel(self):
self.dismiss() self.dismiss()
def _delete_diary(self):
diary = self.app.service_manager.get_travel_diary_service().read_by_id(self.diary_id)
self.app.service_manager.get_travel_diary_service().delete(diary)
if self.app.config_manager.get_auto_open_diary() == self.diary_name:
self.app.config_manager.set_auto_open_diary(None)
self.app.config_manager.save_config()
@@ -5,6 +5,8 @@ from textual.binding import Binding
from textual import on from textual import on
class DeleteYesConfirmationModal(Screen): class DeleteYesConfirmationModal(Screen):
BINDINGS = [ BINDINGS = [
Binding("escape", "cancel", "Cancel"), Binding("escape", "cancel", "Cancel"),
@@ -45,8 +47,9 @@ class DeleteYesConfirmationModal(Screen):
self.action_cancel() self.action_cancel()
def action_cancel(self): def action_cancel(self):
from pilgrim.ui.screens.diary_settings_screen import SettingsScreen
self.dismiss() self.dismiss()
self.app.push_screen(SettingsScreen(diary=travel_diary[0])) self.app.push_screen(SettingsScreen(self.diary_id))
def compose(self): def compose(self):
yield Header() yield Header()