Warn user is she's importing a duplicate and ask for confirmation.

This commit is contained in:
Kovid Goyal 2008-01-16 06:23:05 +00:00
parent 7e7c987923
commit 5a36f6a755
6 changed files with 4420 additions and 6 deletions

View File

@ -47,6 +47,12 @@ def error_dialog(parent, title, msg):
d.setIconPixmap(QPixmap(':/images/dialog_error.svg')) d.setIconPixmap(QPixmap(':/images/dialog_error.svg'))
return d 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): def qstring_to_unicode(q):
return unicode(q) return unicode(q)

View File

@ -8,6 +8,7 @@
<file>images/convert.svg</file> <file>images/convert.svg</file>
<file>images/dialog_error.svg</file> <file>images/dialog_error.svg</file>
<file>images/dialog_warning.svg</file> <file>images/dialog_warning.svg</file>
<file>images/dialog_information.svg</file>
<file>images/document_open.svg</file> <file>images/document_open.svg</file>
<file>images/edit_input.svg</file> <file>images/edit_input.svg</file>
<file>images/forward.svg</file> <file>images/forward.svg</file>

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -130,8 +130,9 @@ class BooksModel(QAbstractTableModel):
self.db = None self.db = None
self.reset() self.reset()
def add_books(self, paths, formats, metadata, uris=[]): def add_books(self, paths, formats, metadata, uris=[], add_duplicates=False):
self.db.add_books(paths, formats, metadata, uris) return self.db.add_books(paths, formats, metadata, uris,
add_duplicates=add_duplicates)
def row_indices(self, index): def row_indices(self, index):
''' Return list indices of all cells in index.row()''' ''' Return list indices of all cells in index.row()'''

View File

@ -31,7 +31,7 @@ from libprs500.ebooks.lrf.any.convert_from import main as _any2lrf
from libprs500.devices.errors import FreeSpaceError from libprs500.devices.errors import FreeSpaceError
from libprs500.devices.interface import Device from libprs500.devices.interface import Device
from libprs500.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ 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, \ pixmap_to_data, choose_dir, ORG_NAME, \
qstring_to_unicode, set_sidebar_directories qstring_to_unicode, set_sidebar_directories
from libprs500 import iswindows, isosx from libprs500 import iswindows, isosx
@ -309,7 +309,14 @@ class Main(MainWindow, Ui_MainWindow):
if not to_device: if not to_device:
model = self.current_view().model() model = self.current_view().model()
model.add_books(paths, formats, metadata) duplicates = model.add_books(paths, formats, metadata)
if duplicates:
files = _('<p>Books with the same title as the following already exist in the database. Add them anyway?<ul>')
for mi in duplicates[2]:
files += '<li>'+mi.title+'</li>\n'
d = question_dialog(self, _('Duplicates found!'), files+'</ul></p>')
if d.exec_() == QMessageBox.Yes:
model.add_books(*duplicates, **dict(add_duplicates=True))
model.resort() model.resort()
model.research() model.research()
else: else:

View File

@ -1105,17 +1105,22 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE;
(id, usize, sqlite.Binary(data))) (id, usize, sqlite.Binary(data)))
self.conn.commit() 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. Add a book to the database. self.data and self.cache are not updated.
''' '''
formats, metadata, uris = iter(formats), iter(metadata), iter(uris) formats, metadata, uris = iter(formats), iter(metadata), iter(uris)
duplicates = []
for path in paths: for path in paths:
mi = metadata.next() mi = metadata.next()
format = formats.next()
try: try:
uri = uris.next() uri = uris.next()
except StopIteration: except StopIteration:
uri = None 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 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 (?, ?, ?)', obj = self.conn.execute('INSERT INTO books(title, uri, series_index) VALUES (?, ?, ?)',
(mi.title, uri, series_index)) (mi.title, uri, series_index))
@ -1141,11 +1146,19 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE;
stream.seek(0, 2) stream.seek(0, 2)
usize = stream.tell() usize = stream.tell()
stream.seek(0) stream.seek(0)
format = formats.next()
self.conn.execute('INSERT INTO data(book, format, uncompressed_size, data) VALUES (?,?,?,?)', self.conn.execute('INSERT INTO data(book, format, uncompressed_size, data) VALUES (?,?,?,?)',
(id, format, usize, sqlite.Binary(compress(stream.read())))) (id, format, usize, sqlite.Binary(compress(stream.read()))))
stream.close() stream.close()
self.conn.commit() 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): def index(self, id, cache=False):