From 4f1754c1e49573a251e0532c2b9d29561e1bd5e7 Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sun, 8 Jul 2018 09:28:35 +0200 Subject: [PATCH] Improved errorhandling during editing of books --- cps/web.py | 321 +++++++++++++++++++++++++++-------------------------- 1 file changed, 165 insertions(+), 156 deletions(-) diff --git a/cps/web.py b/cps/web.py index 7f88a679..403c40e1 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1649,6 +1649,8 @@ def shutdown(): db.engine.dispose() ub.session.close() ub.engine.dispose() + # stop gevent server + # gevent_server.stop() # stop tornado server server = IOLoop.instance() server.add_callback(server.stop) @@ -3030,6 +3032,7 @@ def edit_book(book_id): is_format = db.session.query(db.Data).filter(db.Data.book == book_id).filter(db.Data.format == file_ext.upper()).first() if is_format: # Format entry already exists, no need to update the database + app.logger.info('Bokk format already existing') pass else: db_format = db.Data(book_id, file_ext.upper(), file_size, file_name) @@ -3037,188 +3040,194 @@ def edit_book(book_id): to_save = request.form.to_dict() - if book.title != to_save["book_title"]: - book.title = to_save["book_title"] - edited_books_id.add(book.id) - - input_authors = to_save["author_name"].split('&') - input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors)) - # we have all author names now - if input_authors == ['']: - input_authors = [_(u'unknown')] # prevent empty Author - if book.authors: - author0_before_edit = book.authors[0].name - else: - author0_before_edit = db.Authors(_(u'unknown'), '', 0) - modify_database_object(input_authors, book.authors, db.Authors, db.session, 'author') - if book.authors: - if author0_before_edit != book.authors[0].name: + try: + if book.title != to_save["book_title"]: + book.title = to_save["book_title"] edited_books_id.add(book.id) - book.author_sort = helper.get_sorted_author(input_authors[0]) - error = False - for b in edited_books_id: - if config.config_use_google_drive: - error = helper.update_dir_structure_gdrive(b) + input_authors = to_save["author_name"].split('&') + input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors)) + # we have all author names now + if input_authors == ['']: + input_authors = [_(u'unknown')] # prevent empty Author + if book.authors: + author0_before_edit = book.authors[0].name else: - error = helper.update_dir_stucture(b, config.config_calibre_dir) - if error: # stop on error - break - if config.config_use_google_drive: - updateGdriveCalibreFromLocal() - - if not error: - if to_save["cover_url"]: - if save_cover(to_save["cover_url"], book.path) is true: - book.has_cover = 1 + author0_before_edit = db.Authors(_(u'unknown'), '', 0) + modify_database_object(input_authors, book.authors, db.Authors, db.session, 'author') + if book.authors: + if author0_before_edit != book.authors[0].name: + edited_books_id.add(book.id) + book.author_sort = helper.get_sorted_author(input_authors[0]) + + error = False + for b in edited_books_id: + if config.config_use_google_drive: + error = helper.update_dir_structure_gdrive(b) else: - flash(_(u"Cover is not a jpg file, can't save"), category="error") + error = helper.update_dir_stucture(b, config.config_calibre_dir) + if error: # stop on error + break + if config.config_use_google_drive: + updateGdriveCalibreFromLocal() - if book.series_index != to_save["series_index"]: - book.series_index = to_save["series_index"] + if not error: + if to_save["cover_url"]: + if save_cover(to_save["cover_url"], book.path) is true: + book.has_cover = 1 + else: + flash(_(u"Cover is not a jpg file, can't save"), category="error") - if len(book.comments): - book.comments[0].text = to_save["description"] - else: - book.comments.append(db.Comments(text=to_save["description"], book=book.id)) + if book.series_index != to_save["series_index"]: + book.series_index = to_save["series_index"] - input_tags = to_save["tags"].split(',') - input_tags = list(map(lambda it: it.strip(), input_tags)) - modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags') + if len(book.comments): + book.comments[0].text = to_save["description"] + else: + book.comments.append(db.Comments(text=to_save["description"], book=book.id)) - input_series = [to_save["series"].strip()] - input_series = [x for x in input_series if x != ''] - modify_database_object(input_series, book.series, db.Series, db.session, 'series') + input_tags = to_save["tags"].split(',') + input_tags = list(map(lambda it: it.strip(), input_tags)) + modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags') - input_languages = to_save["languages"].split(',') - input_languages = list(map(lambda it: it.strip().lower(), input_languages)) + input_series = [to_save["series"].strip()] + input_series = [x for x in input_series if x != ''] + modify_database_object(input_series, book.series, db.Series, db.session, 'series') - if to_save["pubdate"]: - try: - book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d") - except ValueError: + input_languages = to_save["languages"].split(',') + input_languages = list(map(lambda it: it.strip().lower(), input_languages)) + + if to_save["pubdate"]: + try: + book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d") + except ValueError: + book.pubdate = db.Books.DEFAULT_PUBDATE + else: book.pubdate = db.Books.DEFAULT_PUBDATE - else: - book.pubdate = db.Books.DEFAULT_PUBDATE - # retranslate displayed text to language codes - languages = db.session.query(db.Languages).all() - input_l = [] - for lang in languages: - try: - lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower() - except Exception: - lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower() - for inp_lang in input_languages: - if inp_lang == lang.name: - input_l.append(lang.lang_code) - modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages') - - if to_save["rating"].strip(): - old_rating = False - if len(book.ratings) > 0: - old_rating = book.ratings[0].rating - ratingx2 = int(float(to_save["rating"]) * 2) - if ratingx2 != old_rating: - is_rating = db.session.query(db.Ratings).filter(db.Ratings.rating == ratingx2).first() - if is_rating: - book.ratings.append(is_rating) - else: - new_rating = db.Ratings(rating=ratingx2) - book.ratings.append(new_rating) - if old_rating: + # retranslate displayed text to language codes + languages = db.session.query(db.Languages).all() + input_l = [] + for lang in languages: + try: + lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower() + except Exception: + lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower() + for inp_lang in input_languages: + if inp_lang == lang.name: + input_l.append(lang.lang_code) + modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages') + + if to_save["rating"].strip(): + old_rating = False + if len(book.ratings) > 0: + old_rating = book.ratings[0].rating + ratingx2 = int(float(to_save["rating"]) * 2) + if ratingx2 != old_rating: + is_rating = db.session.query(db.Ratings).filter(db.Ratings.rating == ratingx2).first() + if is_rating: + book.ratings.append(is_rating) + else: + new_rating = db.Ratings(rating=ratingx2) + book.ratings.append(new_rating) + if old_rating: + book.ratings.remove(book.ratings[0]) + else: + if len(book.ratings) > 0: book.ratings.remove(book.ratings[0]) - else: - if len(book.ratings) > 0: - book.ratings.remove(book.ratings[0]) - - for c in cc: - cc_string = "custom_column_" + str(c.id) - if not c.is_multiple: - if len(getattr(book, cc_string)) > 0: - cc_db_value = getattr(book, cc_string)[0].value - else: - cc_db_value = None - if to_save[cc_string].strip(): - if c.datatype == 'bool': - if to_save[cc_string] == 'None': - to_save[cc_string] = None - else: - to_save[cc_string] = 1 if to_save[cc_string] == 'True' else 0 - if to_save[cc_string] != cc_db_value: - if cc_db_value is not None: - if to_save[cc_string] is not None: - setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) - else: - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) + + for c in cc: + cc_string = "custom_column_" + str(c.id) + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + cc_db_value = getattr(book, cc_string)[0].value + else: + cc_db_value = None + if to_save[cc_string].strip(): + if c.datatype == 'bool': + if to_save[cc_string] == 'None': + to_save[cc_string] = None else: - cc_class = db.cc_classes[c.id] - new_cc = cc_class(value=to_save[cc_string], book=book_id) - db.session.add(new_cc) - elif c.datatype == 'int': - if to_save[cc_string] == 'None': - to_save[cc_string] = None - if to_save[cc_string] != cc_db_value: - if cc_db_value is not None: - if to_save[cc_string] is not None: - setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + to_save[cc_string] = 1 if to_save[cc_string] == 'True' else 0 + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + elif c.datatype == 'int': + if to_save[cc_string] == 'None': + to_save[cc_string] = None + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + + else: + if c.datatype == 'rating': + to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) + if to_save[cc_string].strip() != cc_db_value: + if cc_db_value is not None: + # remove old cc_val del_cc = getattr(book, cc_string)[0] getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) - else: + if len(del_cc.books) == 0: + db.session.delete(del_cc) cc_class = db.cc_classes[c.id] - new_cc = cc_class(value=to_save[cc_string], book=book_id) - db.session.add(new_cc) - - else: - if c.datatype == 'rating': - to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) - if to_save[cc_string].strip() != cc_db_value: - if cc_db_value is not None: - # remove old cc_val - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: - db.session.delete(del_cc) - cc_class = db.cc_classes[c.id] - new_cc = db.session.query(cc_class).filter( - cc_class.value == to_save[cc_string].strip()).first() - # if no cc val is found add it - if new_cc is None: - new_cc = cc_class(value=to_save[cc_string].strip()) - db.session.add(new_cc) new_cc = db.session.query(cc_class).filter( cc_class.value == to_save[cc_string].strip()).first() - # add cc value to book - getattr(book, cc_string).append(new_cc) + # if no cc val is found add it + if new_cc is None: + new_cc = cc_class(value=to_save[cc_string].strip()) + db.session.add(new_cc) + new_cc = db.session.query(cc_class).filter( + cc_class.value == to_save[cc_string].strip()).first() + # add cc value to book + getattr(book, cc_string).append(new_cc) + else: + if cc_db_value is not None: + # remove old cc_val + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) else: - if cc_db_value is not None: - # remove old cc_val - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: - db.session.delete(del_cc) + input_tags = to_save[cc_string].split(',') + input_tags = list(map(lambda it: it.strip(), input_tags)) + modify_database_object(input_tags, getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') + db.session.commit() + author_names = [] + for author in book.authors: + author_names.append(author.name) + if "detail_view" in to_save: + return redirect(url_for('show_book', book_id=book.id)) else: - input_tags = to_save[cc_string].split(',') - input_tags = list(map(lambda it: it.strip(), input_tags)) - modify_database_object(input_tags, getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') - db.session.commit() - author_names = [] - for author in book.authors: - author_names.append(author.name) - if "detail_view" in to_save: - return redirect(url_for('show_book', book_id=book.id)) + return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, + title=_(u"edit metadata")) else: + db.session.rollback() + flash( error, category="error") return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, title=_(u"edit metadata")) - else: + except Exception as e: + app.logger.exception(e) db.session.rollback() - flash( error, category="error") - return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, - title=_(u"edit metadata")) + flash(_("Error editing book, please check logfile for details"), category="error") + return redirect(url_for('show_book', book_id=book.id)) def save_cover(url, book_path):