2019-02-08 11:11:44 -08:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
|
|
|
# Copyright (C) 2018-2019 OzzieIsaacs, cervinko, jkrehm, bodybybuddha, ok11,
|
|
|
|
# andy29485, idalin, Kyosfonica, wuqi, Kennyl, lemmsh,
|
|
|
|
# falgh1, grunjol, csitko, ytils, xybydy, trasba, vrabe,
|
|
|
|
# ruben-herold, marblepebble, JackED42, SiphonSquirrel,
|
|
|
|
# apetresc, nanu-c, mutschler
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2019-06-06 08:10:22 -07:00
|
|
|
from __future__ import division, print_function, unicode_literals
|
2020-04-24 07:56:08 -07:00
|
|
|
from datetime import datetime
|
2019-06-06 08:10:22 -07:00
|
|
|
|
2019-02-08 11:11:44 -08:00
|
|
|
from flask import Blueprint, request, flash, redirect, url_for
|
|
|
|
from flask_babel import gettext as _
|
|
|
|
from flask_login import login_required, current_user
|
2020-04-19 10:08:58 -07:00
|
|
|
from sqlalchemy.sql.expression import func
|
2020-06-27 03:31:26 -07:00
|
|
|
from sqlalchemy.exc import OperationalError, InvalidRequestError
|
2019-06-06 08:10:22 -07:00
|
|
|
|
2020-12-13 04:54:09 -08:00
|
|
|
from . import logger, ub, calibre_db, db
|
2020-12-12 02:23:17 -08:00
|
|
|
from .render_template import render_title_template
|
|
|
|
from .usermanagement import login_required_if_no_ano
|
2019-02-08 11:11:44 -08:00
|
|
|
|
2019-06-06 08:10:22 -07:00
|
|
|
|
2019-02-08 11:11:44 -08:00
|
|
|
shelf = Blueprint('shelf', __name__)
|
2019-06-11 09:35:20 -07:00
|
|
|
log = logger.create()
|
2019-06-06 08:10:22 -07:00
|
|
|
|
2020-04-19 10:08:58 -07:00
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
def check_shelf_edit_permissions(cur_shelf):
|
|
|
|
if not cur_shelf.is_public and not cur_shelf.user_id == int(current_user.id):
|
|
|
|
log.error("User %s not allowed to edit shelf %s", current_user, cur_shelf)
|
|
|
|
return False
|
|
|
|
if cur_shelf.is_public and not current_user.role_edit_shelfs():
|
|
|
|
log.info("User %s not allowed to edit public shelves", current_user)
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def check_shelf_view_permissions(cur_shelf):
|
|
|
|
if cur_shelf.is_public:
|
|
|
|
return True
|
|
|
|
if current_user.is_anonymous or cur_shelf.user_id != current_user.id:
|
|
|
|
log.error("User is unauthorized to view non-public shelf: %s", cur_shelf)
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
@shelf.route("/shelf/add/<int:shelf_id>/<int:book_id>")
|
|
|
|
@login_required
|
|
|
|
def add_to_shelf(shelf_id, book_id):
|
2020-02-08 05:39:46 -08:00
|
|
|
xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest'
|
2019-02-08 11:11:44 -08:00
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
|
|
|
if shelf is None:
|
2019-06-11 09:35:20 -07:00
|
|
|
log.error("Invalid shelf specified: %s", shelf_id)
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Invalid shelf specified"), category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Invalid shelf specified", 400
|
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
if not check_shelf_edit_permissions(shelf):
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Sorry you are not allowed to add a book to the the shelf: %(shelfname)s", shelfname=shelf.name),
|
|
|
|
category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name, 403
|
|
|
|
|
|
|
|
book_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id,
|
2020-04-19 10:08:58 -07:00
|
|
|
ub.BookShelf.book_id == book_id).first()
|
2019-02-08 11:11:44 -08:00
|
|
|
if book_in_shelf:
|
2019-06-11 09:35:20 -07:00
|
|
|
log.error("Book %s is already part of %s", book_id, shelf)
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Book is already part of the shelf: %(shelfname)s", shelfname=shelf.name), category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Book is already part of the shelf: %s" % shelf.name, 400
|
|
|
|
|
|
|
|
maxOrder = ub.session.query(func.max(ub.BookShelf.order)).filter(ub.BookShelf.shelf == shelf_id).first()
|
|
|
|
if maxOrder[0] is None:
|
|
|
|
maxOrder = 0
|
|
|
|
else:
|
|
|
|
maxOrder = maxOrder[0]
|
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book_id, order=maxOrder + 1))
|
2020-04-24 07:56:08 -07:00
|
|
|
shelf.last_modified = datetime.utcnow()
|
2020-06-27 03:31:26 -07:00
|
|
|
try:
|
|
|
|
ub.session.merge(shelf)
|
|
|
|
ub.session.commit()
|
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
|
|
|
if "HTTP_REFERER" in request.environ:
|
|
|
|
return redirect(request.environ["HTTP_REFERER"])
|
|
|
|
else:
|
|
|
|
return redirect(url_for('web.index'))
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success")
|
|
|
|
if "HTTP_REFERER" in request.environ:
|
|
|
|
return redirect(request.environ["HTTP_REFERER"])
|
|
|
|
else:
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "", 204
|
|
|
|
|
|
|
|
|
|
|
|
@shelf.route("/shelf/massadd/<int:shelf_id>")
|
|
|
|
@login_required
|
|
|
|
def search_to_shelf(shelf_id):
|
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
|
|
|
if shelf is None:
|
2019-06-11 09:35:20 -07:00
|
|
|
log.error("Invalid shelf specified: %s", shelf_id)
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Invalid shelf specified"), category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
if not check_shelf_edit_permissions(shelf):
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"You are not allowed to add a book to the the shelf: %(name)s", name=shelf.name), category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
|
2020-10-10 01:32:53 -07:00
|
|
|
if current_user.id in ub.searched_ids and ub.searched_ids[current_user.id]:
|
2019-02-08 11:11:44 -08:00
|
|
|
books_for_shelf = list()
|
|
|
|
books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).all()
|
|
|
|
if books_in_shelf:
|
|
|
|
book_ids = list()
|
|
|
|
for book_id in books_in_shelf:
|
|
|
|
book_ids.append(book_id.book_id)
|
2020-10-10 01:32:53 -07:00
|
|
|
for searchid in ub.searched_ids[current_user.id]:
|
2019-03-16 08:53:22 -07:00
|
|
|
if searchid not in book_ids:
|
|
|
|
books_for_shelf.append(searchid)
|
2019-02-08 11:11:44 -08:00
|
|
|
else:
|
2020-10-10 01:32:53 -07:00
|
|
|
books_for_shelf = ub.searched_ids[current_user.id]
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
if not books_for_shelf:
|
2020-12-13 04:54:09 -08:00
|
|
|
log.error("Books are already part of %s", shelf.name)
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Books are already part of the shelf: %(name)s", name=shelf.name), category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
|
2020-12-13 04:54:09 -08:00
|
|
|
maxOrder = ub.session.query(func.max(ub.BookShelf.order)).filter(ub.BookShelf.shelf == shelf_id).first()[0] or 0
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
for book in books_for_shelf:
|
2020-12-13 04:54:09 -08:00
|
|
|
maxOrder += 1
|
2020-03-12 16:31:42 -07:00
|
|
|
shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book, order=maxOrder))
|
2020-04-24 07:56:08 -07:00
|
|
|
shelf.last_modified = datetime.utcnow()
|
2020-06-27 03:31:26 -07:00
|
|
|
try:
|
|
|
|
ub.session.merge(shelf)
|
|
|
|
ub.session.commit()
|
|
|
|
flash(_(u"Books have been added to shelf: %(sname)s", sname=shelf.name), category="success")
|
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
2019-02-08 11:11:44 -08:00
|
|
|
else:
|
|
|
|
flash(_(u"Could not add books to shelf: %(sname)s", sname=shelf.name), category="error")
|
2019-02-09 10:01:57 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
@shelf.route("/shelf/remove/<int:shelf_id>/<int:book_id>")
|
|
|
|
@login_required
|
|
|
|
def remove_from_shelf(shelf_id, book_id):
|
2020-02-08 05:39:46 -08:00
|
|
|
xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest'
|
2019-02-08 11:11:44 -08:00
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
|
|
|
if shelf is None:
|
2019-06-11 09:35:20 -07:00
|
|
|
log.error("Invalid shelf specified: %s", shelf_id)
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Invalid shelf specified", 400
|
|
|
|
|
|
|
|
# if shelf is public and use is allowed to edit shelfs, or if shelf is private and user is owner
|
|
|
|
# allow editing shelfs
|
|
|
|
# result shelf public user allowed user owner
|
|
|
|
# false 1 0 x
|
|
|
|
# true 1 1 x
|
|
|
|
# true 0 x 1
|
|
|
|
# false 0 x 0
|
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
if check_shelf_edit_permissions(shelf):
|
2019-02-08 11:11:44 -08:00
|
|
|
book_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id,
|
|
|
|
ub.BookShelf.book_id == book_id).first()
|
|
|
|
|
|
|
|
if book_shelf is None:
|
2019-06-11 09:35:20 -07:00
|
|
|
log.error("Book %s already removed from %s", book_id, shelf)
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Book already removed from shelf", 410
|
|
|
|
|
2020-06-27 03:31:26 -07:00
|
|
|
try:
|
|
|
|
ub.session.delete(book_shelf)
|
|
|
|
shelf.last_modified = datetime.utcnow()
|
|
|
|
ub.session.commit()
|
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
|
|
|
if "HTTP_REFERER" in request.environ:
|
|
|
|
return redirect(request.environ["HTTP_REFERER"])
|
|
|
|
else:
|
|
|
|
return redirect(url_for('web.index'))
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Book has been removed from shelf: %(sname)s", sname=shelf.name), category="success")
|
2020-02-16 10:39:32 -08:00
|
|
|
if "HTTP_REFERER" in request.environ:
|
|
|
|
return redirect(request.environ["HTTP_REFERER"])
|
|
|
|
else:
|
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "", 204
|
|
|
|
else:
|
2020-02-08 05:39:46 -08:00
|
|
|
if not xhr:
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name),
|
|
|
|
category="error")
|
2019-02-15 22:23:08 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
return "Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name, 403
|
|
|
|
|
|
|
|
|
|
|
|
@shelf.route("/shelf/create", methods=["GET", "POST"])
|
|
|
|
@login_required
|
|
|
|
def create_shelf():
|
|
|
|
shelf = ub.Shelf()
|
|
|
|
if request.method == "POST":
|
|
|
|
to_save = request.form.to_dict()
|
|
|
|
if "is_public" in to_save:
|
|
|
|
shelf.is_public = 1
|
|
|
|
shelf.name = to_save["title"]
|
|
|
|
shelf.user_id = int(current_user.id)
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
is_shelf_name_unique = False
|
|
|
|
if shelf.is_public == 1:
|
|
|
|
is_shelf_name_unique = ub.session.query(ub.Shelf) \
|
|
|
|
.filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 1)) \
|
|
|
|
.first() is None
|
|
|
|
|
|
|
|
if not is_shelf_name_unique:
|
2020-04-19 10:08:58 -07:00
|
|
|
flash(_(u"A public shelf with the name '%(title)s' already exists.", title=to_save["title"]),
|
|
|
|
category="error")
|
2019-02-08 11:11:44 -08:00
|
|
|
else:
|
2020-04-02 09:23:24 -07:00
|
|
|
is_shelf_name_unique = ub.session.query(ub.Shelf) \
|
2020-04-19 10:08:58 -07:00
|
|
|
.filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 0) &
|
|
|
|
(ub.Shelf.user_id == int(current_user.id)))\
|
|
|
|
.first() is None
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
if not is_shelf_name_unique:
|
2020-04-19 10:08:58 -07:00
|
|
|
flash(_(u"A private shelf with the name '%(title)s' already exists.", title=to_save["title"]),
|
|
|
|
category="error")
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
if is_shelf_name_unique:
|
2019-02-08 11:11:44 -08:00
|
|
|
try:
|
|
|
|
ub.session.add(shelf)
|
|
|
|
ub.session.commit()
|
|
|
|
flash(_(u"Shelf %(title)s created", title=to_save["title"]), category="success")
|
2020-04-19 10:08:58 -07:00
|
|
|
return redirect(url_for('shelf.show_shelf', shelf_id=shelf.id))
|
2020-06-27 03:31:26 -07:00
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
2019-02-08 11:11:44 -08:00
|
|
|
except Exception:
|
2020-06-27 03:31:26 -07:00
|
|
|
ub.session.rollback()
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"There was an error"), category="error")
|
2020-03-18 19:10:10 -07:00
|
|
|
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
|
2019-02-08 11:11:44 -08:00
|
|
|
else:
|
2020-03-18 19:10:10 -07:00
|
|
|
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
@shelf.route("/shelf/edit/<int:shelf_id>", methods=["GET", "POST"])
|
|
|
|
@login_required
|
|
|
|
def edit_shelf(shelf_id):
|
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
2020-04-19 10:08:58 -07:00
|
|
|
if request.method == "POST":
|
2019-02-08 11:11:44 -08:00
|
|
|
to_save = request.form.to_dict()
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
is_shelf_name_unique = False
|
|
|
|
if shelf.is_public == 1:
|
|
|
|
is_shelf_name_unique = ub.session.query(ub.Shelf) \
|
|
|
|
.filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 1)) \
|
|
|
|
.filter(ub.Shelf.id != shelf_id) \
|
|
|
|
.first() is None
|
|
|
|
|
|
|
|
if not is_shelf_name_unique:
|
2020-04-19 10:08:58 -07:00
|
|
|
flash(_(u"A public shelf with the name '%(title)s' already exists.", title=to_save["title"]),
|
|
|
|
category="error")
|
2019-02-08 11:11:44 -08:00
|
|
|
else:
|
2020-04-02 09:23:24 -07:00
|
|
|
is_shelf_name_unique = ub.session.query(ub.Shelf) \
|
2020-04-19 10:08:58 -07:00
|
|
|
.filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 0) &
|
|
|
|
(ub.Shelf.user_id == int(current_user.id)))\
|
|
|
|
.filter(ub.Shelf.id != shelf_id)\
|
|
|
|
.first() is None
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
if not is_shelf_name_unique:
|
2020-04-19 10:08:58 -07:00
|
|
|
flash(_(u"A private shelf with the name '%(title)s' already exists.", title=to_save["title"]),
|
|
|
|
category="error")
|
2020-04-02 09:23:24 -07:00
|
|
|
|
|
|
|
if is_shelf_name_unique:
|
2019-02-08 11:11:44 -08:00
|
|
|
shelf.name = to_save["title"]
|
2020-04-24 07:56:08 -07:00
|
|
|
shelf.last_modified = datetime.utcnow()
|
2019-02-08 11:11:44 -08:00
|
|
|
if "is_public" in to_save:
|
|
|
|
shelf.is_public = 1
|
|
|
|
else:
|
|
|
|
shelf.is_public = 0
|
|
|
|
try:
|
|
|
|
ub.session.commit()
|
|
|
|
flash(_(u"Shelf %(title)s changed", title=to_save["title"]), category="success")
|
2020-06-27 03:31:26 -07:00
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
2019-02-08 11:11:44 -08:00
|
|
|
except Exception:
|
2020-06-27 03:31:26 -07:00
|
|
|
ub.session.rollback()
|
2019-02-08 11:11:44 -08:00
|
|
|
flash(_(u"There was an error"), category="error")
|
|
|
|
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
|
|
|
|
else:
|
|
|
|
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
|
|
|
|
|
|
|
|
|
2020-03-12 16:31:42 -07:00
|
|
|
def delete_shelf_helper(cur_shelf):
|
|
|
|
if not cur_shelf or not check_shelf_edit_permissions(cur_shelf):
|
|
|
|
return
|
|
|
|
shelf_id = cur_shelf.id
|
|
|
|
ub.session.delete(cur_shelf)
|
|
|
|
ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).delete()
|
2020-04-24 07:56:08 -07:00
|
|
|
ub.session.add(ub.ShelfArchive(uuid=cur_shelf.uuid, user_id=cur_shelf.user_id))
|
2020-12-07 10:53:34 -08:00
|
|
|
try:
|
2020-12-08 02:39:23 -08:00
|
|
|
ub.session.commit()
|
2020-12-07 10:53:34 -08:00
|
|
|
log.info("successfully deleted %s", cur_shelf)
|
|
|
|
except OperationalError:
|
2020-12-08 02:39:23 -08:00
|
|
|
ub.session.rollback()
|
2020-03-12 16:31:42 -07:00
|
|
|
|
|
|
|
|
2020-06-27 03:31:26 -07:00
|
|
|
|
2019-02-08 11:11:44 -08:00
|
|
|
@shelf.route("/shelf/delete/<int:shelf_id>")
|
|
|
|
@login_required
|
|
|
|
def delete_shelf(shelf_id):
|
|
|
|
cur_shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
2020-06-27 03:31:26 -07:00
|
|
|
try:
|
|
|
|
delete_shelf_helper(cur_shelf)
|
2020-12-13 04:54:09 -08:00
|
|
|
except InvalidRequestError:
|
2020-06-27 03:31:26 -07:00
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
2019-02-09 10:01:57 -08:00
|
|
|
return redirect(url_for('web.index'))
|
2019-02-08 11:11:44 -08:00
|
|
|
|
2020-04-19 10:08:58 -07:00
|
|
|
|
2019-06-07 23:26:51 -07:00
|
|
|
@shelf.route("/shelf/<int:shelf_id>", defaults={'shelf_type': 1})
|
|
|
|
@shelf.route("/shelf/<int:shelf_id>/<int:shelf_type>")
|
2020-09-01 10:25:57 -07:00
|
|
|
@login_required_if_no_ano
|
2019-06-07 23:26:51 -07:00
|
|
|
def show_shelf(shelf_type, shelf_id):
|
2020-12-13 04:54:09 -08:00
|
|
|
page_no = 0
|
|
|
|
offset = 0
|
|
|
|
order = None
|
|
|
|
return render_show_shelf(shelf_type, shelf_id, page_no, offset, order)
|
2019-02-08 11:11:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
@shelf.route("/shelf/order/<int:shelf_id>", methods=["GET", "POST"])
|
|
|
|
@login_required
|
|
|
|
def order_shelf(shelf_id):
|
|
|
|
if request.method == "POST":
|
|
|
|
to_save = request.form.to_dict()
|
|
|
|
books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).order_by(
|
|
|
|
ub.BookShelf.order.asc()).all()
|
|
|
|
counter = 0
|
|
|
|
for book in books_in_shelf:
|
|
|
|
setattr(book, 'order', to_save[str(book.book_id)])
|
|
|
|
counter += 1
|
2020-04-24 07:56:08 -07:00
|
|
|
# if order diffrent from before -> shelf.last_modified = datetime.utcnow()
|
2020-06-27 03:31:26 -07:00
|
|
|
try:
|
|
|
|
ub.session.commit()
|
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
2020-03-12 16:31:42 -07:00
|
|
|
|
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
2019-02-08 11:11:44 -08:00
|
|
|
result = list()
|
2020-03-12 16:31:42 -07:00
|
|
|
if shelf and check_shelf_view_permissions(shelf):
|
2020-12-13 04:54:09 -08:00
|
|
|
result = calibre_db.session.query(db.Books)\
|
|
|
|
.join(ub.BookShelf,ub.BookShelf.book_id == db.Books.id , isouter=True) \
|
|
|
|
.add_columns(calibre_db.common_filters().label("visible")) \
|
|
|
|
.filter(ub.BookShelf.shelf == shelf_id).order_by(ub.BookShelf.order.asc()).all()
|
2019-02-08 11:11:44 -08:00
|
|
|
return render_title_template('shelf_order.html', entries=result,
|
|
|
|
title=_(u"Change order of Shelf: '%(name)s'", name=shelf.name),
|
|
|
|
shelf=shelf, page="shelforder")
|
2020-12-13 04:54:09 -08:00
|
|
|
|
|
|
|
|
|
|
|
def render_show_shelf(shelf_id, shelf_type, page_no, offset, order):
|
|
|
|
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
|
|
|
|
|
|
|
# check user is allowed to access shelf
|
|
|
|
if shelf and check_shelf_view_permissions(shelf):
|
|
|
|
page = "shelf.html" if shelf_type == 1 else 'shelfdown.html'
|
|
|
|
result, __, pagination = calibre_db.fill_indexpage(page_no, 0,
|
|
|
|
db.Books,
|
|
|
|
ub.BookShelf.shelf == shelf_id,
|
|
|
|
[ub.BookShelf.order.asc()],
|
|
|
|
ub.BookShelf,ub.BookShelf.book_id == db.Books.id)
|
|
|
|
|
|
|
|
# delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web
|
|
|
|
wrong_entries = calibre_db.session.query(ub.BookShelf).join(db.Books, ub.BookShelf.book_id == db.Books.id,
|
|
|
|
isouter=True).filter(db.Books.id == None).all()
|
|
|
|
for entry in wrong_entries:
|
|
|
|
log.info('Not existing book {} in {} deleted'.format(entry.book_id, shelf))
|
|
|
|
try:
|
|
|
|
ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == entry.book_id).delete()
|
|
|
|
ub.session.commit()
|
|
|
|
except (OperationalError, InvalidRequestError):
|
|
|
|
ub.session.rollback()
|
|
|
|
flash(_(u"Settings DB is not Writeable"), category="error")
|
|
|
|
|
|
|
|
return render_title_template(page, entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name),
|
|
|
|
shelf=shelf, page="shelf")
|
|
|
|
else:
|
|
|
|
flash(_(u"Error opening shelf. Shelf does not exist or is not accessible"), category="error")
|
|
|
|
return redirect(url_for("web.index"))
|