diff options
| -rw-r--r-- | src/book_form.py | 17 | ||||
| -rw-r--r-- | src/book_store.py | 14 | ||||
| -rw-r--r-- | src/remove_paths_dialog.py | 45 |
3 files changed, 62 insertions, 14 deletions
diff --git a/src/book_form.py b/src/book_form.py index 5968592..2e5bc52 100644 --- a/src/book_form.py +++ b/src/book_form.py @@ -1,21 +1,27 @@ import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk +import logging +import os.path import src.utils as utils import src.models as models from src.ui.entry_list import EntryList from src.ui.book_entries import BookEntries from src.ui.cover_entry import CoverEntry +from src.remove_paths_dialog import RemovePathsDialog import src.book_store as book_store import src.book_files as book_files import src.str_format as str_format +logger = logging.getLogger(__name__) + class BookForm(Gtk.Window): def __init__(self, parent_window, resources, library, conn, msg, book = None): Gtk.Window.__init__(self) + self._parent_window = parent_window self._book = book self._library = library self._conn = conn @@ -74,9 +80,6 @@ class BookForm(Gtk.Window): # Books self._book_entries = BookEntries(self) box.append(self._book_entries) - self._remove_book_sources = Gtk.CheckButton.new_with_label(' Supprimer les sources') - self._remove_book_sources.set_active(True) - box.append(self._remove_book_sources) # Init values if book: @@ -124,11 +127,17 @@ class BookForm(Gtk.Window): cover = self._cover_entry.get_image() books = self._book_entries.get_books() - book_id = book_store.store(self._library, self._conn, data, cover, books, self._book, self._remove_book_sources.get_active()) + book_id = book_store.store(self._library, self._conn, data, cover, books, self._book) if book_id: self.close() self._msg(['book-saved', book_id, data]) + # Ask whether to remove book sources + directory = f'{self._library}/{book_id}' + external_paths = [p for p in books.keys() if os.path.dirname(p) != directory] + if external_paths: + RemovePathsDialog(self._parent_window, 'Supprimer les sources', external_paths).present() + def non_empty(xs): return [x.strip() for x in xs if x.strip()] diff --git a/src/book_store.py b/src/book_store.py index 1bc296f..687f01b 100644 --- a/src/book_store.py +++ b/src/book_store.py @@ -11,7 +11,7 @@ import src.book_files as book_files logger = logging.getLogger(__name__) -def store(library, conn, data, cover, books, book, remove_book_sources): +def store(library, conn, data, cover, books, book): book_id = book['id'] if book else nanoid.generate() directory = f'{library}/{book_id}' @@ -22,9 +22,9 @@ def store(library, conn, data, cover, books, book, remove_book_sources): if book: if not already_exist(directory, books) or has_delete(library, book_id, books): - update_books(directory, books, remove_book_sources) + update_books(directory, books) else: - update_books(directory, books, remove_book_sources) + update_books(directory, books) if book: db.update_book(conn, book_id, data) @@ -56,7 +56,7 @@ def has_delete(library, book_id, books): return True return False -def update_books(directory, books, remove_book_sources): +def update_books(directory, books): try: tmp_dir = f'{directory}/tmp' os.makedirs(tmp_dir, exist_ok=True) @@ -79,12 +79,6 @@ def update_books(directory, books, remove_book_sources): dest = f'{directory}/{name}{ext}' logger.info('Copying %s to %s', src, dest) shutil.copyfile(src, dest) - # Remove sources outside of book dir - if remove_book_sources: - for path in books.keys(): - if os.path.dirname(path) != directory: - logger.info('Removing source: %s', path) - pathlib.Path.unlink(path) finally: # Remove tmp shutil.rmtree(f'{directory}/tmp', ignore_errors=True) diff --git a/src/remove_paths_dialog.py b/src/remove_paths_dialog.py new file mode 100644 index 0000000..2444067 --- /dev/null +++ b/src/remove_paths_dialog.py @@ -0,0 +1,45 @@ +import gi +gi.require_version('Gtk', '4.0') +from gi.repository import Gtk +import os +import logging +import pathlib + +import src.utils as utils +import src.book_files as book_files + +logger = logging.getLogger(__name__) + +class RemovePathsDialog(Gtk.Window): + + def __init__(self, parent_window, title, paths): + Gtk.Window.__init__(self) + + self._paths = paths + + utils.configure_dialog(self, parent_window, title, width=None, height=None) + + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20) + self.set_child(box) + utils.set_margin(box, 20) + + for path in paths: + box.append(utils.label(path.as_posix())) + + buttons_box = Gtk.Box(spacing=20) + buttons_box.set_halign(Gtk.Align.END) + box.append(buttons_box) + + keep_button = Gtk.Button(label='Conserver') + keep_button.connect('clicked', lambda _: self.close()) + buttons_box.append(keep_button) + + delete_button = Gtk.Button(label='Supprimer') + delete_button.connect('clicked', lambda _: self._on_delete()) + buttons_box.append(delete_button) + + def _on_delete(self): + for path in self._paths: + logger.info('Removing source: %s', path) + pathlib.Path.unlink(path) + self.close() |
