Handle case of bulk series changing index of existing book

This commit is contained in:
Kovid Goyal 2013-07-22 11:57:48 +05:30
parent 6423745c0c
commit 8241d78c16
2 changed files with 9 additions and 7 deletions

View File

@ -1179,9 +1179,11 @@ class Cache(object):
if q == icu_lower(val): if q == icu_lower(val):
books = book_ids books = book_ids
break break
series_indices = sorted(self._field_for(sf.index_field.name, book_id) for book_id in books) idf = sf.index_field
index_map = {book_id:self._fast_field_for(idf, book_id, default_value=1.0) for book_id in books}
if current_indices: if current_indices:
return series_indices return index_map
series_indices = sorted(index_map.itervalues())
return _get_next_series_num_for_list(tuple(series_indices), unwrap=False) return _get_next_series_num_for_list(tuple(series_indices), unwrap=False)
@read_api @read_api

View File

@ -233,19 +233,19 @@ class MyBlockingBusyNew(QDialog): # {{{
cache.set_field('timestamp', {bid:args.adddate for bid in self.ids}) cache.set_field('timestamp', {bid:args.adddate for bid in self.ids})
if args.do_series: if args.do_series:
sval = args.series_start_value if args.do_series_restart else list(cache.get_next_series_num_for(args.series, current_indices=True)) sval = args.series_start_value if args.do_series_restart else cache.get_next_series_num_for(args.series, current_indices=True)
cache.set_field('series', {bid:args.series for bid in self.ids}) cache.set_field('series', {bid:args.series for bid in self.ids})
if not args.series: if not args.series:
cache.set_field('series_index', {bid:1.0 for bid in self.ids}) cache.set_field('series_index', {bid:1.0 for bid in self.ids})
else: else:
def next_series_num(i): def next_series_num(bid, i):
if args.do_series_restart: if args.do_series_restart:
return sval + i return sval + i
next_num = _get_next_series_num_for_list(sval, unwrap=False) next_num = _get_next_series_num_for_list(sorted(sval.itervalues()), unwrap=False)
sval.append(next_num) sval[bid] = next_num
return next_num return next_num
smap = {bid:next_series_num(i) for i, bid in enumerate(self.ids)} smap = {bid:next_series_num(bid, i) for i, bid in enumerate(self.ids)}
if args.do_autonumber: if args.do_autonumber:
cache.set_field('series_index', smap) cache.set_field('series_index', smap)
elif tweaks['series_index_auto_increment'] != 'no_change': elif tweaks['series_index_auto_increment'] != 'no_change':