mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-31 07:13:02 +00:00 
			
		
		
		
	Download only shelf
Show only titles and download button for specific shelf. Currently only direct link works, e.g: calibre-web/shelfdown/6
This commit is contained in:
		
							
								
								
									
										82
									
								
								cps/templates/shelfdown.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								cps/templates/shelfdown.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="{{ g.user.locale }}"> | ||||||
|  |   <head> | ||||||
|  |     <title>{{instance}} | {{title}}</title> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||||
|  |     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||||
|  |  | ||||||
|  |     <!-- Bootstrap --> | ||||||
|  |     <link rel="apple-touch-icon" sizes="140x140" href="{{ url_for('static', filename='favicon.ico') }}"> | ||||||
|  |     <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}"> | ||||||
|  |     <link href="{{ url_for('static', filename='css/libs/bootstrap.min.css') }}" rel="stylesheet" media="screen"> | ||||||
|  |     <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen"> | ||||||
|  |     {% if g.user.get_theme == 1 %} | ||||||
|  |        <link href="{{ url_for('static', filename='css/caliBlur-style.css') }}" rel="stylesheet" media="screen"> | ||||||
|  |     {% endif %} | ||||||
|  |     <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> | ||||||
|  |     <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> | ||||||
|  |     <!--[if lt IE 9]> | ||||||
|  |       <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> | ||||||
|  |       <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> | ||||||
|  |     <![endif]--> | ||||||
|  |  | ||||||
|  |     {% block header %}{% endblock %} | ||||||
|  |   </head> | ||||||
|  |   <body class="{{ page }}"> | ||||||
|  | {% block body %} | ||||||
|  | <div class="discover"> | ||||||
|  |   <h2>{{title}}</h2> | ||||||
|  |   <div class="row"> | ||||||
|  |  | ||||||
|  |     {% for entry in entries %} | ||||||
|  |     <div class="col-sm-3 col-lg-2 col-xs-6 book"> | ||||||
|  |        | ||||||
|  |       <div class="meta"> | ||||||
|  |         <p class="title">{{entry.title|shortentitle}}</p> | ||||||
|  |         <p class="author"> | ||||||
|  |           {% for author in entry.authors %} | ||||||
|  |             <a href="{{url_for('author', book_id=author.id) }}">{{author.name.replace('|',',')}}</a> | ||||||
|  |             {% if not loop.last %} | ||||||
|  |               & | ||||||
|  |             {% endif %} | ||||||
|  |           {% endfor %} | ||||||
|  |         </p> | ||||||
|  |          | ||||||
|  |       </div> | ||||||
|  | 	   | ||||||
|  | 	  <div class="btn-group" role="group" aria-label="Download, send to Kindle, reading"> | ||||||
|  |           {% if g.user.role_download() %} | ||||||
|  |             {% if entry.data|length %} | ||||||
|  |             <div class="btn-group" role="group"> | ||||||
|  |                 {% if entry.data|length < 2 %} | ||||||
|  |                    | ||||||
|  |                   {% for format in entry.data %} | ||||||
|  |                   <a href="{{ url_for('get_download_link_ext', book_id=entry.id, book_format=format.format|lower, anyname=entry.id|string+'.'+format.format|lower) }}" id="btnGroupDrop1{{format.format|lower}}" class="btn btn-primary" role="button"> | ||||||
|  |                     <span class="glyphicon glyphicon-download"></span>{{format.format}} ({{ format.uncompressed_size|filesizeformat }}) | ||||||
|  |                   </a> | ||||||
|  |                   {% endfor %} | ||||||
|  |                 {% else %} | ||||||
|  |                   <button id="btnGroupDrop1" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||||
|  |                     <span class="glyphicon glyphicon-download"></span> {{_('Download')}} | ||||||
|  |                     <span class="caret"></span> | ||||||
|  |                   </button> | ||||||
|  |                   <ul class="dropdown-menu" aria-labelledby="btnGroupDrop1"> | ||||||
|  |                   {% for format in entry.data %} | ||||||
|  |                     <li><a href="{{ url_for('get_download_link_ext', book_id=entry.id, book_format=format.format|lower, anyname=entry.id|string+'.'+format.format|lower) }}">{{format.format}} ({{ format.uncompressed_size|filesizeformat }})</a></li> | ||||||
|  |                   {% endfor %} | ||||||
|  |                   </ul> | ||||||
|  |                 {% endif %} | ||||||
|  |             </div> | ||||||
|  |             {% endif %} | ||||||
|  |           {% endif %} | ||||||
|  |        </div> | ||||||
|  |     </div> | ||||||
|  |     {% endfor %} | ||||||
|  |   </div> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | {% endblock %} | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										29
									
								
								cps/web.py
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								cps/web.py
									
									
									
									
									
								
							| @@ -2676,6 +2676,35 @@ def show_shelf(shelf_id): | |||||||
|         return redirect(url_for("index")) |         return redirect(url_for("index")) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @app.route("/shelfdown/<int:shelf_id>") | ||||||
|  | @login_required_if_no_ano | ||||||
|  | def show_shelf_down(shelf_id): | ||||||
|  |     if current_user.is_anonymous: | ||||||
|  |         shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == shelf_id).first() | ||||||
|  |     else: | ||||||
|  |         shelf = ub.session.query(ub.Shelf).filter(ub.or_(ub.and_(ub.Shelf.user_id == int(current_user.id), | ||||||
|  |                                                                  ub.Shelf.id == shelf_id), | ||||||
|  |                                                          ub.and_(ub.Shelf.is_public == 1, | ||||||
|  |                                                                  ub.Shelf.id == shelf_id))).first() | ||||||
|  |     result = list() | ||||||
|  |     # user is allowed to access shelf | ||||||
|  |     if shelf: | ||||||
|  |         books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).order_by( | ||||||
|  |             ub.BookShelf.order.asc()).all() | ||||||
|  |         for book in books_in_shelf: | ||||||
|  |             cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() | ||||||
|  |             if cur_book: | ||||||
|  |                 result.append(cur_book) | ||||||
|  |             else: | ||||||
|  |                 app.logger.info('Not existing book %s in shelf %s deleted' % (book.book_id, shelf.id)) | ||||||
|  |                 ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete() | ||||||
|  |                 ub.session.commit() | ||||||
|  |         return render_title_template('shelfdown.html', 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("index")) | ||||||
|  |  | ||||||
| @app.route("/shelf/order/<int:shelf_id>", methods=["GET", "POST"]) | @app.route("/shelf/order/<int:shelf_id>", methods=["GET", "POST"]) | ||||||
| @login_required | @login_required | ||||||
| def order_shelf(shelf_id): | def order_shelf(shelf_id): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 otapi
					otapi