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 practice parts of app | |||||
from .practice import practice as practice_blueprint | |||||
app.register_blueprint(practice_blueprint) | |||||
# blueprint for sensitivity parts of app | |||||
from .sensitivity import sensitivity as sensitivity_blueprint | |||||
app.register_blueprint(sensitivity_blueprint) | |||||
# blueprint for typology parts of app | |||||
from .typology import typology as typology_blueprint | |||||
app.register_blueprint(typology_blueprint) | |||||
# blueprint for workflow parts of app | |||||
from .workflow import workflow as workflow_blueprint | |||||
app.register_blueprint(workflow_blueprint) | |||||
# blueprint for publisher parts of app | |||||
from .publisher import publisher as publisher_blueprint | |||||
app.register_blueprint(publisher_blueprint) | |||||
# blueprint for book parts of app | # blueprint for book parts of app | ||||
from .book import book as book_blueprint | from .book import book as book_blueprint | ||||
app.register_blueprint(book_blueprint) | app.register_blueprint(book_blueprint) | ||||
# blueprint for practice parts of app | |||||
from .practice import practice as practice_blueprint | |||||
app.register_blueprint(practice_blueprint) | |||||
# blueprint for reference parts of app | |||||
from .reference import reference as reference_blueprint | |||||
app.register_blueprint(reference_blueprint) | |||||
# blueprint for create parts of app | # blueprint for create parts of app | ||||
from .create import create as create_blueprint | from .create import create as create_blueprint |
# @name: publisher.py | |||||
# @version: 0.1 | |||||
# @creation_date: 2022-02-08 | |||||
# @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
# @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
# @purpose: publisher route for publisher-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 Publisher | |||||
from werkzeug.exceptions import abort | |||||
from . import db | |||||
publisher = Blueprint('publisher', __name__) | |||||
# function to retrieve data about a single publisher from the database | |||||
def get_publisher(publisher_id): | |||||
publisher = Publisher.query.filter_by(id=publisher_id).first() | |||||
if publisher is None: | |||||
abort(404) | |||||
return publisher | |||||
# route for displaying all publishers in database | |||||
@publisher.route('/publishers') | |||||
def get_publishers(): | |||||
publishers = Publisher.query | |||||
return render_template('publishers.html', publishers=publishers) | |||||
# route for displaying a single publisher based on the ID in the database | |||||
@publisher.route('/publishers/<int:publisher_id>') | |||||
def show_publisher(publisher_id): | |||||
publisher = get_publisher(publisher_id) | |||||
return render_template('publisher.html', publisher=publisher) | |||||
# route for editing a single publisher based on the ID in the database | |||||
@publisher.route('/publishers/<int:publisher_id>/edit', methods=('GET', 'POST')) | |||||
@login_required | |||||
def edit_publisher(publisher_id): | |||||
publisher = get_publisher(publisher_id) | |||||
if request.method == 'POST': | |||||
name = request.form['name'] | |||||
description = request.form['description'] | |||||
if not name: | |||||
flash('Name is required!') | |||||
else: | |||||
publisher = Publisher.query.get(publisher_id) | |||||
publisher.name = name | |||||
publisher.description = description | |||||
db.session.commit() | |||||
return redirect(url_for('publisher.get_publishers')) | |||||
return render_template('edit.html', publisher=publisher) | |||||
# route for function to delete a single publisher from the edit page | |||||
@publisher.route('/publishers/<int:publisher_id>/delete', methods=('POST',)) | |||||
@login_required | |||||
def delete_publisher(publisher_id): | |||||
publisher = get_publisher(publisher_id) | |||||
deletion = Publisher.query.get(publisher_id) | |||||
db.session.delete(deletion) | |||||
db.session.commit() | |||||
flash('Successfully deleted!') | |||||
return redirect(url_for('publisher.get_publishers')) |
# @name: reference.py | |||||
# @version: 0.1 | |||||
# @creation_date: 2022-02-08 | |||||
# @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
# @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
# @purpose: reference route for reference-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 Reference | |||||
from werkzeug.exceptions import abort | |||||
from . import db | |||||
reference = Blueprint('reference', __name__) | |||||
# function to retrieve data about a single reference from the database | |||||
def get_reference(reference_id): | |||||
reference = Reference.query.filter_by(id=reference_id).first() | |||||
if reference is None: | |||||
abort(404) | |||||
return reference | |||||
# route for displaying all references in database | |||||
@reference.route('/references') | |||||
def get_references(): | |||||
references = Reference.query | |||||
return render_template('references.html', references=references) | |||||
# route for displaying a single reference based on the ID in the database | |||||
@reference.route('/references/<int:reference_id>') | |||||
def show_reference(reference_id): | |||||
reference = get_reference(reference_id) | |||||
return render_template('reference.html', reference=reference) | |||||
# route for editing a single reference based on the ID in the database | |||||
@reference.route('/references/<int:reference_id>/edit', methods=('GET', 'POST')) | |||||
@login_required | |||||
def edit_reference(reference_id): | |||||
reference = get_reference(reference_id) | |||||
if request.method == 'POST': | |||||
name = request.form['name'] | |||||
description = request.form['description'] | |||||
if not name: | |||||
flash('Name is required!') | |||||
else: | |||||
reference = Reference.query.get(reference_id) | |||||
reference.name = name | |||||
reference.description = description | |||||
db.session.commit() | |||||
return redirect(url_for('reference.get_references')) | |||||
return render_template('edit.html', reference=reference) | |||||
# route for function to delete a single reference from the edit page | |||||
@reference.route('/references/<int:reference_id>/delete', methods=('POST',)) | |||||
@login_required | |||||
def delete_reference(reference_id): | |||||
reference = get_reference(reference_id) | |||||
deletion = Reference.query.get(reference_id) | |||||
db.session.delete(deletion) | |||||
db.session.commit() | |||||
flash('Successfully deleted!') | |||||
return redirect(url_for('reference.get_references')) |
# @name: sensitivity.py | |||||
# @version: 0.1 | |||||
# @creation_date: 2022-02-08 | |||||
# @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
# @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
# @purpose: sensitivity route for sensitivity-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 Sensitivity | |||||
from werkzeug.exceptions import abort | |||||
from . import db | |||||
sensitivity = Blueprint('sensitivity', __name__) | |||||
# function to retrieve data about a single sensitivity from the database | |||||
def get_sensitivity(sensitivity_id): | |||||
sensitivity = Sensitivity.query.filter_by(id=sensitivity_id).first() | |||||
if sensitivity is None: | |||||
abort(404) | |||||
return sensitivity | |||||
# route for displaying all sensitivities in database | |||||
@sensitivity.route('/sensitivities') | |||||
def get_sensitivities(): | |||||
sensitivities = Sensitivity.query | |||||
return render_template('sensitivities.html', sensitivities=sensitivities) | |||||
# route for displaying a single sensitivity based on the ID in the database | |||||
@sensitivity.route('/sensitivities/<int:sensitivity_id>') | |||||
def show_sensitivity(sensitivity_id): | |||||
sensitivity = get_sensitivity(sensitivity_id) | |||||
return render_template('sensitivity.html', sensitivity=sensitivity) | |||||
# route for editing a single sensitivity based on the ID in the database | |||||
@sensitivity.route('/sensitivities/<int:sensitivity_id>/edit', methods=('GET', 'POST')) | |||||
@login_required | |||||
def edit_sensitivity(sensitivity_id): | |||||
sensitivity = get_sensitivity(sensitivity_id) | |||||
if request.method == 'POST': | |||||
name = request.form['name'] | |||||
description = request.form['description'] | |||||
if not name: | |||||
flash('Name is required!') | |||||
else: | |||||
sensitivity = Sensitivity.query.get(sensitivity_id) | |||||
sensitivity.name = name | |||||
sensitivity.description = description | |||||
db.session.commit() | |||||
return redirect(url_for('sensitivity.get_sensitivities')) | |||||
return render_template('edit.html', sensitivity=sensitivity) | |||||
# route for function to delete a single sensitivity from the edit page | |||||
@sensitivity.route('/sensitivities/<int:sensitivity_id>/delete', methods=('POST',)) | |||||
@login_required | |||||
def delete_sensitivity(sensitivity_id): | |||||
sensitivity = get_sensitivity(sensitivity_id) | |||||
deletion = Sensitivity.query.get(sensitivity_id) | |||||
db.session.delete(deletion) | |||||
db.session.commit() | |||||
flash('Successfully deleted!') | |||||
return redirect(url_for('sensitivity.get_sensitivities')) |
</button> | </button> | ||||
<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"> | |||||
<a href="{{ url_for('book.get_books') }}" class="nav-link"> | |||||
Books | |||||
</a> | |||||
</li> | |||||
<li class="nav-item"> | <li class="nav-item"> | ||||
<a href="{{ url_for('tool.get_tools') }}" class="nav-link"> | <a href="{{ url_for('tool.get_tools') }}" class="nav-link"> | ||||
Tools | Tools | ||||
</a> | </a> | ||||
</li> | </li> | ||||
<li class="nav-item"> | <li class="nav-item"> | ||||
<a href="{{ url_for('main.index') }}" class="nav-link"> | |||||
<a href="{{ url_for('sensitivity.get_sensitivities') }}" class="nav-link"> | |||||
Sensitivities | Sensitivities | ||||
</a> | </a> | ||||
</li> | </li> | ||||
<li class="nav-item"> | <li class="nav-item"> | ||||
<a href="{{ url_for('main.index') }}" class="nav-link"> | |||||
<a href="{{ url_for('typology.get_typologies') }}" class="nav-link"> | |||||
Typologies | |||||
</a> | |||||
</li> | |||||
<li class="nav-item"> | |||||
<a href="{{ url_for('workflow.get_workflows') }}" class="nav-link"> | |||||
Workflows | |||||
</a> | |||||
</li> | |||||
<li class="nav-item"> | |||||
<a href="{{ url_for('publisher.get_publishers') }}" class="nav-link"> | |||||
Publishers | Publishers | ||||
</a> | </a> | ||||
</li> | </li> | ||||
<li class="nav-item"> | |||||
<a href="{{ url_for('book.get_books') }}" class="nav-link"> | |||||
Books | |||||
</a> | |||||
</li> | |||||
<li class="nav-item"> | |||||
<a href="{{ url_for('reference.get_references') }}" class="nav-link"> | |||||
References | |||||
</a> | |||||
</li> | |||||
{% if current_user.is_authenticated %} | {% if current_user.is_authenticated %} | ||||
<li class="nav-item"> | <li class="nav-item"> | ||||
<a href="{{ url_for('create.create_resource') }}" class="nav-link"> | <a href="{{ url_for('create.create_resource') }}" class="nav-link"> |
Project page: | Project page: | ||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['project_url'] }} | |||||
{{ tool['projectUrl'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
Code repository: | Code repository: | ||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['repository_url'] }} | |||||
{{ tool['repositoryUrl'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<th> | <th> | ||||
Stand-alone or platform?: | |||||
Expertise required to use: | |||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['platform_status'] }} | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<th> | |||||
Expertise required: | |||||
</th> | |||||
<td> | |||||
{{ tool['expertise'] }} | |||||
{{ tool['expertiseToUse'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
Expertise required to self-host: | Expertise required to self-host: | ||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['self_host_expertise'] }} | |||||
{{ tool['expertiseToHost'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<th> | <th> | ||||
Import / ingest: | |||||
</th> | |||||
<td> | |||||
{{ tool['ingest'] }} | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<th> | |||||
Output formats: | |||||
Technical dependencies: | |||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['output'] }} | |||||
{{ tool['dependencies'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<th> | <th> | ||||
SAAS?: | |||||
Import / ingest formats: | |||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['saas'] }} | |||||
{{ tool['ingestFormats'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<th> | <th> | ||||
Community-hosted examples: | |||||
Output formats: | |||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['outputFormats'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<th> | <th> | ||||
Technical dependencies: | |||||
Platform status: | |||||
</th> | </th> | ||||
<td> | <td> | ||||
{{ tool['dependencies'] }} | |||||
{{ tool['status'] }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
</tbody> | </tbody> |
# @name: typology.py | |||||
# @version: 0.1 | |||||
# @creation_date: 2022-02-08 | |||||
# @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
# @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
# @purpose: typology route for typology-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 Typology | |||||
from werkzeug.exceptions import abort | |||||
from . import db | |||||
typology = Blueprint('typology', __name__) | |||||
# function to retrieve data about a single typology from the database | |||||
def get_typology(typology_id): | |||||
typology = Typology.query.filter_by(id=typology_id).first() | |||||
if typology is None: | |||||
abort(404) | |||||
return typology | |||||
# route for displaying all typologies in database | |||||
@typology.route('/typologies') | |||||
def get_typologies(): | |||||
typologies = Typology.query | |||||
return render_template('typologies.html', typologies=typologies) | |||||
# route for displaying a single typology based on the ID in the database | |||||
@typology.route('/typologies/<int:typology_id>') | |||||
def show_typology(typology_id): | |||||
typology = get_typology(typology_id) | |||||
return render_template('typology.html', typology=typology) | |||||
# route for editing a single typology based on the ID in the database | |||||
@typology.route('/typologies/<int:typology_id>/edit', methods=('GET', 'POST')) | |||||
@login_required | |||||
def edit_typology(typology_id): | |||||
typology = get_typology(typology_id) | |||||
if request.method == 'POST': | |||||
name = request.form['name'] | |||||
description = request.form['description'] | |||||
if not name: | |||||
flash('Name is required!') | |||||
else: | |||||
typology = Typology.query.get(typology_id) | |||||
typology.name = name | |||||
typology.description = description | |||||
db.session.commit() | |||||
return redirect(url_for('typology.get_typologies')) | |||||
return render_template('edit.html', typology=typology) | |||||
# route for function to delete a single typology from the edit page | |||||
@typology.route('/typologies/<int:typology_id>/delete', methods=('POST',)) | |||||
@login_required | |||||
def delete_typology(typology_id): | |||||
typology = get_typology(typology_id) | |||||
deletion = Typology.query.get(typology_id) | |||||
db.session.delete(deletion) | |||||
db.session.commit() | |||||
flash('Successfully deleted!') | |||||
return redirect(url_for('typology.get_typologies')) |
# @name: workflow.py | |||||
# @version: 0.1 | |||||
# @creation_date: 2022-02-08 | |||||
# @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
# @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
# @purpose: workflow route for workflow-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 Workflow | |||||
from werkzeug.exceptions import abort | |||||
from . import db | |||||
workflow = Blueprint('workflow', __name__) | |||||
# function to retrieve data about a single workflow from the database | |||||
def get_workflow(workflow_id): | |||||
workflow = Workflow.query.filter_by(id=workflow_id).first() | |||||
if workflow is None: | |||||
abort(404) | |||||
return workflow | |||||
# route for displaying all workflows in database | |||||
@workflow.route('/workflows') | |||||
def get_workflows(): | |||||
workflows = Workflow.query | |||||
return render_template('workflows.html', workflows=workflows) | |||||
# route for displaying a single workflow based on the ID in the database | |||||
@workflow.route('/workflows/<int:workflow_id>') | |||||
def show_workflow(workflow_id): | |||||
workflow = get_workflow(workflow_id) | |||||
return render_template('workflow.html', workflow=workflow) | |||||
# route for editing a single workflow based on the ID in the database | |||||
@workflow.route('/workflows/<int:workflow_id>/edit', methods=('GET', 'POST')) | |||||
@login_required | |||||
def edit_workflow(workflow_id): | |||||
workflow = get_workflow(workflow_id) | |||||
if request.method == 'POST': | |||||
name = request.form['name'] | |||||
description = request.form['description'] | |||||
if not name: | |||||
flash('Name is required!') | |||||
else: | |||||
workflow = Workflow.query.get(workflow_id) | |||||
workflow.name = name | |||||
workflow.description = description | |||||
db.session.commit() | |||||
return redirect(url_for('workflow.get_workflows')) | |||||
return render_template('edit.html', workflow=workflow) | |||||
# route for function to delete a single workflow from the edit page | |||||
@workflow.route('/workflows/<int:workflow_id>/delete', methods=('POST',)) | |||||
@login_required | |||||
def delete_workflow(workflow_id): | |||||
workflow = get_workflow(workflow_id) | |||||
deletion = Workflow.query.get(workflow_id) | |||||
db.session.delete(deletion) | |||||
db.session.commit() | |||||
flash('Successfully deleted!') | |||||
return redirect(url_for('workflow.get_workflows')) |