diff --git a/cps/db.py b/cps/db.py
index 0d7055a4..7f05e24c 100644
--- a/cps/db.py
+++ b/cps/db.py
@@ -702,14 +702,21 @@ class CalibreDB():
return self.session.query(Books) \
.filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first()
- def search_query(self, term):
+ def search_query(self, term, *join):
term.strip().lower()
self.session.connection().connection.connection.create_function("lower", 1, lcase)
q = list()
authorterms = re.split("[, ]+", term)
for authorterm in authorterms:
q.append(Books.authors.any(func.lower(Authors.name).ilike("%" + authorterm + "%")))
- return self.session.query(Books).filter(self.common_filters(True)).filter(
+ query = self.session.query(Books)
+ if len(join) == 3:
+ query = query.outerjoin(join[0], join[1]).outerjoin(join[2])
+ elif len(join) == 2:
+ query = query.outerjoin(join[0], join[1])
+ elif len(join) == 1:
+ query = query.outerjoin(join[0])
+ return query.filter(self.common_filters(True)).filter(
or_(Books.tags.any(func.lower(Tags.name).ilike("%" + term + "%")),
Books.series.any(func.lower(Series.name).ilike("%" + term + "%")),
Books.authors.any(and_(*q)),
@@ -718,10 +725,10 @@ class CalibreDB():
))
# read search results from calibre-database and return it (function is used for feed and simple search
- def get_search_results(self, term, offset=None, order=None, limit=None):
+ def get_search_results(self, term, offset=None, order=None, limit=None, *join):
order = order or [Books.sort]
pagination = None
- result = self.search_query(term).order_by(*order).all()
+ result = self.search_query(term, *join).order_by(*order).all()
result_count = len(result)
if offset != None and limit != None:
offset = int(offset)
diff --git a/cps/services/__init__.py b/cps/services/__init__.py
index efd55621..e6e5954c 100644
--- a/cps/services/__init__.py
+++ b/cps/services/__init__.py
@@ -49,5 +49,5 @@ except ImportError as err:
try:
from . import gmail
except ImportError as err:
- log.debug("Cannot import Gmail, sending books via G-Mail Accounts will not work: %s", err)
+ log.debug("Cannot import gmail, sending books via Gmail Oauth2 Verification will not work: %s", err)
gmail = None
diff --git a/cps/templates/book_table.html b/cps/templates/book_table.html
index e700eb53..bb167ad3 100644
--- a/cps/templates/book_table.html
+++ b/cps/templates/book_table.html
@@ -47,13 +47,13 @@
{{ text_table_row('title', _('Enter Title'),_('Title'), true, true) }}
{{ text_table_row('sort', _('Enter Title Sort'),_('Title Sort'), false, true) }}
{{ text_table_row('author_sort', _('Enter Author Sort'),_('Author Sort'), false, true) }}
- {{ text_table_row('authors', _('Enter Authors'),_('Authors'), true) }}
- {{ text_table_row('tags', _('Enter Categories'),_('Categories'), false, false) }}
- {{ text_table_row('series', _('Enter Series'),_('Series'), false, false) }}
+ {{ text_table_row('authors', _('Enter Authors'),_('Authors'), true, true) }}
+ {{ text_table_row('tags', _('Enter Categories'),_('Categories'), false, true) }}
+ {{ text_table_row('series', _('Enter Series'),_('Series'), false, true) }}
{{_('Series Index')}} |
- {{ text_table_row('languages', _('Enter Languages'),_('Languages'), false, false) }}
+ {{ text_table_row('languages', _('Enter Languages'),_('Languages'), false, true) }}
- {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, false) }}
+ {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }}
{% if g.user.role_delete_books() and g.user.role_edit()%}
{{_('Delete')}} |
{% endif %}
diff --git a/cps/templates/email_edit.html b/cps/templates/email_edit.html
index 8b92a248..ac1c36d2 100644
--- a/cps/templates/email_edit.html
+++ b/cps/templates/email_edit.html
@@ -12,7 +12,7 @@
@@ -20,7 +20,7 @@
{% if content.mail_gmail_token == {} %}
{% else %}
-
+
{% endif %}
diff --git a/cps/web.py b/cps/web.py
index 0eaacdb1..e01b4b22 100644
--- a/cps/web.py
+++ b/cps/web.py
@@ -760,10 +760,26 @@ def list_books():
sort = request.args.get("sort", "id")
order = request.args.get("order", "").lower()
state = None
+ join = tuple()
if sort == "state":
state = json.loads(request.args.get("state", "[]"))
- if sort != "state" and order:
+ elif sort == "tags":
+ order = [db.Tags.name.asc()] if order == "asc" else [db.Tags.name.desc()]
+ join = db.books_tags_link,db.Books.id == db.books_tags_link.c.book, db.Tags
+ elif sort == "series":
+ order = [db.Series.name.asc()] if order == "asc" else [db.Series.name.desc()]
+ join = db.books_series_link,db.Books.id == db.books_series_link.c.book, db.Series
+ elif sort == "publishers":
+ order = [db.Publishers.name.asc()] if order == "asc" else [db.Publishers.name.desc()]
+ join = db.books_publishers_link,db.Books.id == db.books_publishers_link.c.book, db.Publishers
+ elif sort == "authors":
+ order = [db.Authors.name.asc()] if order == "asc" else [db.Authors.name.desc()]
+ join = db.books_authors_link,db.Books.id == db.books_authors_link.c.book, db.Authors
+ elif sort == "languages":
+ order = [db.Languages.lang_code.asc()] if order == "asc" else [db.Languages.lang_code.desc()]
+ join = db.books_languages_link,db.Books.id == db.books_languages_link.c.book, db.Languages
+ elif order and sort in ["sort", "title", "authors_sort", "series_index"]:
order = [text(sort + " " + order)]
elif not state:
order = [db.Books.timestamp.desc()]
@@ -778,9 +794,9 @@ def list_books():
books = calibre_db.session.query(db.Books).filter(calibre_db.common_filters()).all()
entries = calibre_db.get_checkbox_sorted(books, state, off, limit,order)
elif search:
- entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit)
+ entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *join)
else:
- entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, db.Books, True, order)
+ entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, db.Books, True, order, *join)
for entry in entries:
for index in range(0, len(entry.languages)):