From 3d3bc6e8d7ecfe9ec531a08c5b25938f8bd96696 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Dec 2010 20:05:59 +0000 Subject: [PATCH] #7964: Allow setting the series index in bulk metadata search&replace --- src/calibre/gui2/custom_column_widgets.py | 2 -- src/calibre/gui2/dialogs/metadata_bulk.py | 6 +----- src/calibre/gui2/library/models.py | 4 +--- src/calibre/library/custom_columns.py | 3 +++ src/calibre/library/database2.py | 22 +++++++++++++++++++++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 6e4fc0a0ac..ca9243e51e 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -587,8 +587,6 @@ class BulkSeries(BulkBase): else: s_index = self.db.get_custom_extra(book_id, num=self.col_id, index_is_id=True) - if s_index is None: - s_index = 1.0 extras.append(s_index) self.db.set_custom_bulk(book_ids, val, extras=extras, num=self.col_id, notify=notify) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index e0f1f83c73..976a753254 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -375,7 +375,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): else: val = mi.get(field, None) if val is None: - val = [] + val = [''] elif not fm['is_multiple']: val = [val] elif field == 'authors': @@ -547,11 +547,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): if not dest: dest = source dfm = self.db.field_metadata[dest] - 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_destination(mi, val) if dfm['is_multiple']: diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 661f21e53d..0d70fbc610 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -725,9 +725,7 @@ class BooksModel(QAbstractTableModel): # {{{ return False val = qt_to_dt(val, as_utc=False) elif typ == 'series': - val, s_index = parse_series_string(self.db, label, value.toString()) - if not val: - val = s_index = None + val = unicode(value.toString()).strip() elif typ == 'composite': tmpl = unicode(value.toString()).strip() disp = cc['display'] diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index e95ace2cd4..07ea407460 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -445,6 +445,9 @@ class CustomColumns(object): index_is_id=True) 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['datatype'] == 'enumeration' and ( val and val not in data['display']['enum_values']): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index cba49ae6ae..eb72c1b407 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -2133,9 +2133,27 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.conn.execute('DELETE FROM tags WHERE id=?', (id,)) 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): 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 not isinstance(series, unicode): series = series.decode(preferred_encoding, 'replace') @@ -2147,6 +2165,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): else: aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid 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) if commit: self.conn.commit()