From 62e084efb351e8cad894cf2c2e87d9864f73103c Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Thu, 24 Jul 2025 01:54:24 -0300 Subject: [PATCH] Add the feature to delete all the photos from a travel diary and also remove all the references of photos inside the entry --- src/pilgrim/service/entry_service.py | 22 +++++++++++++++++++ src/pilgrim/service/photo_service.py | 5 +++-- src/pilgrim/service/travel_diary_service.py | 21 ++++++++++++++++++ .../delete_all_photos_from_diary_modal.py | 14 +++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/pilgrim/service/entry_service.py b/src/pilgrim/service/entry_service.py index 5826c31..1d6f476 100644 --- a/src/pilgrim/service/entry_service.py +++ b/src/pilgrim/service/entry_service.py @@ -1,3 +1,4 @@ +import re from datetime import datetime from typing import List @@ -54,3 +55,24 @@ class EntryService: self.session.commit() return excluded 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 diff --git a/src/pilgrim/service/photo_service.py b/src/pilgrim/service/photo_service.py index f23ae3f..5ee3a18 100644 --- a/src/pilgrim/service/photo_service.py +++ b/src/pilgrim/service/photo_service.py @@ -141,7 +141,7 @@ class PhotoService: return original 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) if excluded: # Store photo data before deletion @@ -162,7 +162,8 @@ class PhotoService: file_path.unlink() self.session.delete(excluded) - self.session.commit() + if commit: + self.session.commit() return deleted_photo return None diff --git a/src/pilgrim/service/travel_diary_service.py b/src/pilgrim/service/travel_diary_service.py index fb00d37..eaedcf0 100644 --- a/src/pilgrim/service/travel_diary_service.py +++ b/src/pilgrim/service/travel_diary_service.py @@ -10,6 +10,9 @@ from sqlalchemy.exc import IntegrityError from pilgrim.models.travel_diary import TravelDiary from unidecode import unidecode +from pilgrim.service.photo_service import PhotoService +from pilgrim.service.entry_service import EntryService + class TravelDiaryService: def __init__(self, session): self.session = session @@ -156,6 +159,24 @@ class TravelDiaryService: 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 diff --git a/src/pilgrim/ui/screens/modals/delete_all_photos_from_diary_modal.py b/src/pilgrim/ui/screens/modals/delete_all_photos_from_diary_modal.py index d34b8bb..6b8619d 100644 --- a/src/pilgrim/ui/screens/modals/delete_all_photos_from_diary_modal.py +++ b/src/pilgrim/ui/screens/modals/delete_all_photos_from_diary_modal.py @@ -10,11 +10,23 @@ class DeleteAllPhotosModal(DeleteYesConfirmationModal): def __init__(self,diary_id:int): super().__init__(diary_id) 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): + + 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") \ No newline at end of file