Skip to content

Commit bf0b637

Browse files
authored
Merge branch 'feature/nestbot-assistant' into MVP
2 parents 13485e8 + 888b782 commit bf0b637

File tree

22 files changed

+1265
-1086
lines changed

22 files changed

+1265
-1086
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ repos:
1010
exclude: (.github|pnpm-lock.yaml)
1111

1212
- repo: https://github.com/astral-sh/ruff-pre-commit
13-
rev: v0.13.0
13+
rev: v0.13.1
1414
hooks:
1515
- id: ruff
1616
args:
@@ -38,7 +38,7 @@ repos:
3838
exclude: (.github|pnpm-lock.yaml)
3939

4040
- repo: https://github.com/pre-commit/mirrors-mypy
41-
rev: v1.18.1
41+
rev: v1.18.2
4242
hooks:
4343
- id: mypy
4444
additional_dependencies:

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from apps.api.rest.v0.project import router as project_router
1414
from apps.api.rest.v0.release import router as release_router
1515
from apps.api.rest.v0.repository import router as repository_router
16+
from apps.api.rest.v0.sponsor import router as sponsor_router
1617

1718
from .chapter import router as chapter_router
1819

@@ -34,6 +35,8 @@
3435
"/releases": release_router,
3536
# Repositories.
3637
"/repositories": repository_router,
38+
# Sponsors.
39+
"/sponsors": sponsor_router,
3740
}
3841

3942

@@ -43,7 +46,7 @@
4346
"docs": Swagger(settings={"persistAuthorization": True}),
4447
"throttle": [AuthRateThrottle("10/s")],
4548
"title": "OWASP Nest",
46-
"version": "0.2.1",
49+
"version": "0.2.3",
4750
}
4851

4952
api_settings_customization = {}

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

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,32 +40,10 @@ class ChapterSchema(Schema):
4040
updated_at: datetime
4141

4242

43-
@router.get(
44-
"/",
45-
description="Retrieve a paginated list of OWASP chapters.",
46-
operation_id="list_chapters",
47-
response={200: list[ChapterSchema]},
48-
summary="List chapters",
49-
tags=["Chapters"],
50-
)
51-
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
52-
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
53-
def list_chapters(
54-
request: HttpRequest,
55-
filters: ChapterFilterSchema = Query(...),
56-
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
57-
None,
58-
description="Ordering field",
59-
),
60-
) -> list[ChapterSchema]:
61-
"""Get chapters."""
62-
return filters.filter(Chapter.active_chapters.order_by(ordering or "-created_at"))
63-
64-
6543
@router.get(
6644
"/{str:chapter_id}",
6745
description="Retrieve chapter details.",
68-
operation_id="get_chapter",
46+
operation_id="get",
6947
response={
7048
HTTPStatus.NOT_FOUND: ChapterErrorResponse,
7149
HTTPStatus.OK: ChapterSchema,
@@ -86,3 +64,25 @@ def get_chapter(
8664
return chapter
8765

8866
return Response({"message": "Chapter not found"}, status=HTTPStatus.NOT_FOUND)
67+
68+
69+
@router.get(
70+
"/",
71+
description="Retrieve a paginated list of OWASP chapters.",
72+
operation_id="list",
73+
response={200: list[ChapterSchema]},
74+
summary="List chapters",
75+
tags=["Chapters"],
76+
)
77+
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
78+
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
79+
def list_chapters(
80+
request: HttpRequest,
81+
filters: ChapterFilterSchema = Query(...),
82+
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
83+
None,
84+
description="Ordering field",
85+
),
86+
) -> list[ChapterSchema]:
87+
"""Get chapters."""
88+
return filters.filter(Chapter.active_chapters.order_by(ordering or "-created_at"))

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,10 @@ class CommitteeSchema(Schema):
3232
updated_at: datetime
3333

3434

35-
@router.get(
36-
"/",
37-
description="Retrieve a paginated list of OWASP committees.",
38-
operation_id="list_committees",
39-
response={200: list[CommitteeSchema]},
40-
summary="List committees",
41-
tags=["Committees"],
42-
)
43-
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
44-
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
45-
def list_committees(
46-
request: HttpRequest,
47-
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
48-
None,
49-
description="Ordering field",
50-
),
51-
) -> list[CommitteeSchema]:
52-
"""Get committees."""
53-
return Committee.active_committees.order_by(ordering or "-created_at")
54-
55-
5635
@router.get(
5736
"/{str:committee_id}",
5837
description="Retrieve committee details.",
59-
operation_id="get_committee",
38+
operation_id="get",
6039
response={
6140
HTTPStatus.NOT_FOUND: CommitteeErrorResponse,
6241
HTTPStatus.OK: CommitteeSchema,
@@ -80,3 +59,24 @@ def get_chapter(
8059
return committee
8160

8261
return Response({"message": "Committee not found"}, status=HTTPStatus.NOT_FOUND)
62+
63+
64+
@router.get(
65+
"/",
66+
description="Retrieve a paginated list of OWASP committees.",
67+
operation_id="list",
68+
response={200: list[CommitteeSchema]},
69+
summary="List committees",
70+
tags=["Committees"],
71+
)
72+
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
73+
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
74+
def list_committees(
75+
request: HttpRequest,
76+
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
77+
None,
78+
description="Ordering field",
79+
),
80+
) -> list[CommitteeSchema]:
81+
"""Get committees."""
82+
return Committee.active_committees.order_by(ordering or "-created_at")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class EventSchema(Schema):
2828
@router.get(
2929
"/",
3030
description="Retrieve a paginated list of OWASP events.",
31-
operation_id="list_events",
31+
operation_id="list",
3232
summary="List events",
3333
tags=["Events"],
3434
response={200: list[EventSchema]},
@@ -42,5 +42,5 @@ def list_events(
4242
description="Ordering field",
4343
),
4444
) -> list[EventSchema]:
45-
"""Get all events."""
45+
"""Get events."""
4646
return Event.objects.order_by(ordering or "-start_date")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class IssueSchema(Schema):
3939
@router.get(
4040
"/",
4141
description="Retrieve a paginated list of GitHub issues.",
42-
operation_id="list_issues",
42+
operation_id="list",
4343
response={200: list[IssueSchema]},
4444
summary="List issues",
4545
tags=["Issues"],
@@ -54,7 +54,7 @@ def list_issues(
5454
description="Ordering field",
5555
),
5656
) -> list[IssueSchema]:
57-
"""Get all issues."""
57+
"""Get issues."""
5858
issues = filters.filter(Issue.objects.all())
5959

6060
if ordering:

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class LabelSchema(Schema):
3535
@router.get(
3636
"/",
3737
description="Retrieve a paginated list of GitHub labels.",
38-
operation_id="list_labels",
38+
operation_id="list",
3939
response={200: list[LabelSchema]},
4040
summary="List labels",
4141
tags=["Labels"],
@@ -51,7 +51,7 @@ def list_label(
5151
description="Ordering field",
5252
),
5353
) -> list[LabelSchema]:
54-
"""Get all labels."""
54+
"""Get labels."""
5555
labels = filters.filter(Label.objects.all())
5656

5757
if ordering:

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""User API."""
1+
"""Member API."""
22

33
from datetime import datetime
44
from http import HTTPStatus
@@ -52,32 +52,10 @@ class MemberErrorResponse(Schema):
5252
message: str
5353

5454

55-
@router.get(
56-
"/",
57-
description="Retrieve a paginated list of OWASP community members.",
58-
operation_id="list_members",
59-
response={HTTPStatus.OK: list[MemberSchema]},
60-
summary="List members",
61-
tags=["Community"],
62-
)
63-
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
64-
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
65-
def list_members(
66-
request: HttpRequest,
67-
filters: MemberFilterSchema = Query(...),
68-
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
69-
None,
70-
description="Ordering field",
71-
),
72-
) -> list[MemberSchema]:
73-
"""Get all members."""
74-
return filters.filter(User.objects.order_by(ordering or "-created_at"))
75-
76-
7755
@router.get(
7856
"/{str:member_id}",
7957
description="Retrieve member details.",
80-
operation_id="get_member",
58+
operation_id="get",
8159
response={
8260
HTTPStatus.NOT_FOUND: MemberErrorResponse,
8361
HTTPStatus.OK: MemberSchema,
@@ -94,3 +72,25 @@ def get_member(
9472
return user
9573

9674
return Response({"message": "Member not found"}, status=HTTPStatus.NOT_FOUND)
75+
76+
77+
@router.get(
78+
"/",
79+
description="Retrieve a paginated list of OWASP community members.",
80+
operation_id="list",
81+
response={HTTPStatus.OK: list[MemberSchema]},
82+
summary="List members",
83+
tags=["Community"],
84+
)
85+
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
86+
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
87+
def list_members(
88+
request: HttpRequest,
89+
filters: MemberFilterSchema = Query(...),
90+
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
91+
None,
92+
description="Ordering field",
93+
),
94+
) -> list[MemberSchema]:
95+
"""Get members."""
96+
return filters.filter(User.objects.order_by(ordering or "-created_at"))

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class OrganizationSchema(Schema):
4747
@router.get(
4848
"/",
4949
description="Retrieve a paginated list of GitHub organizations.",
50-
operation_id="list_organizations",
50+
operation_id="list",
5151
response={200: list[OrganizationSchema]},
5252
summary="List organizations",
5353
tags=["Community"],
@@ -73,7 +73,7 @@ def list_organization(
7373
@router.get(
7474
"/{str:organization_id}",
7575
description="Retrieve project details.",
76-
operation_id="get_organization",
76+
operation_id="get",
7777
response={
7878
HTTPStatus.NOT_FOUND: OrganizationErrorResponse,
7979
HTTPStatus.OK: OrganizationSchema,

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,10 @@ class ProjectSchema(Schema):
4343
updated_at: datetime
4444

4545

46-
@router.get(
47-
"/",
48-
description="Retrieve a paginated list of OWASP projects.",
49-
operation_id="list_projects",
50-
response={200: list[ProjectSchema]},
51-
summary="List projects",
52-
tags=["Projects"],
53-
)
54-
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
55-
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
56-
def list_projects(
57-
request: HttpRequest,
58-
filters: ProjectFilterSchema = Query(...),
59-
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
60-
None,
61-
description="Ordering field",
62-
example="-created_at",
63-
),
64-
) -> list[ProjectSchema]:
65-
"""Get projects."""
66-
return filters.filter(Project.active_projects.order_by(ordering or "-created_at"))
67-
68-
6946
@router.get(
7047
"/{str:project_id}",
7148
description="Retrieve project details.",
72-
operation_id="get_project",
49+
operation_id="get",
7350
response={
7451
HTTPStatus.NOT_FOUND: ProjectErrorResponse,
7552
HTTPStatus.OK: ProjectSchema,
@@ -90,3 +67,26 @@ def get_project(
9067
return project
9168

9269
return Response({"message": "Project not found"}, status=HTTPStatus.NOT_FOUND)
70+
71+
72+
@router.get(
73+
"/",
74+
description="Retrieve a paginated list of OWASP projects.",
75+
operation_id="list",
76+
response={200: list[ProjectSchema]},
77+
summary="List projects",
78+
tags=["Projects"],
79+
)
80+
@decorate_view(cache_page(settings.API_CACHE_TIME_SECONDS))
81+
@paginate(PageNumberPagination, page_size=settings.API_PAGE_SIZE)
82+
def list_projects(
83+
request: HttpRequest,
84+
filters: ProjectFilterSchema = Query(...),
85+
ordering: Literal["created_at", "-created_at", "updated_at", "-updated_at"] | None = Query(
86+
None,
87+
description="Ordering field",
88+
example="-created_at",
89+
),
90+
) -> list[ProjectSchema]:
91+
"""Get projects."""
92+
return filters.filter(Project.active_projects.order_by(ordering or "-created_at"))

0 commit comments

Comments
 (0)