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: