Commit 8acd1f1f authored by Ozzie Isaacs's avatar Ozzie Isaacs

Code refactoring and improved error handling for edit user list

Update teststatus
parent 665210e5
......@@ -42,7 +42,8 @@ from sqlalchemy.sql.expression import func, or_
from . import constants, logger, helper, services
from .cli import filepicker
from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils
from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash
from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash, check_email, \
valid_email, check_username
from .gdriveutils import is_gdrive_ready, gdrive_support
from .render_template import render_title_template, get_sidebar_config
from . import debug_info
......@@ -151,7 +152,7 @@ def shutdown():
else:
showtext['text'] = _(u'Performing shutdown of server, please close window')
# stop gevent/tornado server
web_server.stop(task == 0)
web_server.stop(task==0)
return json.dumps(showtext)
if task == 2:
......@@ -241,9 +242,8 @@ def edit_user_table():
@admin_required
def list_users():
off = request.args.get("offset") or 0
limit = request.args.get("limit") or 40
limit = request.args.get("limit") or 10
search = request.args.get("search")
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)
......@@ -259,22 +259,13 @@ def list_users():
filtered_count = total_count
for user in users:
# set readable locale
#try:
# user.local = LC.parse(user.locale).get_language_name(get_locale())
#except UnknownLocaleError:
# # This should not happen
# user.local = _(isoLanguages.get(part1=user.locale).name)
# Set default language
if user.default_language == "all":
user.default = _("all")
else:
user.default = LC.parse(user.default_language).get_language_name(get_locale())
table_entries = {'totalNotFiltered': total_count, 'total': filtered_count, "rows": users}
js_list = json.dumps(table_entries, cls=db.AlchemyEncoder)
response = make_response(js_list)
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
......@@ -294,7 +285,7 @@ def table_get_locale():
ret = list()
current_locale = get_locale()
for loc in locale:
ret.append({'value':str(loc),'text':loc.get_language_name(current_locale)})
ret.append({'value': str(loc), 'text': loc.get_language_name(current_locale)})
return json.dumps(ret)
......@@ -306,7 +297,7 @@ def table_get_default_lang():
ret = list()
ret.append({'value':'all','text':_('Show All')})
for lang in languages:
ret.append({'value':lang.lang_code,'text': lang.name})
ret.append({'value': lang.lang_code, 'text': lang.name})
return json.dumps(ret)
......@@ -333,25 +324,25 @@ def edit_list_user(param):
else:
return ""
for user in users:
if param =='name':
if not ub.session.query(ub.User).filter(ub.User.name == vals['value']).scalar():
user.name = vals['value']
else:
log.error(u"This username is already taken")
return _(u"This username is already taken"), 400
try:
vals['value'] = vals['value'].strip()
if param == 'name':
if user.name == "Guest":
raise Exception(_("Guest Name can't be changed"))
user.name = check_username(vals['value'])
elif param =='email':
existing_email = ub.session.query(ub.User).filter(ub.User.email == vals['value'].lower()).first()
if not existing_email:
user.email = vals['value']
else:
log.error(u"Found an existing account for this e-mail address.")
return _(u"Found an existing account for this e-mail address."), 400
user.email = check_email(vals['value'])
elif param == 'kindle_mail':
user.kindle_mail = vals['value']
user.kindle_mail = valid_email(vals['value']) if vals['value'] else ""
elif param == 'role':
if vals['value'] == 'true':
user.role |= int(vals['field_index'])
else:
if int(vals['field_index']) == constants.ROLE_ADMIN:
if not ub.session.query(ub.User).\
filter(ub.User.role.op('&')(constants.ROLE_ADMIN) == constants.ROLE_ADMIN,
ub.User.id != user.id).count():
return _(u"No admin user remaining, can't remove admin role", nick=user.name), 400
user.role &= ~int(vals['field_index'])
elif param == 'sidebar_view':
if vals['value'] == 'true':
......@@ -370,6 +361,8 @@ def edit_list_user(param):
user.locale = vals['value']
elif param == 'default_language':
user.default_language = vals['value']
except Exception as ex:
return str(ex), 400
ub.session_commit()
return ""
......@@ -378,7 +371,6 @@ def edit_list_user(param):
@login_required
@admin_required
def update_table_settings():
# ToDo: Save table settings
current_user.view_settings['useredit'] = json.loads(request.data)
try:
try:
......@@ -387,7 +379,7 @@ def update_table_settings():
pass
ub.session.commit()
except (InvalidRequestError, OperationalError):
log.error("Invalid request received: %r ", request, )
log.error("Invalid request received: {}".format(request))
return "Invalid request", 400
return ""
......@@ -787,7 +779,6 @@ def pathchooser():
folders = []
files = []
# locale = get_locale()
for f in folders:
try:
data = {"name": f, "fullpath": os.path.join(cwd, f)}
......@@ -932,7 +923,7 @@ def _configuration_ldap_helper(to_save, gdrive_error):
reboot_required |= _config_string(to_save, "config_ldap_cert_path")
reboot_required |= _config_string(to_save, "config_ldap_key_path")
_config_string(to_save, "config_ldap_group_name")
if "config_ldap_serv_password" in to_save and to_save["config_ldap_serv_password"] != "":
if to_save.get("config_ldap_serv_password", "") != "":
reboot_required |= 1
config.set_from_dictionary(to_save, "config_ldap_serv_password", base64.b64encode, encode='UTF-8')
config.save()
......@@ -970,7 +961,7 @@ def _configuration_ldap_helper(to_save, gdrive_error):
return reboot_required, _configuration_result(_('LDAP User Object Filter Has Unmatched Parenthesis'),
gdrive_error)
if "ldap_import_user_filter" in to_save and to_save["ldap_import_user_filter"] == '0':
if to_save.get("ldap_import_user_filter") == '0':
config.config_ldap_member_user_object = ""
else:
if config.config_ldap_member_user_object.count("%s") != 1:
......@@ -1095,8 +1086,8 @@ def _configuration_update_helper(configured):
if config.config_use_google_drive and is_gdrive_ready() and not os.path.exists(metadata_db):
gdriveutils.downloadFile(None, "metadata.db", metadata_db)
db_change = True
except Exception as e:
return _configuration_result('%s' % e, gdrive_error, configured)
except Exception as ex:
return _configuration_result('%s' % ex, gdrive_error, configured)
if db_change:
if not calibre_db.setup_db(config, ub.app_DB_path):
......@@ -1148,7 +1139,6 @@ def _configuration_result(error_flash=None, gdrive_error=None, configured=True):
def _handle_new_user(to_save, content, languages, translations, kobo_support):
content.default_language = to_save["default_language"]
# content.mature_content = "Show_mature_content" in to_save
content.locale = to_save.get("locale", content.locale)
content.sidebar_view = sum(int(key[5:]) for key in to_save if key.startswith('show_'))
......@@ -1156,28 +1146,21 @@ def _handle_new_user(to_save, content, languages, translations, kobo_support):
content.sidebar_view |= constants.DETAIL_RANDOM
content.role = constants.selected_roles(to_save)
if not to_save["name"] or not to_save["email"] or not to_save["password"]:
flash(_(u"Please fill out all fields!"), category="error")
return render_title_template("user_edit.html", new_user=1, content=content, translations=translations,
registered_oauth=oauth_check, kobo_support=kobo_support,
title=_(u"Add new user"))
content.password = generate_password_hash(to_save["password"])
existing_user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == to_save["name"].lower()) \
.first()
existing_email = ub.session.query(ub.User).filter(ub.User.email == to_save["email"].lower()) \
.first()
if not existing_user and not existing_email:
content.name = to_save["name"]
if config.config_public_reg and not check_valid_domain(to_save["email"]):
flash(_(u"E-mail is not from valid domain"), category="error")
return render_title_template("user_edit.html", new_user=1, content=content, translations=translations,
registered_oauth=oauth_check, kobo_support=kobo_support,
title=_(u"Add new user"))
else:
content.email = to_save["email"]
else:
flash(_(u"Found an existing account for this e-mail address or name."), category="error")
try:
if not to_save["name"] or not to_save["email"] or not to_save["password"]:
log.info("Missing entries on new user")
raise Exception(_(u"Please fill out all fields!"))
content.email = check_email(to_save["email"])
# Query User name, if not existing, change
content.name = check_username(to_save["name"])
if to_save.get("kindle_mail"):
content.kindle_mail = valid_email(to_save["kindle_mail"])
if config.config_public_reg and not check_valid_domain(content.email):
log.info("E-mail: {} for new user is not from valid domain".format(content.email))
raise Exception(_(u"E-mail is not from valid domain"))
except Exception as ex:
flash(str(ex), category="error")
return render_title_template("user_edit.html", new_user=1, content=content, translations=translations,
languages=languages, title=_(u"Add new user"), page="newuser",
kobo_support=kobo_support, registered_oauth=oauth_check)
......@@ -1199,7 +1182,7 @@ def _handle_new_user(to_save, content, languages, translations, kobo_support):
def _handle_edit_user(to_save, content, languages, translations, kobo_support):
if "delete" in to_save:
if to_save.get("delete"):
if ub.session.query(ub.User).filter(ub.User.role.op('&')(constants.ROLE_ADMIN) == constants.ROLE_ADMIN,
ub.User.id != content.id).count():
ub.session.query(ub.User).filter(ub.User.id == content.id).delete()
......@@ -1214,8 +1197,7 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
ub.User.id != content.id).count() and 'admin_role' not in to_save:
flash(_(u"No admin user remaining, can't remove admin role", nick=content.name), category="error")
return redirect(url_for('admin.admin'))
if "password" in to_save and to_save["password"]:
if to_save.get("password"):
content.password = generate_password_hash(to_save["password"])
anonymous = content.is_anonymous
content.role = constants.selected_roles(to_save)
......@@ -1233,22 +1215,27 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
elif value not in val and content.check_visibility(value):
content.sidebar_view &= ~value
if "Show_detail_random" in to_save:
if to_save.get("Show_detail_random"):
content.sidebar_view |= constants.DETAIL_RANDOM
else:
content.sidebar_view &= ~constants.DETAIL_RANDOM
if "default_language" in to_save:
if to_save.get("default_language"):
content.default_language = to_save["default_language"]
if "locale" in to_save and to_save["locale"]:
if to_save.get("locale"):
content.locale = to_save["locale"]
if to_save["email"] and to_save["email"] != content.email:
existing_email = ub.session.query(ub.User).filter(ub.User.email == to_save["email"].lower()) \
.first()
if not existing_email:
content.email = to_save["email"]
else:
flash(_(u"Found an existing account for this e-mail address."), category="error")
try:
if to_save.get("email", content.email) != content.email:
content.email = check_email(to_save["email"])
# Query User name, if not existing, change
if to_save.get("name", content.name) != content.name:
if to_save.get("name") == "Guest":
raise Exception(_("Guest Name can't be changed"))
content.name = check_username(to_save["name"])
if to_save.get("kindle_mail") != content.kindle_mail:
content.kindle_mail = valid_email(to_save["kindle_mail"]) if to_save["kindle_mail"] else ""
except Exception as ex:
flash(str(ex), category="error")
return render_title_template("user_edit.html",
translations=translations,
languages=languages,
......@@ -1257,25 +1244,8 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
new_user=0,
content=content,
registered_oauth=oauth_check,
title=_(u"Edit User %(nick)s", nick=content.name), page="edituser")
if "name" in to_save and to_save["name"] != content.name:
# Query User name, if not existing, change
if not ub.session.query(ub.User).filter(ub.User.name == to_save["name"]).scalar():
content.name = to_save["name"]
else:
flash(_(u"This username is already taken"), category="error")
return render_title_template("user_edit.html",
translations=translations,
languages=languages,
mail_configured=config.get_mail_server_configured(),
new_user=0, content=content,
registered_oauth=oauth_check,
kobo_support=kobo_support,
title=_(u"Edit User %(nick)s", nick=content.name),
page="edituser")
if "kindle_mail" in to_save and to_save["kindle_mail"] != content.kindle_mail:
content.kindle_mail = to_save["kindle_mail"]
try:
ub.session_commit()
flash(_(u"User '%(nick)s' updated", nick=content.name), category="success")
......@@ -1330,10 +1300,10 @@ def update_mailsettings():
elif to_save.get("gmail"):
try:
config.mail_gmail_token = services.gmail.setup_gmail(config.mail_gmail_token)
flash(_(u"G-Mail Account Verification Successfull"), category="success")
except Exception as e:
flash(e, category="error")
log.error(e)
flash(_(u"G-Mail Account Verification Successful"), category="success")
except Exception as ex:
flash(str(ex), category="error")
log.error(ex)
return edit_mailsettings()
else:
......@@ -1389,7 +1359,8 @@ def edit_user(user_id):
registered_oauth=oauth_check,
mail_configured=config.get_mail_server_configured(),
kobo_support=kobo_support,
title=_(u"Edit User %(nick)s", nick=content.name), page="edituser")
title=_(u"Edit User %(nick)s", nick=content.name),
page="edituser")
@admi.route("/admin/resetpassword/<int:user_id>")
......@@ -1530,9 +1501,12 @@ def ldap_import_create_user(user, user_data):
else:
log.debug('No Mail Field Found in LDAP Response')
useremail = username + '@email.com'
try:
# check for duplicate email
if ub.session.query(ub.User).filter(func.lower(ub.User.email) == useremail.lower()).first():
log.warning("LDAP Email %s Already in Database", user_data)
useremail = check_email(useremail)
except Exception as ex:
log.warning("LDAP Email Error: {}, {}".format(user_data, ex))
return 0, None
content = ub.User()
content.name = username
......@@ -1549,8 +1523,8 @@ def ldap_import_create_user(user, user_data):
try:
ub.session.commit()
return 1, None # increase no of users
except Exception as e:
log.warning("Failed to create LDAP user: %s - %s", user, e)
except Exception as ex:
log.warning("Failed to create LDAP user: %s - %s", user, ex)
ub.session.rollback()
message = _(u'Failed to Create at Least One LDAP User')
return 0, message
......@@ -1583,16 +1557,16 @@ def import_ldap_users():
query_filter = config.config_ldap_user_object
try:
user_identifier = extract_user_identifier(user, query_filter)
except Exception as e:
log.warning(e)
except Exception as ex:
log.warning(ex)
continue
else:
user_identifier = user
query_filter = None
try:
user_data = services.ldap.get_object_details(user=user_identifier, query_filter=query_filter)
except AttributeError as e:
log.debug_or_exception(e)
except AttributeError as ex:
log.debug_or_exception(ex)
continue
if user_data:
user_count, message = ldap_import_create_user(user, user_data)
......
......@@ -105,8 +105,8 @@ def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecu
if extension in COVER_EXTENSIONS:
cover_data = cf.read(name)
break
except Exception as e:
log.debug('Rarfile failed with error: %s', e)
except Exception as ex:
log.debug('Rarfile failed with error: %s', ex)
return cover_data
......
......@@ -544,8 +544,8 @@ class CalibreDB():
conn = cls.engine.connect()
# conn.text_factory = lambda b: b.decode(errors = 'ignore') possible fix for #1302
except Exception as e:
config.invalidate(e)
except Exception as ex:
config.invalidate(ex)
return False
config.db_configured = True
......@@ -646,8 +646,8 @@ class CalibreDB():
pagination = Pagination(page, pagesize,
len(query.all()))
entries = query.order_by(*order).offset(off).limit(pagesize).all()
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
#for book in entries:
# book = self.order_authors(book)
return entries, randm, pagination
......@@ -791,7 +791,7 @@ class CalibreDB():
def lcase(s):
try:
return unidecode.unidecode(s.lower())
except Exception as e:
except Exception as ex:
log = logger.create()
log.debug_or_exception(e)
log.debug_or_exception(ex)
return s.lower()
......@@ -336,8 +336,8 @@ def delete_book(book_id, book_format, jsonResponse):
calibre_db.session.query(db.Data).filter(db.Data.book == book.id).\
filter(db.Data.format == book_format).delete()
calibre_db.session.commit()
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
calibre_db.session.rollback()
else:
# book not found
......@@ -726,10 +726,10 @@ def edit_book(book_id):
edited_books_id = None
# handle book title
modif_date |= handle_title_on_edit(book, to_save["book_title"])
title_change = handle_title_on_edit(book, to_save["book_title"])
input_authors, change = handle_author_on_edit(book, to_save["author_name"])
if change:
input_authors, authorchange = handle_author_on_edit(book, to_save["author_name"])
if authorchange or title_change:
edited_books_id = book.id
modif_date = True
......@@ -801,8 +801,8 @@ def edit_book(book_id):
calibre_db.session.rollback()
flash(error, category="error")
return render_edit_book(book_id)
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
calibre_db.session.rollback()
flash(_("Error editing book, please check logfile for details"), category="error")
return redirect(url_for('web.show_book', book_id=book.id))
......
......@@ -155,6 +155,6 @@ def on_received_watch_confirmation():
# prevent error on windows, as os.rename does on existing files, also allow cross hdd move
move(os.path.join(tmp_dir, "tmp_metadata.db"), dbpath)
calibre_db.reconnect_db(config, ub.app_DB_path)
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
return ''
......@@ -202,8 +202,8 @@ def getDrive(drive=None, gauth=None):
gauth.Refresh()
except RefreshError as e:
log.error("Google Drive error: %s", e)
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
else:
# Initialize the saved creds
gauth.Authorize()
......@@ -497,8 +497,8 @@ def getChangeById (drive, change_id):
except (errors.HttpError) as error:
log.error(error)
return None
except Exception as e:
log.error(e)
except Exception as ex:
log.error(ex)
return None
......
......@@ -35,7 +35,7 @@ from babel.units import format_unit
from flask import send_from_directory, make_response, redirect, abort, url_for
from flask_babel import gettext as _
from flask_login import current_user
from sqlalchemy.sql.expression import true, false, and_, text
from sqlalchemy.sql.expression import true, false, and_, text, func
from werkzeug.datastructures import Headers
from werkzeug.security import generate_password_hash
......@@ -504,6 +504,31 @@ def uniq(inpt):
output.append(x)
return output
def check_email(email):
email = valid_email(email)
if ub.session.query(ub.User).filter(func.lower(ub.User.email) == email.lower()).first():
log.error(u"Found an existing account for this e-mail address")
raise Exception(_(u"Found an existing account for this e-mail address"))
return email
def check_username(username):
username = username.strip()
if ub.session.query(ub.User).filter(func.lower(ub.User.name) == username.lower()).scalar():
log.error(u"This username is already taken")
raise Exception (_(u"This username is already taken"))
return username
def valid_email(email):
email = email.strip()
# Regex according to https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#validation
if not re.search(r"^[\w.!#$%&'*+\\/=?^_`{|}~-]+@[\w](?:[\w-]{0,61}[\w])?(?:\.[\w](?:[\w-]{0,61}[\w])?)*$",
email):
log.error(u"Invalid e-mail address format")
raise Exception(_(u"Invalid e-mail address format"))
return email
# ################################# External interface #################################
......@@ -551,8 +576,8 @@ def get_book_cover_internal(book, use_generic_cover_on_failure):
else:
log.error('%s/cover.jpg not found on Google Drive', book.path)
return get_cover_on_failure(use_generic_cover_on_failure)
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
return get_cover_on_failure(use_generic_cover_on_failure)
else:
cover_file_path = os.path.join(config.config_calibre_dir, book.path)
......
......@@ -262,8 +262,8 @@ def generate_sync_response(sync_token, sync_results, set_cont=False):
extra_headers["x-kobo-sync-mode"] = store_response.headers.get("x-kobo-sync-mode")
extra_headers["x-kobo-recent-reads"] = store_response.headers.get("x-kobo-recent-reads")
except Exception as e:
log.error("Failed to receive or parse response from Kobo's sync endpoint: " + str(e))
except Exception as ex:
log.error("Failed to receive or parse response from Kobo's sync endpoint: {}".format(ex))
if set_cont:
extra_headers["x-kobo-sync"] = "continue"
sync_token.to_headers(extra_headers)
......
......@@ -147,8 +147,8 @@ def bind_oauth_or_register(provider_id, provider_user_id, redirect_url, provider
ub.session.commit()
flash(_(u"Link to %(oauth)s Succeeded", oauth=provider_name), category="success")
return redirect(url_for('web.profile'))
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
ub.session.rollback()
else:
flash(_(u"Login failed, No User Linked With OAuth Account"), category="error")
......@@ -194,8 +194,8 @@ def unlink_oauth(provider):
ub.session.commit()
logout_oauth_user()
flash(_(u"Unlink to %(oauth)s Succeeded", oauth=oauth_check[provider]), category="success")
except Exception as e:
log.debug_or_exception(e)
except Exception as ex:
log.debug_or_exception(ex)
ub.session.rollback()
flash(_(u"Unlink to %(oauth)s Failed", oauth=oauth_check[provider]), category="error")
except NoResultFound:
......
......@@ -159,9 +159,9 @@ class CalibreTask:
# catch any unhandled exceptions in a task and automatically fail it
try:
self.run(*args)
except Exception as e:
self._handleError(str(e))
log.debug_or_exception(e)
except Exception as ex:
self._handleError(str(ex))
log.debug_or_exception(ex)
self.end_time = datetime.now()
......
......@@ -255,13 +255,13 @@ def create_edit_shelf(shelf, title, page, shelf_id=False):
log.info(u"Shelf {} {}".format(to_save["title"], shelf_action))
flash(flash_text, category="success")
return redirect(url_for('shelf.show_shelf', shelf_id=shelf.id))
except (OperationalError, InvalidRequestError) as e:
except (OperationalError, InvalidRequestError) as ex:
ub.session.rollback()
log.debug_or_exception(e)
log.debug_or_exception(ex)
flash(_(u"Settings DB is not Writeable"), category="error")
except Exception as e:
except Exception as ex:
ub.session.rollback()
log.debug_or_exception(e)
log.debug_or_exception(ex)
flash(_(u"There was an error"), category="error")
return render_title_template('shelf_edit.html', shelf=shelf, title=title, page=page)
......
......@@ -452,6 +452,17 @@ $(function() {
$(this).next().text(elText);
});
},
onLoadSuccess: function () {
var guest = $(".editable[data-name='name'][data-value='Guest']");
guest.editable("disable");
$(".editable[data-name='locale'][data-pk='"+guest.data("pk")+"']").editable("disable");
$("input[data-name='admin_role'][data-pk='"+guest.data("pk")+"']").prop("disabled", true);
$("input[data-name='passwd_role'][data-pk='"+guest.data("pk")+"']").prop("disabled", true);
$("input[data-name='edit_shelf_role'][data-pk='"+guest.data("pk")+"']").prop("disabled", true);
// ToDo: Disable delete
},
// eslint-disable-next-line no-unused-vars
/*onEditableSave: function (field, row, oldvalue, $el) {
if (field === "title" || field === "authors") {
......@@ -612,9 +623,9 @@ function singleUserFormatter(value, row) {
function checkboxFormatter(value, row, index){
if(value & this.column)
return '<input type="checkbox" class="chk" checked onchange="checkboxChange(this, ' + row.id + ', \'' + this.field + '\', ' + this.column + ')">';
return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.name + '" checked onchange="checkboxChange(this, ' + row.id + ', \'' + this.field + '\', ' + this.column + ')">';
else
return '<input type="checkbox" class="chk" onchange="checkboxChange(this, ' + row.id + ', \'' + this.field + '\', ' + this.column + ')">';
return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.name + '" onchange="checkboxChange(this, ' + row.id + ', \'' + this.field + '\', ' + this.column + ')">';
}
function checkboxChange(checkbox, userId, field, field_index) {
......@@ -622,6 +633,11 @@ function checkboxChange(checkbox, userId, field, field_index) {
method:"post",
url: window.location.pathname + "/../../ajax/editlistusers/" + field,
data: {"pk":userId, "field_index":field_index, "value": checkbox.checked}
/*<div className="editable-buttons">
<button type="button" className="btn btn-default btn-sm editable-cancel"><i
className="glyphicon glyphicon-remove"></i></button>
</div>*/
/*<div className="editable-error-block help-block" style="">Text to show</div>*/
});
$.ajax({
method:"get",
......
......@@ -75,8 +75,8 @@ class TaskConvert(CalibreTask):
self.settings['body'],
internal=True)
)
except Exception as e:
return self._handleError(str(e))
except Exception as ex:
return self._handleError(str(ex))
def _convert_ebook_format(self):
error_message = None
......
......@@ -158,9 +158,9 @@ class TaskEmail(CalibreTask):
except socket.error as e:
log.debug_or_exception(e)
self._handleError(u'Socket Error sending email: {}'.format(e.strerror))
except Exception as e:
log.debug_or_exception(e)
self._handleError(u'Error sending email: {}'.format(e))
except Exception as ex:
log.debug_or_exception(ex)
self._handleError(u'Error sending email: {}'.format(ex))
def send_standard_email(self, msg):
......
......@@ -43,6 +43,7 @@
data-visible="{{visiblility.get(parameter)}}"
data-editable-type="select"
data-edit="true"
data-sortable="true"
data-editable-url="{{ url_for('admin.edit_list_user', param=parameter)}}"
data-editable-source={{url}}
{% if validate %}data-edit-validate="{{ _('This Field is Required') }}"{% endif %}>
......@@ -65,6 +66,7 @@
data-visible="{{visiblility.get(parameter)}}"
data-editable-type="select"
data-edit="true"
data-sortable="true"
data-editable-url="{{ url_for('admin.edit_list_user', param=parameter)}}"
data-editable-source={{url}}
{% if validate %}data-edit-validate="{{ _('This Field is Required') }}"{% endif %}>
......@@ -101,7 +103,7 @@
<th data-name="id" data-field="id" id="id" data-visible="false" data-switchable="false"></th>
{{ user_table_row('name', _('Enter Username'), _('Username'), true) }}
{{ user_table_row('email', _('Enter E-mail Address'), _('E-mail Address'), true) }}
{{ user_table_row('kindle_mail', _('Enter Kindle E-mail Address'), _('Kindle E-mail'), true) }}
{{ user_table_row('kindle_mail', _('Enter Kindle E-mail Address'), _('Kindle E-mail'), false) }}
{{ user_select_translations('locale', url_for('admin.table_get_locale'), _('Locale'), true) }}
{{ user_select_languages('default_language', url_for('admin.table_get_default_lang'), _('Visible Book Languages'), true) }}
{{ user_table_row('denied_tags', _("Edit Denied Tags"), _("Denied Tags"), false, true, 0) }}
......
......@@ -117,8 +117,8 @@ def parse_xmp(pdf_file):
"""
try:
xmp_info = pdf_file.getXmpMetadata()
except Exception as e:
log.debug('Can not read XMP metadata %e', e)
except Exception as ex:
log.debug('Can not read XMP metadata {}'.format(ex))
return None
if xmp_info:
......@@ -162,8 +162,8 @@ def parse_xmp(pdf_file):
"""
try:
xmp_info = pdf_file.getXmpMetadata()
except Exception as e:
log.debug('Can not read XMP metadata', e)
except Exception as ex:
log.debug('Can not read XMP metadata {}'.format(ex))
return None
if xmp_info:
......
......@@ -24,7 +24,6 @@ from __future__ import division, print_function, unicode_literals
import os
from datetime import datetime
import json
import re
import mimetypes
import chardet # dependency of requests
......@@ -50,9 +49,9 @@ from . import constants, logger, isoLanguages, services
from . import babel, db, ub, config, get_locale, app
from . import calibre_db
from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download
from .helper import check_valid_domain, render_task_status, \
from .helper import check_valid_domain, render_task_status, check_email, check_username, \
get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \
send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password
send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password, valid_email
from .pagination import Pagination
from .redirect import redirect_back
from .usermanagement import login_required_if_no_ano
......@@ -215,8 +214,8 @@ def update_view():
for element in to_save:
for param in to_save[element]:
current_user.set_view_property(element, param, to_save[element][param])
except Exception as e:
log.error("Could not save view_settings: %r %r: %e", request, to_save, e)
except Exception as ex:
log.error("Could not save view_settings: %r %r: %e", request, to_save, ex)
return "Invalid request", 400
return "1", 200
......@@ -1164,14 +1163,6 @@ def extend_search_term(searchterm,
searchterm.extend(tag.name for tag in tag_names)
tag_names = calibre_db.session.query(db_element).filter(db.Tags.id.in_(tags['exclude_' + key])).all()
searchterm.extend(tag.name for tag in tag_names)
#serie_names = calibre_db.session.query(db.Series).filter(db.Series.id.in_(tags['include_serie'])).all()
#searchterm.extend(serie.name for serie in serie_names)
#serie_names = calibre_db.session.query(db.Series).filter(db.Series.id.in_(tags['include_serie'])).all()
#searchterm.extend(serie.name for serie in serie_names)
#shelf_names = ub.session.query(ub.Shelf).filter(ub.Shelf.id.in_(tags['include_shelf'])).all()
#searchterm.extend(shelf.name for shelf in shelf_names)
#shelf_names = ub.session.query(ub.Shelf).filter(ub.Shelf.id.in_(tags['include_shelf'])).all()
#searchterm.extend(shelf.name for shelf in shelf_names)
language_names = calibre_db.session.query(db.Languages). \
filter(db.Languages.id.in_(tags['include_language'])).all()
if language_names:
......@@ -1345,11 +1336,7 @@ def serve_book(book_id, book_format, anyname):
@login_required_if_no_ano
@download_required
def download_link(book_id, book_format, anyname):
if "Kobo" in request.headers.get('User-Agent'):
client = "kobo"
else:
client=""
client = "kobo" if "Kobo" in request.headers.get('User-Agent') else ""
return get_download_link(book_id, book_format, client)
......@@ -1391,29 +1378,21 @@ def register():
if request.method == "POST":
to_save = request.form.to_dict()
if config.config_register_email:
nickname = to_save["email"]
else:
nickname = to_save.get('name', None)
if not nickname or not to_save.get("email", None):
nickname = to_save["email"].strip() if config.config_register_email else to_save.get('name')
if not nickname or not to_save.get("email"):
flash(_(u"Please fill out all fields!"), category="error")
return render_title_template('register.html', title=_(u"register"), page="register")
#if to_save["email"].count("@") != 1 or not \
# Regex according to https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#validation
if not re.search(r"^[\w.!#$%&'*+\\/=?^_`{|}~-]+@[\w](?:[\w-]{0,61}[\w])?(?:\.[\w](?:[\w-]{0,61}[\w])?)*$",
to_save["email"]):
flash(_(u"Invalid e-mail address format"), category="error")
log.warning('Registering failed for user "%s" e-mail address: %s', nickname, to_save["email"])
try:
nickname = check_username(nickname)
email = check_email(to_save["email"])
except Exception as ex:
flash(str(ex), category="error")
return render_title_template('register.html', title=_(u"register"), page="register")
existing_user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == nickname
.lower()).first()
existing_email = ub.session.query(ub.User).filter(ub.User.email == to_save["email"].lower()).first()
if not existing_user and not existing_email:
content = ub.User()
if check_valid_domain(to_save["email"]):
if check_valid_domain(email):
content.name = nickname
content.email = to_save["email"]
content.email = email
password = generate_random_password()
content.password = generate_password_hash(password)
content.role = config.config_default_role
......@@ -1423,7 +1402,7 @@ def register():
ub.session.commit()
if feature_support['oauth']:
register_user_with_oauth(content)
send_registration_mail(to_save["email"], nickname, password)
send_registration_mail(to_save["email"].strip(), nickname, password)
except Exception:
ub.session.rollback()
flash(_(u"An unknown error occurred. Please try again later."), category="error")
......@@ -1434,9 +1413,6 @@ def register():
return render_title_template('register.html', title=_(u"register"), page="register")
flash(_(u"Confirmation e-mail was send to your e-mail account."), category="success")
return redirect(url_for('web.login'))
else:
flash(_(u"This username or e-mail address is already in use."), category="error")
return render_title_template('register.html', title=_(u"register"), page="register")
if feature_support['oauth']:
register_user_with_oauth()
......@@ -1527,63 +1503,41 @@ def logout():
return redirect(url_for('web.login'))
# ################################### Users own configuration #########################################################
def change_profile_email(to_save, kobo_support, local_oauth_check, oauth_status):
if "email" in to_save and to_save["email"] != current_user.email:
if config.config_public_reg and not check_valid_domain(to_save["email"]):
flash(_(u"E-mail is not from valid domain"), category="error")
return render_title_template("user_edit.html", content=current_user,
title=_(u"%(name)s's profile", name=current_user.name), page="me",
kobo_support=kobo_support,
registered_oauth=local_oauth_check, oauth_status=oauth_status)
current_user.email = to_save["email"]
def change_profile_nickname(to_save, kobo_support, local_oauth_check, translations, languages):
if "name" in to_save and to_save["name"] != current_user.name:
# Query User name, if not existing, change
if not ub.session.query(ub.User).filter(ub.User.name == to_save["name"]).scalar():
current_user.name = to_save["name"]
else:
flash(_(u"This username is already taken"), category="error")
return render_title_template("user_edit.html",
translations=translations,
languages=languages,
kobo_support=kobo_support,
new_user=0, content=current_user,
registered_oauth=local_oauth_check,
title=_(u"Edit User %(nick)s",
nick=current_user.name),
page="edituser")
def change_profile(kobo_support, local_oauth_check, oauth_status, translations, languages):
to_save = request.form.to_dict()
current_user.random_books = 0
if current_user.role_passwd() or current_user.role_admin():
if "password" in to_save and to_save["password"]:
if to_save.get("password"):
current_user.password = generate_password_hash(to_save["password"])
if "kindle_mail" in to_save and to_save["kindle_mail"] != current_user.kindle_mail:
current_user.kindle_mail = to_save["kindle_mail"]
if "allowed_tags" in to_save and to_save["allowed_tags"] != current_user.allowed_tags:
try:
if to_save.get("allowed_tags", current_user.allowed_tags) != current_user.allowed_tags:
current_user.allowed_tags = to_save["allowed_tags"].strip()
change_profile_email(to_save, kobo_support, local_oauth_check, oauth_status)
change_profile_nickname(to_save, kobo_support, local_oauth_check, translations, languages)
if "show_random" in to_save and to_save["show_random"] == "on":
current_user.random_books = 1
if "default_language" in to_save:
if to_save.get("kindle_mail", current_user.kindle_mail) != current_user.kindle_mail:
current_user.kindle_mail = valid_email(to_save["kindle_mail"])
if to_save.get("email", current_user.email) != current_user.email:
current_user.email = check_email(to_save["email"])
if to_save.get("name", current_user.name) != current_user.name:
# Query User name, if not existing, change
current_user.name = check_username(to_save["name"])
current_user.random_books = 1 if to_save.get("show_random") == "on" else 0
if to_save.get("default_language"):
current_user.default_language = to_save["default_language"]
if "locale" in to_save:
if to_save.get("locale"):
current_user.locale = to_save["locale"]
except Exception as ex:
flash(str(ex), category="error")
return render_title_template("user_edit.html", content=current_user,
title=_(u"%(name)s's profile", name=current_user.name), page="me",
kobo_support=kobo_support,
registered_oauth=local_oauth_check, oauth_status=oauth_status)
val = 0
for key, __ in to_save.items():
if key.startswith('show'):
val += int(key[5:])
current_user.sidebar_view = val
if "Show_detail_random" in to_save:
if to_save.get("Show_detail_random"):
current_user.sidebar_view += constants.DETAIL_RANDOM
try:
......
......@@ -37,20 +37,20 @@
<div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3" style="margin-top:50px;">
<p class='text-justify attribute'><strong>Start Time: </strong>2021-03-28 20:37:06</p>
<p class='text-justify attribute'><strong>Start Time: </strong>2021-04-05 18:59:35</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3">
<p class='text-justify attribute'><strong>Stop Time: </strong>2021-03-28 23:05:12</p>
<p class='text-justify attribute'><strong>Stop Time: </strong>2021-04-05 21:34:25</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3">
<p class='text-justify attribute'><strong>Duration: </strong>2h 0 min</p>
<p class='text-justify attribute'><strong>Duration: </strong>2h 5 min</p>
</div>
</div>
</div>
......@@ -500,11 +500,11 @@
<tr id="su" class="failClass">
<tr id="su" class="passClass">
<td>TestEbookConvertCalibreGDrive</td>
<td class="text-center">6</td>
<td class="text-center">5</td>
<td class="text-center">1</td>
<td class="text-center">6</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
......@@ -532,33 +532,11 @@
<tr id="ft6.3" class="none bg-danger">
<tr id='pt6.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEbookConvertCalibreGDrive - test_convert_only</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft6.3')">FAIL</a>
</div>
<!--css div popup start-->
<div id="div_ft6.3" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_ft6.3').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 327, in test_convert_only
self.assertEqual(ret[-2]['result'], 'Finished')
AssertionError: 'Failed' != 'Finished'
- Failed
+ Finished</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -1172,13 +1150,13 @@ AssertionError: 'Failed' != 'Finished'
<tr id="su" class="passClass">
<td>TestEditBooksList</td>
<td class="text-center">3</td>
<td class="text-center">3</td>
<td class="text-center">10</td>
<td class="text-center">10</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c11', 3)">Detail</a>
<a onclick="showClassDetail('c11', 10)">Detail</a>
</td>
</tr>
......@@ -1186,7 +1164,7 @@ AssertionError: 'Failed' != 'Finished'
<tr id='pt11.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_edit_books_list</div>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_author</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -1195,7 +1173,7 @@ AssertionError: 'Failed' != 'Finished'
<tr id='pt11.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_list_visibility</div>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_categories</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -1204,7 +1182,70 @@ AssertionError: 'Failed' != 'Finished'
<tr id='pt11.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_merge_book</div>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_languages</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_publisher</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_series</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_seriesindex</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_bookslist_edit_title</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_list_visibility</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_restricted_rights</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestEditBooksList - test_search_books_list</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -1215,8 +1256,8 @@ AssertionError: 'Failed' != 'Finished'
<tr id="su" class="failClass">
<td>TestEditBooksOnGdrive</td>
<td class="text-center">20</td>
<td class="text-center">19</td>
<td class="text-center">1</td>
<td class="text-center">18</td>
<td class="text-center">2</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
......@@ -1235,11 +1276,34 @@ AssertionError: 'Failed' != 'Finished'
<tr id='pt12.2' class='hiddenRow bg-success'>
<tr id="ft12.2" class="none bg-danger">
<td>
<div class='testcase'>TestEditBooksOnGdrive - test_edit_author</div>
</td>
<td colspan='6' align='center'>PASS</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft12.2')">FAIL</a>
</div>
<!--css div popup start-->
<div id="div_ft12.2" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_ft12.2').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 340, in test_edit_author
self.assertEqual(u'Sigurd Lindgren & Leo Baskerville', author.get_attribute('value'))
AssertionError: 'Sigurd Lindgren & Leo Baskerville' != 'Sigurd Lindgren&Leo Baskerville'
- Sigurd Lindgren & Leo Baskerville
? - -
+ Sigurd Lindgren&Leo Baskerville</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr>
......@@ -1416,7 +1480,7 @@ AssertionError: 'Failed' != 'Finished'
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 848, in test_watch_metadata
self.assertNotIn('series', book)
AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5?edit=4ff3250d-64b1-4c99-8a68-3b7e505dc2f2', 'tag': [], 'publisher': ['Randomhäus'], 'comment': '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p><p>Aenean commodo ligula eget dolor.</p><p>Aenean massa.</p><p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p><p>Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.</p><p>Nulla consequat massa quis enim.</p><p>Donec pede justo, fringilla vel, aliquet nec, vulputate</p>', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1.0 of test', 'series_index': '1.0', 'series': 'test', 'cust_columns': []}</pre>
AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5?edit=18d56230-76a3-40ad-a368-d1fa776f385a', 'tag': [], 'publisher': ['Randomhäus'], 'comment': '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p><p>Aenean commodo ligula eget dolor.</p><p>Aenean massa.</p><p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p><p>Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.</p><p>Nulla consequat massa quis enim.</p><p>Donec pede justo, fringilla vel, aliquet nec, vulputate</p>', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1.0 of test', 'series_index': '1.0', 'series': 'test', 'cust_columns': []}</pre>
</div>
<div class="clearfix"></div>
</div>
......@@ -1427,12 +1491,12 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title':
<tr id="su" class="errorClass">
<tr id="su" class="passClass">
<td>TestSTARTTLS</td>
<td class="text-center">3</td>
<td class="text-center">2</td>
<td class="text-center">3</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">1</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c13', 3)">Detail</a>
......@@ -1459,41 +1523,21 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title':
<tr id="et13.3" class="none bg-info">
<tr id='pt13.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestSTARTTLS - test_STARTTLS_resend_password</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_et13.3')">ERROR</a>
</div>
<!--css div popup start-->
<div id="div_et13.3" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_et13.3').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_email_STARTTLS.py", line 108, in test_STARTTLS_resend_password
password_link = self.check_element_on_page((By.ID, "resend_password")).find_elements_by_tag_name("a")[0].get_attribute('href')
IndexError: list index out of range</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id="su" class="failClass">
<tr id="su" class="passClass">
<td>TestSSL</td>
<td class="text-center">5</td>
<td class="text-center">4</td>
<td class="text-center">1</td>
<td class="text-center">5</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
......@@ -1521,31 +1565,11 @@ IndexError: list index out of range</pre>
<tr id="ft14.3" class="none bg-danger">
<tr id='pt14.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestSSL - test_SSL_logging_email</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft14.3')">FAIL</a>
</div>
<!--css div popup start-->
<div id="div_ft14.3" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_ft14.3').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 139, in test_SSL_logging_email
self.assertTrue(len(re.findall('Subject: Calibre-Web test e-mail',data)),"Email logging not working")
AssertionError: 0 is not true : Email logging not working</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -1708,10 +1732,8 @@ AssertionError: 0 is not true : Email logging not working</pre>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_kobo_sync.py", line 585, in test_book_download
data = self.inital_sync()
File "/home/ozzie/Development/calibre-web-test/test/test_kobo_sync.py", line 133, in inital_sync
self.assertEqual(data[3]['NewEntitlement']['BookMetadata']['DownloadUrls'][1]['Format'], 'EPUB')
File "/home/ozzie/Development/calibre-web-test/test/test_kobo_sync.py", line 586, in test_book_download
download = downloadSession.get(data[0]['NewEntitlement']['BookMetadata']['DownloadUrls'][1]['Url'], headers=TestKoboSync.header)
IndexError: list index out of range</pre>
</div>
<div class="clearfix"></div>
......@@ -2164,7 +2186,7 @@ IndexError: list index out of range</pre>
<tr id="su" class="passClass">
<td>TestOAuthLogin</td>
<td>TestMergeBooksList</td>
<td class="text-center">2</td>
<td class="text-center">2</td>
<td class="text-center">0</td>
......@@ -2179,7 +2201,7 @@ IndexError: list index out of range</pre>
<tr id='pt22.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOAuthLogin - test_oauth_about</div>
<div class='testcase'>TestMergeBooksList - test_delete_book</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
......@@ -2187,6 +2209,39 @@ IndexError: list index out of range</pre>
<tr id='pt22.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestMergeBooksList - test_merge_book</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id="su" class="passClass">
<td>TestOAuthLogin</td>
<td class="text-center">2</td>
<td class="text-center">2</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c23', 2)">Detail</a>
</td>
</tr>
<tr id='pt23.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOAuthLogin - test_oauth_about</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt23.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOAuthLogin - test_visible_oauth</div>
</td>
......@@ -2204,13 +2259,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c23', 22)">Detail</a>
<a onclick="showClassDetail('c24', 22)">Detail</a>
</td>
</tr>
<tr id='pt23.1' class='hiddenRow bg-success'>
<tr id='pt24.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds</div>
</td>
......@@ -2219,7 +2274,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.2' class='hiddenRow bg-success'>
<tr id='pt24.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_author</div>
</td>
......@@ -2228,7 +2283,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.3' class='hiddenRow bg-success'>
<tr id='pt24.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_books</div>
</td>
......@@ -2237,7 +2292,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.4' class='hiddenRow bg-success'>
<tr id='pt24.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_calibre_companion</div>
</td>
......@@ -2246,7 +2301,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.5' class='hiddenRow bg-success'>
<tr id='pt24.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_cover</div>
</td>
......@@ -2255,7 +2310,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.6' class='hiddenRow bg-success'>
<tr id='pt24.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_download_book</div>
</td>
......@@ -2264,7 +2319,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.7' class='hiddenRow bg-success'>
<tr id='pt24.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_formats</div>
</td>
......@@ -2273,7 +2328,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.8' class='hiddenRow bg-success'>
<tr id='pt24.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_guest_user</div>
</td>
......@@ -2282,7 +2337,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.9' class='hiddenRow bg-success'>
<tr id='pt24.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_hot</div>
</td>
......@@ -2291,7 +2346,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.10' class='hiddenRow bg-success'>
<tr id='pt24.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_language</div>
</td>
......@@ -2300,7 +2355,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.11' class='hiddenRow bg-success'>
<tr id='pt24.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_non_admin</div>
</td>
......@@ -2309,7 +2364,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.12' class='hiddenRow bg-success'>
<tr id='pt24.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_publisher</div>
</td>
......@@ -2318,7 +2373,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.13' class='hiddenRow bg-success'>
<tr id='pt24.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_random</div>
</td>
......@@ -2327,7 +2382,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.14' class='hiddenRow bg-success'>
<tr id='pt24.14' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_ratings</div>
</td>
......@@ -2336,7 +2391,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.15' class='hiddenRow bg-success'>
<tr id='pt24.15' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_read_unread</div>
</td>
......@@ -2345,7 +2400,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.16' class='hiddenRow bg-success'>
<tr id='pt24.16' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_search</div>
</td>
......@@ -2354,7 +2409,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.17' class='hiddenRow bg-success'>
<tr id='pt24.17' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_series</div>
</td>
......@@ -2363,7 +2418,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.18' class='hiddenRow bg-success'>
<tr id='pt24.18' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_shelf_access</div>
</td>
......@@ -2372,7 +2427,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.19' class='hiddenRow bg-success'>
<tr id='pt24.19' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_tags</div>
</td>
......@@ -2381,7 +2436,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.20' class='hiddenRow bg-success'>
<tr id='pt24.20' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_top_rated</div>
</td>
......@@ -2390,7 +2445,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.21' class='hiddenRow bg-success'>
<tr id='pt24.21' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_opds_unicode_user</div>
</td>
......@@ -2399,7 +2454,7 @@ IndexError: list index out of range</pre>
<tr id='pt23.22' class='hiddenRow bg-success'>
<tr id='pt24.22' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestOPDSFeed - test_recently_added</div>
</td>
......@@ -2417,13 +2472,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c24', 1)">Detail</a>
<a onclick="showClassDetail('c25', 1)">Detail</a>
</td>
</tr>
<tr id='pt24.1' class='hiddenRow bg-success'>
<tr id='pt25.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUploadPDF - test_upload_invalid_pdf</div>
</td>
......@@ -2441,13 +2496,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c25', 5)">Detail</a>
<a onclick="showClassDetail('c26', 5)">Detail</a>
</td>
</tr>
<tr id='pt25.1' class='hiddenRow bg-success'>
<tr id='pt26.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestReader - test_comic_reader</div>
</td>
......@@ -2456,7 +2511,7 @@ IndexError: list index out of range</pre>
<tr id='pt25.2' class='hiddenRow bg-success'>
<tr id='pt26.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestReader - test_epub_reader</div>
</td>
......@@ -2465,7 +2520,7 @@ IndexError: list index out of range</pre>
<tr id='pt25.3' class='hiddenRow bg-success'>
<tr id='pt26.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestReader - test_pdf_reader</div>
</td>
......@@ -2474,7 +2529,7 @@ IndexError: list index out of range</pre>
<tr id='pt25.4' class='hiddenRow bg-success'>
<tr id='pt26.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestReader - test_sound_listener</div>
</td>
......@@ -2483,7 +2538,7 @@ IndexError: list index out of range</pre>
<tr id='pt25.5' class='hiddenRow bg-success'>
<tr id='pt26.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestReader - test_txt_reader</div>
</td>
......@@ -2501,13 +2556,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c26', 8)">Detail</a>
<a onclick="showClassDetail('c27', 8)">Detail</a>
</td>
</tr>
<tr id='pt26.1' class='hiddenRow bg-success'>
<tr id='pt27.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_forgot_password</div>
</td>
......@@ -2516,7 +2571,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.2' class='hiddenRow bg-success'>
<tr id='pt27.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_illegal_email</div>
</td>
......@@ -2525,7 +2580,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.3' class='hiddenRow bg-success'>
<tr id='pt27.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_limit_domain</div>
</td>
......@@ -2534,7 +2589,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.4' class='hiddenRow bg-success'>
<tr id='pt27.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_register_no_server</div>
</td>
......@@ -2543,7 +2598,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.5' class='hiddenRow bg-success'>
<tr id='pt27.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_registering_only_email</div>
</td>
......@@ -2552,7 +2607,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.6' class='hiddenRow bg-success'>
<tr id='pt27.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_registering_user</div>
</td>
......@@ -2561,7 +2616,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.7' class='hiddenRow bg-success'>
<tr id='pt27.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_registering_user_fail</div>
</td>
......@@ -2570,7 +2625,7 @@ IndexError: list index out of range</pre>
<tr id='pt26.8' class='hiddenRow bg-success'>
<tr id='pt27.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestRegister - test_user_change_password</div>
</td>
......@@ -2588,13 +2643,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">1</td>
<td class="text-center">
<a onclick="showClassDetail('c27', 12)">Detail</a>
<a onclick="showClassDetail('c28', 12)">Detail</a>
</td>
</tr>
<tr id='pt27.1' class='hiddenRow bg-success'>
<tr id='pt28.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_add_shelf_from_search</div>
</td>
......@@ -2603,7 +2658,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.2' class='hiddenRow bg-success'>
<tr id='pt28.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_adv_search_shelf</div>
</td>
......@@ -2612,7 +2667,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.3' class='hiddenRow bg-success'>
<tr id='pt28.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_arrange_shelf</div>
</td>
......@@ -2621,7 +2676,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.4' class='hiddenRow bg-success'>
<tr id='pt28.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_delete_book_of_shelf</div>
</td>
......@@ -2630,7 +2685,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.5' class='hiddenRow bg-success'>
<tr id='pt28.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_private_shelf</div>
</td>
......@@ -2639,7 +2694,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.6' class='hiddenRow bg-success'>
<tr id='pt28.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_public_private_shelf</div>
</td>
......@@ -2648,7 +2703,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.7' class='hiddenRow bg-success'>
<tr id='pt28.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_public_shelf</div>
</td>
......@@ -2657,7 +2712,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.8' class='hiddenRow bg-success'>
<tr id='pt28.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_rename_shelf</div>
</td>
......@@ -2666,7 +2721,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.9' class='hiddenRow bg-success'>
<tr id='pt28.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_shelf_action_non_shelf_edit_role</div>
</td>
......@@ -2675,7 +2730,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.10' class='hiddenRow bg-success'>
<tr id='pt28.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_shelf_anonymous</div>
</td>
......@@ -2684,19 +2739,19 @@ IndexError: list index out of range</pre>
<tr id="st27.11" class="none bg-warning">
<tr id="st28.11" class="none bg-warning">
<td>
<div class='testcase'>TestShelf - test_shelf_database_change</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st27.11')">SKIP</a>
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st28.11')">SKIP</a>
</div>
<!--css div popup start-->
<div id="div_st27.11" class="popup_window test_output" style="display:none;">
<div id="div_st28.11" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_st27.11').style.display='none'"><span
onclick='document.getElementById('div_st28.11').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
......@@ -2710,7 +2765,7 @@ IndexError: list index out of range</pre>
<tr id='pt27.12' class='hiddenRow bg-success'>
<tr id='pt28.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestShelf - test_shelf_long_name</div>
</td>
......@@ -2728,13 +2783,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">1</td>
<td class="text-center">
<a onclick="showClassDetail('c28', 8)">Detail</a>
<a onclick="showClassDetail('c29', 8)">Detail</a>
</td>
</tr>
<tr id='pt28.1' class='hiddenRow bg-success'>
<tr id='pt29.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_check_update_nightly_errors</div>
</td>
......@@ -2743,7 +2798,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.2' class='hiddenRow bg-success'>
<tr id='pt29.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_check_update_nightly_request_errors</div>
</td>
......@@ -2752,7 +2807,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.3' class='hiddenRow bg-success'>
<tr id='pt29.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_check_update_stable_errors</div>
</td>
......@@ -2761,7 +2816,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.4' class='hiddenRow bg-success'>
<tr id='pt29.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_check_update_stable_versions</div>
</td>
......@@ -2770,7 +2825,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.5' class='hiddenRow bg-success'>
<tr id='pt29.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_perform_update</div>
</td>
......@@ -2779,7 +2834,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.6' class='hiddenRow bg-success'>
<tr id='pt29.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_perform_update_stable_errors</div>
</td>
......@@ -2788,19 +2843,19 @@ IndexError: list index out of range</pre>
<tr id="st28.7" class="none bg-warning">
<tr id="st29.7" class="none bg-warning">
<td>
<div class='testcase'>TestUpdater - test_perform_update_timeout</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st28.7')">SKIP</a>
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st29.7')">SKIP</a>
</div>
<!--css div popup start-->
<div id="div_st28.7" class="popup_window test_output" style="display:none;">
<div id="div_st29.7" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_st28.7').style.display='none'"><span
onclick='document.getElementById('div_st29.7').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
......@@ -2814,7 +2869,7 @@ IndexError: list index out of range</pre>
<tr id='pt28.8' class='hiddenRow bg-success'>
<tr id='pt29.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUpdater - test_reconnect_database</div>
</td>
......@@ -2824,6 +2879,66 @@ IndexError: list index out of range</pre>
<tr id="su" class="errorClass">
<td>_ErrorHolder</td>
<td class="text-center">1</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">1</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c30', 1)">Detail</a>
</td>
</tr>
<tr id="et30.1" class="none bg-info">
<td>
<div class='testcase'>setUpClass (test_user_list)</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_et30.1')">ERROR</a>
</div>
<!--css div popup start-->
<div id="div_et30.1" class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick='document.getElementById('div_et30.1').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_user_list.py", line 50, in setUpClass
debug_startup(cls, cls.py_version, {'config_calibre_dir': TEST_DB})
File "/home/ozzie/Development/calibre-web-test/test/helper_func.py", line 109, in debug_startup
inst.driver.get(host)
File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 333, in get
self.execute(Command.GET, {'url': url})
File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=connectionFailure&u=http%3A//127.0.0.1%3A8083/&c=UTF-8&d=Firefox%20kann%20keine%20Verbindung%20zu%20dem%20Server%20unter%20127.0.0.1%3A8083%20aufbauen.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/ozzie/Development/calibre-web-test/test/test_user_list.py", line 55, in setUpClass
cls.p.kill()
AttributeError: 'NoneType' object has no attribute 'kill'</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id="su" class="passClass">
<td>TestUserLoad</td>
<td class="text-center">1</td>
......@@ -2832,13 +2947,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c29', 1)">Detail</a>
<a onclick="showClassDetail('c31', 1)">Detail</a>
</td>
</tr>
<tr id='pt29.1' class='hiddenRow bg-success'>
<tr id='pt31.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserLoad - test_user_change_vis</div>
</td>
......@@ -2856,13 +2971,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c30', 21)">Detail</a>
<a onclick="showClassDetail('c32', 21)">Detail</a>
</td>
</tr>
<tr id='pt30.1' class='hiddenRow bg-success'>
<tr id='pt32.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_allow_column_restriction</div>
</td>
......@@ -2871,7 +2986,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.2' class='hiddenRow bg-success'>
<tr id='pt32.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_allow_tag_restriction</div>
</td>
......@@ -2880,7 +2995,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.3' class='hiddenRow bg-success'>
<tr id='pt32.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_archived_format_template</div>
</td>
......@@ -2889,7 +3004,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.4' class='hiddenRow bg-success'>
<tr id='pt32.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_author_user_template</div>
</td>
......@@ -2898,7 +3013,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.5' class='hiddenRow bg-success'>
<tr id='pt32.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_best_user_template</div>
</td>
......@@ -2907,7 +3022,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.6' class='hiddenRow bg-success'>
<tr id='pt32.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_category_user_template</div>
</td>
......@@ -2916,7 +3031,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.7' class='hiddenRow bg-success'>
<tr id='pt32.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_deny_column_restriction</div>
</td>
......@@ -2925,7 +3040,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.8' class='hiddenRow bg-success'>
<tr id='pt32.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_deny_tag_restriction</div>
</td>
......@@ -2934,7 +3049,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.9' class='hiddenRow bg-success'>
<tr id='pt32.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_detail_random_user_template</div>
</td>
......@@ -2943,7 +3058,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.10' class='hiddenRow bg-success'>
<tr id='pt32.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_download_user_template</div>
</td>
......@@ -2952,7 +3067,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.11' class='hiddenRow bg-success'>
<tr id='pt32.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_format_user_template</div>
</td>
......@@ -2961,7 +3076,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.12' class='hiddenRow bg-success'>
<tr id='pt32.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_hot_user_template</div>
</td>
......@@ -2970,7 +3085,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.13' class='hiddenRow bg-success'>
<tr id='pt32.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_language_user_template</div>
</td>
......@@ -2979,7 +3094,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.14' class='hiddenRow bg-success'>
<tr id='pt32.14' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_limit_book_languages</div>
</td>
......@@ -2988,7 +3103,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.15' class='hiddenRow bg-success'>
<tr id='pt32.15' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_list_user_template</div>
</td>
......@@ -2997,7 +3112,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.16' class='hiddenRow bg-success'>
<tr id='pt32.16' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_publisher_user_template</div>
</td>
......@@ -3006,7 +3121,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.17' class='hiddenRow bg-success'>
<tr id='pt32.17' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_random_user_template</div>
</td>
......@@ -3015,7 +3130,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.18' class='hiddenRow bg-success'>
<tr id='pt32.18' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_read_user_template</div>
</td>
......@@ -3024,7 +3139,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.19' class='hiddenRow bg-success'>
<tr id='pt32.19' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_recent_user_template</div>
</td>
......@@ -3033,7 +3148,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.20' class='hiddenRow bg-success'>
<tr id='pt32.20' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_series_user_template</div>
</td>
......@@ -3042,7 +3157,7 @@ IndexError: list index out of range</pre>
<tr id='pt30.21' class='hiddenRow bg-success'>
<tr id='pt32.21' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestUserTemplate - test_ui_language_settings</div>
</td>
......@@ -3060,13 +3175,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c31', 33)">Detail</a>
<a onclick="showClassDetail('c33', 33)">Detail</a>
</td>
</tr>
<tr id='pt31.1' class='hiddenRow bg-success'>
<tr id='pt33.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_about</div>
</td>
......@@ -3075,7 +3190,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.2' class='hiddenRow bg-success'>
<tr id='pt33.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_SMTP_Settings</div>
</td>
......@@ -3084,7 +3199,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.3' class='hiddenRow bg-success'>
<tr id='pt33.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_add_user</div>
</td>
......@@ -3093,7 +3208,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.4' class='hiddenRow bg-success'>
<tr id='pt33.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_password</div>
</td>
......@@ -3102,7 +3217,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.5' class='hiddenRow bg-success'>
<tr id='pt33.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_archived</div>
</td>
......@@ -3111,7 +3226,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.6' class='hiddenRow bg-success'>
<tr id='pt33.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_authors</div>
</td>
......@@ -3120,7 +3235,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.7' class='hiddenRow bg-success'>
<tr id='pt33.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_category</div>
</td>
......@@ -3129,7 +3244,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.8' class='hiddenRow bg-success'>
<tr id='pt33.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_file_formats</div>
</td>
......@@ -3138,7 +3253,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.9' class='hiddenRow bg-success'>
<tr id='pt33.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_hot</div>
</td>
......@@ -3147,7 +3262,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.10' class='hiddenRow bg-success'>
<tr id='pt33.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_language</div>
</td>
......@@ -3156,7 +3271,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.11' class='hiddenRow bg-success'>
<tr id='pt33.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_publisher</div>
</td>
......@@ -3165,7 +3280,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.12' class='hiddenRow bg-success'>
<tr id='pt33.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_random</div>
</td>
......@@ -3174,7 +3289,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.13' class='hiddenRow bg-success'>
<tr id='pt33.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_rated</div>
</td>
......@@ -3183,7 +3298,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.14' class='hiddenRow bg-success'>
<tr id='pt33.14' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_rating</div>
</td>
......@@ -3192,7 +3307,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.15' class='hiddenRow bg-success'>
<tr id='pt33.15' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_read</div>
</td>
......@@ -3201,7 +3316,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.16' class='hiddenRow bg-success'>
<tr id='pt33.16' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_admin_change_visibility_series</div>
</td>
......@@ -3210,7 +3325,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.17' class='hiddenRow bg-success'>
<tr id='pt33.17' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_allow_columns</div>
</td>
......@@ -3219,7 +3334,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.18' class='hiddenRow bg-success'>
<tr id='pt33.18' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_allow_tags</div>
</td>
......@@ -3228,7 +3343,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.19' class='hiddenRow bg-success'>
<tr id='pt33.19' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_archive_books</div>
</td>
......@@ -3237,7 +3352,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.20' class='hiddenRow bg-success'>
<tr id='pt33.20' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_authors_max_settings</div>
</td>
......@@ -3246,7 +3361,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.21' class='hiddenRow bg-success'>
<tr id='pt33.21' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_change_title</div>
</td>
......@@ -3255,7 +3370,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.22' class='hiddenRow bg-success'>
<tr id='pt33.22' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_checked_logged_in</div>
</td>
......@@ -3264,7 +3379,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.23' class='hiddenRow bg-success'>
<tr id='pt33.23' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_hide_custom_column</div>
</td>
......@@ -3273,7 +3388,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.24' class='hiddenRow bg-success'>
<tr id='pt33.24' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_link_column_to_read_status</div>
</td>
......@@ -3282,7 +3397,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.25' class='hiddenRow bg-success'>
<tr id='pt33.25' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_random_books_available</div>
</td>
......@@ -3291,7 +3406,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.26' class='hiddenRow bg-success'>
<tr id='pt33.26' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_restrict_columns</div>
</td>
......@@ -3300,7 +3415,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.27' class='hiddenRow bg-success'>
<tr id='pt33.27' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_restrict_tags</div>
</td>
......@@ -3309,7 +3424,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.28' class='hiddenRow bg-success'>
<tr id='pt33.28' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_save_views_recent</div>
</td>
......@@ -3318,7 +3433,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.29' class='hiddenRow bg-success'>
<tr id='pt33.29' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_search_functions</div>
</td>
......@@ -3327,7 +3442,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.30' class='hiddenRow bg-success'>
<tr id='pt33.30' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_search_order</div>
</td>
......@@ -3336,7 +3451,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.31' class='hiddenRow bg-success'>
<tr id='pt33.31' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_search_string</div>
</td>
......@@ -3345,7 +3460,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.32' class='hiddenRow bg-success'>
<tr id='pt33.32' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_user_email_available</div>
</td>
......@@ -3354,7 +3469,7 @@ IndexError: list index out of range</pre>
<tr id='pt31.33' class='hiddenRow bg-success'>
<tr id='pt33.33' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreWebVisibilitys - test_user_visibility_sidebar</div>
</td>
......@@ -3372,13 +3487,13 @@ IndexError: list index out of range</pre>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c32', 16)">Detail</a>
<a onclick="showClassDetail('c34', 16)">Detail</a>
</td>
</tr>
<tr id='pt32.1' class='hiddenRow bg-success'>
<tr id='pt34.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_author_sort</div>
</td>
......@@ -3387,7 +3502,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.2' class='hiddenRow bg-success'>
<tr id='pt34.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_author_sort_comma</div>
</td>
......@@ -3396,7 +3511,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.3' class='hiddenRow bg-success'>
<tr id='pt34.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_author_sort_junior</div>
</td>
......@@ -3405,7 +3520,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.4' class='hiddenRow bg-success'>
<tr id='pt34.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_author_sort_oneword</div>
</td>
......@@ -3414,7 +3529,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.5' class='hiddenRow bg-success'>
<tr id='pt34.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_author_sort_roman</div>
</td>
......@@ -3423,7 +3538,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.6' class='hiddenRow bg-success'>
<tr id='pt34.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_Limit_Length</div>
</td>
......@@ -3432,7 +3547,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.7' class='hiddenRow bg-success'>
<tr id='pt34.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_char_replacement</div>
</td>
......@@ -3441,7 +3556,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.8' class='hiddenRow bg-success'>
<tr id='pt34.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_chinese_Characters</div>
</td>
......@@ -3450,7 +3565,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.9' class='hiddenRow bg-success'>
<tr id='pt34.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_deg_eur_replacement</div>
</td>
......@@ -3459,7 +3574,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.10' class='hiddenRow bg-success'>
<tr id='pt34.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_doubleS</div>
</td>
......@@ -3468,7 +3583,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.11' class='hiddenRow bg-success'>
<tr id='pt34.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_finish_Dot</div>
</td>
......@@ -3477,7 +3592,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.12' class='hiddenRow bg-success'>
<tr id='pt34.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_high23</div>
</td>
......@@ -3486,7 +3601,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.13' class='hiddenRow bg-success'>
<tr id='pt34.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_check_umlauts</div>
</td>
......@@ -3495,7 +3610,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.14' class='hiddenRow bg-success'>
<tr id='pt34.14' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_random_password</div>
</td>
......@@ -3504,7 +3619,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.15' class='hiddenRow bg-success'>
<tr id='pt34.15' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_split_authors</div>
</td>
......@@ -3513,7 +3628,7 @@ IndexError: list index out of range</pre>
<tr id='pt32.16' class='hiddenRow bg-success'>
<tr id='pt34.16' class='hiddenRow bg-success'>
<td>
<div class='testcase'>TestCalibreHelper - test_whitespaces</div>
</td>
......@@ -3524,9 +3639,9 @@ IndexError: list index out of range</pre>
<tr id='total_row' class="text-center bg-grey">
<td>Total</td>
<td>302</td>
<td>290</td>
<td>3</td>
<td>312</td>
<td>301</td>
<td>2</td>
<td>2</td>
<td>7</td>
<td>&nbsp;</td>
......@@ -3646,7 +3761,7 @@ IndexError: list index out of range</pre>
<tr>
<th>SQLAlchemy</th>
<td>1.3.23</td>
<td>1.3.24</td>
<td>Basic</td>
</tr>
......@@ -3676,13 +3791,13 @@ IndexError: list index out of range</pre>
<tr>
<th>google-api-python-client</th>
<td>2.0.2</td>
<td>2.1.0</td>
<td>TestEbookConvertCalibreGDrive</td>
</tr>
<tr>
<th>httplib2</th>
<td>0.19.0</td>
<td>0.19.1</td>
<td>TestEbookConvertCalibreGDrive</td>
</tr>
......@@ -3712,13 +3827,13 @@ IndexError: list index out of range</pre>
<tr>
<th>google-api-python-client</th>
<td>2.0.2</td>
<td>2.1.0</td>
<td>TestEbookConvertGDriveKepubify</td>
</tr>
<tr>
<th>httplib2</th>
<td>0.19.0</td>
<td>0.19.1</td>
<td>TestEbookConvertGDriveKepubify</td>
</tr>
......@@ -3772,13 +3887,13 @@ IndexError: list index out of range</pre>
<tr>
<th>google-api-python-client</th>
<td>2.0.2</td>
<td>2.1.0</td>
<td>TestEditBooksOnGdrive</td>
</tr>
<tr>
<th>httplib2</th>
<td>0.19.0</td>
<td>0.19.1</td>
<td>TestEditBooksOnGdrive</td>
</tr>
......@@ -3808,13 +3923,13 @@ IndexError: list index out of range</pre>
<tr>
<th>google-api-python-client</th>
<td>2.0.2</td>
<td>2.1.0</td>
<td>TestSetupGdrive</td>
</tr>
<tr>
<th>httplib2</th>
<td>0.19.0</td>
<td>0.19.1</td>
<td>TestSetupGdrive</td>
</tr>
......@@ -3898,7 +4013,7 @@ IndexError: list index out of range</pre>
</div>
<script>
drawCircle(290, 3, 2, 7);
drawCircle(301, 2, 2, 7);
</script>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment