Skip to content

Commit cc4b5e2

Browse files
committed
Update code
1 parent 693030c commit cc4b5e2

File tree

5 files changed

+23
-17
lines changed

5 files changed

+23
-17
lines changed

backend/apps/api/rest/v0/event.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
class EventBase(Schema):
2121
"""Base schema for Event (used in list endpoints)."""
2222

23-
end_date: datetime
23+
end_date: datetime | None = None
2424
key: str
2525
name: str
2626
start_date: datetime
27-
url: str
27+
url: str | None = None
2828

2929

3030
class Event(EventBase):
@@ -34,7 +34,7 @@ class Event(EventBase):
3434
class EventDetail(EventBase):
3535
"""Detail schema for Event (used in single item endpoints)."""
3636

37-
description: str
37+
description: str | None = None
3838

3939

4040
class EventError(Schema):

backend/apps/api/rest/v0/pagination.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
from typing import Any
44

5+
from django.http import Http404
56
from ninja import Field, Schema
67
from ninja.pagination import PaginationBase
78

89

910
class CustomPagination(PaginationBase):
1011
"""Custom pagination with standardized output schema."""
1112

12-
# Override the default items attribute name
1313
items_attribute: str = "items"
1414

1515
class Input(Schema):
@@ -33,12 +33,19 @@ def paginate_queryset(self, queryset, pagination: Input, **params):
3333
page = pagination.page
3434
page_size = pagination.page_size
3535

36-
# Calculate pagination
36+
# Calculate pagination.
3737
total_count = queryset.count()
38-
total_pages = (total_count + page_size - 1) // page_size # Ceiling division
38+
# Ensure total_pages is at least 1 for consistent metadata.
39+
total_pages = max(1, (total_count + page_size - 1) // page_size)
40+
41+
# Validate that the requested page is within the valid range.
42+
if page > total_pages:
43+
message = f"Page {page} not found. Valid pages are 1 to {total_pages}."
44+
raise Http404(message)
45+
3946
offset = (page - 1) * page_size
4047

41-
# Get the page items
48+
# Get the page items.
4249
items = list(queryset[offset : offset + page_size])
4350

4451
return {

backend/apps/api/rest/v0/release.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ReleaseBase(Schema):
2222

2323
created_at: datetime
2424
name: str
25-
published_at: datetime
25+
published_at: datetime | None = None
2626
tag_name: str
2727

2828

backend/apps/api/rest/v0/repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Repository(RepositoryBase):
3232
class RepositoryDetail(RepositoryBase):
3333
"""Detail schema for Repository (used in single item endpoints)."""
3434

35-
description: str
35+
description: str | None = None
3636

3737

3838
class RepositoryError(Schema):

backend/tests/apps/api/rest/v0/event_test.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@
2727
],
2828
)
2929
def test_event_serializer_validation(event_data):
30-
# Create a mock object with nest_key property
31-
class MockEvent:
32-
def __init__(self, data):
33-
for key, value in data.items():
34-
setattr(self, key, value)
35-
self.nest_key = data["key"]
36-
37-
event = EventDetail.from_orm(MockEvent(event_data))
30+
event = EventDetail(
31+
**{
32+
**event_data,
33+
"end_date": datetime.fromisoformat(event_data["end_date"]),
34+
"start_date": datetime.fromisoformat(event_data["start_date"]),
35+
}
36+
)
3837

3938
assert event.description == event_data["description"]
4039
assert event.end_date == datetime.fromisoformat(event_data["end_date"])

0 commit comments

Comments
 (0)