Compare commits

...

2 Commits

Author SHA1 Message Date
Gustavo Henrique Santos Souza de Miranda 7274d670ec Remove the backup diary option on the diary settings screen 2025-07-24 02:03:52 -03:00
Gustavo Henrique Santos Souza de Miranda 62e084efb3 Add the feature to delete all the photos from a travel diary and also remove all the references of photos inside the entry 2025-07-24 01:54:24 -03:00
5 changed files with 60 additions and 10 deletions

View File

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

View File

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

View File

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

View File

@ -35,7 +35,7 @@ class SettingsScreen(Screen):
self.save_button = Button("Save",id="DiarySettingsScreen-SaveButton" )
self.cancel_button = Button("Cancel",id="DiarySettingsScreen-cancel_button")
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_all_entries_button = Button("Delete All Entries",id="DiarySettingsScreen-DeleteAllEntriesButton")
self.delete_all_photos_button = Button("Delete All Photos",id="DiarySettingsScreen-DeleteAllPhotosButton")
@ -47,12 +47,6 @@ class SettingsScreen(Screen):
id="DiarySettingsScreen-DeleteDiaryButtonContainer",
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(
Label("Delete All Entries:"),
self.delete_all_entries_button,

View File

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