From 85e18d08ab120cef506eb8cf799e7676365c035e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 31 Aug 2010 18:54:51 +0100 Subject: [PATCH] Add custom columns to the OPDF book display --- src/calibre/library/server/opds.py | 33 +++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 87a0fecee3..c3a1d68749 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -19,6 +19,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.library.comments import comments_to_html from calibre import guess_type from calibre.utils.ordered_dict import OrderedDict +from calibre.utils.date import format_date BASE_HREFS = { 0 : '/stanza', @@ -130,7 +131,7 @@ def CATALOG_GROUP_ENTRY(item, category, base_href, version, updated): link ) -def ACQUISITION_ENTRY(item, version, FM, updated): +def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): title = item[FM['title']] if not title: title = _('Unknown') @@ -153,6 +154,21 @@ def ACQUISITION_ENTRY(item, version, FM, updated): extra.append(_('SERIES: %s [%s]
')%\ (series, fmt_sidx(float(item[FM['series_index']])))) + for key in CKEYS: + val = item[CFM[key]['rec_index']] + if val is not None: + name = CFM[key]['name'] + datatype = CFM[key]['datatype'] + if datatype == 'text' and CFM[key]['is_multiple']: + extra.append('%s: %s
'%(name, ', '.join(val.split('|')))) + elif datatype == 'series': + extra.append('%s: %s [%s]
'%(name, val, + fmt_sidx(item[CFM.cc_series_index_column_for(key)]))) + elif datatype == 'datetime': + extra.append('%s: %s
'%(name, + format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy')))) + else: + extra.append('%s: %s
' % (CFM[key]['name'], val)) comments = item[FM['comments']] if comments: comments = comments_to_html(comments) @@ -260,10 +276,14 @@ class NavFeed(Feed): class AcquisitionFeed(NavFeed): def __init__(self, updated, id_, items, offsets, page_url, up_url, version, - FM): + FM, CFM): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) + CKEYS = [key for key in sorted(CFM.get_custom_fields(), + cmp=lambda x,y: cmp(CFM[x]['name'].lower(), + CFM[y]['name'].lower()))] for item in items: - self.root.append(ACQUISITION_ENTRY(item, version, FM, updated)) + self.root.append(ACQUISITION_ENTRY(item, version, FM, updated, + CFM, CKEYS)) class CategoryFeed(NavFeed): @@ -360,7 +380,7 @@ class OPDSServer(object): cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog' return str(AcquisitionFeed(updated, id_, items, offsets, - page_url, up_url, version, self.db.FIELD_MAP)) + page_url, up_url, version, self.db.FIELD_MAP, self.db.field_metadata)) def opds_search(self, query=None, version=0, offset=0): try: @@ -568,7 +588,10 @@ class OPDSServer(object): (_('Newest'), _('Date'), 'Onewest'), (_('Title'), _('Title'), 'Otitle'), ] - for category in categories: + def getter(x): + return category_meta[x]['name'].lower() + for category in sorted(categories, + cmp=lambda x,y: cmp(getter(x), getter(y))): if len(categories[category]) == 0: continue if category == 'formats':