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 @@
+
+
+
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):