Skip to content

Create tasks subsystem #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 0 additions & 1 deletion alembic/versions/fb82c06d1fa2_create_lists_subsystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'])
Expand Down
Binary file added frontend/taskmanager/src/assets/check.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/taskmanager/src/assets/trash.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 25 additions & 4 deletions frontend/taskmanager/src/components/ListSelected.vue
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
<template>
<list-window :title="selected_list.name" >
<task-entry v-for="task in tasks" :key="task" :task="task" ></task-entry>
<button class="red_button" @click="deleteList" >Delete</button>
</list-window>
</template>

<script>
import ListWindow from "./ListWindow";
import { baseUrl, listsUri, backendPort } from "../util/apiUtil";
import { baseUrl, listsUri, backendPort, tasksUri } from "../util/apiUtil";
import { mapState } from "vuex";
import TaskEntry from './TaskEntry.vue';

export default {
name: 'list-selected',
data () {
return {}
return {
tasks: []
}
},
computed: {
...mapState(['selected_list'])
},
created () {
this.getTasks()
},
methods: {
deleteList: function () {
fetch("http://" + baseUrl + backendPort + listsUri +
Expand All @@ -33,15 +40,29 @@ export default {
})
.catch((error) => { console.log(error); });

},
getTasks: function () {
fetch("http://" + baseUrl + backendPort + listsUri +
"/" + this.selected_list.id + tasksUri, {
method: "GET"
})
.then((res) => { return res.json(); })
.then((data) => {
this.tasks = data
console.log("tasks fetched successfully")
})
.catch((error) => { console.log(error); });
}
},
components: {
ListWindow
ListWindow,
TaskEntry
}
}
</script>

<style lang="scss" >

TaskEntry<style lang="scss" >
@import "../assets/stylesheets/base";

.red_button {
Expand Down
60 changes: 60 additions & 0 deletions frontend/taskmanager/src/components/TaskEntry.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<template>
<div class="task_entry" >
<span class="task">
{{ task.name }}
<img src="../assets/check.png" class="mark_done_button" />
<img src="../assets/trash.png" class="delete_button" />
</span>
</div>
</template>

<script>

export default {
name: "task-entry",
data () {
return {}
},
props: [
"task"
]
}
</script>

<style lang="scss">
@import "../assets/stylesheets/base";

.task_entry {
width: 100%;
background-color: inherit;
color: inherit;
}

.task {
width: 100%;
line-height: 30px;
font-size: 20px;
font-family: 'Roboto', sans-serif;
box-sizing: border-box;
padding: 5px;
text-align: justify;
background-color: inherit;
color: inherit;
}

.mark_done_button {
width: 20px;
height: 20px;
margin-left: 5px;
background-color: green;
display: inline;
}

.delete_button {
width: 20px;
height: 20px;
margin-left: 5px;
background-color: $warning_red;
display: inline;
}
</style>
1 change: 1 addition & 0 deletions frontend/taskmanager/src/util/apiUtil.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export const baseUrl = "taskmanagerbackend";
export const backendPort = ":31001";
export const listsUri = "/lists";
export const tasksUri = "/tasks"
6 changes: 6 additions & 0 deletions lists/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from enum import Enum

class TaskStatus(Enum):
DONE = "DONE"
NOT_DONE = "NOT_DONE"

31 changes: 17 additions & 14 deletions lists/dtos.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


43 changes: 35 additions & 8 deletions lists/list_service.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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"])
Expand All @@ -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__)


Expand All @@ -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__)

4 changes: 2 additions & 2 deletions lists/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
16 changes: 14 additions & 2 deletions lists/views.py
Original file line number Diff line number Diff line change
@@ -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__)
Expand All @@ -23,3 +21,17 @@ def getAllLists():
def deleteList(list_id):
response = list_service.delete_task_list(list_id)
return response


@lists.route("<list_id>/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("<list_id>/tasks", methods=["GET"])
def getAllTasksFromList(list_id):
response = list_service.getListTasks(list_id)
return response