Skip to content

Commit 2913801

Browse files
update model for todo and subtodo table
1 parent 37a1747 commit 2913801

File tree

2 files changed

+119
-9
lines changed

2 files changed

+119
-9
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""update todo and subtodo table
2+
3+
Revision ID: 9245f5673cb7
4+
Revises: 80580dd7587b
5+
Create Date: 2024-12-06 10:53:59.113398
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
import sqlmodel.sql.sqltypes
11+
12+
13+
# revision identifiers, used by Alembic.
14+
revision = '9245f5673cb7'
15+
down_revision = '80580dd7587b'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.alter_column('subtodo', 'desc',
23+
existing_type=sa.VARCHAR(length=255),
24+
nullable=False)
25+
op.alter_column('subtodo', 'status',
26+
existing_type=sa.VARCHAR(length=20),
27+
type_=sqlmodel.sql.sqltypes.AutoString(length=255),
28+
existing_nullable=False)
29+
op.add_column('todo', sa.Column('owner_id', sa.Uuid(), nullable=False))
30+
op.alter_column('todo', 'desc',
31+
existing_type=sa.VARCHAR(length=255),
32+
nullable=False)
33+
op.alter_column('todo', 'status',
34+
existing_type=sa.VARCHAR(length=20),
35+
type_=sqlmodel.sql.sqltypes.AutoString(length=255),
36+
existing_nullable=False)
37+
op.drop_constraint('todo_user_id_fkey', 'todo', type_='foreignkey')
38+
op.create_foreign_key(None, 'todo', 'user', ['owner_id'], ['id'], ondelete='CASCADE')
39+
op.drop_column('todo', 'user_id')
40+
# ### end Alembic commands ###
41+
42+
43+
def downgrade():
44+
# ### commands auto generated by Alembic - please adjust! ###
45+
op.add_column('todo', sa.Column('user_id', sa.UUID(), autoincrement=False, nullable=False))
46+
op.drop_constraint(None, 'todo', type_='foreignkey')
47+
op.create_foreign_key('todo_user_id_fkey', 'todo', 'user', ['user_id'], ['id'], ondelete='CASCADE')
48+
op.alter_column('todo', 'status',
49+
existing_type=sqlmodel.sql.sqltypes.AutoString(length=255),
50+
type_=sa.VARCHAR(length=20),
51+
existing_nullable=False)
52+
op.alter_column('todo', 'desc',
53+
existing_type=sa.VARCHAR(length=255),
54+
nullable=True)
55+
op.drop_column('todo', 'owner_id')
56+
op.alter_column('subtodo', 'status',
57+
existing_type=sqlmodel.sql.sqltypes.AutoString(length=255),
58+
type_=sa.VARCHAR(length=20),
59+
existing_nullable=False)
60+
op.alter_column('subtodo', 'desc',
61+
existing_type=sa.VARCHAR(length=255),
62+
nullable=True)
63+
# ### end Alembic commands ###

backend/app/models.py

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import uuid
2+
from enum import Enum
23

34
from pydantic import EmailStr
45
from sqlmodel import Field, Relationship, SQLModel
@@ -44,6 +45,7 @@ class User(UserBase, table=True):
4445
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
4546
hashed_password: str
4647
items: list["Item"] = Relationship(back_populates="owner", cascade_delete=True)
48+
todos: list["Todo"] = Relationship(back_populates="owner", cascade_delete=True)
4749

4850

4951
# Properties to return via API, id is always required
@@ -113,26 +115,71 @@ class NewPassword(SQLModel):
113115
token: str
114116
new_password: str = Field(min_length=8, max_length=40)
115117

118+
# Shared properties
119+
class StatusEnum(str, Enum):
120+
pending = "pending"
121+
completed = "completed"
122+
in_progress = "in_progress"
123+
116124
class TodoBase(SQLModel):
117125
title: str = Field(min_length=1, max_length=255)
118-
desc: str | None = Field(default=None, max_length=255)
126+
desc: str = Field(max_length=255)
119127

120128
# Table Todo
121129
class Todo(TodoBase, table=True):
122130
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
123-
title: str = Field(max_length=255)
124-
desc: str | None = Field(default=None, max_length=255)
125-
user_id: uuid.UUID = Field(
131+
owner_id: uuid.UUID = Field(
126132
foreign_key="user.id", nullable=False, ondelete="CASCADE"
127133
)
128-
status: str = Field(max_length=20)
134+
status: str = Field(max_length=255)
135+
owner: User | None = Relationship(back_populates="todos")
136+
subtodos: list["SubTodo"] = Relationship(back_populates="todo")
137+
138+
class TodoCreate(TodoBase):
139+
pass
140+
141+
# Properties to receive on item update
142+
class TodoUpdate(TodoBase):
143+
title: str | None = Field(default=None, min_length=1, max_length=255) # type: ignore
144+
desc: str | None = Field(default=None, max_length=255)
145+
status: str = Field(max_length=255)
146+
147+
class TodoPublic(TodoBase):
148+
id: uuid.UUID
149+
owner_id: uuid.UUID
150+
status: StatusEnum
151+
152+
class TodosPublic(SQLModel):
153+
data: list[TodoPublic]
154+
count: int
129155

130156
# Table SubTodo
131-
class SubTodo(TodoBase, table=True):
157+
class SubTodoBase(SQLModel):
158+
title: str = Field(min_length=1, max_length=255)
159+
desc: str = Field(max_length=255)
160+
161+
class SubTodo(SubTodoBase, table=True):
132162
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
133-
title: str = Field(max_length=255)
134-
desc: str | None = Field(default=None, max_length=255)
135163
todo_id: uuid.UUID = Field(
136164
foreign_key="todo.id", nullable=False, ondelete="CASCADE"
137165
)
138-
status: str = Field(max_length=20)
166+
status: str = Field(max_length=255)
167+
todo: Todo | None = Relationship(back_populates="subtodos")
168+
169+
class SubTodoCreate(SubTodoBase):
170+
pass
171+
172+
# Properties to receive on item update
173+
class SubTodoUpdate(SubTodoBase):
174+
title: str | None = Field(default=None, min_length=1, max_length=255) # type: ignore
175+
desc: str | None = Field(default=None, max_length=255)
176+
status: StatusEnum | None = Field(default=None)
177+
178+
class SubTodoPublic(SubTodoBase):
179+
id: uuid.UUID
180+
todo_id: uuid.UUID
181+
status: StatusEnum
182+
183+
class SubTodosPublic(SQLModel):
184+
data: list[SubTodoPublic]
185+
count: int

0 commit comments

Comments
 (0)