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>'
__docformat__ = 'restructuredtext en'
import traceback, copy, os
import copy
import os
import traceback
from collections import OrderedDict, namedtuple
from PyQt5.Qt import (QAbstractItemModel, QIcon, QFont, Qt,
QMimeData, QModelIndex, pyqtSignal, QObject)
from functools import partial
from PyQt5.Qt import (
QAbstractItemModel, QFont, QIcon, QMimeData, QModelIndex, QObject, Qt, QTimer,
pyqtSignal
)
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.utils.config import tweaks, prefs
from calibre.utils.icu import sort_key, lower, strcmp, collation_order, primary_strcmp, primary_contains, contains
from calibre.library.field_metadata import category_icon_map
from calibre.ebooks.metadata import rating_to_stars
from calibre.gui2 import config, error_dialog, file_icon_provider, gprefs
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.icu import (
collation_order, contains, lower, primary_contains, primary_strcmp, sort_key,
strcmp
)
from calibre.utils.serialize import json_dumps, json_loads
from polyglot.builtins import iteritems, itervalues, map, range, unicode_type
TAG_SEARCH_STATES = {'clear': 0, 'mark_plus': 1, 'mark_plusplus': 2,
'mark_minus': 3, 'mark_minusminus': 4}
DRAG_IMAGE_ROLE = Qt.UserRole + 1000
@ -1253,8 +1259,7 @@ class TagsModel(QAbstractItemModel): # {{{
return False
if key == 'search':
if val in self.db.saved_search_names():
error_dialog(self.gui_parent, _('Duplicate search name'),
_('The saved search name %s is already used.')%val).exec_()
QTimer.singleShot(0, partial(self.show_duplicate_saved_search_error, val))
return False
self.use_position_based_index_on_next_recount = True
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)
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 do_one_item(lookup_key, an_item, original_name, new_name, restrict_to_books):
self.use_position_based_index_on_next_recount = True