From 80e4b7dde97eb8107b3d8383c6f585e8796736dc Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Fri, 26 Aug 2022 11:44:17 +0100 Subject: [PATCH] Three things related to tag_browser_category_order: 1) do a proper migration of the tweak 2) Fix the server's usage of the migrated value. 3) Fix an exception in the server related to hierarchical user categories --- src/calibre/gui2/tag_browser/model.py | 3 +++ src/calibre/srv/metadata.py | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/tag_browser/model.py b/src/calibre/gui2/tag_browser/model.py index 0d7e600725..7f364533c7 100644 --- a/src/calibre/gui2/tag_browser/model.py +++ b/src/calibre/gui2/tag_browser/model.py @@ -1228,6 +1228,9 @@ class TagsModel(QAbstractItemModel): # {{{ order = {'*': 1000} defvalue = order.get('*', 1000) self.row_map.sort(key=lambda x: order.get(x, defvalue)) + # Migrate the tweak to the new pref. First, make sure the order is valid + self.row_map = self.get_ordered_categories(pref_data_override=[[k,None] for k in self.row_map]) + self.db.new_api.set_pref('tag_browser_category_order', self.row_map) return data def set_categories_filter(self, txt): diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py index f2a59eb705..4390c9daf1 100644 --- a/src/calibre/srv/metadata.py +++ b/src/calibre/srv/metadata.py @@ -222,10 +222,8 @@ def create_toplevel_tree(category_data, items, field_metadata, opts, db): last_category_node, category_node_map, root = None, {}, {'id':None, 'children':[]} node_id_map = {} category_nodes, recount_nodes = [], [] - order = db.pref('tag_browser_category_order') or {} - defvalue = order.get('*', 100) - categories = [category for category in field_metadata if category in category_data] - scats = sorted(categories, key=lambda x: order.get(x, defvalue)) + scats = db.pref('tag_browser_category_order', [k for k in category_data]) + scats = [k for k in scats if k in field_metadata] for category in scats: is_user_category = category.startswith('@') @@ -361,6 +359,9 @@ def process_category_node( opts, tag_map, hierarchical_tags, node_to_tag_map, collapse_nodes, intermediate_nodes, hierarchical_items): category = items[category_node['id']]['category'] + if category not in category_data: + # This can happen for user categories that are hierarchical and missing their parent. + return category_items = category_data[category] cat_len = len(category_items) if cat_len <= 0: