diff --git a/api/Database.py b/api/Database.py index 562cc739b92c39bfe89a898e0144172488a7b805..b5182d38773d4b65b5df141f8f5054e0a8e35fed 100644 --- a/api/Database.py +++ b/api/Database.py @@ -1,4 +1,5 @@ from enum import Enum +from sqlite3.dbapi2 import Date import psycopg2 from psycopg2.extras import RealDictCursor @@ -107,6 +108,10 @@ class Database: self.__query(query, roadmapID, versionCode, versionName, title, dueDate, completionDate, status, milestoneID, fetch_type=FetchType.NONE) + def finish_milestone(self, milestoneID): + query = f'UPDATE milestones SET "{MilestoneParameters.COMPLETION_DATE.value}"=%s, "{MilestoneParameters.STATUS.value}"=%s WHERE "{MilestoneParameters.ID.value}"=%s;' + self.__query(query, Date.today(), 1, milestoneID, fetch_type=FetchType.NONE) + def delete_milestone(self, milestoneID): query = f'DELETE FROM milestones WHERE "{MilestoneParameters.ID.value}"=%s;' self.__query(query, milestoneID, fetch_type=FetchType.NONE) @@ -136,6 +141,10 @@ class Database: query = f'UPDATE tasks SET "{TaskParameters.MILESTONE_ID.value}"=%s, "{TaskParameters.TITLE.value}"=%s, "{TaskParameters.DESCRIPTION.value}"=%s, "{TaskParameters.STATUS.value}"=%s WHERE "{TaskParameters.ID.value}"=%s;' self.__query(query, milestoneID, title, description, status, taskID, fetch_type=FetchType.NONE) + def finish_task(self, taskID): + query = f'UPDATE tasks SET "{TaskParameters.STATUS.value}"=%s WHERE "{TaskParameters.ID.value}"=%s;' + self.__query(query, 1, taskID, fetch_type=FetchType.NONE) + def delete_task(self, taskID): query = f'DELETE FROM tasks WHERE "{TaskParameters.ID.value}"=%s;' self.__query(query, taskID, fetch_type=FetchType.NONE) @@ -165,6 +174,10 @@ class Database: query = f'UPDATE subtasks SET "{SubTaskParameters.TASK_ID.value}"=%s, "{SubTaskParameters.TITLE.value}"=%s, "{SubTaskParameters.DESCRIPTION.value}"=%s, "{SubTaskParameters.STATUS.value}"=%s WHERE "{SubTaskParameters.ID.value}"=%s;' self.__query(query, taskID, title, description, status, subTaskID, fetch_type=FetchType.NONE) + def finish_sub_task(self, subTaskID): + query = f'UPDATE subtasks SET "{SubTaskParameters.STATUS.value}"=%s WHERE "{SubTaskParameters.ID.value}"=%s;' + self.__query(query, 1, subTaskID, fetch_type=FetchType.NONE) + def delete_sub_task(self, subTaskID): query = f'DELETE FROM subtasks WHERE "{SubTaskParameters.ID.value}"=%s;' self.__query(query, subTaskID, fetch_type=FetchType.NONE) diff --git a/api/blueprints/MilestoneAPI.py b/api/blueprints/MilestoneAPI.py index 7d75deba172317f03564fc713625229e176e9235..d9da771abff58585e4bff4969136bb268ce05528 100644 --- a/api/blueprints/MilestoneAPI.py +++ b/api/blueprints/MilestoneAPI.py @@ -5,6 +5,8 @@ from flask_jwt_extended import jwt_required from DateFormatter import DateFormatter from RequestValidator import RequestValidator, ValidationError +from blueprints.SubTaskAPI import SubTaskParameters +from blueprints.TaskAPI import TaskParameters class MilestoneParameters(Enum): @@ -83,6 +85,25 @@ def construct_blueprint(database): parameters[MilestoneParameters.STATUS.value]) return jsonify({"success": True}) + @milestone_api.route("/milestone/<int:milestoneID>/close", methods=['POST']) + @jwt_required + def close_milestone(milestoneID): + if not __milestone_exists(milestoneID): + return jsonify({"success": False, "msg": "No milestone with id '{}' existing".format(milestoneID)}), 400 + + database.finish_milestone(milestoneID) + + tasks = database.get_tasks(milestoneID) + for task in tasks: + task_id = task[TaskParameters.ID.value] + database.finish_task(task_id) + + sub_tasks = database.get_sub_tasks(task_id) + for sub_task in sub_tasks: + database.finish_sub_task(sub_task[SubTaskParameters.ID.value]) + + return jsonify({"success": True}) + @milestone_api.route('/milestone/<int:milestoneID>', methods=['DELETE']) @jwt_required def delete_milestone(milestoneID):