From 034e289ef397a76e5062864e700cc4ac7983cfa3 Mon Sep 17 00:00:00 2001
From: Charles Haley <>
Date: Fri, 24 Jun 2011 17:57:25 +0100
Subject: [PATCH 1/3] Author link first try
---
src/calibre/ebooks/metadata/book/__init__.py | 2 ++
src/calibre/ebooks/metadata/book/base.py | 1 +
src/calibre/ebooks/metadata/opf2.py | 7 +++--
src/calibre/gui2/book_details.py | 10 +++++++
.../gui2/dialogs/edit_authors_dialog.py | 22 +++++++++-----
src/calibre/gui2/library/models.py | 8 ++++-
src/calibre/gui2/tag_view.py | 4 ++-
src/calibre/library/database2.py | 30 +++++++++++++------
src/calibre/library/schema_upgrades.py | 10 +++++++
src/calibre/library/sqlite.py | 6 ++--
10 files changed, 77 insertions(+), 23 deletions(-)
diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py
index fae858aabd..50e7b916ee 100644
--- a/src/calibre/ebooks/metadata/book/__init__.py
+++ b/src/calibre/ebooks/metadata/book/__init__.py
@@ -86,6 +86,8 @@ CALIBRE_METADATA_FIELDS = frozenset([
# a dict of user category names, where the value is a list of item names
# from the book that are in that category
'user_categories',
+ # a dict of author to an associated hyperlink
+ 'author_link_map',
]
)
diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py
index 382cb6c5a2..c28c65f7c9 100644
--- a/src/calibre/ebooks/metadata/book/base.py
+++ b/src/calibre/ebooks/metadata/book/base.py
@@ -34,6 +34,7 @@ NULL_VALUES = {
'authors' : [_('Unknown')],
'title' : _('Unknown'),
'user_categories' : {},
+ 'author_link_map' : {},
'language' : 'und'
}
diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py
index 80fb84633b..c1cd2a739f 100644
--- a/src/calibre/ebooks/metadata/opf2.py
+++ b/src/calibre/ebooks/metadata/opf2.py
@@ -538,7 +538,8 @@ class OPF(object): # {{{
user_categories = MetadataField('user_categories', is_dc=False,
formatter=json.loads,
renderer=dump_user_categories)
-
+ author_link_map = MetadataField('author_link_map', is_dc=False,
+ formatter=json.loads)
def __init__(self, stream, basedir=os.getcwdu(), unquote_urls=True,
populate_spine=True):
@@ -1039,7 +1040,7 @@ class OPF(object): # {{{
for attr in ('title', 'authors', 'author_sort', 'title_sort',
'publisher', 'series', 'series_index', 'rating',
'isbn', 'tags', 'category', 'comments',
- 'pubdate', 'user_categories'):
+ 'pubdate', 'user_categories', 'author_link_map'):
val = getattr(mi, attr, None)
if val is not None and val != [] and val != (None, None):
setattr(self, attr, val)
@@ -1336,6 +1337,8 @@ def metadata_to_opf(mi, as_string=True):
for tag in mi.tags:
factory(DC('subject'), tag)
meta = lambda n, c: factory('meta', name='calibre:'+n, content=c)
+ if getattr(mi, 'author_link_map', None) is not None:
+ meta('author_link_map', json.dumps(mi.author_link_map))
if mi.series:
meta('series', mi.series)
if mi.series_index is not None:
diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py
index f94e179166..ef21773ae4 100644
--- a/src/calibre/gui2/book_details.py
+++ b/src/calibre/gui2/book_details.py
@@ -121,6 +121,16 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
if links:
ans.append((field, u'
%s | %s | '%(
_('Ids')+':', links)))
+ elif field == 'authors' and not isdevice:
+ authors = []
+ for aut in mi.authors:
+ if mi.author_link_map[aut]:
+ authors.append(u'%s' %
+ (mi.author_link_map[aut], aut))
+ else:
+ authors.append(aut)
+ ans.append((field, u'%s | %s | '%(name,
+ u' & '.join(authors))))
else:
val = mi.format_field(field)[-1]
if val is None:
diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py
index a791551d27..1087c3cb82 100644
--- a/src/calibre/gui2/dialogs/edit_authors_dialog.py
+++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py
@@ -33,7 +33,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
# Set up the column headings
self.table.setSelectionMode(QAbstractItemView.SingleSelection)
- self.table.setColumnCount(2)
+ self.table.setColumnCount(3)
self.down_arrow_icon = QIcon(I('arrow-down.png'))
self.up_arrow_icon = QIcon(I('arrow-up.png'))
self.blank_icon = QIcon(I('blank.png'))
@@ -43,26 +43,33 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
self.aus_col = QTableWidgetItem(_('Author sort'))
self.table.setHorizontalHeaderItem(1, self.aus_col)
self.aus_col.setIcon(self.up_arrow_icon)
+ self.aul_col = QTableWidgetItem(_('Link'))
+ self.table.setHorizontalHeaderItem(2, self.aul_col)
+ self.aus_col.setIcon(self.blank_icon)
# Add the data
self.authors = {}
auts = db.get_authors_with_ids()
self.table.setRowCount(len(auts))
select_item = None
- for row, (id, author, sort) in enumerate(auts):
+ for row, (id, author, sort, link) in enumerate(auts):
author = author.replace('|', ',')
- self.authors[id] = (author, sort)
+ self.authors[id] = (author, sort, link)
aut = tableItem(author)
aut.setData(Qt.UserRole, id)
sort = tableItem(sort)
+ link = tableItem(link)
self.table.setItem(row, 0, aut)
self.table.setItem(row, 1, sort)
+ self.table.setItem(row, 2, link)
if id == id_to_select:
if select_sort:
select_item = sort
else:
select_item = aut
self.table.resizeColumnsToContents()
+ if self.table.columnWidth(2) < 200:
+ self.table.setColumnWidth(2, 200)
# set up the cellChanged signal only after the table is filled
self.table.cellChanged.connect(self.cell_changed)
@@ -236,9 +243,10 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
id = self.table.item(row, 0).data(Qt.UserRole).toInt()[0]
aut = unicode(self.table.item(row, 0).text()).strip()
sort = unicode(self.table.item(row, 1).text()).strip()
- orig_aut,orig_sort = self.authors[id]
- if orig_aut != aut or orig_sort != sort:
- self.result.append((id, orig_aut, aut, sort))
+ link = unicode(self.table.item(row, 2).text()).strip()
+ orig_aut,orig_sort,orig_link = self.authors[id]
+ if orig_aut != aut or orig_sort != sort or orig_link != link:
+ self.result.append((id, orig_aut, aut, sort, link))
def do_recalc_author_sort(self):
self.table.cellChanged.disconnect()
@@ -276,6 +284,6 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
c.setText(author_to_author_sort(aut))
item = c
else:
- item = self.table.item(row, 1)
+ item = self.table.item(row, col)
self.table.setCurrentItem(item)
self.table.scrollToItem(item)
diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py
index 40d6e2b6cf..d4aeada313 100644
--- a/src/calibre/gui2/library/models.py
+++ b/src/calibre/gui2/library/models.py
@@ -90,6 +90,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.ids_to_highlight_set = set()
self.current_highlighted_idx = None
self.highlight_only = False
+ self.current_row = -1
self.colors = frozenset([unicode(c) for c in QColor.colorNames()])
self.read_config()
@@ -172,6 +173,7 @@ class BooksModel(QAbstractTableModel): # {{{
self.color_cache = defaultdict(dict)
for row in rows:
if row == current_row:
+ self.current_row = row
self.new_bookdisplay_data.emit(
self.get_book_display_info(row))
self.dataChanged.emit(self.index(row, 0), self.index(row,
@@ -329,6 +331,8 @@ class BooksModel(QAbstractTableModel): # {{{
def refresh(self, reset=True):
self.db.refresh(field=None)
self.resort(reset=reset)
+ if self.current_row >= 0:
+ self.new_bookdisplay_data.emit(self.get_book_display_info(self.current_row))
def reset(self):
self.color_cache = defaultdict(dict)
@@ -368,12 +372,14 @@ class BooksModel(QAbstractTableModel): # {{{
def current_changed(self, current, previous, emit_signal=True):
if current.isValid():
- idx = current.row()
+ self.current_row = idx = current.row()
data = self.get_book_display_info(idx)
if emit_signal:
self.new_bookdisplay_data.emit(data)
else:
return data
+ else:
+ self.current_row = -1
def get_book_info(self, index):
if isinstance(index, int):
diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py
index 3b8c27866c..21309a1592 100644
--- a/src/calibre/gui2/tag_view.py
+++ b/src/calibre/gui2/tag_view.py
@@ -2081,12 +2081,14 @@ class TagBrowserMixin(object): # {{{
editor = EditAuthorsDialog(parent, db, id, select_sort)
d = editor.exec_()
if d:
- for (id, old_author, new_author, new_sort) in editor.result:
+ for (id, old_author, new_author, new_sort, new_link) in editor.result:
if old_author != new_author:
# The id might change if the new author already exists
id = db.rename_author(id, new_author)
db.set_sort_field_for_author(id, unicode(new_sort),
commit=False, notify=False)
+ db.set_link_field_for_author(id, unicode(new_link),
+ commit=False, notify=False)
db.commit()
self.library_view.model().refresh()
self.tags_view.recount()
diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py
index 4c61438e35..9602f8ef1d 100644
--- a/src/calibre/library/database2.py
+++ b/src/calibre/library/database2.py
@@ -367,7 +367,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
'uuid',
'has_cover',
('au_map', 'authors', 'author',
- 'aum_sortconcat(link.id, authors.name, authors.sort)'),
+ 'aum_sortconcat(link.id, authors.name, authors.sort, authors.link)'),
'last_modified',
'(SELECT identifiers_concat(type, val) FROM identifiers WHERE identifiers.book=books.id) identifiers',
]
@@ -894,13 +894,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
aut_list = []
aum = []
aus = {}
- for (author, author_sort) in aut_list:
- aum.append(author.replace('|', ','))
- aus[author] = author_sort.replace('|', ',')
+ aul = {}
+ for (author, author_sort, link) in aut_list:
+ aut = author.replace('|', ',')
+ aum.append(aut)
+ aus[aut] = author_sort.replace('|', ',')
+ aul[aut] = link
mi.title = row[fm['title']]
mi.authors = aum
mi.author_sort = row[fm['author_sort']]
mi.author_sort_map = aus
+ mi.author_link_map = aul
mi.comments = row[fm['comments']]
mi.publisher = row[fm['publisher']]
mi.timestamp = row[fm['timestamp']]
@@ -2002,13 +2006,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
def authors_with_sort_strings(self, id, index_is_id=False):
id = id if index_is_id else self.id(id)
aut_strings = self.conn.get('''
- SELECT authors.id, authors.name, authors.sort
+ SELECT authors.id, authors.name, authors.sort, authors.link
FROM authors, books_authors_link as bl
WHERE bl.book=? and authors.id=bl.author
ORDER BY bl.id''', (id,))
result = []
- for (id_, author, sort,) in aut_strings:
- result.append((id_, author.replace('|', ','), sort))
+ for (id_, author, sort, link) in aut_strings:
+ result.append((id_, author.replace('|', ','), sort, link))
return result
# Given a book, return the author_sort string for authors of the book
@@ -2048,7 +2052,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
aum = self.authors_with_sort_strings(id_, index_is_id=True)
self.data.set(id_, self.FIELD_MAP['au_map'],
- ':#:'.join([':::'.join((au.replace(',', '|'), aus)) for (_, au, aus) in aum]),
+ ':#:'.join([':::'.join((au.replace(',', '|'), aus, aul))
+ for (_, au, aus, aul) in aum]),
row_is_id=True)
def _set_authors(self, id, authors, allow_case_change=False):
@@ -2399,7 +2404,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
self.conn.commit()
def get_authors_with_ids(self):
- result = self.conn.get('SELECT id,name,sort FROM authors')
+ result = self.conn.get('SELECT id,name,sort,link FROM authors')
if not result:
return []
return result
@@ -2410,6 +2415,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
(author,), all=False)
return result
+ def set_link_field_for_author(self, aid, link, commit=True, notify=False):
+ if not link:
+ link = ''
+ self.conn.execute('UPDATE authors SET link=? WHERE id=?', (link.strip(), aid))
+ if commit:
+ self.conn.commit()
+
def set_sort_field_for_author(self, old_id, new_sort, commit=True, notify=False):
self.conn.execute('UPDATE authors SET sort=? WHERE id=?', \
(new_sort.strip(), old_id))
diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py
index 3fc9a2368a..3c64785178 100644
--- a/src/calibre/library/schema_upgrades.py
+++ b/src/calibre/library/schema_upgrades.py
@@ -600,4 +600,14 @@ class SchemaUpgrade(object):
with open(os.path.join(bdir, fname), 'wb') as f:
f.write(script)
+ def upgrade_version_20(self):
+ '''
+ Add a link column to the authors table.
+ '''
+
+ script = '''
+ ALTER TABLE authors ADD COLUMN link TEXT NON NULL DEFAULT "";
+ '''
+ self.conn.executescript(script)
+
diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py
index 96874d2c27..a2a85806f5 100644
--- a/src/calibre/library/sqlite.py
+++ b/src/calibre/library/sqlite.py
@@ -144,9 +144,9 @@ class AumSortedConcatenate(object):
def __init__(self):
self.ans = {}
- def step(self, ndx, author, sort):
+ def step(self, ndx, author, sort, link):
if author is not None:
- self.ans[ndx] = author + ':::' + sort
+ self.ans[ndx] = ':::'.join((author, sort, link))
def finalize(self):
keys = self.ans.keys()
@@ -229,7 +229,7 @@ class DBThread(Thread):
load_c_extensions(self.conn)
self.conn.row_factory = sqlite.Row if self.row_factory else lambda cursor, row : list(row)
self.conn.create_aggregate('concat', 1, Concatenate)
- self.conn.create_aggregate('aum_sortconcat', 3, AumSortedConcatenate)
+ self.conn.create_aggregate('aum_sortconcat', 4, AumSortedConcatenate)
self.conn.create_collation('PYNOCASE', partial(pynocase,
encoding=encoding))
self.conn.create_function('title_sort', 1, title_sort)
From aceb4655f22bf916da388afdaacb25598492072c Mon Sep 17 00:00:00 2001
From: Charles Haley <>
Date: Tue, 28 Jun 2011 19:43:14 +0100
Subject: [PATCH 2/3] Commit to merge from trunk
---
resources/metadata_sqlite.sql | 3 ++-
src/calibre/ebooks/metadata/opf2.py | 11 +++++++--
src/calibre/gui2/__init__.py | 8 +++++++
src/calibre/gui2/book_details.py | 16 +++++++++++--
src/calibre/gui2/dialogs/restore_library.py | 2 +-
src/calibre/gui2/preferences/look_feel.py | 1 +
src/calibre/gui2/preferences/look_feel.ui | 26 +++++++++++++++++++--
src/calibre/gui2/tag_browser/view.py | 2 +-
src/calibre/library/restore.py | 12 ++++++++++
src/calibre/library/schema_upgrades.py | 2 +-
10 files changed, 73 insertions(+), 10 deletions(-)
diff --git a/resources/metadata_sqlite.sql b/resources/metadata_sqlite.sql
index aa29d4b8de..83f55c2762 100644
--- a/resources/metadata_sqlite.sql
+++ b/resources/metadata_sqlite.sql
@@ -1,6 +1,7 @@
CREATE TABLE authors ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
sort TEXT COLLATE NOCASE,
+ link TEXT NOT NULL DEFAULT "",
UNIQUE(name)
);
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -545,4 +546,4 @@ CREATE TRIGGER series_update_trg
BEGIN
UPDATE series SET sort=NEW.name WHERE id=NEW.id;
END;
-pragma user_version=20;
+pragma user_version=21;
diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py
index c1cd2a739f..2ec4ed83ea 100644
--- a/src/calibre/ebooks/metadata/opf2.py
+++ b/src/calibre/ebooks/metadata/opf2.py
@@ -481,6 +481,13 @@ def dump_user_categories(cats):
return json.dumps(object_to_unicode(cats), ensure_ascii=False,
skipkeys=True)
+def dump_author_links(links):
+ if not links:
+ links = {}
+ from calibre.ebooks.metadata.book.json_codec import object_to_unicode
+ return json.dumps(object_to_unicode(links), ensure_ascii=False,
+ skipkeys=True)
+
class OPF(object): # {{{
MIMETYPE = 'application/oebps-package+xml'
@@ -539,7 +546,7 @@ class OPF(object): # {{{
formatter=json.loads,
renderer=dump_user_categories)
author_link_map = MetadataField('author_link_map', is_dc=False,
- formatter=json.loads)
+ formatter=json.loads, renderer=dump_author_links)
def __init__(self, stream, basedir=os.getcwdu(), unquote_urls=True,
populate_spine=True):
@@ -1338,7 +1345,7 @@ def metadata_to_opf(mi, as_string=True):
factory(DC('subject'), tag)
meta = lambda n, c: factory('meta', name='calibre:'+n, content=c)
if getattr(mi, 'author_link_map', None) is not None:
- meta('author_link_map', json.dumps(mi.author_link_map))
+ meta('author_link_map', dump_author_links(mi.author_link_map))
if mi.series:
meta('series', mi.series)
if mi.series_index is not None:
diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py
index 8dbc72ab98..88c5653ee7 100644
--- a/src/calibre/gui2/__init__.py
+++ b/src/calibre/gui2/__init__.py
@@ -181,6 +181,14 @@ def _config(): # {{{
help=_('Show the average rating per item indication in the tag browser'))
c.add_opt('disable_animations', default=False,
help=_('Disable UI animations'))
+ c.add_opt('default_author_link',
+ default='http://en.wikipedia.org/w/index.php?search={author}',
+ help='' +
+ _('Enter a template to be used to create a link for'
+ 'an author in the books information dialog. This template will '
+ 'be used when no link has been provided for the author using '
+ 'Manage Authors. You can use the values {author} and '
+ '{author_sort}, and any template function.') + '
')
# This option is no longer used. It remains for compatibility with upgrades
# so the value can be migrated
diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py
index ef21773ae4..1927b1448e 100644
--- a/src/calibre/gui2/book_details.py
+++ b/src/calibre/gui2/book_details.py
@@ -5,6 +5,7 @@ __license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal '
__docformat__ = 'restructuredtext en'
+import urllib2
from PyQt4.Qt import (QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl,
QPropertyAnimation, QEasingCurve, QApplication, QFontInfo,
@@ -23,6 +24,7 @@ from calibre.library.comments import comments_to_html
from calibre.gui2 import (config, open_local_file, open_url, pixmap_to_data,
gprefs)
from calibre.utils.icu import sort_key
+from calibre.utils.formatter import EvalFormatter
def render_html(mi, css, vertical, widget, all_fields=False): # {{{
table = render_data(mi, all_fields=all_fields,
@@ -123,10 +125,20 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
_('Ids')+':', links)))
elif field == 'authors' and not isdevice:
authors = []
+ formatter = EvalFormatter()
for aut in mi.authors:
if mi.author_link_map[aut]:
- authors.append(u'%s' %
- (mi.author_link_map[aut], aut))
+ link = mi.author_link_map[aut]
+ elif config.get('default_author_link'):
+ vals = {'author': aut}
+ try:
+ vals['author_sort'] = mi.author_sort_map[aut]
+ except:
+ vals['author_sort'] = aut
+ link = formatter.safe_format(
+ config.get('default_author_link'), vals, '', vals)
+ if link:
+ authors.append(u'%s'%(urllib2.quote(link), aut))
else:
authors.append(aut)
ans.append((field, u'%s | %s | '%(name,
diff --git a/src/calibre/gui2/dialogs/restore_library.py b/src/calibre/gui2/dialogs/restore_library.py
index a57d6c86c1..60b224d1cd 100644
--- a/src/calibre/gui2/dialogs/restore_library.py
+++ b/src/calibre/gui2/dialogs/restore_library.py
@@ -54,7 +54,7 @@ class DBRestore(QDialog):
def reject(self):
self.rejected = True
self.restorer.progress_callback = lambda x, y: x
- QDialog.rejecet(self)
+ QDialog.reject(self)
def update(self):
if self.restorer.is_alive():
diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py
index a2850679f1..841193373b 100644
--- a/src/calibre/gui2/preferences/look_feel.py
+++ b/src/calibre/gui2/preferences/look_feel.py
@@ -138,6 +138,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
(_('Partitioned'), 'partition')]
r('tags_browser_partition_method', gprefs, choices=choices)
r('tags_browser_collapse_at', gprefs)
+ r('default_author_link', config)
choices = set([k for k in db.field_metadata.all_field_keys()
if db.field_metadata[k]['is_category'] and
diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui
index cc9133a36f..8dadfe3424 100644
--- a/src/calibre/gui2/preferences/look_feel.ui
+++ b/src/calibre/gui2/preferences/look_feel.ui
@@ -192,7 +192,7 @@
Book Details
- -
+
-
Select displayed metadata
@@ -243,6 +243,28 @@
+ -
+
+
-
+
+
+ Default author link template:
+
+
+
Enter a template that will be used to create a link for
+an author in the books information dialog. Used when no link has been
+provided for the author in Manage Authors.
+
+
+ opt_default_author_link
+
+
+
+ -
+
+
+
+
-
@@ -253,7 +275,7 @@
- -
+
-
Note that <b>comments</b> will always be displayed at the end, regardless of the position you assign here.
diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py
index 1fad4eb9a3..c878630234 100644
--- a/src/calibre/gui2/tag_browser/view.py
+++ b/src/calibre/gui2/tag_browser/view.py
@@ -136,7 +136,7 @@ class TagsView(QTreeView): # {{{
return expanded_categories, state_map
def reread_collapse_parameters(self):
- self._model.reread_collapse_parameters(self.get_state()[1])
+ self._model.reread_collapse_model(self.get_state())
def set_database(self, db, tag_match, sort_by):
self._model.set_database(db)
diff --git a/src/calibre/library/restore.py b/src/calibre/library/restore.py
index 8bd7174849..4fab2edbd6 100644
--- a/src/calibre/library/restore.py
+++ b/src/calibre/library/restore.py
@@ -53,6 +53,7 @@ class Restore(Thread):
self.mismatched_dirs = []
self.successes = 0
self.tb = None
+ self.authors_links = {}
@property
def errors_occurred(self):
@@ -160,6 +161,12 @@ class Restore(Thread):
else:
self.mismatched_dirs.append(dirpath)
+ alm = mi.get('author_link_map', {})
+ for author, link in alm.iteritems():
+ existing_link, timestamp = self.authors_links.get(author, (None, None))
+ if existing_link is None or existing_link != link and timestamp < mi.timestamp:
+ self.authors_links[author] = (link, mi.timestamp)
+
def create_cc_metadata(self):
self.books.sort(key=itemgetter('timestamp'))
self.custom_columns = {}
@@ -206,6 +213,11 @@ class Restore(Thread):
self.failed_restores.append((book, traceback.format_exc()))
self.progress_callback(book['mi'].title, i+1)
+ for author in self.authors_links.iterkeys():
+ link, ign = self.authors_links[author]
+ db.conn.execute('UPDATE authors SET link=? WHERE name=?',
+ (link, author.replace(',', '|')))
+ db.conn.commit()
db.conn.close()
def restore_book(self, book, db):
diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py
index 3c64785178..2907e43098 100644
--- a/src/calibre/library/schema_upgrades.py
+++ b/src/calibre/library/schema_upgrades.py
@@ -606,7 +606,7 @@ class SchemaUpgrade(object):
'''
script = '''
- ALTER TABLE authors ADD COLUMN link TEXT NON NULL DEFAULT "";
+ ALTER TABLE authors ADD COLUMN link TEXT NOT NULL DEFAULT "";
'''
self.conn.executescript(script)
From 251f5ca7fd2996ac44b906221c151579d578eb4c Mon Sep 17 00:00:00 2001
From: Charles Haley <>
Date: Tue, 28 Jun 2011 19:50:43 +0100
Subject: [PATCH 3/3] Ready to push
---
src/calibre/gui2/preferences/look_feel.ui | 7 +------
src/calibre/gui2/tag_browser/view.py | 2 +-
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui
index 8dadfe3424..f8dc9dc782 100644
--- a/src/calibre/gui2/preferences/look_feel.ui
+++ b/src/calibre/gui2/preferences/look_feel.ui
@@ -250,11 +250,6 @@
Default author link template:
-
-
Enter a template that will be used to create a link for
-an author in the books information dialog. Used when no link has been
-provided for the author in Manage Authors.
-
opt_default_author_link
@@ -275,7 +270,7 @@ provided for the author in Manage Authors.
- -
+
-
Note that <b>comments</b> will always be displayed at the end, regardless of the position you assign here.
diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py
index e9059d78aa..586d01ff87 100644
--- a/src/calibre/gui2/tag_browser/view.py
+++ b/src/calibre/gui2/tag_browser/view.py
@@ -136,7 +136,7 @@ class TagsView(QTreeView): # {{{
return expanded_categories, state_map
def reread_collapse_parameters(self):
- self._model.reread_collapse_model(self.get_state())
+ self._model.reread_collapse_model(self.get_state()[1])
def set_database(self, db, tag_match, sort_by):
self._model.set_database(db)