diff --git a/src/calibre/srv/code.py b/src/calibre/srv/code.py index c1835b92a7..c368ac399e 100644 --- a/src/calibre/srv/code.py +++ b/src/calibre/srv/code.py @@ -125,6 +125,16 @@ def update_interface_data(ctx, rd): return basic_interface_data(ctx, rd) +def get_field_list(db): + fieldlist = list(db.pref('book_display_fields', ())) + names = frozenset([x[0] for x in fieldlist]) + available = frozenset(db.field_metadata.displayable_field_keys()) + for field in available: + if field not in names: + fieldlist.append((field, True)) + return [f for f, d in fieldlist if d and f in available] + + def get_library_init_data(ctx, rd, db, num, sorts, orders, vl): ans = {} with db.safe_read_lock: @@ -147,6 +157,7 @@ def get_library_init_data(ctx, rd, db, num, sorts, orders, vl): ) ans['field_metadata'] = db.field_metadata.all_metadata() ans['virtual_libraries'] = db._pref('virtual_libraries', {}) + ans['book_display_fields'] = get_field_list(db) mdata = ans['metadata'] = {} try: extra_books = set( diff --git a/src/pyj/book_list/book_details.pyj b/src/pyj/book_list/book_details.pyj index 235a57cc9e..f3b9280479 100644 --- a/src/pyj/book_list/book_details.pyj +++ b/src/pyj/book_list/book_details.pyj @@ -50,7 +50,7 @@ def get_preferred_format(metadata, output_format, input_formats): break return fmt.toUpperCase() -IGNORED_FIELDS = {'title', 'sort', 'uuid', 'id', 'urls_from_identifiers', 'lang_names', 'last_modified'} +IGNORED_FIELDS = {'title', 'sort', 'uuid', 'id', 'urls_from_identifiers', 'lang_names', 'last_modified', 'path'} default_sort = {f:i+1 for i, f in enumerate(('title', 'title_sort', 'authors', 'author_sort', 'series', 'rating', 'pubdate', 'tags', 'timestamp', 'pubdate', 'identifiers', 'languages', 'publisher', 'last_modified'))} default_sort['formats'] = 999 @@ -113,7 +113,7 @@ def adjusting_sandboxed_html(html): return ans -def render_metadata(mi, table, book_id, field_list=None): # {{{ +def render_metadata(mi, table, book_id): # {{{ field_metadata = library_data.field_metadata interface_data = get_interface_data() def allowed_fields(field): @@ -125,9 +125,15 @@ def render_metadata(mi, table, book_id, field_list=None): # {{{ return True if field in IGNORED_FIELDS or field.endswith('_sort'): return False + if mi[field] is undefined: + return False return True - fields = field_list or sorted(filter(allowed_fields, mi), key=field_sorter(field_metadata)) + fields = library_data.book_display_fields + if not fields or not fields.length: + fields = sorted(filter(allowed_fields, mi), key=field_sorter(field_metadata)) + else: + fields = filter(allowed_fields, fields) comments = {} def add_row(name, val, is_searchable=False, is_html=False, join=None): @@ -173,25 +179,27 @@ def render_metadata(mi, table, book_id, field_list=None): # {{{ add_row(name, val, is_searchable=field) def process_formats(field, fm, name, val): - table.appendChild(E.tr(E.td(name + ':'), E.td())) - td = table.lastChild.lastChild - for fmt in val: - fmt = fmt.toUpperCase() - td.appendChild(E.a( - fmt, class_='simple-link', href='javascript:void(0)', - title=_('Read or download this book in the {} format').format(fmt), - onclick=on_fmt_click.bind(mi.title), data_format=fmt, data_book_id='' + book_id)) - if fmt is not val[-1]: - td.appendChild(document.createTextNode(', ')) + if val.length: + table.appendChild(E.tr(E.td(name + ':'), E.td())) + td = table.lastChild.lastChild + for fmt in val: + fmt = fmt.toUpperCase() + td.appendChild(E.a( + fmt, class_='simple-link', href='javascript:void(0)', + title=_('Read or download this book in the {} format').format(fmt), + onclick=on_fmt_click.bind(mi.title), data_format=fmt, data_book_id='' + book_id)) + if fmt is not val[-1]: + td.appendChild(document.createTextNode(', ')) def process_rating(field, fm, name, val): stars = E.span() - val = int(val) - for i in range(val // 2): - stars.appendChild(svgicon('star')) - if fm.display.allow_half_stars and (val % 2): - stars.appendChild(svgicon('star-half')) - add_row(name, stars) + val = int(val or 0) + if val > 0: + for i in range(val // 2): + stars.appendChild(svgicon('star')) + if fm.display.allow_half_stars and (val % 2): + stars.appendChild(svgicon('star-half')) + add_row(name, stars) def process_identifiers(field, fm, name, val): if val: diff --git a/src/pyj/book_list/library_data.pyj b/src/pyj/book_list/library_data.pyj index a52ba87475..cd738e85ad 100644 --- a/src/pyj/book_list/library_data.pyj +++ b/src/pyj/book_list/library_data.pyj @@ -71,7 +71,7 @@ def update_library_data(data): load_status.loading = False load_status.ok = True load_status.error_html = None - for key in 'search_result sortable_fields field_metadata metadata virtual_libraries'.split(' '): + for key in 'search_result sortable_fields field_metadata metadata virtual_libraries book_display_fields'.split(' '): library_data[key] = data[key] sr = library_data.search_result if sr: