Tag browser: Fix a crash when renaming a saved search to a value that already exists. Fixes #1901273 [Renaming saved search from tag browser crashes Calibre](https://bugs.launchpad.net/calibre/+bug/1901273)

This commit is contained in:
Kovid Goyal 2020-10-27 07:00:18 +05:30
parent 55a13f248a
commit 34a4f06855
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -6,25 +6,31 @@ __license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import traceback, copy, os import copy
import os
import traceback
from collections import OrderedDict, namedtuple from collections import OrderedDict, namedtuple
from functools import partial
from PyQt5.Qt import (QAbstractItemModel, QIcon, QFont, Qt, from PyQt5.Qt import (
QMimeData, QModelIndex, pyqtSignal, QObject) QAbstractItemModel, QFont, QIcon, QMimeData, QModelIndex, QObject, Qt, QTimer,
pyqtSignal
)
from calibre.constants import config_dir from calibre.constants import config_dir
from calibre.ebooks.metadata import rating_to_stars
from calibre.gui2 import gprefs, config, error_dialog, file_icon_provider
from calibre.db.categories import Tag from calibre.db.categories import Tag
from calibre.utils.config import tweaks, prefs from calibre.ebooks.metadata import rating_to_stars
from calibre.utils.icu import sort_key, lower, strcmp, collation_order, primary_strcmp, primary_contains, contains from calibre.gui2 import config, error_dialog, file_icon_provider, gprefs
from calibre.library.field_metadata import category_icon_map
from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.confirm_delete import confirm
from calibre.library.field_metadata import category_icon_map
from calibre.utils.config import prefs, tweaks
from calibre.utils.formatter import EvalFormatter from calibre.utils.formatter import EvalFormatter
from calibre.utils.icu import (
collation_order, contains, lower, primary_contains, primary_strcmp, sort_key,
strcmp
)
from calibre.utils.serialize import json_dumps, json_loads from calibre.utils.serialize import json_dumps, json_loads
from polyglot.builtins import iteritems, itervalues, map, range, unicode_type from polyglot.builtins import iteritems, itervalues, map, range, unicode_type
TAG_SEARCH_STATES = {'clear': 0, 'mark_plus': 1, 'mark_plusplus': 2, TAG_SEARCH_STATES = {'clear': 0, 'mark_plus': 1, 'mark_plusplus': 2,
'mark_minus': 3, 'mark_minusminus': 4} 'mark_minus': 3, 'mark_minusminus': 4}
DRAG_IMAGE_ROLE = Qt.UserRole + 1000 DRAG_IMAGE_ROLE = Qt.UserRole + 1000
@ -1253,8 +1259,7 @@ class TagsModel(QAbstractItemModel): # {{{
return False return False
if key == 'search': if key == 'search':
if val in self.db.saved_search_names(): if val in self.db.saved_search_names():
error_dialog(self.gui_parent, _('Duplicate search name'), QTimer.singleShot(0, partial(self.show_duplicate_saved_search_error, val))
_('The saved search name %s is already used.')%val).exec_()
return False return False
self.use_position_based_index_on_next_recount = True self.use_position_based_index_on_next_recount = True
self.db.saved_search_rename(unicode_type(item.data(role) or ''), val) self.db.saved_search_rename(unicode_type(item.data(role) or ''), val)
@ -1264,6 +1269,10 @@ class TagsModel(QAbstractItemModel): # {{{
self.rename_item(item, key, val) self.rename_item(item, key, val)
return True return True
def show_duplicate_saved_search_error(self, val):
error_dialog(self.gui_parent, _('Duplicate search name'),
_('The saved search name %s is already used.')%val).exec_()
def rename_item(self, item, key, to_what): def rename_item(self, item, key, to_what):
def do_one_item(lookup_key, an_item, original_name, new_name, restrict_to_books): def do_one_item(lookup_key, an_item, original_name, new_name, restrict_to_books):
self.use_position_based_index_on_next_recount = True self.use_position_based_index_on_next_recount = True