mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix #3518 (calibre-server: "By Author", (optional) author_sort sorting)
This commit is contained in:
parent
842d7bed22
commit
20b04fa1e0
@ -551,6 +551,25 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
self.sync_formats()
|
self.sync_formats()
|
||||||
title = unicode(self.title.text())
|
title = unicode(self.title.text())
|
||||||
self.db.set_title(self.id, title, notify=False)
|
self.db.set_title(self.id, title, notify=False)
|
||||||
|
au = unicode(self.authors.text())
|
||||||
|
if au:
|
||||||
|
self.db.set_authors(self.id, string_to_authors(au), notify=False)
|
||||||
|
aus = unicode(self.author_sort.text())
|
||||||
|
if aus:
|
||||||
|
self.db.set_author_sort(self.id, aus, notify=False)
|
||||||
|
self.db.set_isbn(self.id,
|
||||||
|
re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())), notify=False)
|
||||||
|
self.db.set_rating(self.id, 2*self.rating.value(), notify=False)
|
||||||
|
self.db.set_publisher(self.id, qstring_to_unicode(self.publisher.currentText()), notify=False)
|
||||||
|
self.db.set_tags(self.id, qstring_to_unicode(self.tags.text()).split(','), notify=False)
|
||||||
|
self.db.set_series(self.id, qstring_to_unicode(self.series.currentText()), notify=False)
|
||||||
|
self.db.set_series_index(self.id, self.series_index.value(), notify=False)
|
||||||
|
self.db.set_comment(self.id, qstring_to_unicode(self.comments.toPlainText()), notify=False)
|
||||||
|
d = self.pubdate.date()
|
||||||
|
self.db.set_pubdate(self.id, datetime(d.year(), d.month(), d.day()))
|
||||||
|
|
||||||
|
if self.cover_changed and self.cover_data is not None:
|
||||||
|
self.db.set_cover(self.id, self.cover_data)
|
||||||
except IOError, err:
|
except IOError, err:
|
||||||
if err.errno == 13: # Permission denied
|
if err.errno == 13: # Permission denied
|
||||||
fname = err.filename if err.filename else 'file'
|
fname = err.filename if err.filename else 'file'
|
||||||
@ -558,25 +577,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
_('Could not open %s. Is it being used by another'
|
_('Could not open %s. Is it being used by another'
|
||||||
' program?')%fname, show=True)
|
' program?')%fname, show=True)
|
||||||
raise
|
raise
|
||||||
au = unicode(self.authors.text())
|
|
||||||
if au:
|
|
||||||
self.db.set_authors(self.id, string_to_authors(au), notify=False)
|
|
||||||
aus = qstring_to_unicode(self.author_sort.text())
|
|
||||||
if aus:
|
|
||||||
self.db.set_author_sort(self.id, aus, notify=False)
|
|
||||||
self.db.set_isbn(self.id,
|
|
||||||
re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())), notify=False)
|
|
||||||
self.db.set_rating(self.id, 2*self.rating.value(), notify=False)
|
|
||||||
self.db.set_publisher(self.id, qstring_to_unicode(self.publisher.currentText()), notify=False)
|
|
||||||
self.db.set_tags(self.id, qstring_to_unicode(self.tags.text()).split(','), notify=False)
|
|
||||||
self.db.set_series(self.id, qstring_to_unicode(self.series.currentText()), notify=False)
|
|
||||||
self.db.set_series_index(self.id, self.series_index.value(), notify=False)
|
|
||||||
self.db.set_comment(self.id, qstring_to_unicode(self.comments.toPlainText()), notify=False)
|
|
||||||
d = self.pubdate.date()
|
|
||||||
self.db.set_pubdate(self.id, datetime(d.year(), d.month(), d.day()))
|
|
||||||
|
|
||||||
if self.cover_changed and self.cover_data is not None:
|
|
||||||
self.db.set_cover(self.id, self.cover_data)
|
|
||||||
QDialog.accept(self)
|
QDialog.accept(self)
|
||||||
if callable(self.accepted_callback):
|
if callable(self.accepted_callback):
|
||||||
self.accepted_callback(self.id)
|
self.accepted_callback(self.id)
|
||||||
|
@ -366,6 +366,21 @@ class LibraryServer(object):
|
|||||||
return base.intersection(epub.union(pdb))
|
return base.intersection(epub.union(pdb))
|
||||||
|
|
||||||
def stanza_sortby_subcategory(self, updated, sortby, offset):
|
def stanza_sortby_subcategory(self, updated, sortby, offset):
|
||||||
|
pat = re.compile(r'\(.*\)')
|
||||||
|
|
||||||
|
def clean_author(x):
|
||||||
|
return pat.sub('', x).strip()
|
||||||
|
|
||||||
|
def author_cmp(x, y):
|
||||||
|
x = x if ',' in x else clean_author(x).rpartition(' ')[-1]
|
||||||
|
y = y if ',' in y else clean_author(y).rpartition(' ')[-1]
|
||||||
|
return cmp(x.lower(), y.lower())
|
||||||
|
|
||||||
|
def get_author(x):
|
||||||
|
pref, ___, suff = clean_author(x).rpartition(' ')
|
||||||
|
return suff + (', '+pref) if pref else suff
|
||||||
|
|
||||||
|
|
||||||
what, subtitle = sortby[2:], ''
|
what, subtitle = sortby[2:], ''
|
||||||
if sortby == 'byseries':
|
if sortby == 'byseries':
|
||||||
data = self.db.all_series()
|
data = self.db.all_series()
|
||||||
@ -379,13 +394,15 @@ class LibraryServer(object):
|
|||||||
data = self.db.all_tags2()
|
data = self.db.all_tags2()
|
||||||
data = [(x[0], x[1], len(self.get_matches('tags', x[1]))) for x in data]
|
data = [(x[0], x[1], len(self.get_matches('tags', x[1]))) for x in data]
|
||||||
subtitle = 'Books by tag'
|
subtitle = 'Books by tag'
|
||||||
|
fcmp = author_cmp if sortby == 'byauthor' else cmp
|
||||||
data = [x for x in data if x[2] > 0]
|
data = [x for x in data if x[2] > 0]
|
||||||
data.sort(cmp=lambda x, y: cmp(x[1], y[1]))
|
data.sort(cmp=lambda x, y: fcmp(x[1], y[1]))
|
||||||
next_offset = offset + self.max_stanza_items
|
next_offset = offset + self.max_stanza_items
|
||||||
rdata = data[offset:next_offset]
|
rdata = data[offset:next_offset]
|
||||||
if next_offset >= len(data):
|
if next_offset >= len(data):
|
||||||
next_offset = -1
|
next_offset = -1
|
||||||
entries = [self.STANZA_SUBCATALOG_ENTRY.generate(title=title, id=id,
|
gt = get_author if sortby == 'byauthor' else lambda x: x
|
||||||
|
entries = [self.STANZA_SUBCATALOG_ENTRY.generate(title=gt(title), id=id,
|
||||||
what=what, updated=updated, count=c).render('xml').decode('utf-8') for id,
|
what=what, updated=updated, count=c).render('xml').decode('utf-8') for id,
|
||||||
title, c in rdata]
|
title, c in rdata]
|
||||||
next_link = ''
|
next_link = ''
|
||||||
|
Loading…
x
Reference in New Issue
Block a user