This commit is contained in:
Kovid Goyal 2011-03-09 09:36:30 -07:00
commit 24a23a8d7e
2 changed files with 29 additions and 50 deletions

View File

@ -22,7 +22,7 @@ from calibre.utils.icu import sort_key, strcmp as icu_strcmp
from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.ebooks.metadata.meta import set_metadata as _set_metadata
from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.search_query_parser import SearchQueryParser
from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \
REGEXP_MATCH, MetadataBackup REGEXP_MATCH, MetadataBackup, force_to_bool
from calibre import strftime, isbytestring, prepare_string_for_xml from calibre import strftime, isbytestring, prepare_string_for_xml
from calibre.constants import filesystem_encoding, DEBUG from calibre.constants import filesystem_encoding, DEBUG
from calibre.gui2.library import DEFAULT_SORT from calibre.gui2.library import DEFAULT_SORT
@ -624,20 +624,7 @@ class BooksModel(QAbstractTableModel): # {{{
return None # displayed using a decorator return None # displayed using a decorator
def bool_type_decorator(r, idx=-1, bool_cols_are_tristate=True): def bool_type_decorator(r, idx=-1, bool_cols_are_tristate=True):
val = self.db.data[r][idx] val = force_to_bool(self.db.data[r][idx])
if isinstance(val, (str, unicode)):
try:
val = icu_lower(val)
if not val:
val = None
elif val in [_('yes'), _('checked'), 'true']:
val = True
elif val in [_('no'), _('unchecked'), 'false']:
val = False
else:
val = bool(int(val))
except:
val = None
if not bool_cols_are_tristate: if not bool_cols_are_tristate:
if val is None or not val: if val is None or not val:
return self.bool_no_icon return self.bool_no_icon

View File

@ -144,6 +144,22 @@ def _match(query, value, matchkind):
pass pass
return False return False
def force_to_bool(val):
if isinstance(val, (str, unicode)):
try:
val = icu_lower(val)
if not val:
val = None
elif val in [_('yes'), _('checked'), 'true']:
val = True
elif val in [_('no'), _('unchecked'), 'false']:
val = False
else:
val = bool(int(val))
except:
val = None
return val
class CacheRow(list): # {{{ class CacheRow(list): # {{{
def __init__(self, db, composites, val): def __init__(self, db, composites, val):
@ -532,37 +548,23 @@ class ResultCache(SearchQueryParser): # {{{
if item is None: if item is None:
continue continue
val = item[loc] val = force_to_bool(item[loc])
if isinstance(val, (str, unicode)):
try:
val = icu_lower(val)
if not val:
val = None
elif val in [_('yes'), _('checked'), 'true']:
val = True
elif val in [_('no'), _('unchecked'), 'false']:
val = False
else:
val = bool(int(val))
except:
val = None
if not bools_are_tristate: if not bools_are_tristate:
if val is None or not val: # item is None or set to false if val is None or not val: # item is None or set to false
if query in [_('no'), _('unchecked'), 'false']: if query in [_('no'), _('unchecked'), '_no', 'false']:
matches.add(item[0]) matches.add(item[0])
else: # item is explicitly set to true else: # item is explicitly set to true
if query in [_('yes'), _('checked'), 'true']: if query in [_('yes'), _('checked'), '_yes', 'true']:
matches.add(item[0]) matches.add(item[0])
else: else:
if val is None: if val is None:
if query in [_('empty'), _('blank'), 'false']: if query in [_('empty'), _('blank'), '_empty', 'false']:
matches.add(item[0]) matches.add(item[0])
elif not val: # is not None and false elif not val: # is not None and false
if query in [_('no'), _('unchecked'), 'true']: if query in [_('no'), _('unchecked'), '_no', 'true']:
matches.add(item[0]) matches.add(item[0])
else: # item is not None and true else: # item is not None and true
if query in [_('yes'), _('checked'), 'true']: if query in [_('yes'), _('checked'), '_yes', 'true']:
matches.add(item[0]) matches.add(item[0])
return matches return matches
@ -695,13 +697,14 @@ class ResultCache(SearchQueryParser): # {{{
if item is None: continue if item is None: continue
if not item[loc]: if not item[loc]:
if q == 'false': if q == 'false' and matchkind == CONTAINS_MATCH:
matches.add(item[0]) matches.add(item[0])
continue # item is empty. No possible matches below continue # item is empty. No possible matches below
if q == 'false': # Field has something in it, so a false query does not match if q == 'false'and matchkind == CONTAINS_MATCH:
# Field has something in it, so a false query does not match
continue continue
if q == 'true': if q == 'true' and matchkind == CONTAINS_MATCH:
if isinstance(item[loc], basestring): if isinstance(item[loc], basestring):
if item[loc].strip() == '': if item[loc].strip() == '':
continue continue
@ -989,18 +992,7 @@ class SortKeyGenerator(object):
val = 0.0 val = 0.0
dt = 'float' dt = 'float'
elif sb == 'bool': elif sb == 'bool':
try: val = force_to_bool(val)
v = icu_lower(val)
if not val:
val = None
elif v in [_('yes'), _('checked'), 'true']:
val = True
elif v in [_('no'), _('unchecked'), 'false']:
val = False
else:
val = bool(int(val))
except:
val = None
dt = 'bool' dt = 'bool'
if dt == 'datetime': if dt == 'datetime':