From 5b22a690cc3d01564b8c8d83a7aa091ade49aa26 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 1 Nov 2014 22:20:29 +0530 Subject: [PATCH] Make render_composite() an internal API --- src/calibre/db/cache.py | 2 +- src/calibre/db/fields.py | 13 +++++++++---- src/calibre/db/lazy.py | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index b64df49a86..5a48322bd7 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -405,7 +405,7 @@ class Cache(object): if mi is None: return f.get_value_with_cache(book_id, self._get_proxy_metadata) else: - return f.render_composite_with_cache(book_id, mi, mi.formatter, mi.template_cache) + return f._render_composite_with_cache(book_id, mi, mi.formatter, mi.template_cache) @read_api def field_ids_for(self, name, book_id): diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 3b34670442..adf482808d 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -253,7 +253,8 @@ class CompositeField(OneToOneField): def bool_sort_key(self, val): return self._bool_sort_key(force_to_bool(val)) - def render_composite(self, book_id, mi, formatter, template_cache): + def __render_composite(self, book_id, mi, formatter, template_cache): + ' INTERNAL USE ONLY. DO NOT USE THIS OUTSIDE THIS CLASS! ' ans = formatter.safe_format( self.metadata['display']['composite_template'], mi, _('TEMPLATE ERROR'), mi, column_name=self._composite_name, template_cache=template_cache).strip() @@ -261,11 +262,15 @@ class CompositeField(OneToOneField): self._render_cache[book_id] = ans return ans - def render_composite_with_cache(self, book_id, mi, formatter, template_cache): + def _render_composite_with_cache(self, book_id, mi, formatter, template_cache): + ''' INTERNAL USE ONLY. DO NOT USE METHOD DIRECTLY. INSTEAD USE + db.composite_for() OR mi.get(). Those methods make sure there is no + risk of infinite recursion when evaluating temoplates that refer to + themselves. ''' with self._lock: ans = self._render_cache.get(book_id, None) if ans is None: - return self.render_composite(book_id, mi, formatter, template_cache) + return self.__render_composite(book_id, mi, formatter, template_cache) return ans def clear_caches(self, book_ids=None): @@ -281,7 +286,7 @@ class CompositeField(OneToOneField): ans = self._render_cache.get(book_id, None) if ans is None: mi = get_metadata(book_id) - return self.render_composite(book_id, mi, mi.formatter, mi.template_cache) + return self.__render_composite(book_id, mi, mi.formatter, mi.template_cache) return ans def sort_keys_for_books(self, get_metadata, lang_map): diff --git a/src/calibre/db/lazy.py b/src/calibre/db/lazy.py index 059ee18762..93a814be1e 100644 --- a/src/calibre/db/lazy.py +++ b/src/calibre/db/lazy.py @@ -232,7 +232,7 @@ def composite_getter(mi, field, dbref, book_id, cache, formatter, template_cache except KeyError: ret = cache[field] = _('Invalid field: %s') % field else: - ret = cache[field] = fo.render_composite_with_cache(book_id, mi, formatter, template_cache) + ret = cache[field] = fo._render_composite_with_cache(book_id, mi, formatter, template_cache) except Exception: import traceback traceback.print_exc()