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")