Allow calibredb ot set series index for series type custom columns

This commit is contained in:
Kovid Goyal 2010-06-23 08:23:34 -06:00
parent 186532e795
commit 44be78af3d
4 changed files with 34 additions and 21 deletions

View File

@ -21,6 +21,7 @@ from calibre.utils.date import dt_factory, qt_to_dt, isoformat
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, REGEXP_MATCH from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH
from calibre.library.cli import parse_series_string
from calibre import strftime, isbytestring, prepare_string_for_xml from calibre import strftime, isbytestring, prepare_string_for_xml
from calibre.constants import filesystem_encoding from calibre.constants import filesystem_encoding
from calibre.gui2.library import DEFAULT_SORT from calibre.gui2.library import DEFAULT_SORT
@ -708,17 +709,7 @@ class BooksModel(QAbstractTableModel): # {{{
return False return False
val = qt_to_dt(val, as_utc=False) val = qt_to_dt(val, as_utc=False)
elif typ == 'series': elif typ == 'series':
val = unicode(value.toString()).strip() val, s_index = parse_series_string(self.db, label, value.toString())
pat = re.compile(r'\[([.0-9]+)\]')
match = pat.search(val)
if match is not None:
val = pat.sub('', val).strip()
s_index = float(match.group(1))
elif val:
if tweaks['series_index_auto_increment'] == 'next':
s_index = self.db.get_next_cc_series_num_for(val, label=label)
else:
s_index = 1.0
self.db.set_custom(self.db.id(row), val, extra=s_index, self.db.set_custom(self.db.id(row), val, extra=s_index,
label=label, num=None, append=False, notify=True) label=label, num=None, append=False, notify=True)
return True return True

View File

@ -620,6 +620,10 @@ class ResultCache(SearchQueryParser):
elif field == 'title': field = 'sort' elif field == 'title': field = 'sort'
elif field == 'authors': field = 'author_sort' elif field == 'authors': field = 'author_sort'
as_string = field not in ('size', 'rating', 'timestamp') as_string = field not in ('size', 'rating', 'timestamp')
if self.first_sort:
subsort = True
self.first_sort = False
if self.field_metadata[field]['is_custom']: if self.field_metadata[field]['is_custom']:
if self.field_metadata[field]['datatype'] == 'series': if self.field_metadata[field]['datatype'] == 'series':
fcmp = functools.partial(self.seriescmp, fcmp = functools.partial(self.seriescmp,
@ -638,10 +642,6 @@ class ResultCache(SearchQueryParser):
else: else:
fcmp = functools.partial(self.cmp, self.FIELD_MAP[field], fcmp = functools.partial(self.cmp, self.FIELD_MAP[field],
subsort=subsort, asstr=as_string) subsort=subsort, asstr=as_string)
if self.first_sort:
subsort = True
self.first_sort = False
self._map.sort(cmp=fcmp, reverse=not ascending) self._map.sort(cmp=fcmp, reverse=not ascending)
self._map_filtered = [id for id in self._map if id in self._map_filtered] self._map_filtered = [id for id in self._map if id in self._map_filtered]

View File

@ -7,11 +7,11 @@ __docformat__ = 'restructuredtext en'
Command line interface to the calibre database. Command line interface to the calibre database.
''' '''
import sys, os, cStringIO import sys, os, cStringIO, re
from textwrap import TextWrapper from textwrap import TextWrapper
from calibre import terminal_controller, preferred_encoding, prints from calibre import terminal_controller, preferred_encoding, prints
from calibre.utils.config import OptionParser, prefs from calibre.utils.config import OptionParser, prefs, tweaks
from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata.meta import get_metadata
from calibre.library.database2 import LibraryDatabase2 from calibre.library.database2 import LibraryDatabase2
from calibre.ebooks.metadata.opf2 import OPFCreator, OPF from calibre.ebooks.metadata.opf2 import OPFCreator, OPF
@ -680,7 +680,29 @@ def command_catalog(args, dbpath):
# end of GR additions # end of GR additions
def parse_series_string(db, label, value):
val = unicode(value).strip()
s_index = None
pat = re.compile(r'\[([.0-9]+)\]')
match = pat.search(val)
if match is not None:
val = pat.sub('', val).strip()
s_index = float(match.group(1))
elif val:
if tweaks['series_index_auto_increment'] == 'next':
s_index = db.get_next_cc_series_num_for(val, label=label)
else:
s_index = 1.0
return val, s_index
def do_set_custom(db, col, id_, val, append): def do_set_custom(db, col, id_, val, append):
if db.custom_column_label_map[col]['datatype'] == 'series':
val, s_index = parse_series_string(db, col, val)
db.set_custom(id_, val, extra=s_index, label=col, append=append)
prints('Data set to: %r[%4.2f]'%
(db.get_custom(id_, label=col, index_is_id=True),
db.get_custom_extra(id_, label=col, index_is_id=True)))
else:
db.set_custom(id_, val, label=col, append=append) db.set_custom(id_, val, label=col, append=append)
prints('Data set to: %r'%db.get_custom(id_, label=col, index_is_id=True)) prints('Data set to: %r'%db.get_custom(id_, label=col, index_is_id=True))

View File

@ -308,8 +308,8 @@ class CustomColumns(object):
self.conn.commit() self.conn.commit()
return changed return changed
def set_custom(self, id_, val, extra=None, label=None, num=None, def set_custom(self, id_, val, label=None, num=None,
append=False, notify=True): append=False, notify=True, extra=None):
if label is not None: if label is not None:
data = self.custom_column_label_map[label] data = self.custom_column_label_map[label]
if num is not None: if num is not None: