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.

This commit is contained in:
Kovid Goyal 2015-11-18 18:41:32 +05:30
parent 737059052a
commit 11ca9bc818
2 changed files with 16 additions and 36 deletions

View File

@ -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)
# }}}

View File

@ -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]