diff --git a/src/calibre/db/cli/cmd_list.py b/src/calibre/db/cli/cmd_list.py index 32c74d3832..458ef1d429 100644 --- a/src/calibre/db/cli/cmd_list.py +++ b/src/calibre/db/cli/cmd_list.py @@ -74,6 +74,7 @@ def implementation( data[field] = {k: v.get('isbn') or '' for k, v in x.items()} continue if field == 'template': + from calibre.utils.formatter import TEMPLATE_ERROR if not template: data['template'] = _('Template not allowed') if is_remote else _('No template specified') continue @@ -84,7 +85,7 @@ def implementation( formatter = SafeFormat() for book_id in book_ids: mi = db.get_proxy_metadata(book_id) - vals[book_id] = formatter.safe_format(template, {}, 'TEMPLATE ERROR', mi, global_vars=global_vars) + vals[book_id] = formatter.safe_format(template, {}, TEMPLATE_ERROR, mi, global_vars=global_vars) data['template'] = vals continue field = field.replace('*', '#') diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index f87ab470d3..f2dfd1e4d2 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -17,6 +17,7 @@ from calibre.db.write import Writer from calibre.ebooks.metadata import author_to_author_sort, rating_to_stars, title_sort from calibre.utils.config_base import tweaks from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort, parse_date +from calibre.utils.formatter import TEMPLATE_ERROR from calibre.utils.icu import sort_key from calibre.utils.localization import calibre_langcode_to_name @@ -299,7 +300,7 @@ class CompositeField(OneToOneField): ' INTERNAL USE ONLY. DO NOT USE THIS OUTSIDE THIS CLASS! ' db = self.db_weakref() ans = formatter.safe_format( - self.metadata['display']['composite_template'], mi, _('TEMPLATE ERROR'), + self.metadata['display']['composite_template'], mi, TEMPLATE_ERROR, mi, column_name=self._composite_name, template_cache=template_cache, template_functions=self.get_template_functions(), global_vars={rendering_composite_name:'1'}, database=db).strip() diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index c682985b0f..4d04752055 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -147,11 +147,12 @@ class Metadata: d = _data['user_metadata'][field] val = d['#value#'] if val is None and d['datatype'] == 'composite': + from calibre.utils.formatter import TEMPLATE_ERROR d['#value#'] = 'RECURSIVE_COMPOSITE FIELD (Metadata) ' + field val = d['#value#'] = self.formatter.safe_format( d['display']['composite_template'], self, - _('TEMPLATE ERROR'), + TEMPLATE_ERROR, self, column_name=field, template_cache=self.template_cache).strip() return val diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index b823214cb5..22b5b7ec4d 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -125,9 +125,10 @@ class DatabaseImages(pictureflow.FlowImages): return self.model.count() def render_template(self, template, index, db): + from calibre.utils.formatter import TEMPLATE_ERROR book_id = self.model.id(index) mi = db.get_proxy_metadata(book_id) - return mi.formatter.safe_format(template, mi, _('TEMPLATE ERROR'), mi, template_cache=self.template_cache) + return mi.formatter.safe_format(template, mi, TEMPLATE_ERROR, mi, template_cache=self.template_cache) def caption(self, index): if self.ignore_image_requests: diff --git a/src/calibre/gui2/library/bookshelf_view.py b/src/calibre/gui2/library/bookshelf_view.py index 508b41d320..d70434f81b 100644 --- a/src/calibre/gui2/library/bookshelf_view.py +++ b/src/calibre/gui2/library/bookshelf_view.py @@ -73,6 +73,7 @@ from calibre.gui2.library.caches import CoverThumbnailCache, Thumbnailer from calibre.gui2.library.models import BooksModel from calibre.gui2.momentum_scroll import MomentumScrollMixin from calibre.gui2.palette import dark_palette, light_palette +from calibre.utils.formatter import TEMPLATE_ERROR from calibre.utils.icu import numeric_sort_key from calibre.utils.img import resize_to_fit from calibre.utils.iso8601 import UNDEFINED_DATE @@ -84,7 +85,6 @@ from calibre_extensions.progress_indicator import contrast_ratio # Utility functions {{{ -TEMPLATE_ERROR = _('TEMPLATE ERROR') def random_from_id(book_id: int, limit: int = 21) -> int: diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index ec27383504..025cb17fed 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -24,6 +24,8 @@ from calibre.utils.icu import strcmp from calibre.utils.localization import _ from polyglot.builtins import error_message +TEMPLATE_ERROR = _('TEMPLATE ERROR') + def default_template_error_reporter(e: Exception, fmt, kwargs, book, column_name: str | None): if DEBUG: