Start work on currently reading section of home page

This commit is contained in:
Kovid Goyal 2017-02-17 19:32:52 +05:30
parent d425d50a90
commit 73b4ff84b7
3 changed files with 37 additions and 8 deletions

View File

@ -14,12 +14,21 @@ from book_list.ui import set_default_panel_handler, show_panel
from book_list.router import update_window_title from book_list.router import update_window_title
def show_recent_stage2(books):
container = document.getElementById(this)
if not container:
return
for book in books:
print(book.key, book.metadata.title, book.last_read)
def show_recent(): def show_recent():
container = this container = this
db = get_db() db = get_db()
if not db.initialized: if not db.initialized:
conditional_timeout(container.id, 5, show_recent) conditional_timeout(container.id, 5, show_recent)
return return
db.get_recently_read_books(show_recent_stage2.bind(container.id))
def init(container_id): def init(container_id):

View File

@ -6,12 +6,10 @@ from gettext import gettext as _
from encodings import base64encode, base64decode from encodings import base64encode, base64decode
from modals import error_dialog from modals import error_dialog
from book_list.library_data import current_library_id
from book_list.router import is_reading_book from book_list.router import is_reading_book
current_library_id
def upgrade_schema(idb, old_version, new_version): def upgrade_schema(idb, old_version, new_version, transaction):
print('upgrade_schema:', old_version, new_version) print('upgrade_schema:', old_version, new_version)
if not idb.objectStoreNames.contains('books'): if not idb.objectStoreNames.contains('books'):
idb.createObjectStore('books', {'keyPath':'key'}) idb.createObjectStore('books', {'keyPath':'key'})
@ -22,6 +20,11 @@ def upgrade_schema(idb, old_version, new_version):
if not idb.objectStoreNames.contains('objects'): if not idb.objectStoreNames.contains('objects'):
idb.createObjectStore('objects', {'keyPath':'key'}) idb.createObjectStore('objects', {'keyPath':'key'})
# Create indices
books_store = transaction.objectStore('books')
if not books_store.indexNames.contains('last_read_index'):
books_store.createIndex('last_read_index', 'last_read')
def file_store_name(book, name): def file_store_name(book, name):
return book.book_hash + ' ' + name return book.book_hash + ' ' + name
@ -33,7 +36,7 @@ def get_error_details(event):
desc = desc.errorCode desc = desc.errorCode
DB_NAME = 'calibre-books-db-testing' # TODO: Remove test suffix and change version back to 1 DB_NAME = 'calibre-books-db-testing' # TODO: Remove test suffix and change version back to 1
DB_VERSION = 2 DB_VERSION = 3
class DB: class DB:
@ -60,7 +63,7 @@ class DB:
request = window.indexedDB.open(DB_NAME, DB_VERSION) request = window.indexedDB.open(DB_NAME, DB_VERSION)
request.onupgradeneeded = def(event): request.onupgradeneeded = def(event):
upgrade_schema(event.target.result, event.oldVersion, event.newVersion) upgrade_schema(event.target.result, event.oldVersion, event.newVersion, event.target.transaction)
request.onblocked = def(event): request.onblocked = def(event):
self.initialize_error_msg = _('Please close all other browser tabs with calibre open') self.initialize_error_msg = _('Please close all other browser tabs with calibre open')
@ -126,12 +129,12 @@ class DB:
req.onerror = def(event): req.onerror = def(event):
self.display_error(error_msg, event) self.display_error(error_msg, event)
def get_book(self, book_id, fmt, metadata, proceed): def get_book(self, library_id, book_id, fmt, metadata, proceed):
fmt = fmt.toUpperCase() fmt = fmt.toUpperCase()
# The key has to be a JavaScript array as otherwise it cannot be stored # The key has to be a JavaScript array as otherwise it cannot be stored
# into indexed db, because the RapydScript list has properties that # into indexed db, because the RapydScript list has properties that
# refer to non-serializable objects like functions. # refer to non-serializable objects like functions.
key = v'[current_library_id(), book_id, fmt]' key = v'[library_id, book_id, fmt]'
self.do_op(['books'], key, _('Failed to read from the books database'), def(result): self.do_op(['books'], key, _('Failed to read from the books database'), def(result):
proceed(result or { proceed(result or {
'key':key, 'key':key,
@ -262,6 +265,23 @@ class DB:
else: else:
proceed(data) proceed(data)
def get_recently_read_books(self, proceed, limit):
limit = limit or 3
c = self.idb.transaction(['books'], 'readonly').objectStore('books').index('last_read_index').openCursor(None, 'prev')
books = v'[]'
c.onerror = def(event):
err = _('Failed to read recent books from local storage')
self.display_error(err, event)
c.onsuccess = def (ev):
cursor = ev.target.result
if cursor:
books.push(cursor.value)
if books.length >= limit or not cursor:
proceed(books)
return
if cursor:
cursor.continue()
def delete_book(self, book, proceed): def delete_book(self, book, proceed):
c = self.idb.transaction(['books', 'files'], 'readwrite') c = self.idb.transaction(['books', 'files'], 'readwrite')
files = c.objectStore('files') files = c.objectStore('files')

View File

@ -145,7 +145,7 @@ class ReadUI:
if jstype(self.db) is 'string': if jstype(self.db) is 'string':
self.show_error(_('Cannot read book'), self.db) self.show_error(_('Cannot read book'), self.db)
return return
self.db.get_book(book_id, fmt, metadata, self.got_book.bind(self, force_reload)) self.db.get_book(current_library_id(), book_id, fmt, metadata, self.got_book.bind(self, force_reload))
def got_book(self, force_reload, book): def got_book(self, force_reload, book):
if not book.manifest or book.manifest.version is not RENDER_VERSION or not book.is_complete: if not book.manifest or book.manifest.version is not RENDER_VERSION or not book.is_complete: