From 39bbee0eebf0b894ced33cffb300a581ed95cf04 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 17 Apr 2021 10:27:30 +0200 Subject: [PATCH] Books sort with non Books table column working #1938 --- cps/db.py | 15 +++++++++++---- cps/services/__init__.py | 2 +- cps/templates/book_table.html | 10 +++++----- cps/templates/email_edit.html | 4 ++-- cps/web.py | 22 +++++++++++++++++++--- 5 files changed, 38 insertions(+), 15 deletions(-) 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)):