First stage: adding a ProxyMetadata object to get_metadata

This commit is contained in:
Charles Haley 2013-07-25 10:50:58 +02:00
parent ce5821eec8
commit 6a488a3320
4 changed files with 31 additions and 5 deletions

View File

@ -184,6 +184,9 @@ class Cache(object):
def _get_metadata(self, book_id, get_user_categories=True): # {{{ def _get_metadata(self, book_id, get_user_categories=True): # {{{
mi = Metadata(None, template_cache=self.formatter_template_cache) 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) author_ids = self._field_ids_for('authors', book_id)
adata = self._author_data(author_ids) adata = self._author_data(author_ids)
aut_list = [adata[i] for i in author_ids] aut_list = [adata[i] for i in author_ids]

View File

@ -278,9 +278,10 @@ for field in ('formats', 'format_metadata'):
class ProxyMetadata(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, '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, '_db', weakref.ref(db))
sa(self, '_book_id', book_id) sa(self, '_book_id', book_id)
sa(self, '_cache', {'user_categories':{}, 'cover_data':(None,None), 'device_collections':[]}) sa(self, '_cache', {'user_categories':{}, 'cover_data':(None,None), 'device_collections':[]})

View File

@ -66,7 +66,8 @@ class Metadata(object):
becomes a reserved field name. 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 title: title or ``_('Unknown')``
@param authors: List of strings or [] @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.author = list(authors) if authors else [] # Needed for backward compatibility
self.authors = list(authors) if authors else [] self.authors = list(authors) if authors else []
from calibre.ebooks.metadata.book.formatter import SafeFormat from calibre.ebooks.metadata.book.formatter import SafeFormat
self.formatter = SafeFormat() if formatter is None:
self.formatter = SafeFormat()
self.template_cache = template_cache self.template_cache = template_cache
def is_null(self, field): def is_null(self, field):

View File

@ -1246,6 +1246,26 @@ class BuiltinFinishFormatting(BuiltinFormatterFunction):
return val return val
return prefix + formatter._do_format(val, fmt) + suffix 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 = [ _formatter_builtins = [
BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(),
BuiltinAssign(), BuiltinBooksize(), BuiltinAssign(), BuiltinBooksize(),
@ -1267,7 +1287,7 @@ _formatter_builtins = [
BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(), BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(),
BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundComma(), BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundComma(),
BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(), BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(),
BuiltinToday(), BuiltinUppercase(), BuiltinToday(), BuiltinUppercase(), BuiltinVirtualLibraries()
] ]
class FormatterUserFunction(FormatterFunction): class FormatterUserFunction(FormatterFunction):