""" Flask Documentation: http://flask.pocoo.org/docs/ Jinja2 Documentation: http://jinja.pocoo.org/2/documentation/ Werkzeug Documentation: http://werkzeug.pocoo.org/documentation/ This file creates your application. """ from app import app, db from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory, jsonify, abort from app.forms import UserForm, UserForm_Edit from app.models import Book, BookSchema, Author from app.cover import get_cover import os from werkzeug.utils import secure_filename # import sqlite3 ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) book_schema = BookSchema() books_schema = BookSchema(many=True) def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS ### # Routing for your application. ### @app.route('/') def home(): """Render website's home page.""" return render_template('home.html') @app.route('/hello/') def hello(name): return "Hello " + name @app.route('/about/') def about(): """Render the website's about page.""" return render_template('about.html', name="Mary Jane") @app.route('/uploads/') def uploaded_file(filename): return send_from_directory(app.config['UPLOAD_FOLDER'], filename) @app.route('/uploads/cover/') def uploaded_file_cover(filename): return send_from_directory(app.config['UPLOAD_FOLDER_COVER'], filename) @app.route('/books') def show_books(): books = db.session.query(Book).all() # or you could have used User.query.all() return render_template('show_books.html', books=books) @app.route('/books/') def show_book_by_id(id): book = Book.query.get(id) if not book: return render_template('red_link.html', id=id) else: return render_template('show_book_detail.html', book=book) @app.route('/books//delete', methods=['POST', 'GET']) def remove_book_by_id(id): book_to_edit = Book.query.filter_by(id=id).first() title = book_to_edit.title Book.query.filter_by(id=id).delete() author_table = Author.query.filter_by(user_id=book_to_edit.id).delete() db.session.commit() flash("%s deleted from library" % (title)) return redirect(url_for('show_books')) @app.route('/books//edit', methods=['POST', 'GET']) def edit_book_by_id(id): book_to_edit = Book.query.filter_by(id=id).first() user_form = UserForm_Edit(title = book_to_edit.title, author =book_to_edit.author) if request.method == 'POST': if user_form.validate_on_submit(): # check if the post request has the file part title = user_form.title.data # You could also have used request.form['name'] author = user_form.author.data # You could also have used request.form['email'] # save user to database #book = Book(title, author, filename, cover, file_extension) book_to_edit.title = title db.session.commit() book = Book.query.filter_by(title=title).first() author_table = Author.query.filter_by(user_id=book.id).delete() for this_author in author: this_author = Author(this_author.get('author_name')) book.author.append(this_author) db.session.commit() flash("%s updated" % (title)) return redirect(url_for('show_books')) return render_template('edit_book_detail.html', book=book_to_edit, form=user_form) @app.route('/add-book', methods=['POST', 'GET']) def add_book(): user_form = UserForm() if request.method == 'POST': if user_form.validate_on_submit(): # check if the post request has the file part if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] # if user does not select file, browser also # submit a empty part without filename if file.filename == '': flash('No selected file') return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) fullpath = os.path.join(app.config['UPLOAD_FOLDER'], filename) name, file_extension = os.path.splitext(filename) file.save(fullpath) cover = get_cover(fullpath, name) title = user_form.title.data # You could also have used request.form['name'] author = user_form.author.data # You could also have used tag = user_form.tag.data print(author) print(len(author)) book = Book(title, filename, cover, file_extension, tag) db.session.add(book) db.session.commit() book = Book.query.filter_by(title=title).first() for this_author in author: this_author = Author(this_author.get('author_name')) book.author.append(this_author) db.session.commit() # save user to database flash("%s added to the library" % (title)) return redirect(url_for('show_books')) else: flash('allowed file formats: %s' % ALLOWED_EXTENSIONS) flash_errors(user_form) return render_template('add_book.html', form=user_form) # Flash errors from the form if validation fails def flash_errors(form): for field, errors in form.errors.items(): for error in errors: flash(u"Error in the %s field - %s" % ( getattr(form, field).label.text, error )) #Authors @app.route('/authors/') def show_author_by_id(id): author = Author.query.get(id) if not author: abort (404) else: return render_template('show_author_detail.html', author=author) @app.route('/authors//edit', methods=['POST', 'GET']) def edit_author_by_id(id): book_to_edit = Book.query.filter_by(id=id).first() user_form = UserForm_Edit(title = book_to_edit.title, author =book_to_edit.author) if request.method == 'POST': if user_form.validate_on_submit(): # check if the post request has the file part title = user_form.title.data # You could also have used request.form['name'] author = user_form.author.data # You could also have used request.form['email'] # save user to database #book = Book(title, author, filename, cover, file_extension) book_to_edit.title = title db.session.commit() book = Book.query.filter_by(title=title).first() author_table = Author.query.filter_by(user_id=book.id).delete() for this_author in author: this_author = Author(this_author.get('author_name')) book.author.append(this_author) db.session.commit() flash("%s updated" % (title)) return redirect(url_for('show_books')) return render_template('edit_book_detail.html', book=book_to_edit, form=user_form) ### # The API ### @app.route('/api/books', methods=['GET']) def get_books(): books = Book.query.all() data, errors = books_schema.dump(books) return jsonify({'books': data}) @app.route('/api/books/', methods=['GET']) def get_book_by_id(id): book = Book.query.get(id) book_result, error = book_schema.dump(book) if not book_result: return jsonify({"message": "Book could not be found."}), 400 else: return jsonify({'book': book_result}) ### # The functions below should be applicable to all Flask apps. ### @app.route('/.txt') def send_text_file(file_name): """Send your static text file.""" file_dot_text = file_name + '.txt' return app.send_static_file(file_dot_text) @app.after_request def add_header(response): """ Add headers to both force latest IE rendering engine or Chrome Frame, and also to cache the rendered page for 10 minutes. """ response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1' response.headers['Cache-Control'] = 'public, max-age=600' return response @app.errorhandler(404) def page_not_found(error): """Custom 404 page.""" return render_template('404.html'), 404 if __name__ == '__main__': app.run(debug=True,host="0.0.0.0",port="8080")