diff --git a/cps/admin.py b/cps/admin.py index 76092993..935aee45 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -38,6 +38,7 @@ from sqlalchemy import and_ from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_, text +# from sqlalchemy.func import field from . import constants, logger, helper, services from .cli import filepicker @@ -241,29 +242,44 @@ def edit_user_table(): @login_required @admin_required def list_users(): - off = request.args.get("offset") or 0 - limit = request.args.get("limit") or 10 + off = int(request.args.get("offset") or 0) + limit = int(request.args.get("limit") or 10) search = request.args.get("search") - sort = request.args.get("sort") + sort = request.args.get("sort", "state") order = request.args.get("order") - if sort and order: + state = None + if sort != "state" and order: order = text(sort + " " + order) else: order = ub.User.name.desc() + if sort == "state": + state = json.loads(request.args.get("state")) all_user = ub.session.query(ub.User) if not config.config_anonbrowse: all_user = all_user.filter(ub.User.role.op('&')(constants.ROLE_ANONYMOUS) != constants.ROLE_ANONYMOUS) - total_count = all_user.count() + + total_count = filtered_count = all_user.count() + if search: - users = all_user.filter(or_(func.lower(ub.User.name).ilike("%" + search + "%"), + all_user = all_user.filter(or_(func.lower(ub.User.name).ilike("%" + search + "%"), func.lower(ub.User.kindle_mail).ilike("%" + search + "%"), - func.lower(ub.User.email).ilike("%" + search + "%")))\ - .order_by(order).offset(off).limit(limit).all() - filtered_count = len(users) + func.lower(ub.User.email).ilike("%" + search + "%"))) + if state: + outcome = list() + userlist = {user.id:user for user in all_user.all()} + for entry in state: + outcome.append(userlist[entry]) + del userlist[entry] + for entry in userlist: + outcome.append(userlist[entry]) + if request.args.get("order", "").lower() == "asc": + outcome.reverse() + users = outcome[off:off + limit] else: users = all_user.order_by(order).offset(off).limit(limit).all() - filtered_count = total_count + if search: + filtered_count = len(users) for user in users: if user.default_language == "all": diff --git a/cps/db.py b/cps/db.py index b875ded7..51aeeca1 100644 --- a/cps/db.py +++ b/cps/db.py @@ -689,23 +689,26 @@ class CalibreDB(): return self.session.query(Books) \ .filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first() - # 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): - order = order or [Books.sort] - pagination = None + def search_query(self, term): 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 + "%"))) - result = self.session.query(Books).filter(self.common_filters(True)).filter( + return self.session.query(Books).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)), Books.publishers.any(func.lower(Publishers.name).ilike("%" + term + "%")), func.lower(Books.title).ilike("%" + term + "%") - )).order_by(*order).all() + )) + + # 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): + order = order or [Books.sort] + pagination = None + result = self.search_query(term).order_by(*order).all() result_count = len(result) if offset != None and limit != None: offset = int(offset) diff --git a/cps/static/js/table.js b/cps/static/js/table.js index 96d28c85..59b70626 100644 --- a/cps/static/js/table.js +++ b/cps/static/js/table.js @@ -422,6 +422,7 @@ $(function() { $("#user-table").bootstrapTable({ sidePagination: "server", + queryParams: queryParams, pagination: true, paginationLoop: false, paginationDetailHAlign: " hidden", @@ -462,28 +463,10 @@ $(function() { $("input[data-name='sidebar_read_and_unread'][data-pk='"+guest.data("pk")+"']").prop("disabled", true); $(".user-remove[data-pk='"+guest.data("pk")+"']").prop("disabled", true); }, - - // eslint-disable-next-line no-unused-vars - /*onEditableSave: function (field, row, oldvalue, $el) { - if (field === "title" || field === "authors") { - $.ajax({ - method:"get", - dataType: "json", - url: window.location.pathname + "/../../ajax/sort_value/" + field + "/" + row.id, - success: function success(data) { - var key = Object.keys(data)[0]; - $("#books-table").bootstrapTable("updateCellByUniqueId", { - id: row.id, - field: key, - value: data[key] - }); - // console.log(data); - } - }); - } - },*/ - // eslint-disable-next-line no-unused-vars - onColumnSwitch: function (field, checked) { + onSort: function(a, b) { + console.log("huh"); + }, + onColumnSwitch: function () { var visible = $("#user-table").bootstrapTable("getVisibleColumns"); var hidden = $("#user-table").bootstrapTable("getHiddenColumns"); var st = ""; @@ -746,6 +729,11 @@ function deleteUser(a,b){ ); } +function queryParams(params) +{ + params.state = JSON.stringify(selections); + return params; +} function user_handle (userId) { } diff --git a/cps/templates/user_table.html b/cps/templates/user_table.html index b8a9d2c2..5f33cb99 100644 --- a/cps/templates/user_table.html +++ b/cps/templates/user_table.html @@ -144,7 +144,7 @@ {{ restrict_modal() }} {% endblock %} {% block js %} - + diff --git a/cps/web.py b/cps/web.py index 658ff735..a8c7b71a 100644 --- a/cps/web.py +++ b/cps/web.py @@ -753,21 +753,42 @@ def books_table(): @web.route("/ajax/listbooks") @login_required def list_books(): - off = request.args.get("offset") or 0 - limit = request.args.get("limit") or config.config_books_per_page - sort = request.args.get("sort") + off = int(request.args.get("offset") or 0) + limit = int(request.args.get("limit") or config.config_books_per_page) + search = request.args.get("search") + sort = request.args.get("sort", "state") order = request.args.get("order") - if sort and order: + state = None + if sort != "state" and order: order = [text(sort + " " + order)] else: order = [db.Books.timestamp.desc()] - search = request.args.get("search") - total_count = calibre_db.session.query(db.Books).count() - if search: + if sort == "state": + state = json.loads(request.args.get("state")) + + total_count = filtered_count = calibre_db.session.query(db.Books).count() + + if state: + outcome = list() + if search: + books = calibre_db.search_query(search) + filtered_count = len(books) + else: + books = calibre_db.session.query(db.Books).filter(calibre_db.common_filters()).all() + booklist = {book.id: book for book in books} + for entry in state: + outcome.append(booklist[entry]) + del booklist[entry] + for entry in booklist: + outcome.append(booklist[entry]) + if request.args.get("order", "").lower() == "asc": + outcome.reverse() + entries = outcome[off:off + limit] + elif search: entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit) else: entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, db.Books, True, order) - filtered_count = total_count + for entry in entries: for index in range(0, len(entry.languages)): try: