diff --git a/src/calibre/db/categories.py b/src/calibre/db/categories.py index 8d07714c3e..f49789e16c 100644 --- a/src/calibre/db/categories.py +++ b/src/calibre/db/categories.py @@ -12,6 +12,7 @@ from functools import partial from operator import attrgetter from future_builtins import map +from calibre.ebooks.metadata import author_to_author_sort from calibre.library.field_metadata import TagsIcons from calibre.utils.config_base import tweaks from calibre.utils.icu import sort_key @@ -149,8 +150,16 @@ def get_categories(dbcache, sort='name', book_ids=None, icon_map=None): elif category == 'news': cats = dbcache.fields['tags'].get_news_category(tag_class, book_ids) else: + cat = fm[category] + brm = book_rating_map + if cat['datatype'] == 'rating' and category != 'rating': + brm = dbcache.fields[category].book_value_map cats = dbcache.fields[category].get_categories( - tag_class, book_rating_map, lang_map, book_ids) + tag_class, brm, lang_map, book_ids) + if (category != 'authors' and cat['datatype'] == 'text' and + cat['is_multiple'] and cat['display'].get('is_names', False)): + for item in cats: + item.sort = author_to_author_sort(item.sort) sort_categories(cats, sort) categories[category] = cats diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index b01e4b0709..6de8d814d5 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -247,9 +247,34 @@ class ReadingTest(BaseTest): old = LibraryDatabase2(self.library_path) old_categories = old.get_categories() cache = self.init_cache(self.library_path) - import pprint - pprint.pprint(old_categories) - pprint.pprint(cache.get_categories()) + new_categories = cache.get_categories() + self.assertEqual(set(old_categories), set(new_categories), + 'The set of old categories is not the same as the set of new categories') + + def compare_category(category, old, new): + for attr in ('name', 'original_name', 'id', 'count', + 'is_hierarchical', 'is_editable', 'is_searchable', + 'id_set', 'avg_rating', 'sort', 'use_sort_as_name', + 'tooltip', 'icon', 'category'): + oval, nval = getattr(old, attr), getattr(new, attr) + if oval != nval: + if ( + (category in {'rating', '#rating'} and attr in {'id_set', 'sort'}) or + (category == 'series' and attr == 'sort') or # Sorting is wrong in old + (category == 'identifiers' and attr == 'id_set') or + (category == '@Good Series') or # Sorting is wrong in old + (category == 'news' and attr in {'count', 'id_set'}) + ): + continue + self.assertTrue(False, + 'The attribute %s for %s in category %s does not match. Old is %r, New is %r' + %(attr, old.name, category, oval, nval)) + for category in old_categories: + old, new = old_categories[category], new_categories[category] + self.assertEqual(len(old), len(new), + 'The number of items in the category %s is not the same'%category) + for o, n in zip(old, new): + compare_category(category, o, n) # }}}