Skip to content

Commit 076ee53

Browse files
(feat + fix) create lists subsystem and fix db
Previously, the sqlalchemy database URI was incorrectly passed in the configuration. Fix this by using only two // instead of //// in the URI. Also create the lists GET and POST APIs and database models. Also fix the migration file by adding tasks and list_properties tables.
1 parent 8044754 commit 076ee53

10 files changed

+149
-10
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
*/__pycache__
2+
__pycache__
3+

alembic/versions/fb82c06d1fa2_create_lists_subsystem.py

+24
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,31 @@ def upgrade():
2525
sa.Column("modified_at", sa.DateTime, nullable=False)
2626
)
2727

28+
op.create_table("tasks",
29+
sa.Column("id", sa.BIGINT, primary_key=True),
30+
sa.Column("name", sa.Text, nullable=False),
31+
sa.Column("status", sa.String(64), nullable=False),
32+
sa.Column("description", sa.Text),
33+
sa.Column("list_id", sa.BIGINT, nullable=False),
34+
sa.Column("soft_deleted", sa.BOOLEAN, nullable=False),
35+
sa.Column("created_at", sa.DateTime, nullable=False),
36+
sa.Column("modified_at", sa.DateTime, nullable=False),
37+
sa.ForeignKeyConstraint(['list_id'], ['lists.id'])
38+
)
39+
40+
op.create_table("list_properties",
41+
sa.Column("id", sa.BIGINT, primary_key=True),
42+
sa.Column("name", sa.Text, nullable=False),
43+
sa.Column("value", sa.Text, nullable=False),
44+
sa.Column("list_id", sa.BIGINT, nullable=False),
45+
sa.Column("created_at", sa.DateTime, nullable=False),
46+
sa.Column("modified_at", sa.DateTime, nullable=False),
47+
sa.ForeignKeyConstraint(['list_id'], ['lists.id'])
48+
)
49+
2850

2951
def downgrade():
52+
op.drop_table("list_properties")
53+
op.drop_table("tasks")
3054
op.drop_table("lists")
3155

config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql:////root:password@mysql-clusterip/taskmanager'
1+
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@mysql-clusterip:3306/taskmanager'

database.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from flask_sqlalchemy import SQLAlchemy
2+
3+
db = SQLAlchemy()

lists/dtos.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#######################
2+
# DTOs are Data Transfer Objects
3+
# They can be serialized to json
4+
# or anything for that matter
5+
#######################
6+
7+
class TaskListsDto:
8+
9+
def __init__(self):
10+
self.lists = []
11+
12+
def set_lists(self, taskListDtos=[]):
13+
self.lists = taskListDtos
14+
15+
16+
class TaskListDto:
17+
18+
def __init__(self):
19+
self.name = ""
20+
self.recurring_deadline = None
21+
22+
def set_name(self, name):
23+
self.name = name
24+
25+
def set_recurring_deadline(self, recurring_deadline):
26+
self.recurring_deadline = recurring_deadline
27+
28+

lists/list_service.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from .models import List
2+
from database import db
3+
from .dtos import TaskListDto, TaskListsDto
4+
import json
5+
import time
6+
7+
global STRP_FORMAT
8+
STRP_FORMAT = "%H:%M:%S"
9+
10+
11+
def create_and_get_list(name, recurring_deadline):
12+
new_list = List(name=name, recurring_deadline=\
13+
time.strptime(recurring_deadline, STRP_FORMAT))
14+
return new_list
15+
16+
17+
def create_task_list(request_dict):
18+
new_list = create_and_get_list(request_dict["name"],
19+
request_dict["recurring_deadline"])
20+
db.session.add(new_list)
21+
db.session.commit()
22+
response = dict()
23+
response["message"] = "created a new list"
24+
return response
25+
26+
27+
def get_all_lists():
28+
task_lists = List.query.all()
29+
task_list_dtos = []
30+
for task_list in task_lists:
31+
task_list_dto = TaskListDto()
32+
task_list_dto.set_name(task_list.name)
33+
task_list_dto.set_recurring_deadline(
34+
task_list.recurring_deadline.strftime(STRP_FORMAT))
35+
task_list_dtos.append(task_list_dto.__dict__)
36+
task_lists_dto = TaskListsDto()
37+
task_lists_dto.set_lists(task_list_dtos)
38+
return json.dumps(task_lists_dto.__dict__)

lists/models.py

+36-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,38 @@
1-
from main import db
2-
import flask_sqlalchemy as sa
1+
from database import db
2+
from datetime import datetime
33

4-
class List(db.Model):
4+
5+
class Audited:
6+
created_at = db.Column("created_at",
7+
db.DateTime, nullable=False, default=datetime.now())
8+
modified_at = db.Column("modified_at",
9+
db.DateTime, nullable=False, default=datetime.now())
10+
11+
12+
class List(db.Model, Audited):
513
''' This class represents a list '''
6-
14+
__tablename__ = "lists"
15+
id = db.Column("id", db.Integer, primary_key=True)
16+
name = db.Column("name", db.String, nullable=False)
17+
recurring_deadline = db.Column("recurring_deadline",
18+
db.Time, nullable=False)
19+
tasks = db.relationship("Task", backref="task_list")
20+
list_properties = db.relationship("ListProperty", backref="task_list")
21+
22+
23+
class Task(db.Model, Audited):
24+
id = db.Column("id", db.Integer, primary_key=True)
25+
name = db.Column("name", db.String, nullable=False)
26+
status = db.Column("status", db.String, nullable=False)
27+
description = db.Column("description", db.String)
28+
list_id = db.Column("list_id", db.ForeignKey(List.id),
29+
nullable=False)
30+
soft_deleted = db.Column("soft_deleted", db.BOOLEAN, nullable=False)
31+
32+
33+
class ListProperty(db.Model, Audited):
34+
id = db.Column("id", db.Integer, primary_key=True)
35+
name = db.Column("name", db.String, nullable=False)
36+
value = db.Column("value", db.String, nullable=False)
37+
list_id = db.Column("list_id", db.ForeignKey(List.id),
38+
nullable=False)

lists/views.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
from flask import Blueprint
1+
from flask import Blueprint, request
2+
from .models import List
3+
from . import list_service
4+
from database import db
25

36

47
lists = Blueprint("list_controller", __name__)
58

9+
610
@lists.route("", methods=["POST"])
711
def createList():
8-
return "created a list"
12+
request_json = request.json
13+
response = list_service.create_task_list(request_json)
14+
return response
15+
916

17+
@lists.route("", methods=["GET"])
18+
def getAllLists():
19+
return list_service.get_all_lists()

main.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from flask import Flask
2-
from flask_sqlalchemy import SQLAlchemy
3-
import os
42
from lists.views import lists
3+
from database import db
4+
import pymysql
5+
import os
56

67

78
app = Flask(__name__)
89
app.config.from_pyfile(os.path.join('.', 'config.py'))
9-
db = SQLAlchemy(app)
10+
db.init_app(app)
1011

1112
app.register_blueprint(lists, url_prefix="/lists")
1213

taskmanager-deployment.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,6 @@ spec:
3131
ports:
3232
- port: 5000
3333
targetPort: 5000
34+
nodePort: 31001
3435
type: NodePort
3536
---

0 commit comments

Comments
 (0)