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]