diff --git a/cps/admin.py b/cps/admin.py index 305d822e..02d63960 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -347,10 +347,11 @@ def list_domain(allow): response.headers["Content-Type"] = "application/json; charset=utf-8" return response -@admi.route("/ajax/editrestriction/", methods=['POST']) +@admi.route("/ajax/editrestriction/", defaults={"user_id":0}, methods=['POST']) +@admi.route("/ajax/editrestriction//", methods=['POST']) @login_required @admin_required -def edit_restriction(res_type): +def edit_restriction(res_type, user_id): element = request.form.to_dict() if element['id'].startswith('a'): if res_type == 0: # Tags as template @@ -364,9 +365,8 @@ def edit_restriction(res_type): config.config_allowed_column_value = ','.join(elementlist) config.save() if res_type == 2: # Tags per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user elementlist = usr.list_allowed_tags() @@ -377,9 +377,8 @@ def edit_restriction(res_type): except OperationalError: ub.session.rollback() if res_type == 3: # CColumn per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user elementlist = usr.list_allowed_column_values() @@ -401,9 +400,8 @@ def edit_restriction(res_type): config.config_denied_column_value = ','.join(elementlist) config.save() if res_type == 2: # Tags per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user elementlist = usr.list_denied_tags() @@ -414,9 +412,8 @@ def edit_restriction(res_type): except OperationalError: ub.session.rollback() if res_type == 3: # CColumn per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user elementlist = usr.list_denied_column_values() @@ -444,10 +441,11 @@ def restriction_deletion(element, list_func): return ','.join(elementlist) -@admi.route("/ajax/addrestriction/", methods=['POST']) +@admi.route("/ajax/addrestriction/", defaults={"user_id":0}, methods=['POST']) +@admi.route("/ajax/addrestriction//", methods=['POST']) @login_required @admin_required -def add_restriction(res_type): +def add_restriction(res_type, user_id): element = request.form.to_dict() if res_type == 0: # Tags as template if 'submit_allow' in element: @@ -464,9 +462,8 @@ def add_restriction(res_type): config.config_denied_column_value = restriction_addition(element, config.list_allowed_column_values) config.save() if res_type == 2: # Tags per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user if 'submit_allow' in element: @@ -482,9 +479,8 @@ def add_restriction(res_type): except OperationalError: ub.session.rollback() if res_type == 3: # CustomC per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user if 'submit_allow' in element: @@ -501,10 +497,11 @@ def add_restriction(res_type): ub.session.rollback() return "" -@admi.route("/ajax/deleterestriction/", methods=['POST']) +@admi.route("/ajax/deleterestriction/", defaults={"user_id":0}, methods=['POST']) +@admi.route("/ajax/deleterestriction//", methods=['POST']) @login_required @admin_required -def delete_restriction(res_type): +def delete_restriction(res_type, user_id): element = request.form.to_dict() if res_type == 0: # Tags as template if element['id'].startswith('a'): @@ -521,9 +518,8 @@ def delete_restriction(res_type): config.config_denied_column_value = restriction_deletion(element, config.list_denied_column_values) config.save() elif res_type == 2: # Tags per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user if element['id'].startswith('a'): @@ -539,9 +535,8 @@ def delete_restriction(res_type): except OperationalError: ub.session.rollback() elif res_type == 3: # Columns per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: # select current user if admins are editing their own rights - usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() else: usr = current_user if element['id'].startswith('a'): @@ -558,11 +553,11 @@ def delete_restriction(res_type): ub.session.rollback() return "" - -@admi.route("/ajax/listrestriction/") +@admi.route("/ajax/listrestriction/", defaults={"user_id":0}) +@admi.route("/ajax/listrestriction//") @login_required @admin_required -def list_restriction(res_type): +def list_restriction(res_type, user_id): if res_type == 0: # Tags as template restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } for i,x in enumerate(config.list_denied_tags()) if x != '' ] @@ -576,9 +571,8 @@ def list_restriction(res_type): for i,x in enumerate(config.list_allowed_column_values()) if x != ''] json_dumps = restrict + allow elif res_type == 2: # Tags per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id == usr_id).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id == user_id).first() else: usr = current_user restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } @@ -587,9 +581,8 @@ def list_restriction(res_type): for i,x in enumerate(usr.list_allowed_tags()) if x != ''] json_dumps = restrict + allow elif res_type == 3: # CustomC per user - usr_id = os.path.split(request.referrer)[-1] - if usr_id.isdigit() == True: - usr = ub.session.query(ub.User).filter(ub.User.id==usr_id).first() + if isinstance(user_id, int): + usr = ub.session.query(ub.User).filter(ub.User.id==user_id).first() else: usr = current_user restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } diff --git a/cps/render_template.py b/cps/render_template.py index fb0b5067..16fdab13 100644 --- a/cps/render_template.py +++ b/cps/render_template.py @@ -104,7 +104,7 @@ def get_readbooks_ids(): readBooks = calibre_db.session.query(db.cc_classes[config.config_read_column])\ .filter(db.cc_classes[config.config_read_column].value == True).all() return frozenset([x.book for x in readBooks]) - except KeyError: + except (KeyError, AttributeError): log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column) return [] diff --git a/cps/services/SyncToken.py b/cps/services/SyncToken.py index 4ad5fa2c..26eb396c 100644 --- a/cps/services/SyncToken.py +++ b/cps/services/SyncToken.py @@ -144,6 +144,8 @@ class SyncToken: except TypeError: log.error("SyncToken timestamps don't parse to a datetime.") return SyncToken(raw_kobo_store_token=raw_kobo_store_token) + except KeyError: + books_last_id = -1 return SyncToken( raw_kobo_store_token=raw_kobo_store_token, diff --git a/cps/static/js/table.js b/cps/static/js/table.js index 7fdf9e6a..efe0fad4 100644 --- a/cps/static/js/table.js +++ b/cps/static/js/table.js @@ -255,14 +255,14 @@ $(function() { $("#h3").addClass("hidden"); $("#h4").addClass("hidden"); }); - function startTable(type) { + function startTable(type, user_id) { var pathname = document.getElementsByTagName("script"), src = pathname[pathname.length - 1].src; var path = src.substring(0, src.lastIndexOf("/")); $("#restrict-elements-table").bootstrapTable({ formatNoMatches: function () { return ""; }, - url: path + "/../../ajax/listrestriction/" + type, + url: path + "/../../ajax/listrestriction/" + type + "/" + user_id, rowStyle: function(row) { // console.log('Reihe :' + row + " Index :" + index); if (row.id.charAt(0) === "a") { @@ -276,13 +276,13 @@ $(function() { $.ajax ({ type: "Post", data: "id=" + row.id + "&type=" + row.type + "&Element=" + encodeURIComponent(row.Element), - url: path + "/../../ajax/deleterestriction/" + type, + url: path + "/../../ajax/deleterestriction/" + type + "/" + user_id, async: true, timeout: 900, success:function() { $.ajax({ method:"get", - url: path + "/../../ajax/listrestriction/" + type, + url: path + "/../../ajax/listrestriction/" + type + "/" + user_id, async: true, timeout: 900, success:function(data) { @@ -298,7 +298,7 @@ $(function() { $("#restrict-elements-table").removeClass("table-hover"); $("#restrict-elements-table").on("editable-save.bs.table", function (e, field, row) { $.ajax({ - url: path + "/../../ajax/editrestriction/" + type, + url: path + "/../../ajax/editrestriction/" + type + "/" + user_id, type: "Post", data: row }); @@ -306,13 +306,13 @@ $(function() { $("[id^=submit_]").click(function() { $(this)[0].blur(); $.ajax({ - url: path + "/../../ajax/addrestriction/" + type, + url: path + "/../../ajax/addrestriction/" + type + "/" + user_id, type: "Post", data: $(this).closest("form").serialize() + "&" + $(this)[0].name + "=", success: function () { $.ajax ({ method:"get", - url: path + "/../../ajax/listrestriction/" + type, + url: path + "/../../ajax/listrestriction/" + type + "/" + user_id, async: true, timeout: 900, success:function(data) { @@ -325,21 +325,21 @@ $(function() { }); } $("#get_column_values").on("click", function() { - startTable(1); + startTable(1, 0); $("#h2").removeClass("hidden"); }); $("#get_tags").on("click", function() { - startTable(0); + startTable(0, 0); $("#h1").removeClass("hidden"); }); $("#get_user_column_values").on("click", function() { - startTable(3); + startTable(3, $(this).data('id')); $("#h4").removeClass("hidden"); }); $("#get_user_tags").on("click", function() { - startTable(2); + startTable(2, $(this).data('id')); $(this)[0].blur(); $("#h3").removeClass("hidden"); }); diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index cf3c7bcd..ba8d4f9e 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -20,7 +20,7 @@ {% if filepicker %} - + {% endif %} diff --git a/cps/templates/modal_dialogs.html b/cps/templates/modal_dialogs.html index da83649a..da00834c 100644 --- a/cps/templates/modal_dialogs.html +++ b/cps/templates/modal_dialogs.html @@ -96,7 +96,7 @@ diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index 7403574e..90a32acc 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -82,8 +82,8 @@ {% if ( g.user and g.user.role_admin() and not new_user ) %} - {{_('Add Allowed/Denied Tags')}} - {{_('Add allowed/Denied Custom Column Values')}} + {{_('Add Allowed/Denied Tags')}} + {{_('Add allowed/Denied Custom Column Values')}} {% endif %}
diff --git a/cps/web.py b/cps/web.py index 1b231e34..4dc30c9b 100644 --- a/cps/web.py +++ b/cps/web.py @@ -635,13 +635,12 @@ def render_read_books(page, are_read, as_xml=False, order=None): db_filter = and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.read_status == ub.ReadBook.STATUS_FINISHED) else: - db_filter = and_(ub.ReadBook.user_id == int(current_user.id), - coalesce(ub.ReadBook.read_status, 0) != ub.ReadBook.STATUS_FINISHED) + db_filter = coalesce(ub.ReadBook.read_status, 0) != ub.ReadBook.STATUS_FINISHED entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, db_filter, order, - ub.ReadBook, db.Books.id==ub.ReadBook.book_id) + ub.ReadBook, db.Books.id == ub.ReadBook.book_id) else: try: if are_read: diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index dde602ab..027a3e46 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2020-12-12 12:19:43

+

Start Time: 2021-01-02 07:53:24

-

Stop Time: 2020-12-12 14:23:09

+

Stop Time: 2021-01-02 10:58:22

-

Duration: 1h 33 min

+

Duration: 2h 37 min

@@ -234,1125 +234,21 @@ - - _ErrorHolder - 29 - 0 - 0 - 29 - 0 - - Detail - - - - - - - -
tearDownClass (test_anonymous)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_cli)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_cover_edit_books)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_delete_database)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_ebook_convert)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_ebook_convert_gdrive)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_ebook_convert_kepubify)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_ebook_convert_kepubify_gdrive)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_edit_additional_books)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_edit_books)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_edit_books_list)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_edit_ebooks_gdrive)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_email_STARTTLS)
- - -
- ERROR -
- - - - - - - - - - -
setUpClass (test_email_ssl)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_gdrive_setup)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_goodreads)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_kobo_sync)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_ldap)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_logging)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_login)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_oauth)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_opds_feed)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_reader)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_register)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_shelf)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_updater)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_user_load)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_user_template)
- - -
- ERROR -
- - - - - - - - - - -
tearDownClass (test_visiblilitys)
- - -
- ERROR -
- - - - - - - - - TestCli + 8 7 - 6 0 0 1 - Detail + Detail - +
TestCli - test_already_started
@@ -1361,7 +257,7 @@ AttributeError: 'bool' object has no attribute '_formatMessage' - +
TestCli - test_bind_to_single_interface
@@ -1370,7 +266,7 @@ AttributeError: 'bool' object has no attribute '_formatMessage' - +
TestCli - test_cli_SSL_files
@@ -1379,7 +275,7 @@ AttributeError: 'bool' object has no attribute '_formatMessage' - +
TestCli - test_cli_different_folder
@@ -1388,7 +284,7 @@ AttributeError: 'bool' object has no attribute '_formatMessage' - +
TestCli - test_cli_different_settings_database
@@ -1397,19 +293,19 @@ AttributeError: 'bool' object has no attribute '_formatMessage' - +
TestCli - test_cli_gdrive_location
- SKIP + SKIP
-