mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Implement writing custom series index fields
This commit is contained in:
parent
2e8e0f6daf
commit
836e00211a
@ -211,6 +211,12 @@ class Cache(object):
|
|||||||
self.fields['ondevice'] = create_field('ondevice',
|
self.fields['ondevice'] = create_field('ondevice',
|
||||||
VirtualTable('ondevice'))
|
VirtualTable('ondevice'))
|
||||||
|
|
||||||
|
for name, field in self.fields.iteritems():
|
||||||
|
if name[0] == '#' and name.endswith('_index'):
|
||||||
|
field.series_field = self.fields[name[:-len('_index')]]
|
||||||
|
elif name == 'series_index':
|
||||||
|
field.series_field = self.fields['series']
|
||||||
|
|
||||||
@read_api
|
@read_api
|
||||||
def field_for(self, name, book_id, default_value=None):
|
def field_for(self, name, book_id, default_value=None):
|
||||||
'''
|
'''
|
||||||
|
@ -46,6 +46,7 @@ class Field(object):
|
|||||||
elif name == 'languages':
|
elif name == 'languages':
|
||||||
self.category_formatter = calibre_langcode_to_name
|
self.category_formatter = calibre_langcode_to_name
|
||||||
self.writer = Writer(self)
|
self.writer = Writer(self)
|
||||||
|
self.series_field = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def metadata(self):
|
def metadata(self):
|
||||||
|
@ -22,7 +22,11 @@ class WritingTest(BaseTest):
|
|||||||
|
|
||||||
def create_getter(self, name, getter=None):
|
def create_getter(self, name, getter=None):
|
||||||
if getter is None:
|
if getter is None:
|
||||||
ans = lambda db:partial(db.get_custom, label=name[1:],
|
if name.endswith('_index'):
|
||||||
|
ans = lambda db:partial(db.get_custom_extra, index_is_id=True,
|
||||||
|
label=name[1:].replace('_index', ''))
|
||||||
|
else:
|
||||||
|
ans = lambda db:partial(db.get_custom, label=name[1:],
|
||||||
index_is_id=True)
|
index_is_id=True)
|
||||||
else:
|
else:
|
||||||
ans = lambda db:partial(getattr(db, getter), index_is_id=True)
|
ans = lambda db:partial(getattr(db, getter), index_is_id=True)
|
||||||
@ -53,22 +57,29 @@ class WritingTest(BaseTest):
|
|||||||
db = self.init_old(cl)
|
db = self.init_old(cl)
|
||||||
getter = test.getter(db)
|
getter = test.getter(db)
|
||||||
sqlite_res = getter(1)
|
sqlite_res = getter(1)
|
||||||
test.setter(db)(1, val)
|
if test.name.endswith('_index'):
|
||||||
old_cached_res = getter(1)
|
val = float(val) if val is not None else 1.0
|
||||||
self.assertEqual(old_cached_res, cached_res,
|
self.assertEqual(sqlite_res, val,
|
||||||
'Failed setting for %s with value %r, cached value not the same. Old: %r != New: %r'%(
|
'Failed setting for %s with value %r, sqlite value not the same. val: %r != sqlite_val: %r'%(
|
||||||
test.name, val, old_cached_res, cached_res))
|
test.name, val, val, sqlite_res))
|
||||||
db.refresh()
|
else:
|
||||||
old_sqlite_res = getter(1)
|
test.setter(db)(1, val)
|
||||||
self.assertEqual(old_sqlite_res, sqlite_res,
|
old_cached_res = getter(1)
|
||||||
'Failed setting for %s, sqlite value not the same: %r != %r'%(
|
self.assertEqual(old_cached_res, cached_res,
|
||||||
test.name, old_sqlite_res, sqlite_res))
|
'Failed setting for %s with value %r, cached value not the same. Old: %r != New: %r'%(
|
||||||
|
test.name, val, old_cached_res, cached_res))
|
||||||
|
db.refresh()
|
||||||
|
old_sqlite_res = getter(1)
|
||||||
|
self.assertEqual(old_sqlite_res, sqlite_res,
|
||||||
|
'Failed setting for %s, sqlite value not the same: %r != %r'%(
|
||||||
|
test.name, old_sqlite_res, sqlite_res))
|
||||||
del db
|
del db
|
||||||
|
|
||||||
def test_one_one(self):
|
def test_one_one(self):
|
||||||
'Test setting of values in one-one fields'
|
'Test setting of values in one-one fields'
|
||||||
tests = [self.create_test('#yesno', (True, False, 'true', 'false', None))]
|
tests = [self.create_test('#yesno', (True, False, 'true', 'false', None))]
|
||||||
for name, getter, setter in (
|
for name, getter, setter in (
|
||||||
|
('#series_index', None, None),
|
||||||
('series_index', 'series_index', 'set_series_index'),
|
('series_index', 'series_index', 'set_series_index'),
|
||||||
('#float', None, None),
|
('#float', None, None),
|
||||||
):
|
):
|
||||||
|
@ -138,6 +138,21 @@ def one_one_in_other(book_id_val_map, db, field, *args):
|
|||||||
field.table.book_col_map.update(updated)
|
field.table.book_col_map.update(updated)
|
||||||
return set(book_id_val_map)
|
return set(book_id_val_map)
|
||||||
|
|
||||||
|
def custom_series_index(book_id_val_map, db, field, *args):
|
||||||
|
series_field = field.series_field
|
||||||
|
sequence = []
|
||||||
|
for book_id, sidx in book_id_val_map.iteritems():
|
||||||
|
if sidx is None:
|
||||||
|
sidx = 1.0
|
||||||
|
ids = series_field.ids_for_book(book_id)
|
||||||
|
if ids:
|
||||||
|
sequence.append((sidx, book_id, ids[0]))
|
||||||
|
field.table.book_col_map[book_id] = sidx
|
||||||
|
if sequence:
|
||||||
|
db.conn.executemany('UPDATE %s SET %s=? WHERE book=? AND value=?'%(
|
||||||
|
field.metadata['table'], field.metadata['column']), sequence)
|
||||||
|
return {s[0] for s in sequence}
|
||||||
|
|
||||||
def dummy(book_id_val_map, *args):
|
def dummy(book_id_val_map, *args):
|
||||||
return set()
|
return set()
|
||||||
|
|
||||||
@ -153,8 +168,7 @@ class Writer(object):
|
|||||||
'id', 'cover', 'size', 'path', 'formats', 'news'}:
|
'id', 'cover', 'size', 'path', 'formats', 'news'}:
|
||||||
self.set_books_func = dummy
|
self.set_books_func = dummy
|
||||||
elif self.name[0] == '#' and self.name.endswith('_index'):
|
elif self.name[0] == '#' and self.name.endswith('_index'):
|
||||||
# TODO: Implement this
|
self.set_books_func = custom_series_index
|
||||||
pass
|
|
||||||
elif field.is_many:
|
elif field.is_many:
|
||||||
# TODO: Implement this
|
# TODO: Implement this
|
||||||
pass
|
pass
|
||||||
|
Loading…
x
Reference in New Issue
Block a user