From c1aac6e002e6e2881337198fd363dbc842c2b307 Mon Sep 17 00:00:00 2001
From: tobias <tobias@thecodedev.de>
Date: Wed, 25 Sep 2019 21:53:06 +0200
Subject: [PATCH] #35 - Add close milestone (tasks, sub tasks) route

---
 api/Database.py                | 13 +++++++++++++
 api/blueprints/MilestoneAPI.py | 21 +++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/api/Database.py b/api/Database.py
index 562cc73..b5182d3 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 7d75deb..d9da771 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):
-- 
GitLab