mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Sorting for composite cols marked as dates
This commit is contained in:
parent
798baa863b
commit
521320657d
@ -18,7 +18,7 @@ from calibre.db.write import Writer
|
|||||||
from calibre.ebooks.metadata import title_sort, author_to_author_sort
|
from calibre.ebooks.metadata import title_sort, author_to_author_sort
|
||||||
from calibre.utils.config_base import tweaks
|
from calibre.utils.config_base import tweaks
|
||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort
|
from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort, parse_date
|
||||||
from calibre.utils.localization import calibre_langcode_to_name
|
from calibre.utils.localization import calibre_langcode_to_name
|
||||||
|
|
||||||
class Field(object):
|
class Field(object):
|
||||||
@ -191,7 +191,15 @@ class CompositeField(OneToOneField):
|
|||||||
self.splitter = None
|
self.splitter = None
|
||||||
composite_sort = m.get('display', {}).get('composite_sort', None)
|
composite_sort = m.get('display', {}).get('composite_sort', None)
|
||||||
if composite_sort == 'number':
|
if composite_sort == 'number':
|
||||||
|
self._default_sort_key = 0
|
||||||
self._sort_key = self.number_sort_key
|
self._sort_key = self.number_sort_key
|
||||||
|
elif composite_sort == 'date':
|
||||||
|
self._default_sort_key = UNDEFINED_DATE
|
||||||
|
self._filter_date = lambda x: x
|
||||||
|
if tweaks['sort_dates_using_visible_fields']:
|
||||||
|
fmt = m.get('display', {}).get('date_format', None)
|
||||||
|
self._filter_date = partial(clean_date_for_sort, fmt=fmt)
|
||||||
|
self._sort_key = self.date_sort_key
|
||||||
else:
|
else:
|
||||||
self._sort_key = sort_key
|
self._sort_key = sort_key
|
||||||
|
|
||||||
@ -202,10 +210,17 @@ class CompositeField(OneToOneField):
|
|||||||
p = 1 << (10 * self.SIZE_SUFFIX_MAP.get(val[-2:-1], 0))
|
p = 1 << (10 * self.SIZE_SUFFIX_MAP.get(val[-2:-1], 0))
|
||||||
val = val[:(-2 if p > 1 else -1)].strip()
|
val = val[:(-2 if p > 1 else -1)].strip()
|
||||||
val = atof(val) * p
|
val = atof(val) * p
|
||||||
except (TypeError, AttributeError, ValueError):
|
except (TypeError, AttributeError, ValueError, KeyError):
|
||||||
val = 0.0
|
val = 0.0
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
def date_sort_key(self, val):
|
||||||
|
try:
|
||||||
|
val = self._filter_date(parse_date(val))
|
||||||
|
except (TypeError, ValueError, AttributeError, KeyError):
|
||||||
|
val = UNDEFINED_DATE
|
||||||
|
return val
|
||||||
|
|
||||||
def render_composite(self, book_id, mi):
|
def render_composite(self, book_id, mi):
|
||||||
with self._lock:
|
with self._lock:
|
||||||
ans = self._render_cache.get(book_id, None)
|
ans = self._render_cache.get(book_id, None)
|
||||||
|
@ -556,11 +556,14 @@ class ReadingTest(BaseTest):
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
def test_composites(self): # {{{
|
def test_composites(self): # {{{
|
||||||
|
from calibre.utils.date import parse_only_date as p
|
||||||
cache = self.init_cache()
|
cache = self.init_cache()
|
||||||
cache.create_custom_column('mult', 'CC1', 'composite', True, display={'composite_template': 'b,a,c'})
|
cache.create_custom_column('mult', 'CC1', 'composite', True, display={'composite_template': 'b,a,c'})
|
||||||
cache.create_custom_column('single', 'CC2', 'composite', False, display={'composite_template': 'b,a,c'})
|
cache.create_custom_column('single', 'CC2', 'composite', False, display={'composite_template': 'b,a,c'})
|
||||||
cache.create_custom_column('number', 'CC3', 'composite', False, display={'composite_template': '{#float}', 'composite_sort':'number'})
|
cache.create_custom_column('number', 'CC3', 'composite', False, display={'composite_template': '{#float}', 'composite_sort':'number'})
|
||||||
cache.create_custom_column('size', 'CC4', 'composite', False, display={'composite_template': '{#float:human_readable()}', 'composite_sort':'number'})
|
cache.create_custom_column('size', 'CC4', 'composite', False, display={'composite_template': '{#float:human_readable()}', 'composite_sort':'number'})
|
||||||
|
cache.create_custom_column('ccdate', 'CC5', 'composite', False,
|
||||||
|
display={'composite_template': '{pubdate:format_date(d-M-yy)}', 'composite_sort':'date'})
|
||||||
|
|
||||||
cache = self.init_cache()
|
cache = self.init_cache()
|
||||||
# Test searching
|
# Test searching
|
||||||
@ -574,5 +577,9 @@ class ReadingTest(BaseTest):
|
|||||||
self.assertEqual([3, 1, 2], cache.multisort([('#number', True)]))
|
self.assertEqual([3, 1, 2], cache.multisort([('#number', True)]))
|
||||||
cache.set_field('#float', {1:3, 2:2*1024, 3:1*1024*1024})
|
cache.set_field('#float', {1:3, 2:2*1024, 3:1*1024*1024})
|
||||||
self.assertEqual([1, 2, 3], cache.multisort([('#size', True)]))
|
self.assertEqual([1, 2, 3], cache.multisort([('#size', True)]))
|
||||||
|
|
||||||
|
# Test date sorting
|
||||||
|
cache.set_field('pubdate', {1:p('2001-2-6'), 2:p('2001-10-6'), 3:p('2001-6-6')})
|
||||||
|
self.assertEqual([1, 3, 2], cache.multisort([('#ccdate', True)]))
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user