From 11ca9bc818546a7930967a31336d6afe1d36d3e3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Nov 2015 18:41:32 +0530 Subject: [PATCH] Move code to update user categories in field metadata from the tag browser into db.cache. This way it works everywhere, and is only run once unless the user actually changes the preference. --- src/calibre/db/cache.py | 24 +++++++++++++++-------- src/calibre/gui2/tag_browser/model.py | 28 --------------------------- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 95d7bc91f4..687914ddbd 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -84,6 +84,7 @@ def _add_newbook_tag(mi): elif tag not in mi.tags: mi.tags.append(tag) +dynamic_category_preferences = frozenset({'grouped_search_make_user_categories', 'grouped_search_terms', 'user_categories'}) class Cache(object): @@ -146,14 +147,18 @@ class Cache(object): will happen.''' return SafeReadLock(self.read_lock) - @write_api - def initialize_dynamic(self): + def _initialize_dynamic_categories(self): # Reconstruct the user categories, putting them into field_metadata - # Assumption is that someone else will fix them if they change. - self.field_metadata.remove_dynamic_categories() + fm = self.field_metadata + fm.remove_dynamic_categories() for user_cat in sorted(self._pref('user_categories', {}).iterkeys(), key=sort_key): cat_name = '@' + user_cat # add the '@' to avoid name collision - self.field_metadata.add_user_category(label=cat_name, name=user_cat) + while cat_name: + try: + fm.add_user_category(label=cat_name, name=user_cat) + except ValueError: + break # Can happen since we are removing dots and adding parent categories ourselves + cat_name = cat_name.rpartition('.')[0] # add grouped search term user categories muc = frozenset(self._pref('grouped_search_make_user_categories', [])) @@ -163,7 +168,7 @@ class Cache(object): # user category. Print the exception and continue. try: self.field_metadata.add_user_category(label=u'@' + cat, name=cat) - except: + except ValueError: traceback.print_exc() if len(self._search_api.saved_searches.names()) > 0: @@ -171,13 +176,15 @@ class Cache(object): self.field_metadata.add_grouped_search_terms( self._pref('grouped_search_terms', {})) - self._refresh_search_locations() + @write_api + def initialize_dynamic(self): self.dirtied_cache = {x:i for i, (x,) in enumerate( self.backend.execute('SELECT book FROM metadata_dirtied'))} if self.dirtied_cache: self.dirtied_sequence = max(self.dirtied_cache.itervalues())+1 + self._initialize_dynamic_categories() @write_api def initialize_template_cache(self): @@ -587,6 +594,8 @@ class Cache(object): self.backend.prefs.set(name, val) if name == 'grouped_search_terms': self._clear_search_caches() + if name in dynamic_category_preferences: + self._initialize_dynamic_categories() @api def get_metadata(self, book_id, @@ -2080,4 +2089,3 @@ class Cache(object): report_progress(i+1, len(book_ids), mi) # }}} - diff --git a/src/calibre/gui2/tag_browser/model.py b/src/calibre/gui2/tag_browser/model.py index d745b3067e..45076f5713 100644 --- a/src/calibre/gui2/tag_browser/model.py +++ b/src/calibre/gui2/tag_browser/model.py @@ -880,34 +880,6 @@ class TagsModel(QAbstractItemModel): # {{{ first_letter_sort=self.collapse_model == 'first letter') self.restriction_error.emit() - # Reconstruct the user categories, putting them into metadata - self.db.field_metadata.remove_dynamic_categories() - tb_cats = self.db.field_metadata - for user_cat in sorted(self.db.prefs.get('user_categories', {}).keys(), - key=sort_key): - cat_name = '@' + user_cat # add the '@' to avoid name collision - while True: - try: - tb_cats.add_user_category(label=cat_name, name=user_cat) - dot = cat_name.rfind('.') - if dot < 0: - break - cat_name = cat_name[:dot] - except ValueError: - break - - for cat in sorted(self.db.prefs.get('grouped_search_terms', {}).keys(), - key=sort_key): - if (u'@' + cat) in data: - try: - tb_cats.add_user_category(label=u'@' + cat, name=cat) - except ValueError: - traceback.print_exc() - self.db.new_api.refresh_search_locations() - - if len(self.db.saved_search_names()): - tb_cats.add_search_category(label='search', name=_('Searches')) - if self.filter_categories_by: for category in data.keys(): data[category] = [t for t in data[category]