From 01b8547872392d9701bc3202eecb7ca147d5cb94 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sun, 1 Nov 2020 23:13:48 +0000 Subject: [PATCH] Bug #1902313: Option to mark all books with annotations/bookmarks Provided a formatter function annotation_count() that returns the number of annotations for a book --- src/calibre/db/backend.py | 6 ++++++ src/calibre/db/cache.py | 4 ++++ src/calibre/utils/formatter_functions.py | 22 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 0ee3cce504..2b433b331a 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -1948,6 +1948,12 @@ class DB(object): self.execute('DELETE FROM annotations_dirtied') return changed + def annotation_count_for_book(self, book_id): + with self.conn: + c = self.execute('SELECT count(id) FROM annotations WHERE book=?', (book_id,)) + r = c.fetchone()[0] + return r + def conversion_options(self, book_id, fmt): for (data,) in self.conn.get('SELECT data FROM conversion_options WHERE book=? AND format=?', (book_id, fmt.upper())): if data: diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 16c3283a45..e0a19330d6 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -2329,6 +2329,10 @@ class Cache(object): def all_annotations_for_book(self, book_id): return tuple(self.backend.all_annotations_for_book(book_id)) + @read_api + def annotation_count_for_book(self, book_id): + return self.backend.annotation_count_for_book(book_id) + @read_api def all_annotation_users(self): return tuple(self.backend.all_annotation_users()) diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index d41e2e2b49..72a2c032b2 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -1181,6 +1181,26 @@ class BuiltinOndevice(BuiltinFormatterFunction): return _('This function can be used only in the GUI') +class BuiltinAnnotationCount(BuiltinFormatterFunction): + name = 'annotation_count' + arg_count = 0 + category = 'Get values from metadata' + __doc__ = doc = _('annotation_count() -- return the total number of annotations ' + 'of all types attached to the current book. ' + 'This function works only in the GUI.') + + def evaluate(self, formatter, kwargs, mi, locals): + if hasattr(mi, '_proxy_metadata'): + try: + from calibre.gui2.ui import get_gui + c = get_gui().current_db.new_api.annotation_count_for_book(mi.id) + return '' if c == 0 else unicode_type(c) + except: + return _('Failed to fetch annotation count') + return '' + return _('This function can be used only in the GUI') + + class BuiltinSeriesSort(BuiltinFormatterFunction): name = 'series_sort' arg_count = 0 @@ -1808,7 +1828,7 @@ _formatter_builtins = [ BuiltinSwapAroundComma(), BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(), BuiltinToday(), BuiltinTransliterate(), BuiltinUppercase(), - BuiltinUserCategories(), BuiltinVirtualLibraries() + BuiltinUserCategories(), BuiltinVirtualLibraries(), BuiltinAnnotationCount() ]