Source code for stakeholders.api

"""
This module contains the API and API factory.
"""


import json
import flask
import stakeholders.db
import stakeholders.utils


# In the API functions below, we call `to_dict` on `flask.request.form`.
# This is because `flask.request.form` is an ImmutableMultiDict, and
# we experience issues in Python 3.5 if we do not convert it into a
# standard dict before passing it into the database functions.


[docs]def create_api(file="./stakeholders.sqlite3"): """ This is the API factory. It returns an instance of the API. Parameters ---------- file : str The name of the database file (`stakeholders.sqlite3` by default). Returns ------- api : Flask application object An instance of the API as a Flask application object. """ api = flask.Flask(__name__) @api.route("/api/v1/stakeholders/add", methods=["POST"]) def add_stakeholder(): """ This is the endpoint for adding a stakeholder. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders` table if it does not already exist. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() # We extract the values of `power` and `interest` # from the body of the request and compute # the approach for managing this stakeholder. approach = stakeholders.utils.compute_approach( flask.request.form.get("power"), flask.request.form.get("interest") ) # We create a dict with information on the stakeholder. stakeholder = { "name": flask.request.form.get("name"), "role": flask.request.form.get("role"), "sentiment": flask.request.form.get("sentiment"), "power": flask.request.form.get("power"), "interest": flask.request.form.get("interest"), "approach": approach } # We insert a record into the `stakeholders` table. db.insert_into_stakeholders_table(**stakeholder) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/stakeholders/show") def show_stakeholders(): """ This is the endpoint for showing stakeholders. It accepts a `GET` request. It returns a status code (`200`) and records serialized as JSON. """ # We open a connection to the database and create the # `stakeholders` table if it does not already exist. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() # If it exists, then we obtain the value of the `id` # query parameter. id = flask.request.args.get("id") # If there is no `id`, then we select all records # from the `stakeholders` table. # # Otherwise, we select a single record # from the `stakeholders` table. if id is None: results = db.select_all_from_stakeholders_table() else: results = db.select_from_stakeholders_table(id=id) # We return a `200` status code and records serialized # as JSON. return ( json.dumps(results), 200, {"Content-Type": "application/json"} ) @api.route("/api/v1/stakeholders/update", methods=["POST"]) def update_stakeholder(): """ This is the endpoint for updating a stakeholder. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders` table if it does not already exist. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() # We extract the values of `power` and `interest` # from the body of the request and compute # the approach for managing this stakeholder. approach = stakeholders.utils.compute_approach( flask.request.form.get("power"), flask.request.form.get("interest") ) # We create a dict with information on the stakeholder. stakeholder = { "id": flask.request.form.get("id"), "name": flask.request.form.get("name"), "role": flask.request.form.get("role"), "sentiment": flask.request.form.get("sentiment"), "power": flask.request.form.get("power"), "interest": flask.request.form.get("interest"), "approach": approach } # We update a record in the `stakeholders` table. db.update_stakeholders_table(**stakeholder) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/stakeholders/delete", methods=["POST"]) def delete_stakeholder(): """ This is the endpoint for deleting a stakeholder. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders` table if it does not already exist. # # We delete a record from the `stakeholders` table. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.delete_from_stakeholders_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/deliverables/add", methods=["POST"]) def add_deliverable(): """ This is the endpoint for adding a deliverable. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `deliverables` table if it does not already exist. # # We insert a record into the `deliverables` table. with stakeholders.db.Database(file=file) as db: db.create_deliverables_table() db.insert_into_deliverables_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/deliverables/show") def show_deliverables(): """ This is the endpoint for showing deliverables. It accepts a `GET` request. It returns a status code (`200`) and records serialized as JSON. """ # We open a connection to the database and create the # `deliverables` table if it does not already exist. with stakeholders.db.Database(file=file) as db: db.create_deliverables_table() # If it exists, then we obtain the value of the `id` # query parameter. id = flask.request.args.get("id") # If there is no `id`, then we select all records # from the `deliverables` table. # # Otherwise, we select a single record # from the `deliverables` table. if id is None: results = db.select_all_from_deliverables_table() else: results = db.select_from_deliverables_table(id=id) # We return a `200` status code and records serialized # as JSON. return ( json.dumps(results), 200, {"Content-Type": "application/json"} ) @api.route("/api/v1/deliverables/update", methods=["POST"]) def update_deliverable(): """ This is the endpoint for updating a deliverable. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `deliverables` table if it does not already exist. # # We update a record in the `deliverables` table. with stakeholders.db.Database(file=file) as db: db.create_deliverables_table() db.update_deliverables_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/deliverables/delete", methods=["POST"]) def delete_deliverable(): """ This is the endpoint for deleting a deliverable. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `deliverables` table if it does not already exist. # # We delete a record from the `deliverables` table. with stakeholders.db.Database(file=file) as db: db.create_deliverables_table() db.delete_from_deliverables_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/associations/add", methods=["POST"]) def add_association(): """ This is the endpoint for adding an association. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders`, `deliverables`, and `associations` tables # if they do not already exist. # # We insert a record into the `associations` table. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.create_deliverables_table() db.create_associations_table() db.insert_into_associations_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/associations/show") def show_associations(): """ This is the endpoint for showing associations. It accepts a `GET` request. It returns a status code (`200`) and records serialized as JSON. """ # We open a connection to the database and create the # `stakeholders`, `deliverables`, and `associations` tables # if they do not already exist. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.create_deliverables_table() db.create_associations_table() # If it exists, then we obtain the value of the `id` # query parameter. id = flask.request.args.get("id") # If there is no `id`, then we select all records # from the `associations` table. # # Otherwise, we select a single record # from the `associations` table. if id is None: results = db.select_all_from_associations_table() else: results = db.select_from_associations_table(id=id) # We return a `200` status code and records serialized # as JSON. return ( json.dumps(results), 200, {"Content-Type": "application/json"} ) @api.route("/api/v1/associations/update", methods=["POST"]) def update_association(): """ This is the endpoint for updating an association. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders`, `deliverables`, and `associations` tables # if they do not already exist. # # We update a record in the `associations` table. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.create_deliverables_table() db.create_associations_table() db.update_associations_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/associations/delete", methods=["POST"]) def delete_association(): """ This is the endpoint for deleting an association. It accepts a `POST` request. It returns a status code (`200`) and a message (`Success`). """ # We open a connection to the database and create the # `stakeholders`, `deliverables`, and `associations` tables # if they do not already exist. # # We delete a record from the `associations` table. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.create_deliverables_table() db.create_associations_table() db.delete_from_associations_table(**flask.request.form.to_dict()) # We return a `200` status code and a `Success` message. return ( "Success", 200 ) @api.route("/api/v1/management-plan/show") def show_management_plan(): # We open a connection to the database and create the # `stakeholders`, `deliverables`, and `associations` tables # if they do not already exist. with stakeholders.db.Database(file=file) as db: db.create_stakeholders_table() db.create_deliverables_table() db.create_associations_table() # We request all records from the `associations` table. results = db.select_all_from_associations_table() # We map, reduce, and sort these records. mapped_reduced_sorted = stakeholders.utils.sort( stakeholders.utils.map_reduce(results) ) # We return a `200` status code and records serialized # as JSON. return ( json.dumps(mapped_reduced_sorted), 200, {"Content-Type": "application/json"} ) return api