From 04e8a48916603a513b3dcd7c8af0e0b81a380904 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 27 May 2010 21:53:36 +0100 Subject: [PATCH] Changes to schema_upgrades.py and changing get_categories to not modify metadata. --- src/calibre/gui2/tag_view.py | 13 +++++++++++++ src/calibre/library/database2.py | 23 +++++++++++++---------- src/calibre/library/field_metadata.py | 4 ++++ src/calibre/library/schema_upgrades.py | 8 ++------ 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 8ecc26e30c..15270e14b1 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -15,6 +15,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \ from calibre.gui2 import config, NONE from calibre.utils.config import prefs from calibre.library.field_metadata import TagsIcons +from calibre.utils.search_query_parser import saved_searches class TagsView(QTreeView): # {{{ @@ -221,6 +222,18 @@ class TagsModel(QAbstractItemModel): # {{{ self.db = db self.search_restriction = '' self.ignore_next_search = 0 + + # Reconstruct the user categories, putting them into metadata + tb_cats = self.db.field_metadata + for k in tb_cats.keys(): + if tb_cats[k]['kind'] in ['user', 'search']: + del tb_cats[k] + for user_cat in sorted(prefs['user_categories'].keys()): + cat_name = user_cat+':' # add the ':' to avoid name collision + tb_cats.add_user_category(label=cat_name, name=user_cat) + if len(saved_searches.names()): + tb_cats.add_search_category(label='search', name=_('Searches')) + data = self.get_node_tree(config['sort_by_popularity']) self.root_item = TagTreeItem() for i, r in enumerate(self.row_map): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5ba603cc52..ff8e352583 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -231,6 +231,18 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.conn.executescript(script) self.conn.commit() + # Reconstruct the user categories, putting them into field_metadata + # Assumption is that someone else will fix them if they change. + tb_cats = self.field_metadata + for k in tb_cats.keys(): + if tb_cats[k]['kind'] in ['user', 'search']: + del tb_cats[k] + for user_cat in sorted(prefs['user_categories'].keys()): + cat_name = user_cat+':' # add the ':' to avoid name collision + tb_cats.add_user_category(label=cat_name, name=user_cat) + if len(saved_searches.names()): + tb_cats.add_search_category(label='search', name=_('Searches')) + self.book_on_device_func = None self.data = ResultCache(self.FIELD_MAP, self.field_metadata) self.search = self.data.search @@ -653,17 +665,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): raise TypeError('icon_map passed to get_categories must be of type TagIcons') tb_cats = self.field_metadata - - # remove all user categories from field_metadata. They can - # easily come and go. We will add all the existing ones in below. - for k in tb_cats.keys(): - if tb_cats[k]['kind'] in ['user', 'search']: - del tb_cats[k] - #### First, build the standard and custom-column categories #### for category in tb_cats.keys(): cat = tb_cats[category] - if not cat['is_category']: + if not cat['is_category'] or not cat['kind'] == 'field': continue tn = cat['table'] categories[category] = [] #reserve the position in the ordered list @@ -757,7 +762,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # else: do nothing, to not include nodes w zero counts if len(items): cat_name = user_cat+':' # add the ':' to avoid name collision - tb_cats.add_user_category(label=cat_name, name=user_cat) # Not a problem if we accumulate entries in the icon map if icon_map is not None: icon_map[cat_name] = icon_map[':user'] @@ -776,7 +780,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for srch in saved_searches.names(): items.append(Tag(srch, tooltip=saved_searches.lookup(srch), icon=icon)) if len(items): - tb_cats.add_search_category(label='search', name=_('Searches')) if icon_map is not None: icon_map['search'] = icon_map['search'] categories['search'] = items diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 5a175ab2aa..a373ce9bad 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -64,6 +64,7 @@ class FieldMetadata(dict): _field_metadata = [ ('authors', {'table':'authors', 'column':'name', + 'link_column':'author', 'datatype':'text', 'is_multiple':',', 'kind':'field', @@ -73,6 +74,7 @@ class FieldMetadata(dict): 'is_category':True}), ('series', {'table':'series', 'column':'name', + 'link_column':'series', 'datatype':'text', 'is_multiple':None, 'kind':'field', @@ -91,6 +93,7 @@ class FieldMetadata(dict): 'is_category':True}), ('publisher', {'table':'publishers', 'column':'name', + 'link_column':'publisher', 'datatype':'text', 'is_multiple':None, 'kind':'field', @@ -100,6 +103,7 @@ class FieldMetadata(dict): 'is_category':True}), ('rating', {'table':'ratings', 'column':'rating', + 'link_column':'rating', 'datatype':'rating', 'is_multiple':None, 'kind':'field', diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index 6222a8950f..070ad1f3a6 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -290,9 +290,5 @@ class SchemaUpgrade(object): self.conn.executescript(script) for field in self.field_metadata.itervalues(): - if field['is_category'] and not field['is_custom'] and \ - field['table'] != 'news' and field['table'] is not None: - cn = field['table'][:-1] - if cn == 'serie': - cn += 's' - create_tag_browser_view(field['table'], cn, field['column']) + if field['is_category'] and not field['is_custom'] and 'link_column' in field: + create_tag_browser_view(field['table'], field['link_column'], field['column'])