Skip to content

Commit 9440333

Browse files
🎨 Auto format and update with pre-commit
1 parent 1cdac8f commit 9440333

17 files changed

Lines changed: 150 additions & 168 deletions

File tree

backend/app/api/deps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def get_current_active_superuser(current_user: CurrentUser) -> User:
5656
)
5757
return current_user
5858

59+
5960
def require_role(*allowed_roles: UserRole):
6061
def role_checker(current_user: CurrentUser) -> User:
6162
if current_user.role not in allowed_roles:

backend/app/api/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from fastapi import APIRouter
22

3-
from app.api.routes import items, login, private, users, utils, metrics
3+
from app.api.routes import items, login, metrics, private, users, utils
44
from app.core.config import settings
55

66
api_router = APIRouter()

backend/app/api/routes/metrics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ def read_metrics(session: SessionDep) -> MetricsPublic:
2626
total_users=total_users,
2727
active_users=active_users,
2828
total_items=total_items,
29-
)
29+
)

backend/app/api/routes/users.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
UserCreate,
2121
UserPublic,
2222
UserRegister,
23+
UserRole,
2324
UsersPublic,
2425
UserUpdate,
2526
UserUpdateMe,
26-
UserRole,
2727
)
2828
from app.utils import generate_new_account_email, send_email
2929

@@ -136,9 +136,7 @@ def delete_user_me(session: SessionDep, current_user: CurrentUser) -> Any:
136136
Delete own user. Accessible manager and member.
137137
"""
138138
if current_user.role == UserRole.ADMIN:
139-
raise HTTPException(
140-
status_code=403, detail="Admins cannot delete themselves"
141-
)
139+
raise HTTPException(status_code=403, detail="Admins cannot delete themselves")
142140
session.delete(current_user)
143141
session.commit()
144142
return Message(message="User deleted successfully")
@@ -223,12 +221,9 @@ def delete_user(
223221
if not user:
224222
raise HTTPException(status_code=404, detail="User not found")
225223
if user == current_user:
226-
raise HTTPException(
227-
status_code=403, detail="Admins cannot delete themselves"
228-
)
224+
raise HTTPException(status_code=403, detail="Admins cannot delete themselves")
229225
statement = delete(Item).where(col(Item.owner_id) == user_id)
230226
session.exec(statement)
231227
session.delete(user)
232228
session.commit()
233229
return Message(message="User deleted successfully")
234-

backend/app/core/db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,4 @@ def _ensure_user(
6565
role=role,
6666
is_superuser=is_superuser,
6767
)
68-
return crud.create_user(session=session, user_create=user_in)
68+
return crud.create_user(session=session, user_create=user_in)

backend/app/models.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import uuid
22
from datetime import datetime, timezone
3-
43
from enum import Enum
4+
55
from pydantic import EmailStr
6-
from sqlalchemy import DateTime, String
6+
from sqlalchemy import DateTime, String
77
from sqlmodel import Field, Relationship, SQLModel
88

99

1010
def get_datetime_utc() -> datetime:
1111
return datetime.now(timezone.utc)
1212

13+
1314
# User roles for RBAC.
1415
class UserRole(str, Enum):
1516
ADMIN = "admin"
@@ -136,7 +137,8 @@ class NewPassword(SQLModel):
136137
token: str
137138
new_password: str = Field(min_length=8, max_length=128)
138139

140+
139141
class MetricsPublic(SQLModel):
140142
total_users: int
141143
active_users: int
142-
total_items: int
144+
total_items: int

backend/tests/api/routes/test_rbac.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,22 @@
66
def test_admin_can_list_users(
77
client: TestClient, superuser_token_headers: dict[str, str]
88
) -> None:
9-
r = client.get(
10-
f"{settings.API_V1_STR}/users/", headers=superuser_token_headers
11-
)
9+
r = client.get(f"{settings.API_V1_STR}/users/", headers=superuser_token_headers)
1210
assert 200 <= r.status_code < 300
1311
assert "data" in r.json()
1412

1513

1614
def test_manager_can_list_users(
1715
client: TestClient, manager_token_headers: dict[str, str]
1816
) -> None:
19-
r = client.get(
20-
f"{settings.API_V1_STR}/users/", headers=manager_token_headers
21-
)
17+
r = client.get(f"{settings.API_V1_STR}/users/", headers=manager_token_headers)
2218
assert 200 <= r.status_code < 300
2319

2420

2521
def test_member_cannot_list_users(
2622
client: TestClient, normal_user_token_headers: dict[str, str]
2723
) -> None:
28-
r = client.get(
29-
f"{settings.API_V1_STR}/users/", headers=normal_user_token_headers
30-
)
24+
r = client.get(f"{settings.API_V1_STR}/users/", headers=normal_user_token_headers)
3125
assert r.status_code == 403
3226

3327

@@ -45,9 +39,7 @@ def test_manager_cannot_create_user(
4539
def test_member_can_read_own_profile(
4640
client: TestClient, normal_user_token_headers: dict[str, str]
4741
) -> None:
48-
r = client.get(
49-
f"{settings.API_V1_STR}/users/me", headers=normal_user_token_headers
50-
)
42+
r = client.get(f"{settings.API_V1_STR}/users/me", headers=normal_user_token_headers)
5143
current_user = r.json()
5244
assert 200 <= r.status_code < 300
5345
assert "role" in current_user
@@ -56,21 +48,17 @@ def test_member_can_read_own_profile(
5648
def test_member_cannot_view_metrics(
5749
client: TestClient, normal_user_token_headers: dict[str, str]
5850
) -> None:
59-
r = client.get(
60-
f"{settings.API_V1_STR}/metrics/", headers=normal_user_token_headers
61-
)
51+
r = client.get(f"{settings.API_V1_STR}/metrics/", headers=normal_user_token_headers)
6252
assert r.status_code == 403
6353

6454

6555
def test_manager_can_view_metrics(
6656
client: TestClient, manager_token_headers: dict[str, str]
6757
) -> None:
68-
r = client.get(
69-
f"{settings.API_V1_STR}/metrics/", headers=manager_token_headers
70-
)
58+
r = client.get(f"{settings.API_V1_STR}/metrics/", headers=manager_token_headers)
7159
assert 200 <= r.status_code < 300
7260

7361

7462
def test_unauthenticated_cannot_list_users(client: TestClient) -> None:
7563
r = client.get(f"{settings.API_V1_STR}/users/")
76-
assert r.status_code == 401
64+
assert r.status_code == 401

backend/tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def normal_user_token_headers(client: TestClient, db: Session) -> dict[str, str]
4141
client=client, email=settings.EMAIL_TEST_USER, db=db
4242
)
4343

44+
4445
@pytest.fixture(scope="module")
4546
def manager_token_headers(client: TestClient, db: Session) -> dict[str, str]:
4647
return authentication_token_from_email(

backend/tests/utils/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from app import crud
55
from app.core.config import settings
6-
from app.models import User, UserCreate, UserUpdate, UserRole
6+
from app.models import User, UserCreate, UserRole, UserUpdate
77
from tests.utils.utils import random_email, random_lower_string
88

99

frontend/src/components/Admin/columns.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import type { ColumnDef } from "@tanstack/react-table";
1+
import type { ColumnDef } from "@tanstack/react-table"
22

3-
import type { UserPublic } from "@/client";
4-
import { Badge } from "@/components/ui/badge";
5-
import { can } from "@/lib/auth/permissions";
6-
import { cn } from "@/lib/utils";
7-
import { UserActionsMenu } from "./UserActionsMenu";
3+
import type { UserPublic } from "@/client"
4+
import { Badge } from "@/components/ui/badge"
5+
import { can } from "@/lib/auth/permissions"
6+
import { cn } from "@/lib/utils"
7+
import { UserActionsMenu } from "./UserActionsMenu"
88

99
export type UserTableData = UserPublic & {
10-
isCurrentUser: boolean;
11-
};
10+
isCurrentUser: boolean
11+
}
1212

1313
const baseColumns: ColumnDef<UserTableData>[] = [
1414
{
1515
accessorKey: "full_name",
1616
header: "Full Name",
1717
cell: ({ row }) => {
18-
const fullName = row.original.full_name;
18+
const fullName = row.original.full_name
1919
return (
2020
<div className="flex items-center gap-2">
2121
<span
@@ -29,7 +29,7 @@ const baseColumns: ColumnDef<UserTableData>[] = [
2929
</Badge>
3030
)}
3131
</div>
32-
);
32+
)
3333
},
3434
},
3535
{
@@ -43,12 +43,12 @@ const baseColumns: ColumnDef<UserTableData>[] = [
4343
accessorKey: "role",
4444
header: "Role",
4545
cell: ({ row }) => {
46-
const role = row.original.role ?? "member";
46+
const role = row.original.role ?? "member"
4747
return (
4848
<Badge variant={role === "admin" ? "default" : "secondary"}>
4949
{role.charAt(0).toUpperCase() + role.slice(1)}
5050
</Badge>
51-
);
51+
)
5252
},
5353
},
5454
{
@@ -68,7 +68,7 @@ const baseColumns: ColumnDef<UserTableData>[] = [
6868
</div>
6969
),
7070
},
71-
];
71+
]
7272

7373
const actionsColumn: ColumnDef<UserTableData> = {
7474
id: "actions",
@@ -78,13 +78,13 @@ const actionsColumn: ColumnDef<UserTableData> = {
7878
<UserActionsMenu user={row.original} />
7979
</div>
8080
),
81-
};
81+
}
8282

8383
export function getColumns(
8484
currentUser: UserPublic | null | undefined,
8585
): ColumnDef<UserTableData>[] {
8686
const canManageUsers =
87-
can(currentUser, "updateAnyUser") || can(currentUser, "deleteAnyUser");
87+
can(currentUser, "updateAnyUser") || can(currentUser, "deleteAnyUser")
8888

89-
return canManageUsers ? [...baseColumns, actionsColumn] : baseColumns;
89+
return canManageUsers ? [...baseColumns, actionsColumn] : baseColumns
9090
}

0 commit comments

Comments
 (0)