| from .tool import tool as tool_blueprint | from .tool import tool as tool_blueprint | ||||
| app.register_blueprint(tool_blueprint) | app.register_blueprint(tool_blueprint) | ||||
| # blueprint for example parts of app | |||||
| from .example import example as example_blueprint | |||||
| app.register_blueprint(example_blueprint) | |||||
| # blueprint for book parts of app | |||||
| from .book import book as book_blueprint | |||||
| app.register_blueprint(book_blueprint) | |||||
| # blueprint for practice parts of app | # blueprint for practice parts of app | ||||
| from .practice import practice as practice_blueprint | from .practice import practice as practice_blueprint |
| # @name: book.py | |||||
| # @version: 0.1 | |||||
| # @creation_date: 2021-11-03 | |||||
| # @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
| # @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
| # @purpose: book route for book-related functions and pages | |||||
| # @acknowledgements: | |||||
| # https://www.digitalocean.com/community/tutorials/how-to-make-a-web-application-using-flask-in-python-3 | |||||
| from flask import Blueprint, render_template, request, flash, redirect, url_for | |||||
| from flask_login import login_required, current_user | |||||
| from .models import Book | |||||
| from werkzeug.exceptions import abort | |||||
| from . import db | |||||
| book = Blueprint('book', __name__) | |||||
| # function to retrieve data about a single book from the database | |||||
| def get_book(book_id): | |||||
| book = Book.query.filter_by(id=book_id).first() | |||||
| if book is None: | |||||
| abort(404) | |||||
| return book | |||||
| # route for displaying all books in database | |||||
| @book.route('/books') | |||||
| def get_books(): | |||||
| books = Book.query | |||||
| return render_template('books.html', books=books) | |||||
| # route for displaying a single book based on the ID in the database | |||||
| @book.route('/books/<int:book_id>') | |||||
| def show_book(book_id): | |||||
| book = get_book(book_id) | |||||
| return render_template('book.html', book=book) | |||||
| # route for editing a single book based on the ID in the database | |||||
| @book.route('/books/<int:book_id>/edit', methods=('GET', 'POST')) | |||||
| @login_required | |||||
| def edit_book(book_id): | |||||
| book = get_book(book_id) | |||||
| if request.method == 'POST': | |||||
| name = request.form['name'] | |||||
| description = request.form['description'] | |||||
| if not name: | |||||
| flash('Name is required!') | |||||
| else: | |||||
| book = Book.query.get(book_id) | |||||
| book.name = name | |||||
| book.description = description | |||||
| db.session.commit() | |||||
| return redirect(url_for('book.get_books')) | |||||
| return render_template('edit.html', book=book) | |||||
| # route for function to delete a single book from the edit page | |||||
| @book.route('/books/<int:book_id>/delete', methods=('POST',)) | |||||
| @login_required | |||||
| def delete_book(book_id): | |||||
| book = get_book(book_id) | |||||
| deletion = Book.query.get(book_id) | |||||
| db.session.delete(deletion) | |||||
| db.session.commit() | |||||
| flash('Successfully deleted!') | |||||
| return redirect(url_for('book.get_books')) |
| from flask import Blueprint, render_template, request, flash, redirect, url_for | from flask import Blueprint, render_template, request, flash, redirect, url_for | ||||
| from flask_login import login_required, current_user | from flask_login import login_required, current_user | ||||
| from .models import Tool | from .models import Tool | ||||
| from .models import Example | |||||
| from .models import Book | |||||
| from .models import Practice | from .models import Practice | ||||
| from werkzeug.exceptions import abort | from werkzeug.exceptions import abort | ||||
| from . import db | from . import db | ||||
| db.session.add(new_tool) | db.session.add(new_tool) | ||||
| db.session.commit() | db.session.commit() | ||||
| elif request.form.get('resource_type') == 'example': | |||||
| elif request.form.get('resource_type') == 'book': | |||||
| name = request.form.get('name') | name = request.form.get('name') | ||||
| description = request.form.get('description') | description = request.form.get('description') | ||||
| if not name: | if not name: | ||||
| flash('Name is required!') | flash('Name is required!') | ||||
| else: | else: | ||||
| example = Example.query.filter_by(name=name).first() # if this returns an example, then the name already exists in database | |||||
| example = Book.query.filter_by(name=name).first() # if this returns a book, then the name already exists in database | |||||
| if example: # if an example is found, we want to redirect back to create page | |||||
| flash('Example with same name already exists') | |||||
| if example: # if a book is found, we want to redirect back to create page | |||||
| flash('Book with same name already exists') | |||||
| return redirect(url_for('create.create')) | return redirect(url_for('create.create')) | ||||
| # create a new example with the form data | |||||
| new_example = Example(name=name, description=description) | |||||
| # create a new book with the form data | |||||
| new_book = Book(name=name, description=description) | |||||
| # add the new example to the database | |||||
| db.session.add(new_example) | |||||
| # add the new book to the database | |||||
| db.session.add(new_book) | |||||
| db.session.commit() | db.session.commit() | ||||
| elif request.form.get('resource_type') == 'practice': | elif request.form.get('resource_type') == 'practice': |
| # @name: example.py | |||||
| # @version: 0.1 | |||||
| # @creation_date: 2021-11-03 | |||||
| # @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
| # @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
| # @purpose: example route for example-related functions and pages | |||||
| # @acknowledgements: | |||||
| # https://www.digitalocean.com/community/tutorials/how-to-make-a-web-application-using-flask-in-python-3 | |||||
| from flask import Blueprint, render_template, request, flash, redirect, url_for | |||||
| from flask_login import login_required, current_user | |||||
| from .models import Example | |||||
| from werkzeug.exceptions import abort | |||||
| from . import db | |||||
| example = Blueprint('example', __name__) | |||||
| # function to retrieve data about a single example from the database | |||||
| def get_example(example_id): | |||||
| example = Example.query.filter_by(id=example_id).first() | |||||
| if example is None: | |||||
| abort(404) | |||||
| return example | |||||
| # route for displaying all examples in database | |||||
| @example.route('/examples') | |||||
| def get_examples(): | |||||
| examples = Example.query | |||||
| return render_template('examples.html', examples=examples) | |||||
| # route for displaying a single example based on the ID in the database | |||||
| @example.route('/examples/<int:example_id>') | |||||
| def show_example(example_id): | |||||
| example = get_example(example_id) | |||||
| return render_template('example.html', example=example) | |||||
| # route for editing a single example based on the ID in the database | |||||
| @example.route('/examples/<int:example_id>/edit', methods=('GET', 'POST')) | |||||
| @login_required | |||||
| def edit_example(example_id): | |||||
| example = get_example(example_id) | |||||
| if request.method == 'POST': | |||||
| name = request.form['name'] | |||||
| description = request.form['description'] | |||||
| if not name: | |||||
| flash('Name is required!') | |||||
| else: | |||||
| example = Example.query.get(example_id) | |||||
| example.name = name | |||||
| example.description = description | |||||
| db.session.commit() | |||||
| return redirect(url_for('example.get_examples')) | |||||
| return render_template('edit.html', example=example) | |||||
| # route for function to delete a single example from the edit page | |||||
| @example.route('/examples/<int:example_id>/delete', methods=('POST',)) | |||||
| @login_required | |||||
| def delete_example(example_id): | |||||
| example = get_example(example_id) | |||||
| deletion = Example.query.get(example_id) | |||||
| db.session.delete(deletion) | |||||
| db.session.commit() | |||||
| flash('Successfully deleted!') | |||||
| return redirect(url_for('example.get_examples')) |
| saas = db.Column(db.Text) | saas = db.Column(db.Text) | ||||
| dependencies = db.Column(db.Text) | dependencies = db.Column(db.Text) | ||||
| # table for examples | |||||
| class Example(db.Model): | |||||
| # table for books | |||||
| class Book(db.Model): | |||||
| id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy | id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy | ||||
| created = db.Column(db.DateTime, default=datetime.utcnow) | created = db.Column(db.DateTime, default=datetime.utcnow) | ||||
| name = db.Column(db.Text) | name = db.Column(db.Text) |
| <div class="collapse navbar-collapse" id="navbarSupportedContent"> | <div class="collapse navbar-collapse" id="navbarSupportedContent"> | ||||
| <ul class="navbar-nav"> | <ul class="navbar-nav"> | ||||
| <li class="nav-item"> | <li class="nav-item"> | ||||
| <a href="{{ url_for('example.get_examples') }}" class="nav-link"> | |||||
| <a href="{{ url_for('book.get_books') }}" class="nav-link"> | |||||
| Books | Books | ||||
| </a> | </a> | ||||
| </li> | </li> |
| {% block content %} | {% block content %} | ||||
| <div class="row"> | <div class="row"> | ||||
| <div class="col-12 text-center"> | <div class="col-12 text-center"> | ||||
| <h1>{% block title %} Examples {% endblock %}</h1> | |||||
| <h1>{% block title %} Books {% endblock %}</h1> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="row"> | <div class="row"> | ||||
| <div class="col-md-4 col-sm-6 py-3"> | <div class="col-md-4 col-sm-6 py-3"> | ||||
| <div class="card"> | <div class="card"> | ||||
| <div class="card-header"> | <div class="card-header"> | ||||
| <a href="{{ url_for('example.show_example', example_id=example['id']) }}"> | |||||
| <h2 class="card-title">{{ example['name'] }}</h2> | |||||
| <a href="{{ url_for('book.show_book', book_id=book['id']) }}"> | |||||
| <h2 class="card-title">{{ book['name'] }}</h2> | |||||
| </a> | </a> | ||||
| </div> | </div> | ||||
| <div class="card-body"> | <div class="card-body"> | ||||
| </p> | </p> | ||||
| <span class="badge bg-secondary">{{ example['created'].strftime("%Y-%m-%d %H:%M") }} UTC</span> | <span class="badge bg-secondary">{{ example['created'].strftime("%Y-%m-%d %H:%M") }} UTC</span> | ||||
| {% if current_user.is_authenticated %} | {% if current_user.is_authenticated %} | ||||
| <a href="{{ url_for('example.edit_example', example_id=example['id']) }}"> | |||||
| <a href="{{ url_for('book.edit_book', book_id=book['id']) }}"> | |||||
| <span class="badge bg-dark">Edit</span> | <span class="badge bg-dark">Edit</span> | ||||
| </a> | </a> | ||||
| {% endif %} | {% endif %} |