mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
newdb: Fix bools_are_tristate preference not being respected when sorting
This commit is contained in:
parent
d056f8fed7
commit
7214608282
@ -286,14 +286,15 @@ class Cache(object):
|
|||||||
'''
|
'''
|
||||||
with self.write_lock:
|
with self.write_lock:
|
||||||
self.backend.read_tables()
|
self.backend.read_tables()
|
||||||
|
bools_are_tristate = self.backend.prefs['bools_are_tristate']
|
||||||
|
|
||||||
for field, table in self.backend.tables.iteritems():
|
for field, table in self.backend.tables.iteritems():
|
||||||
self.fields[field] = create_field(field, table)
|
self.fields[field] = create_field(field, table, bools_are_tristate)
|
||||||
if table.metadata['datatype'] == 'composite':
|
if table.metadata['datatype'] == 'composite':
|
||||||
self.composites[field] = self.fields[field]
|
self.composites[field] = self.fields[field]
|
||||||
|
|
||||||
self.fields['ondevice'] = create_field('ondevice',
|
self.fields['ondevice'] = create_field('ondevice',
|
||||||
VirtualTable('ondevice'))
|
VirtualTable('ondevice'), bools_are_tristate)
|
||||||
|
|
||||||
for name, field in self.fields.iteritems():
|
for name, field in self.fields.iteritems():
|
||||||
if name[0] == '#' and name.endswith('_index'):
|
if name[0] == '#' and name.endswith('_index'):
|
||||||
|
@ -26,7 +26,7 @@ class Field(object):
|
|||||||
is_many_many = False
|
is_many_many = False
|
||||||
is_composite = False
|
is_composite = False
|
||||||
|
|
||||||
def __init__(self, name, table):
|
def __init__(self, name, table, bools_are_tristate):
|
||||||
self.name, self.table = name, table
|
self.name, self.table = name, table
|
||||||
dt = self.metadata['datatype']
|
dt = self.metadata['datatype']
|
||||||
self.has_text_data = dt in {'text', 'comments', 'series', 'enumeration'}
|
self.has_text_data = dt in {'text', 'comments', 'series', 'enumeration'}
|
||||||
@ -43,6 +43,10 @@ class Field(object):
|
|||||||
self._default_sort_key = 0
|
self._default_sort_key = 0
|
||||||
elif dt == 'bool':
|
elif dt == 'bool':
|
||||||
self._default_sort_key = None
|
self._default_sort_key = None
|
||||||
|
if bools_are_tristate:
|
||||||
|
self._sort_key = lambda x:{True: 1, False: 2, None: 3}.get(x, 3)
|
||||||
|
else:
|
||||||
|
self._sort_key = lambda x:{True: 1, False: 2, None: 2}.get(x, 2)
|
||||||
elif dt == 'datetime':
|
elif dt == 'datetime':
|
||||||
self._default_sort_key = UNDEFINED_DATE
|
self._default_sort_key = UNDEFINED_DATE
|
||||||
if tweaks['sort_dates_using_visible_fields']:
|
if tweaks['sort_dates_using_visible_fields']:
|
||||||
@ -248,7 +252,7 @@ class CompositeField(OneToOneField):
|
|||||||
|
|
||||||
class OnDeviceField(OneToOneField):
|
class OnDeviceField(OneToOneField):
|
||||||
|
|
||||||
def __init__(self, name, table):
|
def __init__(self, name, table, bools_are_tristate):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.book_on_device_func = None
|
self.book_on_device_func = None
|
||||||
self.is_multiple = False
|
self.is_multiple = False
|
||||||
@ -565,7 +569,7 @@ class TagsField(ManyToManyField):
|
|||||||
ans.append(c)
|
ans.append(c)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
def create_field(name, table):
|
def create_field(name, table, bools_are_tristate):
|
||||||
cls = {
|
cls = {
|
||||||
ONE_ONE: OneToOneField,
|
ONE_ONE: OneToOneField,
|
||||||
MANY_ONE: ManyToOneField,
|
MANY_ONE: ManyToOneField,
|
||||||
@ -585,5 +589,5 @@ def create_field(name, table):
|
|||||||
cls = CompositeField
|
cls = CompositeField
|
||||||
elif table.metadata['datatype'] == 'series':
|
elif table.metadata['datatype'] == 'series':
|
||||||
cls = SeriesField
|
cls = SeriesField
|
||||||
return cls(name, table)
|
return cls(name, table, bools_are_tristate)
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ class ReadingTest(BaseTest):
|
|||||||
|
|
||||||
def test_sorting(self): # {{{
|
def test_sorting(self): # {{{
|
||||||
'Test sorting'
|
'Test sorting'
|
||||||
cache = self.init_cache(self.library_path)
|
cache = self.init_cache()
|
||||||
for field, order in {
|
for field, order in {
|
||||||
'title' : [2, 1, 3],
|
'title' : [2, 1, 3],
|
||||||
'authors': [2, 1, 3],
|
'authors': [2, 1, 3],
|
||||||
@ -147,7 +147,7 @@ class ReadingTest(BaseTest):
|
|||||||
'#rating':[3, 2, 1],
|
'#rating':[3, 2, 1],
|
||||||
'#series':[3, 2, 1],
|
'#series':[3, 2, 1],
|
||||||
'#tags':[3, 2, 1],
|
'#tags':[3, 2, 1],
|
||||||
'#yesno':[3, 1, 2],
|
'#yesno':[2, 1, 3],
|
||||||
'#comments':[3, 2, 1],
|
'#comments':[3, 2, 1],
|
||||||
}.iteritems():
|
}.iteritems():
|
||||||
x = list(reversed(order))
|
x = list(reversed(order))
|
||||||
@ -189,6 +189,11 @@ class ReadingTest(BaseTest):
|
|||||||
c2 = self.init_cache()
|
c2 = self.init_cache()
|
||||||
self.assertEqual([3, 2, 1], c2.multisort([('pubdate', True)]))
|
self.assertEqual([3, 2, 1], c2.multisort([('pubdate', True)]))
|
||||||
|
|
||||||
|
# Test bool sorting when not tristate
|
||||||
|
cache.set_pref('bools_are_tristate', False)
|
||||||
|
c2 = self.init_cache()
|
||||||
|
self.assertEqual([2, 3, 1], c2.multisort([('#yesno', True), ('id', False)]))
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
def test_get_metadata(self): # {{{
|
def test_get_metadata(self): # {{{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user