#7964: Allow setting the series index in bulk metadata search&replace

This commit is contained in:
Charles Haley 2010-12-20 20:05:59 +00:00
parent 0e0f992934
commit 3d3bc6e8d7
5 changed files with 26 additions and 11 deletions

View File

@ -587,8 +587,6 @@ class BulkSeries(BulkBase):
else: else:
s_index = self.db.get_custom_extra(book_id, num=self.col_id, s_index = self.db.get_custom_extra(book_id, num=self.col_id,
index_is_id=True) index_is_id=True)
if s_index is None:
s_index = 1.0
extras.append(s_index) extras.append(s_index)
self.db.set_custom_bulk(book_ids, val, extras=extras, self.db.set_custom_bulk(book_ids, val, extras=extras,
num=self.col_id, notify=notify) num=self.col_id, notify=notify)

View File

@ -375,7 +375,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
else: else:
val = mi.get(field, None) val = mi.get(field, None)
if val is None: if val is None:
val = [] val = ['']
elif not fm['is_multiple']: elif not fm['is_multiple']:
val = [val] val = [val]
elif field == 'authors': elif field == 'authors':
@ -547,11 +547,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
if not dest: if not dest:
dest = source dest = source
dfm = self.db.field_metadata[dest] dfm = self.db.field_metadata[dest]
mi = self.db.get_metadata(id, index_is_id=True,) mi = self.db.get_metadata(id, index_is_id=True,)
val = mi.get(source)
if val is None:
return
val = self.s_r_do_regexp(mi) val = self.s_r_do_regexp(mi)
val = self.s_r_do_destination(mi, val) val = self.s_r_do_destination(mi, val)
if dfm['is_multiple']: if dfm['is_multiple']:

View File

@ -725,9 +725,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, s_index = parse_series_string(self.db, label, value.toString()) val = unicode(value.toString()).strip()
if not val:
val = s_index = None
elif typ == 'composite': elif typ == 'composite':
tmpl = unicode(value.toString()).strip() tmpl = unicode(value.toString()).strip()
disp = cc['display'] disp = cc['display']

View File

@ -445,6 +445,9 @@ class CustomColumns(object):
index_is_id=True) index_is_id=True)
val = self.custom_data_adapters[data['datatype']](val, data) val = self.custom_data_adapters[data['datatype']](val, data)
if data['datatype'] == 'series' and extra is None:
(val, extra) = self._get_series_values(val)
if data['normalized']: if data['normalized']:
if data['datatype'] == 'enumeration' and ( if data['datatype'] == 'enumeration' and (
val and val not in data['display']['enum_values']): val and val not in data['display']['enum_values']):

View File

@ -2133,9 +2133,27 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
self.conn.execute('DELETE FROM tags WHERE id=?', (id,)) self.conn.execute('DELETE FROM tags WHERE id=?', (id,))
self.conn.commit() self.conn.commit()
series_index_pat = re.compile(r'(.*)\[([.0-9]+)\]')
def _get_series_values(self, val):
if not val:
return (val, None)
match = self.series_index_pat.match(val)
if match is not None:
idx = match.group(2)
try:
idx = float(idx)
return (match.group(1).strip(), idx)
except:
pass
return (val, None)
def set_series(self, id, series, notify=True, commit=True): def set_series(self, id, series, notify=True, commit=True):
self.conn.execute('DELETE FROM books_series_link WHERE book=?',(id,)) self.conn.execute('DELETE FROM books_series_link WHERE book=?',(id,))
self.conn.execute('DELETE FROM series WHERE (SELECT COUNT(id) FROM books_series_link WHERE series=series.id) < 1') self.conn.execute('''DELETE FROM series
WHERE (SELECT COUNT(id) FROM books_series_link
WHERE series=series.id) < 1''')
(series, idx) = self._get_series_values(series)
if series: if series:
if not isinstance(series, unicode): if not isinstance(series, unicode):
series = series.decode(preferred_encoding, 'replace') series = series.decode(preferred_encoding, 'replace')
@ -2147,6 +2165,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
else: else:
aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid
self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid)) self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid))
if idx:
self.set_series_index(id, idx, notify=notify, commit=commit)
self.dirtied([id], commit=False) self.dirtied([id], commit=False)
if commit: if commit:
self.conn.commit() self.conn.commit()