diff --git a/src/libprs500/gui2/__init__.py b/src/libprs500/gui2/__init__.py index b5cf2d69d0..9db9aeba35 100644 --- a/src/libprs500/gui2/__init__.py +++ b/src/libprs500/gui2/__init__.py @@ -47,6 +47,12 @@ def error_dialog(parent, title, msg): d.setIconPixmap(QPixmap(':/images/dialog_error.svg')) return d +def question_dialog(parent, title, msg): + d = QMessageBox(QMessageBox.Question, title, msg, QMessageBox.Yes|QMessageBox.No, + parent) + d.setIconPixmap(QPixmap(':/images/dialog_information.svg')) + return d + def qstring_to_unicode(q): return unicode(q) diff --git a/src/libprs500/gui2/images.qrc b/src/libprs500/gui2/images.qrc index c431f6a3bf..2a05128cbb 100644 --- a/src/libprs500/gui2/images.qrc +++ b/src/libprs500/gui2/images.qrc @@ -8,6 +8,7 @@ images/convert.svg images/dialog_error.svg images/dialog_warning.svg + images/dialog_information.svg images/document_open.svg images/edit_input.svg images/forward.svg diff --git a/src/libprs500/gui2/images/dialog_information.svg b/src/libprs500/gui2/images/dialog_information.svg new file mode 100644 index 0000000000..42c1247bb6 --- /dev/null +++ b/src/libprs500/gui2/images/dialog_information.svg @@ -0,0 +1,4386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xmlimage/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libprs500/gui2/library.py b/src/libprs500/gui2/library.py index 3930d331ef..2dd32501da 100644 --- a/src/libprs500/gui2/library.py +++ b/src/libprs500/gui2/library.py @@ -130,8 +130,9 @@ class BooksModel(QAbstractTableModel): self.db = None self.reset() - def add_books(self, paths, formats, metadata, uris=[]): - self.db.add_books(paths, formats, metadata, uris) + def add_books(self, paths, formats, metadata, uris=[], add_duplicates=False): + return self.db.add_books(paths, formats, metadata, uris, + add_duplicates=add_duplicates) def row_indices(self, index): ''' Return list indices of all cells in index.row()''' diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py index 938cd58003..f82d21478a 100644 --- a/src/libprs500/gui2/main.py +++ b/src/libprs500/gui2/main.py @@ -31,7 +31,7 @@ from libprs500.ebooks.lrf.any.convert_from import main as _any2lrf from libprs500.devices.errors import FreeSpaceError from libprs500.devices.interface import Device from libprs500.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ - initialize_file_icon_provider, \ + initialize_file_icon_provider, question_dialog,\ pixmap_to_data, choose_dir, ORG_NAME, \ qstring_to_unicode, set_sidebar_directories from libprs500 import iswindows, isosx @@ -309,7 +309,14 @@ class Main(MainWindow, Ui_MainWindow): if not to_device: model = self.current_view().model() - model.add_books(paths, formats, metadata) + duplicates = model.add_books(paths, formats, metadata) + if duplicates: + files = _('

Books with the same title as the following already exist in the database. Add them anyway?

    ') + for mi in duplicates[2]: + files += '
  • '+mi.title+'
  • \n' + d = question_dialog(self, _('Duplicates found!'), files+'

') + if d.exec_() == QMessageBox.Yes: + model.add_books(*duplicates, **dict(add_duplicates=True)) model.resort() model.research() else: diff --git a/src/libprs500/library/database.py b/src/libprs500/library/database.py index 1f811f87d6..247f0e400e 100644 --- a/src/libprs500/library/database.py +++ b/src/libprs500/library/database.py @@ -1105,17 +1105,22 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; (id, usize, sqlite.Binary(data))) self.conn.commit() - def add_books(self, paths, formats, metadata, uris=[]): + def add_books(self, paths, formats, metadata, uris=[], add_duplicates=True): ''' Add a book to the database. self.data and self.cache are not updated. ''' formats, metadata, uris = iter(formats), iter(metadata), iter(uris) + duplicates = [] for path in paths: mi = metadata.next() + format = formats.next() try: uri = uris.next() except StopIteration: uri = None + if not add_duplicates and self.conn.execute('SELECT id FROM books where title=?', (mi.title,)).fetchone(): + duplicates.append((path, format, mi, uri)) + continue series_index = 1 if mi.series_index is None else mi.series_index obj = self.conn.execute('INSERT INTO books(title, uri, series_index) VALUES (?, ?, ?)', (mi.title, uri, series_index)) @@ -1141,11 +1146,19 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; stream.seek(0, 2) usize = stream.tell() stream.seek(0) - format = formats.next() + self.conn.execute('INSERT INTO data(book, format, uncompressed_size, data) VALUES (?,?,?,?)', (id, format, usize, sqlite.Binary(compress(stream.read())))) stream.close() self.conn.commit() + if duplicates: + paths = tuple(duplicate[0] for duplicate in duplicates) + formats = tuple(duplicate[1] for duplicate in duplicates) + metadata = tuple(duplicate[2] for duplicate in duplicates) + uris = tuple(duplicate[3] for duplicate in duplicates) + return (paths, formats, metadata, uris) + return None + def index(self, id, cache=False):