Track virtual library state as well

Also ensure that library and virtual library state is always present in
the book list URLs
This commit is contained in:
Kovid Goyal 2017-04-24 11:56:53 +05:30
parent 2246053e3a
commit 508c8578fd
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
8 changed files with 47 additions and 23 deletions

View File

@ -540,12 +540,13 @@ def search_result(ctx, rd, db, query, num, offset, sort, sort_order, vl=''):
total_num = len(ids) total_num = len(ids)
ids = ids[offset:offset+num] ids = ids[offset:offset+num]
return { return {
'total_num': total_num, 'sort_order':sort_order, 'total_num': total_num, 'sort_order':sort_order,
'offset':offset, 'num':len(ids), 'sort':sort, 'offset':offset, 'num':len(ids), 'sort':sort,
'base_url':ctx.url_for(search, library_id=db.server_library_id), 'base_url':ctx.url_for(search, library_id=db.server_library_id),
'query': query, 'query': query,
'library_id': db.server_library_id, 'library_id': db.server_library_id,
'book_ids':ids 'book_ids':ids,
'vl': vl,
} }

View File

@ -304,15 +304,16 @@ def book_metadata(ctx, rd, book_id):
''' '''
Get metadata for the specified book. If no book_id is specified, return metadata for a random book. Get metadata for the specified book. If no book_id is specified, return metadata for a random book.
Optional: ?library_id=<default library> Optional: ?library_id=<default library>&vl=<virtual library>
''' '''
library_id, db = get_basic_query_data(ctx, rd)[:2] library_id, db, sorts, orders, vl = get_basic_query_data(ctx, rd)
def notfound(): def notfound():
raise HTTPNotFound(_('No book with id: {} in library: {}').format(book_id, library_id)) raise HTTPNotFound(_('No book with id: {} in library: {}').format(book_id, library_id))
if not book_id: if not book_id:
book_id = random.choice(tuple(db.all_book_ids())) all_ids = db.books_in_virtual_library(vl) if vl else db.all_book_ids()
book_id = random.choice(tuple(all_ids))
elif not db.has_id(book_id): elif not db.has_id(book_id):
notfound() notfound()
data = book_as_json(db, book_id) data = book_as_json(db, book_id)

View File

@ -15,7 +15,7 @@ from session import get_interface_data
from utils import fmt_sidx, parse_url_params, conditional_timeout from utils import fmt_sidx, parse_url_params, conditional_timeout
from book_list.router import back, open_book from book_list.router import back, open_book
from book_list.library_data import book_metadata, cover_url, set_book_metadata, current_library_id, library_data, download_url, load_status from book_list.library_data import book_metadata, cover_url, set_book_metadata, current_library_id, library_data, download_url, load_status, current_virtual_library
from book_list.top_bar import create_top_bar, set_title, add_button from book_list.top_bar import create_top_bar, set_title, add_button
from book_list.ui import set_panel_handler from book_list.ui import set_panel_handler
from book_list.views import search from book_list.views import search
@ -401,7 +401,7 @@ def fetch_metadata(container_id, book_id):
if current_fetch: if current_fetch:
current_fetch.abort() current_fetch.abort()
current_fetch = ajax('interface-data/book-metadata/' + book_id, metadata_fetched.bind(None, container_id, book_id), current_fetch = ajax('interface-data/book-metadata/' + book_id, metadata_fetched.bind(None, container_id, book_id),
query={'library_id':current_library_id().library_id}) query={'library_id':current_library_id(), 'vl':current_virtual_library()})
current_fetch.send() current_fetch.send()
container = container.lastChild container = container.lastChild
clear(container) clear(container)

View File

@ -18,6 +18,11 @@ def current_library_id():
return q.library_id or get_interface_data().default_library_id return q.library_id or get_interface_data().default_library_id
def current_virtual_library():
q = parse_url_params()
return q.vl or ''
def url_books_query(sd): def url_books_query(sd):
q = parse_url_params() q = parse_url_params()
sd = sd or get_session_data() sd = sd or get_session_data()
@ -26,6 +31,7 @@ def url_books_query(sd):
'library_id': lid, 'library_id': lid,
'sort': q.sort or sd.get_library_option(lid, 'sort'), 'sort': q.sort or sd.get_library_option(lid, 'sort'),
'search': q.search, 'search': q.search,
'vl': current_virtual_library(),
} }
@ -37,7 +43,8 @@ def loaded_books_query():
return { return {
'library_id': sr.library_id if sr else None, 'library_id': sr.library_id if sr else None,
'sort': sort, 'sort': sort,
'search': sr?.query 'search': sr?.query,
'vl':sr?.vl
} }
@ -111,8 +118,14 @@ def ensure_current_library_data():
q = url_books_query() q = url_books_query()
loaded = loaded_books_query() loaded = loaded_books_query()
matches = True matches = True
def is_same(a, b):
if not a and not b:
return True
return a is b
for key in q: for key in q:
if q[key] is not loaded[key]: if not is_same(q[key], loaded[key]):
matches = False matches = False
break break
if not matches: if not matches:

View File

@ -12,7 +12,7 @@ from modals import show_modal
from utils import rating_to_stars from utils import rating_to_stars
from session import get_interface_data from session import get_interface_data
from book_list.library_data import library_data, current_library_id from book_list.library_data import library_data, current_library_id, current_virtual_library
from book_list.ui import show_panel from book_list.ui import show_panel
from book_list.router import back from book_list.router import back
from book_list.top_bar import create_top_bar, add_button from book_list.top_bar import create_top_bar, add_button
@ -357,7 +357,7 @@ def refresh():
state.currently_loading.abort() state.currently_loading.abort()
state.currently_loading = None state.currently_loading = None
sd = get_session_data() sd = get_session_data()
query = {'library_id': current_library_id()} query = {'library_id': current_library_id(), 'vl':current_virtual_library()}
for k in 'sort_tags_by partition_method collapse_at dont_collapse hide_empty_categories'.split(' '): for k in 'sort_tags_by partition_method collapse_at dont_collapse hide_empty_categories'.split(' '):
query[k] = sd.get(k) + '' query[k] = sd.get(k) + ''
xhr = ajax('interface-data/tag-browser', on_data_fetched, query=query, bypass_cache=False) xhr = ajax('interface-data/tag-browser', on_data_fetched, query=query, bypass_cache=False)

View File

@ -8,7 +8,7 @@ from elementmaker import E
from book_list.constants import book_list_container_id from book_list.constants import book_list_container_id
from book_list.globals import get_current_query from book_list.globals import get_current_query
from book_list.router import push_state from book_list.router import push_state
from book_list.library_data import current_library_id from book_list.library_data import current_library_id, current_virtual_library
panel_handlers = {} panel_handlers = {}
@ -45,6 +45,15 @@ def currently_showing_panel():
return c.dataset.panel return c.dataset.panel
def add_library_info(query):
if not query.library_id:
query.library_id = current_library_id()
if not query.vl:
vlid = current_virtual_library()
if vlid:
query.vl = vlid
def show_panel(panel, query=None, replace=False): def show_panel(panel, query=None, replace=False):
if query is None: if query is None:
query = {} query = {}
@ -52,6 +61,7 @@ def show_panel(panel, query=None, replace=False):
query = {k:query[k] for k in query if k is not 'panel'} query = {k:query[k] for k in query if k is not 'panel'}
if panel is not 'home': if panel is not 'home':
query.panel = panel query.panel = panel
add_library_info(query)
push_state(query, replace=replace) push_state(query, replace=replace)
@ -75,7 +85,5 @@ apply_url_state.back_from_current = def back_from_current(current_query):
q = {} q = {}
else: else:
q = {'panel':'book_list'} q = {'panel':'book_list'}
lid = current_library_id() add_library_info(q)
if lid:
q.library_id = lid
return q return q

View File

@ -14,7 +14,7 @@ from book_list.cover_grid import (
from book_list.globals import get_session_data from book_list.globals import get_session_data
from book_list.item_list import create_item, create_item_list from book_list.item_list import create_item, create_item_list
from book_list.library_data import ( from book_list.library_data import (
book_metadata, current_library_id, current_sorted_field, book_metadata, current_sorted_field,
ensure_current_library_data, library_data, load_status, loaded_books_query, ensure_current_library_data, library_data, load_status, loaded_books_query,
thumbnail_cache, url_books_query thumbnail_cache, url_books_query
) )
@ -61,7 +61,7 @@ def clear_grid():
def show_book_details(book_id): def show_book_details(book_id):
show_panel('book_details', {'book_id':book_id, 'library_id':current_library_id()}) show_panel('book_details', {'book_id':book_id})
def create_image(book_id, max_width, max_height, on_load): def create_image(book_id, max_width, max_height, on_load):
@ -296,7 +296,7 @@ def create_more_actions_panel(container_id):
items = [ items = [
create_item(_('Book list mode'), subtitle=_('Change how the list of books is displayed')), create_item(_('Book list mode'), subtitle=_('Change how the list of books is displayed')),
create_item(_('A random book'), subtitle=_('Choose a random book from the library'), action=def(): create_item(_('A random book'), subtitle=_('Choose a random book from the library'), action=def():
query = {'library_id': current_library_id(), 'book_id':'0'} query = {'book_id':'0'}
show_panel('book_details', query=query, replace=True) show_panel('book_details', query=query, replace=True)
), ),
] ]

View File

@ -13,7 +13,7 @@ from utils import human_readable, debounce
from book_list.constants import read_book_container_id from book_list.constants import read_book_container_id
from read_book.db import get_db from read_book.db import get_db
from book_list.router import update_window_title from book_list.router import update_window_title
from book_list.library_data import library_data, current_library_id from book_list.library_data import library_data, current_library_id, current_virtual_library
from read_book.view import View from read_book.view import View
RENDER_VERSION = __RENDER_VERSION__ RENDER_VERSION = __RENDER_VERSION__
@ -75,6 +75,7 @@ class ReadUI:
if self.current_book_id: if self.current_book_id:
a.setAttribute('href', encode_query({ a.setAttribute('href', encode_query({
'library_id':current_library_id(), 'library_id':current_library_id(),
'vl': current_virtual_library(),
'book-id': (self.current_book_id + ''), 'book-id': (self.current_book_id + ''),
'panel':'book-details' 'panel':'book-details'
})) }))