mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-11-03 16:53:02 +00:00 
			
		
		
		
	Code refactor shelf handling
This commit is contained in:
		
							
								
								
									
										126
									
								
								cps/shelf.py
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								cps/shelf.py
									
									
									
									
									
								
							@@ -27,7 +27,7 @@ import sys
 | 
			
		||||
from flask import Blueprint, request, flash, redirect, url_for
 | 
			
		||||
from flask_babel import gettext as _
 | 
			
		||||
from flask_login import login_required, current_user
 | 
			
		||||
from sqlalchemy.sql.expression import func
 | 
			
		||||
from sqlalchemy.sql.expression import func, true
 | 
			
		||||
from sqlalchemy.exc import OperationalError, InvalidRequestError
 | 
			
		||||
 | 
			
		||||
from . import logger, ub, calibre_db, db
 | 
			
		||||
@@ -221,96 +221,78 @@ def remove_from_shelf(shelf_id, book_id):
 | 
			
		||||
@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)
 | 
			
		||||
 | 
			
		||||
        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:
 | 
			
		||||
                flash(_(u"A public shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                      category="error")
 | 
			
		||||
        else:
 | 
			
		||||
            is_shelf_name_unique = ub.session.query(ub.Shelf) \
 | 
			
		||||
                .filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 0) &
 | 
			
		||||
                        (ub.Shelf.user_id == int(current_user.id)))\
 | 
			
		||||
                                       .first() is None
 | 
			
		||||
 | 
			
		||||
            if not is_shelf_name_unique:
 | 
			
		||||
                flash(_(u"A private shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                      category="error")
 | 
			
		||||
 | 
			
		||||
        if is_shelf_name_unique:
 | 
			
		||||
            try:
 | 
			
		||||
                ub.session.add(shelf)
 | 
			
		||||
                ub.session.commit()
 | 
			
		||||
                flash(_(u"Shelf %(title)s created", title=to_save["title"]), category="success")
 | 
			
		||||
                return redirect(url_for('shelf.show_shelf', shelf_id=shelf.id))
 | 
			
		||||
            except (OperationalError, InvalidRequestError):
 | 
			
		||||
                ub.session.rollback()
 | 
			
		||||
                flash(_(u"Settings DB is not Writeable"), category="error")
 | 
			
		||||
            except Exception:
 | 
			
		||||
                ub.session.rollback()
 | 
			
		||||
                flash(_(u"There was an error"), category="error")
 | 
			
		||||
        return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
 | 
			
		||||
    else:
 | 
			
		||||
        return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
 | 
			
		||||
    create_edit_shelf(shelf)
 | 
			
		||||
    return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@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()
 | 
			
		||||
    create_edit_shelf(shelf, shelf_id)
 | 
			
		||||
    return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# if shelf ID is set, we are editing a shelf
 | 
			
		||||
def create_edit_shelf(shelf, shelf_id=False):
 | 
			
		||||
    if request.method == "POST":
 | 
			
		||||
        to_save = request.form.to_dict()
 | 
			
		||||
 | 
			
		||||
        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:
 | 
			
		||||
                flash(_(u"A public shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                      category="error")
 | 
			
		||||
        else:
 | 
			
		||||
            is_shelf_name_unique = ub.session.query(ub.Shelf) \
 | 
			
		||||
                .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
 | 
			
		||||
 | 
			
		||||
            if not is_shelf_name_unique:
 | 
			
		||||
                flash(_(u"A private shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                      category="error")
 | 
			
		||||
 | 
			
		||||
        if is_shelf_name_unique:
 | 
			
		||||
            shelf.name = to_save["title"]
 | 
			
		||||
            shelf.last_modified = datetime.utcnow()
 | 
			
		||||
        if check_shelf_is_unique(shelf, to_save, shelf_id):
 | 
			
		||||
            if "is_public" in to_save:
 | 
			
		||||
                shelf.is_public = 1
 | 
			
		||||
            else:
 | 
			
		||||
                shelf.is_public = 0
 | 
			
		||||
            shelf.name = to_save["title"]
 | 
			
		||||
            shelf.last_modified = datetime.utcnow()
 | 
			
		||||
            if not shelf_id:
 | 
			
		||||
                shelf.user_id = int(current_user.id)
 | 
			
		||||
            try:
 | 
			
		||||
                if shelf_id:
 | 
			
		||||
                    ub.session.add(shelf)
 | 
			
		||||
                    shelf_action = "changed"
 | 
			
		||||
                    flash_text = _(u"Shelf %(title)s changed", title=to_save["title"])
 | 
			
		||||
                else:
 | 
			
		||||
                    shelf_action = "created"
 | 
			
		||||
                    flash_text = _(u"Shelf %(title)s created", title=to_save["title"])
 | 
			
		||||
                ub.session.commit()
 | 
			
		||||
                flash(_(u"Shelf %(title)s changed", title=to_save["title"]), category="success")
 | 
			
		||||
            except (OperationalError, InvalidRequestError):
 | 
			
		||||
                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:
 | 
			
		||||
                ub.session.rollback()
 | 
			
		||||
                log.debug_or_exception(e)
 | 
			
		||||
                flash(_(u"Settings DB is not Writeable"), category="error")
 | 
			
		||||
            except Exception:
 | 
			
		||||
            except Exception as e:
 | 
			
		||||
                ub.session.rollback()
 | 
			
		||||
                log.debug_or_exception(e)
 | 
			
		||||
                flash(_(u"There was an error"), category="error")
 | 
			
		||||
        return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def check_shelf_is_unique(shelf, to_save, shelf_id=False):
 | 
			
		||||
    if shelf_id:
 | 
			
		||||
        ident = ub.Shelf.id != shelf_id
 | 
			
		||||
    else:
 | 
			
		||||
        return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
 | 
			
		||||
        ident = true()
 | 
			
		||||
    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(ident) \
 | 
			
		||||
                                   .first() is None
 | 
			
		||||
 | 
			
		||||
        if not is_shelf_name_unique:
 | 
			
		||||
            flash(_(u"A public shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                  category="error")
 | 
			
		||||
    else:
 | 
			
		||||
        is_shelf_name_unique = ub.session.query(ub.Shelf) \
 | 
			
		||||
                                   .filter((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 0) &
 | 
			
		||||
                                           (ub.Shelf.user_id == int(current_user.id))) \
 | 
			
		||||
                                   .filter(ident) \
 | 
			
		||||
                                   .first() is None
 | 
			
		||||
 | 
			
		||||
        if not is_shelf_name_unique:
 | 
			
		||||
            flash(_(u"A private shelf with the name '%(title)s' already exists.", title=to_save["title"]),
 | 
			
		||||
                  category="error")
 | 
			
		||||
    return is_shelf_name_unique
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def delete_shelf_helper(cur_shelf):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user