Display metadata fields in the same order in the server view as in the GUI book details panel

This commit is contained in:
Kovid Goyal 2017-05-19 10:43:42 +05:30
parent 7ba58f0d67
commit e13ae2da4e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 39 additions and 20 deletions

View File

@ -125,6 +125,16 @@ def update_interface_data(ctx, rd):
return basic_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): def get_library_init_data(ctx, rd, db, num, sorts, orders, vl):
ans = {} ans = {}
with db.safe_read_lock: 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['field_metadata'] = db.field_metadata.all_metadata()
ans['virtual_libraries'] = db._pref('virtual_libraries', {}) ans['virtual_libraries'] = db._pref('virtual_libraries', {})
ans['book_display_fields'] = get_field_list(db)
mdata = ans['metadata'] = {} mdata = ans['metadata'] = {}
try: try:
extra_books = set( extra_books = set(

View File

@ -50,7 +50,7 @@ def get_preferred_format(metadata, output_format, input_formats):
break break
return fmt.toUpperCase() 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 = {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 default_sort['formats'] = 999
@ -113,7 +113,7 @@ def adjusting_sandboxed_html(html):
return ans 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 field_metadata = library_data.field_metadata
interface_data = get_interface_data() interface_data = get_interface_data()
def allowed_fields(field): def allowed_fields(field):
@ -125,9 +125,15 @@ def render_metadata(mi, table, book_id, field_list=None): # {{{
return True return True
if field in IGNORED_FIELDS or field.endswith('_sort'): if field in IGNORED_FIELDS or field.endswith('_sort'):
return False return False
if mi[field] is undefined:
return False
return True 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 = {} comments = {}
def add_row(name, val, is_searchable=False, is_html=False, join=None): 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) add_row(name, val, is_searchable=field)
def process_formats(field, fm, name, val): def process_formats(field, fm, name, val):
table.appendChild(E.tr(E.td(name + ':'), E.td())) if val.length:
td = table.lastChild.lastChild table.appendChild(E.tr(E.td(name + ':'), E.td()))
for fmt in val: td = table.lastChild.lastChild
fmt = fmt.toUpperCase() for fmt in val:
td.appendChild(E.a( fmt = fmt.toUpperCase()
fmt, class_='simple-link', href='javascript:void(0)', td.appendChild(E.a(
title=_('Read or download this book in the {} format').format(fmt), fmt, class_='simple-link', href='javascript:void(0)',
onclick=on_fmt_click.bind(mi.title), data_format=fmt, data_book_id='' + book_id)) title=_('Read or download this book in the {} format').format(fmt),
if fmt is not val[-1]: onclick=on_fmt_click.bind(mi.title), data_format=fmt, data_book_id='' + book_id))
td.appendChild(document.createTextNode(', ')) if fmt is not val[-1]:
td.appendChild(document.createTextNode(', '))
def process_rating(field, fm, name, val): def process_rating(field, fm, name, val):
stars = E.span() stars = E.span()
val = int(val) val = int(val or 0)
for i in range(val // 2): if val > 0:
stars.appendChild(svgicon('star')) for i in range(val // 2):
if fm.display.allow_half_stars and (val % 2): stars.appendChild(svgicon('star'))
stars.appendChild(svgicon('star-half')) if fm.display.allow_half_stars and (val % 2):
add_row(name, stars) stars.appendChild(svgicon('star-half'))
add_row(name, stars)
def process_identifiers(field, fm, name, val): def process_identifiers(field, fm, name, val):
if val: if val:

View File

@ -71,7 +71,7 @@ def update_library_data(data):
load_status.loading = False load_status.loading = False
load_status.ok = True load_status.ok = True
load_status.error_html = None 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] library_data[key] = data[key]
sr = library_data.search_result sr = library_data.search_result
if sr: if sr: