diff --git a/cps/__init__.py b/cps/__init__.py old mode 100755 new mode 100644 diff --git a/cps/admin.py b/cps/admin.py old mode 100755 new mode 100644 diff --git a/cps/redirect.py b/cps/redirect.py old mode 100755 new mode 100644 diff --git a/cps/search.py b/cps/search.py index 4ae8a5d72..6054ec9ec 100644 --- a/cps/search.py +++ b/cps/search.py @@ -24,6 +24,7 @@ from flask_babel import format_date from flask_babel import gettext as _ from sqlalchemy.sql.expression import func, not_, and_, or_, text, true from sqlalchemy.sql.functions import coalesce +from sqlalchemy import exists from . import logger, db, calibre_db, config, ub from .usermanagement import login_required_if_no_ano @@ -81,16 +82,27 @@ def adv_search_custom_columns(cc, term, q): if custom_end: q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( func.datetime(db.cc_classes[c.id].value) <= func.datetime(custom_end))) + elif c.datatype in ["int", "float"]: + custom_low = term.get('custom_column_' + str(c.id) + '_low') + custom_high = term.get('custom_column_' + str(c.id) + '_high') + if custom_low: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value >= custom_low)) + if custom_high: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value <= custom_high)) else: custom_query = term.get('custom_column_' + str(c.id)) - if custom_query != '' and custom_query is not None: - if c.datatype == 'bool': - q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( - db.cc_classes[c.id].value == (custom_query == "True"))) - elif c.datatype == 'int' or c.datatype == 'float': - q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( - db.cc_classes[c.id].value == custom_query)) - elif c.datatype == 'rating': + if c.datatype == 'bool': + if custom_query != "Any": + if custom_query == "": + q = q.filter(~getattr(db.Books, 'custom_column_' + str(c.id)). + any(db.cc_classes[c.id].value >= 0)) + else: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value == bool(custom_query == "True"))) + elif custom_query != '' and custom_query is not None: + if c.datatype == 'rating': q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( db.cc_classes[c.id].value == int(float(custom_query) * 2))) else: @@ -129,10 +141,10 @@ def adv_search_read_status(read_status): db_filter = coalesce(ub.ReadBook.read_status, 0) != ub.ReadBook.STATUS_FINISHED else: try: - if read_status == "True": - db_filter = db.cc_classes[config.config_read_column].value == True + if read_status == "": + db_filter = coalesce(db.cc_classes[config.config_read_column].value, 2) == 2 else: - db_filter = coalesce(db.cc_classes[config.config_read_column].value, False) != True + db_filter = db.cc_classes[config.config_read_column].value == bool(read_status == "True") except (KeyError, AttributeError, IndexError): log.error("Custom Column No.{} does not exist in calibre database".format(config.config_read_column)) flash(_("Custom Column No.%(column)d does not exist in calibre database", @@ -275,10 +287,23 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): cc_present = True if column_end: search_term.extend(["{} <= {}".format(c.name, - format_date(datetime.strptime(column_end, "%Y-%m-%d").date(), + format_date(datetime.strptime(column_end, "%Y-%m-%d").date(), format='medium') )]) cc_present = True + if c.datatype in ["int", "float"]: + column_low = term.get('custom_column_' + str(c.id) + '_low') + column_high = term.get('custom_column_' + str(c.id) + '_high') + if column_low: + search_term.extend(["{} >= {}".format(c.name, column_low)]) + cc_present = True + if column_high: + search_term.extend(["{} <= {}".format(c.name,column_high)]) + cc_present = True + elif c.datatype == "bool": + if term.get('custom_column_' + str(c.id)) != "Any": + search_term.extend([("{}: {}".format(c.name, term.get('custom_column_' + str(c.id))))]) + cc_present = True elif term.get('custom_column_' + str(c.id)): search_term.extend([("{}: {}".format(c.name, term.get('custom_column_' + str(c.id))))]) cc_present = True diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 6b183b07a..fc18890c5 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -160,15 +160,18 @@ $(document).ready(function() { $(".session").click(function() { window.sessionStorage.setItem("back", window.location.pathname); + window.sessionStorage.setItem("search", window.location.search); }); $("#back").click(function() { var loc = sessionStorage.getItem("back"); + var param = sessionStorage.getItem("search"); if (!loc) { loc = $(this).data("back"); } sessionStorage.removeItem("back"); - window.location.href = loc; + sessionStorage.removeItem("search"); + window.location.href = loc + param; }); diff --git a/cps/tasks_status.py b/cps/tasks_status.py index 49feb67c2..268200d4e 100644 --- a/cps/tasks_status.py +++ b/cps/tasks_status.py @@ -82,6 +82,7 @@ def render_task_status(tasklist): ret['task_id'] = task.id ret['stat'] = task.stat ret['is_cancellable'] = task.is_cancellable + ret['error'] = task.error rendered_tasklist.append(ret) diff --git a/cps/templates/search_form.html b/cps/templates/search_form.html index cf2fac04b..cdce85a5c 100644 --- a/cps/templates/search_form.html +++ b/cps/templates/search_form.html @@ -158,21 +158,41 @@ {% if cc|length > 0 %} {% for c in cc %}
Start Time: 2024-07-29 06:08:20
+Start Time: 2024-08-02 21:21:17
Stop Time: 2024-07-29 13:40:23
+Stop Time: 2024-08-03 04:29:18
Duration: 6h 9 min
+Duration: 5h 53 min
Traceback (most recent call last): - File "/home/ozzie/Development/calibre-web-test/test/test_backup_metadata.py", line 69, in test_backup_all - self.assertEqual(tasks[-1]['result'], "Failed") -AssertionError: 'Finished' != 'Failed' -- Finished -+ Failed-
Traceback (most recent call last): - File "/home/ozzie/Development/calibre-web-test/test/test_cli.py", line 602, in test_no_database - os.rmdir(alt_location) -OSError: [Errno 39] Directory not empty: '/home/ozzie/Dusty/script/alternate'-
Traceback (most recent call last):
- File "/home/ozzie/Development/calibre-web-test/test/test_cli.py", line 732, in test_writeonly_static_files
- self.driver.get("http://127.0.0.1:" + PORTS[0])
- File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 449, in get
- self.execute(Command.GET, {"url": url})
- File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
- self.error_handler.check_response(response)
- File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
- raise exception_class(message, screen, stacktrace)
-selenium.common.exceptions.TimeoutException: Message: Navigation timed out after 300000 ms
-Stacktrace:
-RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
-WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
-TimeoutError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:740:5
-bail@chrome://remote/content/marionette/sync.sys.mjs:211:19
- Traceback (most recent call last): - File "/home/ozzie/Development/calibre-web-test/test/test_cli_gdrive.py", line 283, in test_no_database - os.rmdir(alt_location) -OSError: [Errno 39] Directory not empty: '/home/ozzie/Dusty/script/alternate'-
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 702, in test_calibre_log + task_len, ret1 = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 2+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 442, in test_convert_only + self.assertEqual(ret[-1]['result'], 'Finished') +IndexError: list index out of range+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 482, in test_email_only + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 2+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 224, in test_convert_email + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 2+
Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 254, in test_convert_failed_and_email
+ select.select_by_visible_text('AZW3')
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/support/select.py", line 134, in select_by_visible_text
+ raise NoSuchElementException(f"Could not locate element with visible text: {text}")
+selenium.common.exceptions.NoSuchElementException: Message: Could not locate element with visible text: AZW3
+ Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 412, in test_convert_only + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 0+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 450, in test_email_only + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 2+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_kepubify.py", line 154, in test_convert_only + self.assertEqual(ret[-1]['result'], 'Finished') +IndexError: list index out of range+
Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_kepubify_gdrive.py", line 212, in test_convert_only + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 0+
Traceback (most recent call last): - File "/home/ozzie/Development/calibre-web-test/test/test_edit_additional_books.py", line 417, in test_writeonly_path - self.assertTrue(self.check_element_on_page((By.ID, "flash_danger"))) -AssertionError: False is not true-
Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_author.py", line 62, in test_change_capital_one_author_one_book - self.assertFalse(os.path.isdir(os.path.join(TEST_DB, 'Leo Baskerville'))) -AssertionError: True is not false+ self.assertFalse('Leo Baskerville' in os.listdir(SMB_LIB)) +NameError: name 'SMB_LIB' is not defined
Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_author.py", line 111, in test_change_capital_one_author_two_books - self.assertFalse(os.path.isdir(os.path.join(TEST_DB, 'Peter Parker'))) -AssertionError: True is not false+ self.assertFalse('Peter Parker' in os.listdir(SMB_LIB)) +NameError: name 'SMB_LIB' is not defined
Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_author.py", line 164, in test_change_capital_one_author_two_books_coauthor - self.assertFalse(os.path.isdir(os.path.join(TEST_DB, 'Norbert Halagal'))) -AssertionError: True is not false+ self.assertFalse('Norbert Halagal' in os.listdir(SMB_LIB)) +NameError: name 'SMB_LIB' is not defined
Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_author.py", line 294, in test_change_capital_rename_co_author - self.assertFalse(os.path.isdir(os.path.join(TEST_DB, 'Hector Gonçalves'))) -AssertionError: True is not false+ self.assertFalse('Hector Gonçalves' in os.listdir(SMB_LIB)) +NameError: name 'SMB_LIB' is not defined
Traceback (most recent call last):
- File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_list.py", line 230, in test_bookslist_edit_languages
- self.assertTrue("+" in self.check_element_on_page((By.XPATH,
-AssertionError: False is not true
- Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 753, in test_edit_custom_float
+ self.assertEqual(len(self.adv_search({u'custom_column_8': u'-2.5'})), 0)
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 2172, in adv_search
+ ele = self.driver.find_element(By.XPATH,
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 830, in find_element
+ return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
+ self.error_handler.check_response(response)
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
+ raise exception_class(message, screen, stacktrace)
+selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //input[@value = '-2.5' and starts-with(@id, 'custom_column_8') ]/..
+Stacktrace:
+RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
+WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
+NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:511:5
+dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16
+ Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 769, in test_edit_custom_int
+ self.assertEqual(len(self.adv_search({u'custom_column_4': u'0'})), 0)
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 2172, in adv_search
+ ele = self.driver.find_element(By.XPATH,
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 830, in find_element
+ return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
+ self.error_handler.check_response(response)
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
+ raise exception_class(message, screen, stacktrace)
+selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //input[@value = '0' and starts-with(@id, 'custom_column_4') ]/..
+Stacktrace:
+RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
+WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
+NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:511:5
+dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16
+ Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 199, in test_SSL_non_admin_user + task_len, ret = self.wait_tasks(tasks, 1) + File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 1636, in wait_tasks + self.assertEqual(expected, task_len) +AssertionError: 1 != 0+
Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 72, in test_SSL_only
+ self.setup_server(False, {'mail_use_ssl': 'SSL/TLS'})
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 727, in setup_server
+ select = Select(cls.driver.find_element(By.ID, key))
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 830, in find_element
+ return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
+ self.error_handler.check_response(response)
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
+ raise exception_class(message, screen, stacktrace)
+selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="mail_use_ssl"]
+Stacktrace:
+RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
+WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
+NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:511:5
+dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16
+ Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 146, in test_email_limit
+ self.fill_basic_config({'config_uploading': 1})
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 392, in fill_basic_config
+ cls._fill_basic_config(elements)
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 304, in _fill_basic_config
+ WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_port")))
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/support/wait.py", line 95, in until
+ raise TimeoutException(message, screen, stacktrace)
+selenium.common.exceptions.TimeoutException: Message:
+Stacktrace:
+RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
+WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
+NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:511:5
+dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16
+ Traceback (most recent call last): + File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 229, in test_filepicker_two_file + accordions[0].click() +IndexError: list index out of range+
Traceback (most recent call last):
+ File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 60, in tearDownClass
+ cls.stop_calibre_web()
+ File "/home/ozzie/Development/calibre-web-test/test/helper_ui.py", line 480, in stop_calibre_web
+ cls.driver.find_element(By.ID, 'admin_stop').click()
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 830, in find_element
+ return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
+ self.error_handler.check_response(response)
+ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
+ raise exception_class(message, screen, stacktrace)
+selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="admin_stop"]
+Stacktrace:
+RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
+WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5
+NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:511:5
+dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16
+