From ec4bd6d1b30cdbd6805a153c70265a78dd957a9b Mon Sep 17 00:00:00 2001 From: GRiker Date: Tue, 26 Apr 2011 06:06:08 -0600 Subject: [PATCH 01/14] GwR patch for artist name split/windows --- src/calibre/devices/apple/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index d7811f0a22..b11a3f298c 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -460,7 +460,7 @@ class ITUNES(DriverBase): cached_books[this_book.path] = { 'title':book.Name, - 'author':book.artist().split(' & '), + 'author':book.Artist.split(' & '), 'lib_book':library_books[this_book.path] if this_book.path in library_books else None, 'uuid': book.Composer, 'format': 'pdf' if book.KindAsString.startswith('PDF') else 'epub' From e765da76f61b7afe39f74ea4b2da9a489603f6a9 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 26 Apr 2011 15:06:30 +0100 Subject: [PATCH 02/14] Fix 'count-of' searches (e.g., tags:#>3). Add a small blurb to the manual. --- src/calibre/library/caches.py | 4 +--- src/calibre/manual/gui.rst | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index ca256e0350..543c6eab96 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -406,11 +406,9 @@ class ResultCache(SearchQueryParser): # {{{ if val_func is None: loc = self.field_metadata[location]['rec_index'] val_func = lambda item, loc=loc: item[loc] - dt = self.field_metadata[location]['datatype'] - q = '' - val_func = lambda item, loc=loc: item[loc] cast = adjust = lambda x: x + dt = self.field_metadata[location]['datatype'] if query == 'false': if dt == 'rating' or location == 'cover': diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index 7b6e60c93a..a4e18c2e07 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -365,6 +365,8 @@ Dates and numeric fields support the relational operators ``=`` (equals), ``>`` Rating fields are considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 or higher. +You can search for the number of items in multiple-valued fields such as tags). These searches begin with the character ``#``, then use the same syntax as numeric fields. For example, to find all books with more than 4 tags, use ``tags:#>4``. To find all books with exactly 10 tags, use ``tags:#=10``. + Series indices are searchable. For the standard series, the search name is 'series_index'. For custom series columns, use the column search name followed by _index. For example, to search the indices for a custom series column named ``#my_series``, you would use the search name ``#my_series_index``. From e3de77792edf1479cb1e1ed3ccc595a547f49a85 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 09:07:16 -0600 Subject: [PATCH 03/14] ... --- src/calibre/ebooks/pdb/plucker/reader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/ebooks/pdb/plucker/reader.py b/src/calibre/ebooks/pdb/plucker/reader.py index 39ceb33b13..d782e4e97c 100644 --- a/src/calibre/ebooks/pdb/plucker/reader.py +++ b/src/calibre/ebooks/pdb/plucker/reader.py @@ -16,6 +16,7 @@ from calibre import CurrentDir from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ptempfile import TemporaryFile from calibre.utils.magick import Image, create_canvas +from calibre.ebooks.compression.palmdoc import decompress_doc DATATYPE_PHTML = 0 DATATYPE_PHTML_COMPRESSED = 1 From 15bc2500d16c8cae18015f755b6703dfbef2df51 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 10:34:28 -0600 Subject: [PATCH 04/14] Add a column that shows the date when the metadata of a book record was alst modified in calibre. To see the column, right click on the column headers in calibre and select Show column->Modified --- resources/default_tweaks.py | 1 + src/calibre/gui2/library/delegates.py | 13 ++++++++++--- src/calibre/gui2/library/models.py | 3 +++ src/calibre/gui2/library/views.py | 18 +++++++++++++++--- .../gui2/preferences/create_custom_column.py | 6 ++---- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 08017b5c98..e91b4a62d5 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -118,6 +118,7 @@ sort_columns_at_startup = None # timestamp default if not set: dd MMM yyyy gui_pubdate_display_format = 'MMM yyyy' gui_timestamp_display_format = 'dd MMM yyyy' +gui_last_modified_display_format = 'dd MMM yyyy' #: Control sorting of titles and series in the library display # Control title and series sorting in the library view. If set to diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index ac8568af07..e2234f6df5 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -97,18 +97,25 @@ class RatingDelegate(QStyledItemDelegate): # {{{ class DateDelegate(QStyledItemDelegate): # {{{ + def __init__(self, parent, tweak_name='gui_timestamp_display_format', + default_format='dd MMM yyyy', editor_format='dd MMM yyyy'): + QStyledItemDelegate.__init__(self, parent) + self.tweak_name = tweak_name + self.default_format = default_format + self.editor_format = editor_format + def displayText(self, val, locale): d = val.toDate() if d <= UNDEFINED_QDATE: return '' - format = tweaks['gui_timestamp_display_format'] + format = tweaks[self.tweak_name] if format is None: - format = 'dd MMM yyyy' + format = self.default_format return format_date(d.toPyDate(), format) def createEditor(self, parent, option, index): qde = QStyledItemDelegate.createEditor(self, parent, option, index) - qde.setDisplayFormat('dd MMM yyyy') + qde.setDisplayFormat(self.editor_format) qde.setMinimumDate(UNDEFINED_QDATE) qde.setSpecialValueText(_('Undefined')) qde.setCalendarPopup(True) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 8b830d2ec2..dd5082c27f 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -70,6 +70,7 @@ class BooksModel(QAbstractTableModel): # {{{ 'publisher' : _("Publisher"), 'tags' : _("Tags"), 'series' : _("Series"), + 'last_modified' : _('Modified'), } def __init__(self, parent=None, buffer=40): @@ -620,6 +621,8 @@ class BooksModel(QAbstractTableModel): # {{{ idx=self.db.field_metadata['timestamp']['rec_index']), 'pubdate' : functools.partial(datetime_type, idx=self.db.field_metadata['pubdate']['rec_index']), + 'last_modified': functools.partial(datetime_type, + idx=self.db.field_metadata['last_modified']['rec_index']), 'rating' : functools.partial(rating_type, idx=self.db.field_metadata['rating']['rec_index']), 'publisher': functools.partial(text_type, diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 921e62d4c3..26f6788a75 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -76,6 +76,8 @@ class BooksView(QTableView): # {{{ self.rating_delegate = RatingDelegate(self) self.timestamp_delegate = DateDelegate(self) self.pubdate_delegate = PubDateDelegate(self) + self.last_modified_delegate = DateDelegate(self, + tweak_name='gui_last_modified_display_format') self.tags_delegate = CompleteDelegate(self, ',', 'all_tags') self.authors_delegate = CompleteDelegate(self, '&', 'all_author_names', True) self.cc_names_delegate = CompleteDelegate(self, '&', 'all_custom', True) @@ -296,6 +298,7 @@ class BooksView(QTableView): # {{{ state = {} state['hidden_columns'] = [cm[i] for i in range(h.count()) if h.isSectionHidden(i) and cm[i] != 'ondevice'] + state['last_modified_injected'] = True state['sort_history'] = \ self.cleanup_sort_history(self.model().sort_history) state['column_positions'] = {} @@ -380,7 +383,7 @@ class BooksView(QTableView): # {{{ def get_default_state(self): old_state = { - 'hidden_columns': [], + 'hidden_columns': ['last_modified'], 'sort_history':[DEFAULT_SORT], 'column_positions': {}, 'column_sizes': {}, @@ -388,6 +391,7 @@ class BooksView(QTableView): # {{{ 'size':'center', 'timestamp':'center', 'pubdate':'center'}, + 'last_modified_injected': True, } h = self.column_header cm = self.column_map @@ -398,7 +402,7 @@ class BooksView(QTableView): # {{{ old_state['column_sizes'][name] = \ min(350, max(self.sizeHintForColumn(i), h.sectionSizeHint(i))) - if name == 'timestamp': + if name in ('timestamp', 'last_modified'): old_state['column_sizes'][name] += 12 return old_state @@ -418,6 +422,13 @@ class BooksView(QTableView): # {{{ pass if ans is not None: db.prefs[name] = ans + else: + if not ans.get('last_modified_injected', False): + ans['last_modified_injected'] = True + hc = ans.get('hidden_columns', []) + if 'last_modified' not in hc: + hc.append('last_modified') + db.prefs[name] = ans return ans @@ -459,7 +470,8 @@ class BooksView(QTableView): # {{{ def database_changed(self, db): for i in range(self.model().columnCount(None)): if self.itemDelegateForColumn(i) in (self.rating_delegate, - self.timestamp_delegate, self.pubdate_delegate): + self.timestamp_delegate, self.pubdate_delegate, + self.last_modified_delegate): self.setItemDelegateForColumn(i, self.itemDelegate()) cm = self.column_map diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 433f8fd222..7b891b782c 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -63,7 +63,7 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): self.shortcuts.linkActivated.connect(self.shortcut_activated) text = '

'+_('Quick create:') for col, name in [('isbn', _('ISBN')), ('formats', _('Formats')), - ('last_modified', _('Modified Date')), ('yesno', _('Yes/No')), + ('yesno', _('Yes/No')), ('tags', _('Tags')), ('series', _('Series')), ('rating', _('Rating')), ('people', _("People's names"))]: text += ' %s,'%(col, name) @@ -150,7 +150,6 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'tags': _('My Tags'), 'series': _('My Series'), 'rating': _('My Rating'), - 'last_modified':_('Modified Date'), 'people': _('People')}[which]) self.is_names.setChecked(which == 'people') if self.composite_box.isVisible(): @@ -158,9 +157,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): { 'isbn': '{identifiers:select(isbn)}', 'formats': '{formats}', - 'last_modified':'''{last_modified:'format_date($, "dd MMM yyyy")'}''' }[which]) - self.composite_sort_by.setCurrentIndex(2 if which == 'last_modified' else 0) + self.composite_sort_by.setCurrentIndex(0) def datatype_changed(self, *args): try: From f11ab2f63d6c4f0e17afde49b598dd2cff56d149 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 10:58:49 -0600 Subject: [PATCH 05/14] ... --- recipes/le_monde.recipe | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/le_monde.recipe b/recipes/le_monde.recipe index 3c47d81ee1..cf1f858dfe 100644 --- a/recipes/le_monde.recipe +++ b/recipes/le_monde.recipe @@ -48,7 +48,7 @@ class LeMonde(BasicNewsRecipe): if alink.string is not None: tstr = alink.string alink.replaceWith(tstr) - return soup + return self.adeify_images(soup) preprocess_regexps = [ (re.compile(r'([0-9])%'), lambda m: m.group(1) + ' %'), From 4eba1acad2c9b1064e409ff7905e157a12f81696 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 12:03:16 -0600 Subject: [PATCH 06/14] Allow use of {last_modified} in save to disk templates --- src/calibre/ebooks/metadata/worker.py | 2 +- src/calibre/library/save_to_disk.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index d059d7e34c..c335cc4c13 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -222,7 +222,7 @@ class SaveWorker(Thread): if isbytestring(fpath): fpath = fpath.decode(filesystem_encoding) formats[fmt.lower()] = fpath - data[i] = [opf, cpath, formats] + data[i] = [opf, cpath, formats, mi.last_modified.isoformat()] return data def run(self): diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index f7f5559412..709e3645a6 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -17,6 +17,7 @@ from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.constants import preferred_encoding from calibre.ebooks.metadata import fmt_sidx from calibre.ebooks.metadata import title_sort +from calibre.utils.date import parse_date from calibre import strftime, prints, sanitize_file_name_unicode plugboard_any_device_value = 'any device' @@ -42,6 +43,8 @@ FORMAT_ARG_DESCS = dict( publisher=_('The publisher'), timestamp=_('The date'), pubdate=_('The published date'), + last_modified=_('The date when the metadata for this book record' + ' was last modified'), id=_('The calibre internal id') ) @@ -191,6 +194,9 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['timestamp'] = strftime(timefmt, mi.timestamp.timetuple()) if hasattr(mi.pubdate, 'timetuple'): format_args['pubdate'] = strftime(timefmt, mi.pubdate.timetuple()) + if hasattr(mi, 'last_modified') and hasattr(mi.last_modified, 'timetuple'): + format_args['last_modified'] = strftime(timefmt, mi.last_modified.timetuple()) + format_args['id'] = str(id) # Now format the custom fields custom_metadata = mi.get_all_user_metadata(make_copy=False) @@ -373,10 +379,14 @@ def save_serialized_to_disk(ids, data, plugboards, root, opts, callback): root, opts, length = _sanitize_args(root, opts) failures = [] for x in ids: - opf, cover, format_map = data[x] + opf, cover, format_map, last_modified = data[x] if isinstance(opf, unicode): opf = opf.encode('utf-8') mi = OPF(cStringIO.StringIO(opf)).to_book_metadata() + try: + mi.last_modified = parse_date(last_modified) + except: + pass tb = '' try: failed, id, title = do_save_book_to_disk(x, mi, cover, plugboards, From 688c1a3f64b79f0de28839a16b70dcd8b1eff529 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 26 Apr 2011 19:11:30 +0100 Subject: [PATCH 07/14] Make field_metadata put last_modified format tweak into the display dict so the template formatter will see it. --- src/calibre/library/field_metadata.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 0ae4d74242..979e98a819 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -368,7 +368,8 @@ class FieldMetadata(dict): 'date_format': tweaks['gui_timestamp_display_format']} self._tb_cats['pubdate']['display'] = { 'date_format': tweaks['gui_pubdate_display_format']} - self._tb_cats['last_modified']['display'] = {'date_format': 'iso'} + self._tb_cats['last_modified']['display'] = { + 'date_format': tweaks['gui_last_modified_display_format']} self.custom_field_prefix = '#' self.get = self._tb_cats.get From e8592b2f9037386385c4b87b6bb55e7fd56d8a6e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 26 Apr 2011 19:41:56 +0100 Subject: [PATCH 08/14] Make the new author_sort -> author try to split the author_sort into its individual authors, then handle them one by one. --- src/calibre/gui2/metadata/basic_widgets.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index f7872b94b9..35d50c3d66 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -280,11 +280,16 @@ class AuthorSortEdit(EnLineEdit): aus = self.current_val meth = tweaks['author_sort_copy_method'] if aus: - ln, _, rest = aus.partition(',') - if rest: - if meth in ('invert', 'nocomma', 'comma'): - aus = rest.strip() + ' ' + ln.strip() - self.authors_edit.current_val = [aus] + ans = [] + for one in [a.strip() for a in aus.split('&')]: + if not one: + continue + ln, _, rest = one.partition(',') + if rest: + if meth in ('invert', 'nocomma', 'comma'): + one = rest.strip() + ' ' + ln.strip() + ans.append(one) + self.authors_edit.current_val = ans def auto_generate(self, *args): au = unicode(self.authors_edit.text()) From 3435831d521b064faf77c33f60c3626e7ded1336 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 14:29:18 -0600 Subject: [PATCH 09/14] Fix new edit metadata dialog not automatically fixing isbns --- src/calibre/gui2/metadata/basic_widgets.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 35d50c3d66..86d2a3544f 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -943,6 +943,10 @@ class IdentifiersEdit(QLineEdit): # {{{ for x in parts: c = x.split(':') if len(c) == 2: + if c[0] == 'isbn': + v = check_isbn(c[1]) + if v is not None: + c[1] = v ans[c[0]] = c[1] return ans def fset(self, val): From 2ac771e1dc004e2e3d5e0159974ba2141b7dfe39 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 14:32:30 -0600 Subject: [PATCH 10/14] ... --- src/calibre/gui2/metadata/basic_widgets.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 86d2a3544f..6b10448c50 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -957,6 +957,11 @@ class IdentifiersEdit(QLineEdit): # {{{ if x == 'isbn': x = '00isbn' return x + for k in list(val): + if k == 'isbn': + v = check_isbn(k) + if v is not None: + val[k] = v ids = sorted(val.iteritems(), key=keygen) txt = ', '.join(['%s:%s'%(k, v) for k, v in ids]) self.setText(txt.strip()) @@ -964,8 +969,8 @@ class IdentifiersEdit(QLineEdit): # {{{ return property(fget=fget, fset=fset) def initialize(self, db, id_): - self.current_val = db.get_identifiers(id_, index_is_id=True) - self.original_val = self.current_val + self.original_val = db.get_identifiers(id_, index_is_id=True) + self.current_val = self.original_val def commit(self, db, id_): if self.original_val != self.current_val: From 7f133692efacb83c866fb9fe5858e833a2763d9e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 19:43:16 -0600 Subject: [PATCH 11/14] Only set language in MOBI metadata is it is not null --- src/calibre/ebooks/metadata/mobi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index 15fdceff15..74db3b3a58 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -400,7 +400,8 @@ class MetadataUpdater(object): if getattr(self, 'exth', None) is None: raise MobiError('No existing EXTH record. Cannot update metadata.') - self.record0[92:96] = iana2mobi(mi.language) + if not mi.is_null('language'): + self.record0[92:96] = iana2mobi(mi.language) self.create_exth(exth=exth, new_title=mi.title) # Fetch updated timestamp, cover_record, thumbnail_record From ff3c857c80a2061734d7ed49d98c3ac715b47e49 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 21:53:08 -0600 Subject: [PATCH 12/14] ... --- src/calibre/gui2/book_details.py | 5 +++-- src/calibre/gui2/metadata/basic_widgets.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 80d3c1636e..f94e179166 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -118,8 +118,9 @@ def render_data(mi, use_roman_numbers=True, all_fields=False): links = [u'%s' % (url, id_typ, id_val, name) for name, id_typ, id_val, url in urls] links = u', '.join(links) - ans.append((field, u'%s%s'%( - _('Ids')+':', links))) + if links: + ans.append((field, u'%s%s'%( + _('Ids')+':', links))) else: val = mi.format_field(field)[-1] if val is None: diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 6b10448c50..1620734209 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -942,7 +942,7 @@ class IdentifiersEdit(QLineEdit): # {{{ ans = {} for x in parts: c = x.split(':') - if len(c) == 2: + if len(c) > 1: if c[0] == 'isbn': v = check_isbn(c[1]) if v is not None: From e60506d355a497c6ff5fe9d380ed5085d2a5ffce Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 22:41:01 -0600 Subject: [PATCH 13/14] Fix bug in applying changes to the downloaded fields in the metadata sources preferences --- src/calibre/gui2/preferences/metadata_sources.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index 4a6c7cfc06..f487051d07 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -209,8 +209,11 @@ class FieldsModel(QAbstractListModel): # {{{ return ret def commit(self): - val = [k for k, v in self.overrides.iteritems() if v == Qt.Unchecked] - msprefs['ignore_fields'] = val + ignored_fields = set([x for x in msprefs['ignore_fields'] if x not in + self.overrides]) + changed = set([k for k, v in self.overrides.iteritems() if v == + Qt.Unchecked]) + msprefs['ignore_fields'] = list(ignored_fields.union(changed)) # }}} From 78f33e3d3592b7a8a24347b93ba6db0e587080f1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Apr 2011 22:43:44 -0600 Subject: [PATCH 14/14] ... --- src/calibre/gui2/metadata/config.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/metadata/config.py b/src/calibre/gui2/metadata/config.py index abb45faa46..cb51324ae0 100644 --- a/src/calibre/gui2/metadata/config.py +++ b/src/calibre/gui2/metadata/config.py @@ -41,8 +41,11 @@ class FieldsModel(FM): # {{{ self.reset() def commit(self): - val = [k for k, v in self.overrides.iteritems() if v == Qt.Unchecked] - self.prefs['ignore_fields'] = val + ignored_fields = set([x for x in self.prefs['ignore_fields'] if x not in + self.overrides]) + changed = set([k for k, v in self.overrides.iteritems() if v == + Qt.Unchecked]) + self.prefs['ignore_fields'] = list(ignored_fields.union(changed)) # }}}