From 6a488a332033d17bfbf31f51c2237f96a0fcbc40 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Thu, 25 Jul 2013 10:50:58 +0200 Subject: [PATCH] First stage: adding a ProxyMetadata object to get_metadata --- src/calibre/db/cache.py | 3 +++ src/calibre/db/lazy.py | 5 +++-- src/calibre/ebooks/metadata/book/base.py | 6 ++++-- src/calibre/utils/formatter_functions.py | 22 +++++++++++++++++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index ef4c8854b4..1c224bce7e 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -184,6 +184,9 @@ class Cache(object): def _get_metadata(self, book_id, get_user_categories=True): # {{{ mi = Metadata(None, template_cache=self.formatter_template_cache) + + mi._proxy_metadata = ProxyMetadata(self, book_id, formatter=mi.formatter) + author_ids = self._field_ids_for('authors', book_id) adata = self._author_data(author_ids) aut_list = [adata[i] for i in author_ids] diff --git a/src/calibre/db/lazy.py b/src/calibre/db/lazy.py index 566e51b32a..303d47b697 100644 --- a/src/calibre/db/lazy.py +++ b/src/calibre/db/lazy.py @@ -278,9 +278,10 @@ for field in ('formats', 'format_metadata'): class ProxyMetadata(Metadata): - def __init__(self, db, book_id): + def __init__(self, db, book_id, formatter=None): sa(self, 'template_cache', db.formatter_template_cache) - sa(self, 'formatter', SafeFormat()) + if formatter is None: + sa(self, 'formatter', SafeFormat()) sa(self, '_db', weakref.ref(db)) sa(self, '_book_id', book_id) sa(self, '_cache', {'user_categories':{}, 'cover_data':(None,None), 'device_collections':[]}) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 4427121f37..93253b1dcc 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -66,7 +66,8 @@ class Metadata(object): becomes a reserved field name. ''' - def __init__(self, title, authors=(_('Unknown'),), other=None, template_cache=None): + def __init__(self, title, authors=(_('Unknown'),), other=None, template_cache=None, + formatter=None): ''' @param title: title or ``_('Unknown')`` @param authors: List of strings or [] @@ -85,7 +86,8 @@ class Metadata(object): self.author = list(authors) if authors else [] # Needed for backward compatibility self.authors = list(authors) if authors else [] from calibre.ebooks.metadata.book.formatter import SafeFormat - self.formatter = SafeFormat() + if formatter is None: + self.formatter = SafeFormat() self.template_cache = template_cache def is_null(self, field): diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index f2b973a1e7..606fe3b11b 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -1246,6 +1246,26 @@ class BuiltinFinishFormatting(BuiltinFormatterFunction): return val return prefix + formatter._do_format(val, fmt) + suffix +class BuiltinVirtualLibraries(BuiltinFormatterFunction): + name = 'virtual_libraries' + arg_count = 0 + category = 'Get values from metadata' + __doc__ = doc = _('virtual_libraries() -- return a comma-separated list of ' + 'virtual libraries that contain this book. This function ' + 'works only in the GUI. If you want to use these values ' + 'in save-to-disk or send-to-device templates then you ' + 'must make a custom "Column built from other columns", use ' + 'the function in that column\'s template, and use that ' + 'column\'s value in your save/send templates') + + def evaluate(self, formatter, kwargs, mi, locals_): + from calibre.db.lazy import ProxyMetadata + if isinstance(mi, ProxyMetadata): + return mi.virtual_libraries + if hasattr(mi, '_proxy_metadata'): + return mi._proxy_metadata.virtual_libraries + return _('This function can be used only in the GUI') + _formatter_builtins = [ BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAssign(), BuiltinBooksize(), @@ -1267,7 +1287,7 @@ _formatter_builtins = [ BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(), BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundComma(), BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(), - BuiltinToday(), BuiltinUppercase(), + BuiltinToday(), BuiltinUppercase(), BuiltinVirtualLibraries() ] class FormatterUserFunction(FormatterFunction):