Refactor books_in_library to get rid of call back that wasn't used, and also to build library titles cache once.

This commit is contained in:
Charles Haley 2010-05-09 19:37:38 +01:00
parent 27635f58f9
commit 660668f718
3 changed files with 16 additions and 22 deletions

View File

@ -1013,29 +1013,29 @@ class DeviceGUI(object):
break break
return loc return loc
def set_books_in_library(self, booklist): def set_books_in_library(self, booklist, reset = False):
''' if reset:
Set the 'in_library' attribute for all books on a device to True if a self.book_in_library_cache = None
book on the device is in the library, else False return
'''
# First build a cache of the library, so the search isn't On**2 # First build a self.book_in_library_cache of the library, so the search isn't On**2
cache = {} self.book_in_library_cache = {}
for id, title in self.library_view.model().db.all_titles(): for id, title in self.library_view.model().db.all_titles():
title = re.sub('(?u)\W|[_]', '', title.lower()) title = re.sub('(?u)\W|[_]', '', title.lower())
if title not in cache: if title not in self.book_in_library_cache:
cache[title] = {'authors':set(), 'db_ids':set()} self.book_in_library_cache[title] = {'authors':set(), 'db_ids':set()}
au = self.library_view.model().db.authors(id, index_is_id=True) au = self.library_view.model().db.authors(id, index_is_id=True)
authors = au.lower() if au else '' authors = au.lower() if au else ''
authors = re.sub('(?u)\W|[_]', '', authors) authors = re.sub('(?u)\W|[_]', '', authors)
cache[title]['authors'].add(authors) self.book_in_library_cache[title]['authors'].add(authors)
cache[title]['db_ids'].add(id) self.book_in_library_cache[title]['db_ids'].add(id)
# Now iterate through all the books on the device, setting the in_library field # Now iterate through all the books on the device, setting the in_library field
for book in booklist: for book in booklist:
book_title = book.title.lower() if book.title else '' book_title = book.title.lower() if book.title else ''
book_title = re.sub('(?u)\W|[_]', '', book_title) book_title = re.sub('(?u)\W|[_]', '', book_title)
book.in_library = False book.in_library = False
d = cache.get(book_title, None) d = self.book_in_library_cache.get(book_title, None)
if d is not None: if d is not None:
if book.db_id in d['db_ids']: if book.db_id in d['db_ids']:
book.in_library = True book.in_library = True

View File

@ -1266,13 +1266,6 @@ class DeviceBooksModel(BooksModel):
self.search_engine = OnDeviceSearch(self) self.search_engine = OnDeviceSearch(self)
self.editable = True self.editable = True
self.book_in_library = None self.book_in_library = None
self.loc = None
def set_book_in_library_func(self, func, loc):
self.book_in_library = func
self.loc = loc
# Not convinced that this should be here ...
func(self.db)
def mark_for_deletion(self, job, rows): def mark_for_deletion(self, job, rows):
self.marked_for_deletion[job] = self.indices(rows) self.marked_for_deletion[job] = self.indices(rows)

View File

@ -992,15 +992,16 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
else: else:
self.device_job_exception(job) self.device_job_exception(job)
return return
self.set_books_in_library(None, reset=True)
mainlist, cardalist, cardblist = job.result mainlist, cardalist, cardblist = job.result
self.memory_view.set_database(mainlist) self.memory_view.set_database(mainlist)
self.memory_view.model().set_book_in_library_func(self.set_books_in_library, 'main') self.set_books_in_library(mainlist)
self.memory_view.set_editable(self.device_manager.device.CAN_SET_METADATA) self.memory_view.set_editable(self.device_manager.device.CAN_SET_METADATA)
self.card_a_view.set_database(cardalist) self.card_a_view.set_database(cardalist)
self.card_a_view.model().set_book_in_library_func(self.set_books_in_library, 'carda') self.set_books_in_library(cardalist)
self.card_a_view.set_editable(self.device_manager.device.CAN_SET_METADATA) self.card_a_view.set_editable(self.device_manager.device.CAN_SET_METADATA)
self.card_b_view.set_database(cardblist) self.card_b_view.set_database(cardblist)
self.card_b_view.model().set_book_in_library_func(self.set_books_in_library, 'cardb') self.set_books_in_library(cardblist)
self.card_b_view.set_editable(self.device_manager.device.CAN_SET_METADATA) self.card_b_view.set_editable(self.device_manager.device.CAN_SET_METADATA)
for view in (self.memory_view, self.card_a_view, self.card_b_view): for view in (self.memory_view, self.card_a_view, self.card_b_view):
view.sortByColumn(3, Qt.DescendingOrder) view.sortByColumn(3, Qt.DescendingOrder)