mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 18:24:30 -04:00
Display metadata fields in the same order in the server view as in the GUI book details panel
This commit is contained in:
parent
7ba58f0d67
commit
e13ae2da4e
@ -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(
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user