mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Warn user is she's importing a duplicate and ask for confirmation.
This commit is contained in:
parent
7e7c987923
commit
5a36f6a755
@ -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)
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
4386
src/libprs500/gui2/images/dialog_information.svg
Normal file
4386
src/libprs500/gui2/images/dialog_information.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 116 KiB |
@ -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()'''
|
||||||
|
@ -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:
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user