mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
categories API
This commit is contained in:
parent
1ee4cad632
commit
76045d2a54
@ -401,6 +401,12 @@ class Cache(object):
|
|||||||
def get_item_name(self, field, item_id):
|
def get_item_name(self, field, item_id):
|
||||||
return self.fields[field].table.id_map[item_id]
|
return self.fields[field].table.id_map[item_id]
|
||||||
|
|
||||||
|
@read_api
|
||||||
|
def get_item_id(self, field, item_name):
|
||||||
|
' Return the item id for item_name (case-insensitive) '
|
||||||
|
rmap = {icu_lower(v) if isinstance(v, unicode) else v:k for k, v in self.fields[field].table.id_map.iteritems()}
|
||||||
|
return rmap.get(icu_lower(item_name) if isinstance(item_name, unicode) else item_name, None)
|
||||||
|
|
||||||
@read_api
|
@read_api
|
||||||
def author_data(self, author_ids=None):
|
def author_data(self, author_ids=None):
|
||||||
'''
|
'''
|
||||||
@ -1413,6 +1419,14 @@ class Cache(object):
|
|||||||
def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None):
|
def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None):
|
||||||
return self.backend.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display)
|
return self.backend.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display)
|
||||||
|
|
||||||
|
@read_api
|
||||||
|
def get_books_for_category(self, category, item_id_or_composite_value):
|
||||||
|
f = self.fields[category]
|
||||||
|
if hasattr(f, 'get_books_for_val'):
|
||||||
|
# Composite field
|
||||||
|
return f.get_books_for_val(item_id_or_composite_value, self._get_metadata, self._all_book_ids())
|
||||||
|
return self._books_for_field(f.name, item_id_or_composite_value)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
class SortKey(object): # {{{
|
class SortKey(object): # {{{
|
||||||
|
@ -211,6 +211,16 @@ class CompositeField(OneToOneField):
|
|||||||
ans.append(c)
|
ans.append(c)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
def get_books_for_val(self, value, get_metadata, book_ids):
|
||||||
|
is_multiple = self.table.metadata['is_multiple'].get('cache_to_list', None)
|
||||||
|
ans = set()
|
||||||
|
for book_id in book_ids:
|
||||||
|
val = self.get_value_with_cache(book_id, get_metadata)
|
||||||
|
vals = {x.strip() for x in val.split(is_multiple)} if is_multiple else [val]
|
||||||
|
if value in vals:
|
||||||
|
ans.add(book_id)
|
||||||
|
return ans
|
||||||
|
|
||||||
class OnDeviceField(OneToOneField):
|
class OnDeviceField(OneToOneField):
|
||||||
|
|
||||||
def __init__(self, name, table):
|
def __init__(self, name, table):
|
||||||
|
@ -717,10 +717,13 @@ LibraryDatabase.format_hash = MT(lambda self, book_id, fmt:self.new_api.format_h
|
|||||||
LibraryDatabase.index = MT(lambda self, book_id, cache=False:self.data.id_to_index(book_id))
|
LibraryDatabase.index = MT(lambda self, book_id, cache=False:self.data.id_to_index(book_id))
|
||||||
LibraryDatabase.has_cover = MT(lambda self, book_id:self.new_api.field_for('cover', book_id))
|
LibraryDatabase.has_cover = MT(lambda self, book_id:self.new_api.field_for('cover', book_id))
|
||||||
LibraryDatabase.get_tags = MT(lambda self, book_id:set(self.new_api.field_for('tags', book_id)))
|
LibraryDatabase.get_tags = MT(lambda self, book_id:set(self.new_api.field_for('tags', book_id)))
|
||||||
|
LibraryDatabase.get_categories = MT(lambda self, sort='name', ids=None, icon_map=None:self.new_api.get_categories(sort=sort, book_ids=ids, icon_map=icon_map))
|
||||||
LibraryDatabase.get_identifiers = MT(
|
LibraryDatabase.get_identifiers = MT(
|
||||||
lambda self, index, index_is_id=False: self.new_api.field_for('identifiers', index if index_is_id else self.id(index)))
|
lambda self, index, index_is_id=False: self.new_api.field_for('identifiers', index if index_is_id else self.id(index)))
|
||||||
LibraryDatabase.isbn = MT(
|
LibraryDatabase.isbn = MT(
|
||||||
lambda self, index, index_is_id=False: self.get_identifiers(index, index_is_id=index_is_id).get('isbn', None))
|
lambda self, index, index_is_id=False: self.get_identifiers(index, index_is_id=index_is_id).get('isbn', None))
|
||||||
|
LibraryDatabase.get_books_for_category = MT(
|
||||||
|
lambda self, category, id_:self.new_api.get_books_for_category(category, id_))
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Legacy setter API {{{
|
# Legacy setter API {{{
|
||||||
|
@ -161,10 +161,12 @@ class LegacyTest(BaseTest):
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
ndb = self.init_legacy(self.cloned_library)
|
ndb = self.init_legacy(self.cloned_library)
|
||||||
db = self.init_old()
|
db = self.init_old()
|
||||||
|
newstag = ndb.new_api.get_item_id('tags', 'news')
|
||||||
|
|
||||||
self.assertEqual(dict(db.prefs), dict(ndb.prefs))
|
self.assertEqual(dict(db.prefs), dict(ndb.prefs))
|
||||||
|
|
||||||
for meth, args in {
|
for meth, args in {
|
||||||
|
'get_books_for_category': [('tags', newstag), ('#formats', 'FMT1')],
|
||||||
'get_next_series_num_for': [('A Series One',)],
|
'get_next_series_num_for': [('A Series One',)],
|
||||||
'get_id_from_uuid':[('ddddd',), (db.uuid(1, True),)],
|
'get_id_from_uuid':[('ddddd',), (db.uuid(1, True),)],
|
||||||
'cover':[(0,), (1,), (2,)],
|
'cover':[(0,), (1,), (2,)],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user