From 3db682cd156b5b959d76465de0195919b86ee53e Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 4 Aug 2018 18:22:43 +0200 Subject: [PATCH] Merge remote-tracking branch 'del_books/delete-book-formats' # Conflicts: # cps/helper.py Implemented delete on gdrive --- cps/helper.py | 46 +++++++++++-------- cps/templates/book_edit.html | 9 ++++ cps/web.py | 86 ++++++++++++++++++++---------------- 3 files changed, 84 insertions(+), 57 deletions(-) diff --git a/cps/helper.py b/cps/helper.py index b8af45eb..4a5a7aeb 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -243,24 +243,27 @@ def get_sorted_author(value): value2 = value return value2 + # Deletes a book fro the local filestorage, returns True if deleting is successfull, otherwise false -def delete_book_file(book, calibrepath): +def delete_book_file(book, calibrepath, book_format=None): # check that path is 2 elements deep, check that target path has no subfolders if book.path.count('/') == 1: path = os.path.join(calibrepath, book.path) - if os.path.isdir(path): - if len(next(os.walk(path))[1]): - web.app.logger.error( - "Deleting book " + str(book.id) + " failed, path has subfolders: " + book.path) - return False - shutil.rmtree(path, ignore_errors=True) - return True + if book_format: + for file in os.listdir(path): + if file.upper().endswith("."+book_format): + os.remove(os.path.join(path, file)) else: - web.app.logger.error("Deleting book " + str(book.id) + " failed, book path not valid: " + book.path) - return False - else: - web.app.logger.error("Deleting book " + str(book.id) + " failed, book path value: "+ book.path) - return False + if os.path.isdir(path): + if len(next(os.walk(path))[1]): + web.app.logger.error( + "Deleting book " + str(book.id) + " failed, path has subfolders: " + book.path) + return False + shutil.rmtree(path, ignore_errors=True) + return True + else: + web.app.logger.error("Deleting book " + str(book.id) + " failed, book path not valid: " + book.path) + return False def update_dir_stucture_file(book_id, calibrepath): @@ -333,9 +336,16 @@ def update_dir_structure_gdrive(book_id): return error -def delete_book_gdrive(book): +def delete_book_gdrive(book, book_format): error= False - gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path),book.path.split('/')[1]) + if book_format: + name = '' + for entry in book.data: + if entry.format.upper() == book_format: + name = entry.name + '.' + book_format + gFile = gd.getFileFromEbooksFolder(book.path, name) + else: + gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path),book.path.split('/')[1]) if gFile: gd.deleteDatabaseEntry(gFile['id']) gFile.Trash() @@ -351,11 +361,11 @@ def update_dir_stucture(book_id, calibrepath): else: return update_dir_stucture_file(book_id, calibrepath) -def delete_book(book, calibrepath): +def delete_book(book, calibrepath, book_format): if ub.config.config_use_google_drive: - return delete_book_gdrive(book) + return delete_book_gdrive(book, book_format) else: - return delete_book_file(book, calibrepath) + return delete_book_file(book, calibrepath, book_format) def get_book_cover(cover_path): if ub.config.config_use_google_drive: diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 1000d759..819960bd 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -15,6 +15,15 @@
+ {% if book.data|length > 1 %} +

{{_('Delete formats:')}}

+ {% for file in book.data %} + + {% endfor %} +
+ {% endif %} {% endif %}
diff --git a/cps/web.py b/cps/web.py index 2cfd813d..8fd41410 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1480,55 +1480,63 @@ def stats(): categorycounter=categorys, seriecounter=series, title=_(u"Statistics"), page="stat") -@app.route("/delete//") +@app.route("/delete//", defaults={'book_format': ""}) +@app.route("/delete///") @login_required -def delete_book(book_id): +def delete_book(book_id, book_format): if current_user.role_delete_books(): book = db.session.query(db.Books).filter(db.Books.id == book_id).first() if book: - # delete book from Shelfs, Downloads, Read list - ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).delete() - ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id).delete() - # ToDo check Downloads.book right - ub.delete_download(book_id) - # ub.session.query(ub.Downloads).filter(ub.Downloads.book_id == book_id).delete() - ub.session.commit() + helper.delete_book(book, config.config_calibre_dir, book_format=book_format.upper()) + if not book_format: + # delete book from Shelfs, Downloads, Read list + ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).delete() + ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id).delete() + # ToDo check Downloads.book right + ub.delete_download(book_id) + # ub.session.query(ub.Downloads).filter(ub.Downloads.book_id == book_id).delete() + ub.session.commit() - helper.delete_book(book, config.config_calibre_dir) - # check if only this book links to: - # author, language, series, tags, custom columns - modify_database_object([u''], book.authors, db.Authors, db.session, 'author') - modify_database_object([u''], book.tags, db.Tags, db.session, 'tags') - modify_database_object([u''], book.series, db.Series, db.session, 'series') - modify_database_object([u''], book.languages, db.Languages, db.session, 'languages') - modify_database_object([u''], book.publishers, db.Publishers, db.session, 'series') + # check if only this book links to: + # author, language, series, tags, custom columns + modify_database_object([u''], book.authors, db.Authors, db.session, 'author') + modify_database_object([u''], book.tags, db.Tags, db.session, 'tags') + modify_database_object([u''], book.series, db.Series, db.session, 'series') + modify_database_object([u''], book.languages, db.Languages, db.session, 'languages') + modify_database_object([u''], book.publishers, db.Publishers, db.session, 'series') - cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() - for c in cc: - cc_string = "custom_column_" + str(c.id) - if not c.is_multiple: - if len(getattr(book, cc_string)) > 0: - if c.datatype == 'bool' or c.datatype == 'integer': - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) - elif c.datatype == 'rating': - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: + cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + for c in cc: + cc_string = "custom_column_" + str(c.id) + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + if c.datatype == 'bool' or c.datatype == 'integer': + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) db.session.delete(del_cc) - else: - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) - else: - modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') - db.session.query(db.Books).filter(db.Books.id == book_id).delete() + elif c.datatype == 'rating': + 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: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') + db.session.query(db.Books).filter(db.Books.id == book_id).delete() + else: + db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format).delete() db.session.commit() else: - # book not foundß + # book not found app.logger.info('Book with id "'+str(book_id)+'" could not be deleted') - return redirect(url_for('index')) + if book_format: + return redirect(url_for('edit_book', book_id=book_id)) + else: + return redirect(url_for('index')) + @app.route("/gdrive/authenticate")