diff --git a/cps.py b/cps.py
index 16d84957..ca7d7230 100755
--- a/cps.py
+++ b/cps.py
@@ -23,8 +23,12 @@ import os
# Insert local directories into path
-sys.path.append(os.path.dirname(os.path.abspath(__file__)))
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
+if sys.version_info < (3, 0):
+ sys.path.append(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))))
+ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))), 'vendor'))
+else:
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
from cps import create_app
diff --git a/cps/__init__.py b/cps/__init__.py
index 50bd1781..6b8815e9 100755
--- a/cps/__init__.py
+++ b/cps/__init__.py
@@ -87,8 +87,8 @@ global_WorkerThread = WorkerThread()
from .server import WebServer
web_server = WebServer()
-from .ldap import Ldap
-ldap = Ldap()
+from .ldap_login import Ldap
+ldap1 = Ldap()
babel = Babel()
@@ -97,6 +97,12 @@ log = logger.create()
def create_app():
app.wsgi_app = ReverseProxied(app.wsgi_app)
+ # For python2 convert path to unicode
+ if sys.version_info < (3, 0):
+ app.static_folder = app.static_folder.decode('utf-8')
+ app.root_path = app.root_path.decode('utf-8')
+ app.instance_path = app.instance_path .decode('utf-8')
+
cache_buster.init_cache_busting(app)
log.info('Starting Calibre Web...')
@@ -106,7 +112,7 @@ def create_app():
web_server.init_app(app, config)
db.setup_db()
babel.init_app(app)
- ldap.init_app(app)
+ ldap1.init_app(app)
global_WorkerThread.start()
return app
diff --git a/cps/admin.py b/cps/admin.py
index 449c5684..4984e2f0 100644
--- a/cps/admin.py
+++ b/cps/admin.py
@@ -40,7 +40,7 @@ from sqlalchemy import and_
from sqlalchemy.exc import IntegrityError
from werkzeug.security import generate_password_hash
-from . import constants, logger, ldap
+from . import constants, logger, ldap1
from . import db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils
from .helper import speaking_language, check_valid_domain, check_unrar, send_test_mail, generate_random_password, \
send_registration_mail
@@ -48,7 +48,7 @@ from .gdriveutils import is_gdrive_ready, gdrive_support, downloadFile, deleteDa
from .web import admin_required, render_title_template, before_request, unconfigured, login_required_if_no_ano
feature_support = dict()
-feature_support['ldap'] = ldap.ldap_supported()
+feature_support['ldap'] = ldap1.ldap_supported()
try:
from goodreads.client import GoodreadsClient
diff --git a/cps/cli.py b/cps/cli.py
index 1bda9c93..de12be5a 100644
--- a/cps/cli.py
+++ b/cps/cli.py
@@ -82,6 +82,18 @@ parser.add_argument('-i', metavar='ip-adress', help='Server IP-Adress to listen'
parser.add_argument('-s', metavar='user:pass', help='Sets specific username to new password')
args = parser.parse_args()
+if sys.version_info < (3, 0):
+ if args.p:
+ args.p = args.p.decode('utf-8')
+ if args.g:
+ args.g = args.g.decode('utf-8')
+ if args.k:
+ args.k = args.k.decode('utf-8')
+ if args.c:
+ args.c = args.c.decode('utf-8')
+ if args.s:
+ args.s = args.s.decode('utf-8')
+
settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db")
gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db")
diff --git a/cps/constants.py b/cps/constants.py
index aaf0cd21..fce91312 100644
--- a/cps/constants.py
+++ b/cps/constants.py
@@ -24,7 +24,12 @@ from collections import namedtuple
# Base dir is parent of current file, necessary if called from different folder
-BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir))
+if sys.version_info < (3, 0):
+ BASE_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),os.pardir)).decode('utf-8')
+else:
+ BASE_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),os.pardir))
STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static')
TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates')
TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations')
diff --git a/cps/db.py b/cps/db.py
index 2cd959ad..5429e93c 100755
--- a/cps/db.py
+++ b/cps/db.py
@@ -342,7 +342,7 @@ def setup_db():
try:
if not os.path.exists(dbpath):
raise
- engine = create_engine('sqlite:///' + dbpath,
+ engine = create_engine('sqlite:///{0}'.format(dbpath),
echo=False,
isolation_level="SERIALIZABLE",
connect_args={'check_same_thread': False})
diff --git a/cps/ldap.py b/cps/ldap_login.py
similarity index 95%
rename from cps/ldap.py
rename to cps/ldap_login.py
index 0688475a..dcded6f6 100644
--- a/cps/ldap.py
+++ b/cps/ldap_login.py
@@ -16,10 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
Start Time: 2019-05-12 18:51:22.511134
+Start Time: 2019-06-22 21:54:40.897700
Stop Time: 2019-05-12 19:42:21.577115
+Stop Time: 2019-06-22 22:37:09.413469
Duration: 0:50:59.065981
+Duration: 0:42:28.515769
pt3.2: Incomming connection 127.0.0.1:45562 -127.0.0.1:45562 Timeouted+
pt3.2: Incomming connection 127.0.0.1:45526 +127.0.0.1:45526 Timeouted
pt3.3: Incomming connection 127.0.0.1:45564 +pt3.3: Incomming connection 127.0.0.1:45528 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45564)) -('Message addressed from:', '<name@host.com> size=507') +('Receiving message from:', ('127.0.0.1', 45528)) +('Message addressed from:', '<name@host.com> size=508') ('Message addressed to :', ['a1@b.com']) -('Message length :', 506) +('Message length :', 507) Received: QUIT
pt3.4: Incomming connection 127.0.0.1:45566 +pt3.4: Incomming connection 127.0.0.1:45530 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45566)) -('Message addressed from:', '<name@host.com> size=30377') +('Receiving message from:', ('127.0.0.1', 45530)) +('Message addressed from:', '<name@host.com> size=30379') ('Message addressed to :', ['a1@b.com']) -('Message length :', 30376) +('Message length :', 30378) Received: QUIT
pt4.1: Incomming connection 127.0.0.1:45674 -127.0.0.1:45674 Timeouted+
pt4.1: Incomming connection 127.0.0.1:45622 +127.0.0.1:45622 Timeouted
pt4.2: Incomming connection 127.0.0.1:45680 -127.0.0.1:45680 Timeouted+
pt4.2: Incomming connection 127.0.0.1:45624 +127.0.0.1:45624 Timeouted
pt4.3: Incomming connection 127.0.0.1:45682 +pt4.3: Incomming connection 127.0.0.1:45626 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45682)) +('Receiving message from:', ('127.0.0.1', 45626)) ('Message addressed from:', '<name@host.com> size=523') ('Message addressed to :', ['a1@b.com']) ('Message length :', 506) @@ -783,14 +783,14 @@ Received: QUITaria-hidden="true">×
pt4.4: Incomming connection 127.0.0.1:45684 +pt4.4: Incomming connection 127.0.0.1:45628 Received: EHLO Received: AUTH User: name@host.com, Password: 10234 Received: MAIL Received: RCPT Received: DATA -('Receiving message from:', ('127.0.0.1', 45684)) +('Receiving message from:', ('127.0.0.1', 45628)) ('Message addressed from:', '<name@host.com> size=30788') ('Message addressed to :', ['a1@b.com']) ('Message length :', 30378) @@ -801,78 +801,118 @@ Received: QUIT-- test_logging.test_logging_Python27 -5 ++ -unittest.suite._ErrorHolder +3 +0 +0 3 -1 0 -1 - Detail + Detail + - - -test_debug_log+test_logging_Python27)PASS -- -- test_failed_login++ -+ ERROR ++ + + +PASS + - - test_failed_register+test_anonymous_Python27)- + - - -test_logfile_change-PASS -- - test_logfile_recover+test_updater)- - -test_anonymous.test_anonymous_Python27 +test_anonymous.test_anonymous_Python36 10 10 0 @@ -1545,834 +1585,3800 @@ AssertionError: logfile config value is not empty after reseting to defaultPASS - -test_anonymous.test_anonymous_Python36 -10 -10 -0 -0 -0 -- Detail - -- -- -test_guest_about-PASS -- -- -test_guest_change_visibility_category-PASS -- -- -test_guest_change_visibility_hot-PASS -- -- -test_guest_change_visibility_language-PASS -- -- -test_guest_change_visibility_publisher-PASS -- -- -test_guest_change_visibility_rated-PASS -- -- -test_guest_change_visibility_series-PASS -- -- -test_guest_random_books_available-PASS -- -- -test_guest_visibility_read-PASS -- -- -test_guest_visibility_sidebar-PASS -+ - test_user_template.test_user_template_Python27 -14 -11 +25 0 0 +22 3 - Detail + Detail + - - test_author_user_templatePASS -- -- -test_best_user_template-PASS -- -- -test_category_user_template-PASS -- -- -test_detail_random_user_template-PASS -- -- -test_hot_user_template-PASS -- -- -test_language_user_template-PASS -- -- test_limit_book_languages-- + - - test_mature_content_settings+test_author_user_template- - -- -test_publisher_user_template-PASS -- -- -test_random_user_template-PASS -- -- -test_read_user_template-PASS -- -- -test_recent_user_template-PASS -- -- -test_series_user_template-PASS -+ - - test_ui_language_settings+test_best_user_template- - -test_user_template.test_user_template_Python36 -14 -11 -0 -0 -3 -- Detail - -- -- -test_author_user_template-PASS -+ - - test_best_user_templatePASS -- -- -test_category_user_template-PASS -- -- -test_detail_random_user_template-PASS -- -- -test_hot_user_template-PASS -- -- -test_language_user_template-PASS -- -- test_limit_book_languages-- + - - test_mature_content_settings+test_category_user_template- - -- -test_publisher_user_template-PASS -+ - - -test_random_user_template+test_category_user_templatePASS -- -- test_read_user_template++ -+ ERROR ++ + + +PASS + - - -test_recent_user_template+test_detail_random_user_templatePASS -- -- test_series_user_template++ -+ ERROR ++ + + +PASS + - - test_ui_language_settings+test_detail_random_user_template- - -test_updater.test_updater -1 -0 -0 -0 -1 -- Detail - -+ - - test_updater+test_hot_user_template- - -test_cli.test_cli_Python27 -6 -5 -0 -0 -1 -- Detail - -+ - - -test_already_started+test_hot_user_templatePASS -- -- test_cli_SSL_files++ -+ ERROR ++ + + +PASS + - - -test_cli_different_folder+test_language_user_templatePASS -- -- test_cli_different_settings_database++ -+ ERROR ++ + + +PASS + - - test_cli_gdrive_location+test_language_user_template- + - - -test_environ_port_setting+test_limit_book_languagesPASS -- -test_cli.test_cli_Python36 -6 -5 -0 -0 -1 -- Detail + + + SKIP ++ + + ++ - - -test_already_started+test_mature_content_settingsPASS -- -- test_cli_SSL_files++ -+ SKIP ++ + + +PASS + - - -test_cli_different_folder+test_publisher_user_templatePASS -- -- test_cli_different_settings_database++ -+ ERROR ++ + + +PASS + - - test_cli_gdrive_location+test_publisher_user_template- + - - -test_environ_port_setting-PASS -- -test_shelf.test_shelf_Python27 -7 -6 -1 -0 -0 -- Detail + -test_random_user_template- -- test_delete_book_of_shelf++ -+ ERROR ++ + + +PASS + - - -test_private_shelf+test_random_user_templatePASS -- -- test_public_private_shelf++ -+ ERROR ++ + + +PASS + - - -test_public_shelf+test_read_user_templatePASS -- -- test_rename_shelf++ -+ ERROR ++ + + +PASS + - - test_shelf_database_change+test_read_user_template- + - - -test_shelf_long_name+test_recent_user_templatePASS -- +test_shelf.test_shelf_Python36 -7 -6 -1 ++ ++ ERROR ++ + + + ++ ++ +test_recent_user_template++ ++ ERROR ++ + + + ++ ++ +test_series_user_template++ ++ ERROR ++ + + + ++ ++ +test_series_user_template++ ++ ERROR ++ + + + ++ ++ +test_ui_language_settings++ ++ SKIP ++ + + + ++ -test_user_template.test_user_template_Python36 +14 +11 0 0 +3 - Detail + Detail + - - test_delete_book_of_shelf+test_author_user_templatePASS + - - test_private_shelf+test_best_user_templatePASS + - - test_public_private_shelf+test_category_user_templatePASS + - - test_public_shelf+test_detail_random_user_templatePASS + - - test_rename_shelf+test_hot_user_templatePASS + + - +test_shelf_database_change+test_language_user_template+PASS ++ -+ test_limit_book_languages- + - - -test_shelf_long_name+test_mature_content_settingsPASS -- -test_login.test_login_Python27 -7 -7 -0 -0 -0 -- Detail + + + SKIP ++ + + ++ - - test_login_capital_letters_user_unicode_password_passwort+test_publisher_user_templatePASS + - - test_login_delete_admin+test_random_user_templatePASS + - - test_login_empty_password+test_read_user_templatePASS + - - test_login_locale_select+test_recent_user_templatePASS + - - test_login_protected+test_series_user_templatePASS + - - -test_login_unicode_user_space_end_passwort+test_ui_language_settingsPASS -- -- test_login_user_with_space_passwort_end_space++ -+ SKIP ++ + + +PASS - test_login.test_login_Python36 -7 -7 -0 ++ -test_cli.test_cli_Python27 +6 +5 0 0 +1 - Detail + Detail + - - test_login_capital_letters_user_unicode_password_passwort+test_already_startedPASS + - - test_login_delete_admin+test_cli_SSL_filesPASS + - - test_login_empty_password+test_cli_different_folderPASS + - - test_login_locale_select+test_cli_different_settings_databasePASS + - - -test_login_protected+test_cli_gdrive_locationPASS -- -- test_login_unicode_user_space_end_passwort++ -+ SKIP ++ + + +PASS + + - test_login_user_with_space_passwort_end_space+test_environ_port_settingPASS + +test_cli.test_cli_Python36 +6 +5 +0 +0 +1 ++ Detail + ++ ++ +test_already_started+PASS ++ ++ +test_cli_SSL_files+PASS ++ ++ +test_cli_different_folder+PASS ++ ++ +test_cli_different_settings_database+PASS ++ ++ +test_cli_gdrive_location++ ++ SKIP ++ + + + ++ ++ +test_environ_port_setting+PASS ++ +test_shelf.test_shelf_Python27 +7 +6 +1 +0 +0 ++ Detail + ++ ++ +test_delete_book_of_shelf+PASS ++ ++ +test_private_shelf+PASS ++ ++ +test_public_private_shelf+PASS ++ ++ +test_public_shelf+PASS ++ ++ +test_rename_shelf+PASS ++ ++ +test_shelf_database_change++ ++ FAIL ++ + + + ++ ++ +test_shelf_long_name+PASS ++ +test_shelf.test_shelf_Python36 +7 +6 +1 +0 +0 ++ Detail + ++ ++ +test_delete_book_of_shelf+PASS ++ ++ +test_private_shelf+PASS ++ ++ +test_public_private_shelf+PASS ++ ++ +test_public_shelf+PASS ++ ++ +test_rename_shelf+PASS ++ ++ +test_shelf_database_change++ ++ FAIL ++ + + + ++ ++ +test_shelf_long_name+PASS ++ +test_login.test_login_Python27 +13 +0 +0 +13 +0 ++ Detail + ++ ++ +test_login_capital_letters_user_unicode_password_passwort++ ++ ERROR ++ + + + ++ ++ +test_login_capital_letters_user_unicode_password_passwort++ ++ ERROR ++ + + + ++ ++ +test_login_delete_admin++ ++ ERROR ++ + + + ++ ++ +test_login_delete_admin++ ++ ERROR ++ + + + ++ ++ +test_login_empty_password++ ++ ERROR ++ + + + ++ ++ +test_login_empty_password++ ++ ERROR ++ + + + ++ ++ +test_login_locale_select++ ++ ERROR ++ + + + ++ ++ +test_login_protected++ ++ ERROR ++ + + + ++ ++ +test_login_protected++ ++ ERROR ++ + + + ++ ++ +test_login_unicode_user_space_end_passwort++ ++ ERROR ++ + + + ++ ++ +test_login_unicode_user_space_end_passwort++ ++ ERROR ++ + + + ++ ++ +test_login_user_with_space_passwort_end_space++ ++ ERROR ++ + + + ++ ++ +test_login_user_with_space_passwort_end_space++ ++ ERROR ++ + + + ++ +test_login.test_login_Python36 +7 +7 +0 +0 +0 ++ Detail + ++ ++ +test_login_capital_letters_user_unicode_password_passwort+PASS ++ ++ +test_login_delete_admin+PASS ++ ++ +test_login_empty_password+PASS ++ ++ +test_login_locale_select+PASS ++ ++ +test_login_protected+PASS ++ ++ +test_login_unicode_user_space_end_passwort+PASS ++ ++ +test_login_user_with_space_passwort_end_space+PASS ++ +test_ebook_convert.test_ebook_convert_Python27 +22 +0 +0 +22 +0 ++ Detail + ++ ++ +test_SSL_smtp_setup_error++ ++ ERROR ++ + + + ++ ++ +test_SSL_smtp_setup_error++ ++ ERROR ++ + + + ++ ++ +test_STARTTLS_smtp_setup_error++ ++ ERROR ++ + + + ++ ++ +test_STARTTLS_smtp_setup_error++ ++ ERROR ++ + + + ++ ++ +test_convert_deactivate++ ++ ERROR ++ + + + ++ ++ +test_convert_deactivate++ ++ ERROR ++ + + + ++ ++ +test_convert_email++ ++ ERROR ++ + + + ++ ++ +test_convert_email++ ++ ERROR ++ + + + ++ ++ +test_convert_failed_and_email++ ++ ERROR ++ + + + ++ ++ +test_convert_failed_and_email++ ++ ERROR ++ + + + ++ ++ +test_convert_only++ ++ ERROR ++ + + + ++ ++ +test_convert_only++ ++ ERROR ++ + + + ++ ++ +test_convert_parameter++ ++ ERROR ++ + + + ++ ++ +test_convert_parameter++ ++ ERROR ++ + + + ++ ++ +test_convert_wrong_excecutable++ ++ ERROR ++ + + + ++ ++ +test_convert_wrong_excecutable++ ++ ERROR ++ + + + ++ ++ +test_email_failed++ ++ ERROR ++ + + + ++ ++ +test_email_failed++ ++ ERROR ++ + + + ++ ++ +test_email_only++ ++ ERROR ++ + + + ++ ++ +test_email_only++ ++ ERROR ++ + + + ++ ++ +test_kindle_send_not_configured++ ++ ERROR ++ + + + ++ + +test_kindle_send_not_configured++ ++ ERROR ++ + + + +- -test_ebook_convert.test_ebook_convert_Python27 +test_ebook_convert.test_ebook_convert_Python36 11 9 2 0 0 - Detail + Detail + - test_SSL_smtp_setup_error- + - test_STARTTLS_smtp_setup_error- + - test_convert_deactivate- + - test_convert_email- + - test_convert_failed_and_email- + - test_convert_only- + - test_convert_parameterPASS + - test_convert_wrong_excecutable- + - test_email_failedPASS + - test_email_only- + - test_kindle_send_not_configuredPASS - test_ebook_convert.test_ebook_convert_Python36 -11 -4 -7 ++ -test_visiblilitys.calibre_web_visibilitys_Python27 +16 0 0 +16 +0 - Detail + Detail + - - test_SSL_smtp_setup_error+test_about- + - - test_STARTTLS_smtp_setup_error+test_admin_SMTP_Settings- + - - test_convert_deactivate+test_admin_add_user- + - - test_convert_email+test_admin_change_password- + - - test_convert_failed_and_email+test_admin_change_visibility_authors- + - - test_convert_only+test_admin_change_visibility_category- + - - test_convert_parameter+test_admin_change_visibility_hot- + - - test_convert_wrong_excecutable+test_admin_change_visibility_language- + - - test_email_failed+test_admin_change_visibility_publisher- + - - test_email_only+test_admin_change_visibility_rated- - -- -test_kindle_send_not_configured-PASS -- -test_visiblilitys.calibre_web_visibilitys_Python27 -16 -16 -0 -0 -0 -- Detail - -- -- -test_about-PASS -- -- -test_admin_SMTP_Settings-PASS -- -- -test_admin_add_user-PASS -- -- -test_admin_change_password-PASS -- -- -test_admin_change_visibility_authors-PASS -- -- -test_admin_change_visibility_category-PASS -- -- -test_admin_change_visibility_hot-PASS -- -- -test_admin_change_visibility_language-PASS -- -- -test_admin_change_visibility_publisher-PASS -- -- -test_admin_change_visibility_rated-PASS -+ - - test_admin_change_visibility_readPASS ++ + ERROR ++ + + + ++ - - test_admin_change_visibility_seriesPASS ++ + ERROR ++ + + + ++ - - test_checked_logged_inPASS ++ + ERROR ++ + + + ++ - - test_random_books_availablePASS ++ + ERROR ++ + + + ++ - - test_user_email_availablePASS ++ + ERROR ++ + + + ++ - test_user_visibility_sidebarPASS ++ + ERROR ++ + + + +- test_visiblilitys.calibre_web_visibilitys_Python36 @@ -2989,647 +6495,1259 @@ AssertionError: 'Waiting' != 'Finished'0 0 - Detail + Detail + - test_aboutPASS + - test_admin_SMTP_SettingsPASS + - test_admin_add_userPASS + - test_admin_change_passwordPASS + - test_admin_change_visibility_authorsPASS + - test_admin_change_visibility_categoryPASS + - test_admin_change_visibility_hotPASS + - test_admin_change_visibility_languagePASS + - test_admin_change_visibility_publisherPASS + - test_admin_change_visibility_ratedPASS + - test_admin_change_visibility_readPASS + - test_admin_change_visibility_seriesPASS + - test_checked_logged_inPASS + - test_random_books_availablePASS + - test_user_email_availablePASS + - test_user_visibility_sidebarPASS + + test_edit_books.test_edit_books_Python27 23 -11 -1 0 +0 +12 11 - Detail + Detail + ++ -+ +test_database_errors++ + SKIP ++ + + ++ - - test_database_errors+test_delete_book- + - - test_delete_book+test_delete_format- + - - test_delete_format+test_edit_author- - -- -test_edit_author-PASS -+ - - test_edit_categoryPASS ++ + ERROR ++ + + + ++ - - test_edit_commentsPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_boolPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_ratingPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_single_selectPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_textPASS ++ + ERROR ++ + + + ++ - - test_edit_languagePASS ++ + ERROR ++ + + + ++ - - test_edit_publisherPASS ++ + ERROR ++ + + + ++ - test_edit_publishing_date- + - - test_edit_ratingPASS ++ + ERROR ++ + + + ++ - - test_edit_seriesPASS ++ + ERROR ++ + + + ++ - test_edit_title- + - test_rename_uppercase_lowercase- + - test_typeahead_author- + - test_typeahead_language- + - test_typeahead_publisher- + - test_typeahead_series- + - test_typeahead_tag- + - test_upload_cover_hdd- + - test_edit_books.test_edit_books_Python36 23 -11 +7 1 -0 +4 11 - Detail + Detail + - test_database_errors- + - test_delete_book- + - test_delete_format- + - test_edit_authorPASS + - test_edit_categoryPASS + - test_edit_commentsPASS + - - test_edit_custom_boolPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_ratingPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_single_selectPASS ++ + ERROR ++ + + + ++ - - test_edit_custom_textPASS ++ + ERROR ++ + + + ++ - test_edit_languagePASS + - test_edit_publisherPASS + - test_edit_publishing_date- + - test_edit_ratingPASS + - test_edit_seriesPASS + - test_edit_title- + - test_rename_uppercase_lowercase- + - test_typeahead_author- + - test_typeahead_language- + - test_typeahead_publisher- + - test_typeahead_series- + - test_typeahead_tag- + - test_upload_cover_hdd- + - test_email_STARTTLS.test_STARTTLS_Python27 2 -2 0 0 +2 0 - Detail + Detail + - test_STARTTLS- + - test_STARTTLS_SSL_setup_error- + - test_STARTTLS- + - test_STARTTLS_SSL_setup_error- + - test_author_sortPASS + - test_author_sort_commaPASS + - test_author_sort_juniorPASS + - test_author_sort_onewordPASS + - test_author_sort_romanPASS + - test_check_Limit_LengthPASS + - test_check_char_replacementPASS + - test_check_chinese_CharactersPASS + - test_check_degEUR_replacementPASS + - test_check_doubleSPASS + - test_check_finish_DotPASS + - test_check_high23PASS + @@ -4034,17 +8144,17 @@ Received: QUIT test_check_umlautsTotal -266 -178 -15 -0 -73 +281 +110 +6 +94 +71