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)
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(

View File

@ -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:

View File

@ -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: