From b78d98a7d5e08175e2338d24ae94b38eaac243d5 Mon Sep 17 00:00:00 2001 From: ProgrammingMuffin Date: Sun, 31 Oct 2021 15:16:34 +0530 Subject: [PATCH] (feat) add tasks subsystem add get tasks and delete task APIs and start frontend changes for it --- Dockerfile | 2 +- .../fb82c06d1fa2_create_lists_subsystem.py | 1 - frontend/taskmanager/src/assets/check.png | Bin 0 -> 690 bytes frontend/taskmanager/src/assets/trash.png | Bin 0 -> 663 bytes .../src/components/ListSelected.vue | 29 +++++++-- .../taskmanager/src/components/TaskEntry.vue | 60 ++++++++++++++++++ frontend/taskmanager/src/util/apiUtil.js | 1 + lists/constants.py | 6 ++ lists/dtos.py | 31 +++++---- lists/list_service.py | 43 ++++++++++--- lists/models.py | 4 +- lists/views.py | 16 ++++- 12 files changed, 161 insertions(+), 32 deletions(-) create mode 100644 frontend/taskmanager/src/assets/check.png create mode 100644 frontend/taskmanager/src/assets/trash.png create mode 100644 frontend/taskmanager/src/components/TaskEntry.vue create mode 100644 lists/constants.py diff --git a/Dockerfile b/Dockerfile index 0a15af0..0337818 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ COPY requirements.txt /www/app/ RUN pip install -r /www/app/requirements.txt -COPY ./ /www/app/ +COPY . /www/app/ RUN ls /www/app/frontend/taskmanager diff --git a/alembic/versions/fb82c06d1fa2_create_lists_subsystem.py b/alembic/versions/fb82c06d1fa2_create_lists_subsystem.py index 82b73c8..ebba9f3 100644 --- a/alembic/versions/fb82c06d1fa2_create_lists_subsystem.py +++ b/alembic/versions/fb82c06d1fa2_create_lists_subsystem.py @@ -31,7 +31,6 @@ def upgrade(): sa.Column("status", sa.String(64), nullable=False), sa.Column("description", sa.Text), sa.Column("list_id", sa.BIGINT, nullable=False), - sa.Column("soft_deleted", sa.BOOLEAN, nullable=False), sa.Column("created_at", sa.DateTime, nullable=False), sa.Column("modified_at", sa.DateTime, nullable=False), sa.ForeignKeyConstraint(['list_id'], ['lists.id']) diff --git a/frontend/taskmanager/src/assets/check.png b/frontend/taskmanager/src/assets/check.png new file mode 100644 index 0000000000000000000000000000000000000000..bc64da9de39b020b123b784200764f3c3cb85979 GIT binary patch literal 690 zcmV;j0!{siP)EX>4Tx04R}tkv&MmKpe$iQ?*hm4i*#<%ut;y6cusQDionYs1;guFuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi*nNH0Shl#~P3o9+mil#<9NgPo%o$`f@ z$13M7&RVI$8u#Qc4CVCYC9cyPLIMj|gai=^D%d~?HlnoZq*zGNe!Pu;(Dh5?QpmLd zMvi%up+R>2;D7MDTPr^??j?odKg?t`(KcjET0)4kYaMkOrv5(USAWdB*Z-9eC zV6;HlYi-`$-P+r~XBz$e0F#t*v;lqaB>(^b24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPM1|uWT)CE`o000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001qNklK@LC>3`D2yf9LtTzd}o^66srtdJ|Lt zMNt%aus7JU($9YB=>fMm%Wj83Unv@f@W@vS8MW=6r}z&MA@}@jh@yCf Y4>BTP^?+Qg=>Px#07*qoM6N<$f^?TAf&c&j literal 0 HcmV?d00001 diff --git a/frontend/taskmanager/src/assets/trash.png b/frontend/taskmanager/src/assets/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..83af4d9b18fa0df8a185b0839ab6745c6cb258c9 GIT binary patch literal 663 zcmV;I0%-k-P)EX>4Tx04R}tkv&MmKpe$iQ>9WWg6$w8lA$_T5EXUQDionYs1;guFuC+YXws0h zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi!ES_(b9vW|$S?b>hj* ziotoGIKqmuN_UyKw^epMfjASU6!LlC{fxdT3xsch;HukOb04Py{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPL69@x8o8AWi000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001PNkl + - diff --git a/frontend/taskmanager/src/util/apiUtil.js b/frontend/taskmanager/src/util/apiUtil.js index 5241007..a295fb4 100644 --- a/frontend/taskmanager/src/util/apiUtil.js +++ b/frontend/taskmanager/src/util/apiUtil.js @@ -1,3 +1,4 @@ export const baseUrl = "taskmanagerbackend"; export const backendPort = ":31001"; export const listsUri = "/lists"; +export const tasksUri = "/tasks" diff --git a/lists/constants.py b/lists/constants.py new file mode 100644 index 0000000..52e64c9 --- /dev/null +++ b/lists/constants.py @@ -0,0 +1,6 @@ +from enum import Enum + +class TaskStatus(Enum): + DONE = "DONE" + NOT_DONE = "NOT_DONE" + diff --git a/lists/dtos.py b/lists/dtos.py index 585fd2e..aab9551 100644 --- a/lists/dtos.py +++ b/lists/dtos.py @@ -6,27 +6,30 @@ class TaskListsDto: - def __init__(self): - self.lists = [] - - def set_lists(self, taskListDtos=[]): + def __init__(self, taskListDtos): self.lists = taskListDtos class TaskListDto: - def __init__(self): - self.id = "" - self.name = "" - self.recurring_deadline = None - - def set_id(self, id): + def __init__(self, id, name, recurring_deadline): self.id = id - - def set_name(self, name): self.name = name - - def set_recurring_deadline(self, recurring_deadline): self.recurring_deadline = recurring_deadline +class TasksDto: + + def __init__(self, taskDtos): + self.tasks = taskDtos + + +class TaskDto: + + def __init__(self, id, name, status, description): + self.id = id + self.name = name + self.status = status + self.description = description + + diff --git a/lists/list_service.py b/lists/list_service.py index 75f5ede..5023a39 100644 --- a/lists/list_service.py +++ b/lists/list_service.py @@ -1,6 +1,8 @@ -from .models import List +from .models import List, Task from database import db -from .dtos import TaskListDto, TaskListsDto +from .dtos import TaskListDto, TaskListsDto,\ + TaskDto, TasksDto +from .constants import TaskStatus import json import time from flask import make_response, abort @@ -15,6 +17,12 @@ def create_and_get_list(name, recurring_deadline): return new_list +def create_and_get_task(name, status, description, list_id): + new_task = Task(name=name, status=status, + description=description, list_id=list_id) + return new_task + + def create_task_list(request_dict): new_list = create_and_get_list(request_dict["name"], request_dict["recurring_deadline"]) @@ -29,14 +37,10 @@ def get_all_lists(): task_lists = List.query.all() task_list_dtos = [] for task_list in task_lists: - task_list_dto = TaskListDto() - task_list_dto.set_id(task_list.id) - task_list_dto.set_name(task_list.name) - task_list_dto.set_recurring_deadline( + task_list_dto = TaskListDto(task_list.id, task_list.name, task_list.recurring_deadline.strftime(STRP_FORMAT)) task_list_dtos.append(task_list_dto.__dict__) - task_lists_dto = TaskListsDto() - task_lists_dto.set_lists(task_list_dtos) + task_lists_dto = TaskListsDto(task_list_dtos) return json.dumps(task_lists_dto.__dict__) @@ -50,3 +54,26 @@ def delete_task_list(list_id): return response response["message"] = "List not found" abort(make_response(json.dumps(response), 404)) + + +def create_task(request_dict): + new_task = create_and_get_task(request_dict["name"], TaskStatus.NOT_DONE.value, + request_dict["description"], request_dict["list_id"]) + db.session.add(new_task) + db.session.commit() + response = dict() + response["message"] = "created a new task for list" +\ + str(request_dict["list_id"]) + return response + + +def getListTasks(list_id): + list_tasks = Task.query.filter_by(list_id=list_id).all() + taskDtos = [] + for list_task in list_tasks: + task_dto = TaskDto(list_task.id, list_task.name, + list_task.status, list_task.description) + taskDtos.append(task_dto.__dict__) + tasksDto = TasksDto(taskDtos) + return json.dumps(tasksDto.__dict__) + diff --git a/lists/models.py b/lists/models.py index 7ede847..93b2a1d 100644 --- a/lists/models.py +++ b/lists/models.py @@ -29,9 +29,9 @@ class Task(db.Model, Audited): description = db.Column("description", db.String) list_id = db.Column("list_id", db.ForeignKey(List.id), nullable=False) - soft_deleted = db.Column("soft_deleted", db.BOOLEAN, nullable=False) - +# can be used for further extending the functionality of the list +# in the future. class ListProperty(db.Model, Audited): ''' This class represents list properties''' __tablename__ = "list_properties" diff --git a/lists/views.py b/lists/views.py index 319cb21..bef770c 100644 --- a/lists/views.py +++ b/lists/views.py @@ -1,7 +1,5 @@ from flask import Blueprint, request -from .models import List from . import list_service -from database import db lists = Blueprint("list_controller", __name__) @@ -23,3 +21,17 @@ def getAllLists(): def deleteList(list_id): response = list_service.delete_task_list(list_id) return response + + +@lists.route("/tasks", methods=["POST"]) +def createTaskInList(list_id): + request_json = request.json + request_json["list_id"] = list_id + response = list_service.create_task(request_json) + return response + + +@lists.route("/tasks", methods=["GET"]) +def getAllTasksFromList(list_id): + response = list_service.getListTasks(list_id) + return response