Skip to content

Commit a687d90

Browse files
mypy type linting and dependency updates
1 parent 867a96b commit a687d90

File tree

9 files changed

+68
-109
lines changed

9 files changed

+68
-109
lines changed

main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ async def password_validation_exception_handler(request: Request, exc: PasswordV
6767
{
6868
"request": request,
6969
"status_code": 422,
70-
"errors": {exc.detail["field"]: exc.detail["message"]}
70+
"errors": {"error": exc.detail}
7171
},
7272
status_code=422,
7373
)

poetry.lock

Lines changed: 26 additions & 65 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,24 @@ package-mode = false
99
[tool.poetry.dependencies]
1010
python = "^3.12"
1111
sqlmodel = "^0.0.22"
12-
fastapi = "^0.114.1"
13-
pyjwt = "^2.9.0"
12+
pyjwt = "^2.10.0"
1413
jinja2 = "^3.1.4"
15-
uvicorn = "^0.30.6"
16-
psycopg2 = "^2.9.9"
17-
pydantic = {extras = ["email"], version = "^2.9.1"}
18-
python-multipart = "^0.0.9"
14+
uvicorn = "^0.32.0"
15+
psycopg2 = "^2.9.10"
16+
pydantic = "^2.9.2"
17+
python-multipart = "^0.0.17"
1918
python-dotenv = "^1.0.1"
2019
resend = "^2.4.0"
2120
bcrypt = "^4.2.0"
21+
fastapi = "^0.115.5"
2222

2323

2424
[tool.poetry.group.dev.dependencies]
2525
graphviz = "^0.20.3"
2626
quarto = "^0.1.0"
2727
mypy = "^1.11.2"
2828
jupyter = "^1.1.1"
29+
notebook = "^7.2.2"
2930

3031
[build-system]
3132
requires = ["poetry-core"]

routers/__init__.py

Whitespace-only changes.

routers/authentication.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from datetime import datetime
55
from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks, Form
66
from fastapi.responses import RedirectResponse
7-
from pydantic import BaseModel, EmailStr, ConfigDict, field_validator
7+
from pydantic import BaseModel, EmailStr, ConfigDict
88
from sqlmodel import Session, select
99
from utils.db import User
1010
from utils.auth import (
@@ -255,7 +255,7 @@ async def reset_password(
255255
authorized_user, reset_token = get_user_from_reset_token(
256256
user.email, user.token, session)
257257

258-
if not authorized_user:
258+
if not authorized_user or not reset_token:
259259
raise HTTPException(status_code=400, detail="Invalid or expired token")
260260

261261
# Update password and mark token as used

routers/role.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from fastapi import APIRouter, Depends, HTTPException, Form
55
from fastapi.responses import RedirectResponse
66
from pydantic import BaseModel, ConfigDict
7-
from sqlmodel import Session, select
7+
from sqlmodel import Session, select, delete
88
from utils.db import Role, RolePermissionLink, ValidPermissions, get_session, utc_time
99

1010
logger = getLogger("uvicorn.error")
@@ -37,12 +37,13 @@ class RoleRead(BaseModel):
3737
class RoleUpdate(BaseModel):
3838
model_config = ConfigDict(from_attributes=True)
3939

40+
id: int
4041
name: str
4142
permissions: List[ValidPermissions]
4243

4344
@classmethod
44-
async def as_form(cls, name: str = Form(...), permissions: List[ValidPermissions] = Form(...)):
45-
return cls(name=name, permissions=permissions)
45+
async def as_form(cls, id: int = Form(...), name: str = Form(...), permissions: List[ValidPermissions] = Form(...)):
46+
return cls(id=id, name=name, permissions=permissions)
4647

4748

4849
@router.post("/", response_class=RedirectResponse)
@@ -56,30 +57,29 @@ def create_role(
5657

5758
# Create role and permissions in a single transaction
5859
db_role = Role(name=role.name)
59-
session.add(db_role)
60-
session.commit()
61-
session.refresh(db_role)
6260

63-
for permission in role.permissions:
64-
db_role_permission_link = RolePermissionLink(
65-
role_id=db_role.id,
66-
permission_id=permission.name
67-
)
68-
session.add(db_role_permission_link)
69-
session.commit()
61+
# Create RolePermissionLink objects and associate them with the role
62+
db_role.permissions = [
63+
RolePermissionLink(permission_id=permission.name)
64+
for permission in role.permissions
65+
]
66+
67+
session.add(db_role)
68+
session.commit() # Commit once after all operations
7069

7170
return RedirectResponse(url="/roles", status_code=303)
7271

7372

7473
@router.get("/{role_id}", response_model=RoleRead)
7574
def read_role(role_id: int, session: Session = Depends(get_session)):
76-
db_role = session.get(Role, role_id)
77-
if not db_role:
75+
db_role: Role | None = session.get(Role, role_id)
76+
if not db_role or not db_role.id or db_role.deleted:
7877
raise HTTPException(status_code=404, detail="Role not found")
7978

8079
permissions = [
8180
ValidPermissions(link.permission.name)
8281
for link in db_role.role_permission_links
82+
if link.permission is not None
8383
]
8484

8585
return RoleRead(
@@ -94,12 +94,11 @@ def read_role(role_id: int, session: Session = Depends(get_session)):
9494

9595
@router.put("/{role_id}", response_class=RedirectResponse)
9696
def update_role(
97-
role_id: int,
9897
role: RoleUpdate = Depends(RoleUpdate.as_form),
9998
session: Session = Depends(get_session)
10099
) -> RedirectResponse:
101-
db_role = session.get(Role, role_id)
102-
if not db_role:
100+
db_role: Role | None = session.get(Role, role.id)
101+
if not db_role or not db_role.id or db_role.deleted:
103102
raise HTTPException(status_code=404, detail="Role not found")
104103
role_data = role.model_dump(exclude_unset=True)
105104
for key, value in role_data.items():
@@ -108,9 +107,8 @@ def update_role(
108107
session.add(db_role)
109108
session.commit()
110109

111-
# Update RolePermissionLinks
112-
session.exec(select(RolePermissionLink).where(
113-
RolePermissionLink.role_id == role_id)).delete()
110+
# Correctly delete RolePermissionLinks for the role
111+
session.delete(RolePermissionLink.role_id == role.id)
114112

115113
for permission in role.permissions:
116114
db_role_permission_link = RolePermissionLink(
@@ -121,7 +119,7 @@ def update_role(
121119

122120
session.commit()
123121
session.refresh(db_role)
124-
return RedirectResponse(url=f"/roles/{role_id}", status_code=303)
122+
return RedirectResponse(url=f"/roles/{role.id}", status_code=303)
125123

126124

127125
@router.delete("/{role_id}", response_class=RedirectResponse)

utils/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)