Files
ihrm/horilla_api/docs.py

98 lines
2.4 KiB
Python
Raw Normal View History

2025-12-23 15:01:24 +05:30
"""
Documentation helpers for API views
"""
2025-12-23 15:01:24 +05:30
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
2025-12-23 15:01:24 +05:30
from rest_framework import authentication
# Module tags for organizing endpoints
MODULE_TAGS = {
"auth": "Authentication",
"asset": "Asset Management",
"base": "Base",
"employee": "Employee Management",
"notifications": "Notifications",
"payroll": "Payroll",
"attendance": "Attendance",
"leave": "Leave Management",
2025-12-23 15:01:24 +05:30
}
# Common response schemas
error_response = openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
"error": openapi.Schema(type=openapi.TYPE_STRING),
"detail": openapi.Schema(type=openapi.TYPE_STRING),
},
2025-12-23 15:01:24 +05:30
)
success_response = openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
"success": openapi.Schema(type=openapi.TYPE_BOOLEAN),
"message": openapi.Schema(type=openapi.TYPE_STRING),
},
2025-12-23 15:01:24 +05:30
)
# Common parameters
pagination_params = [
openapi.Parameter(
"page", openapi.IN_QUERY, description="Page number", type=openapi.TYPE_INTEGER
),
openapi.Parameter(
"page_size",
openapi.IN_QUERY,
description="Number of results per page",
type=openapi.TYPE_INTEGER,
),
2025-12-23 15:01:24 +05:30
]
2025-12-23 15:01:24 +05:30
def document_api(
operation_description=None,
request_body=None,
responses=None,
query_params=None,
tags=None,
manual_parameters=None,
**kwargs
):
"""
Decorator for documenting API views with authentication
2025-12-23 15:01:24 +05:30
Example usage:
2025-12-23 15:01:24 +05:30
@document_api(
operation_description="List all employees",
responses={200: EmployeeSerializer(many=True)},
tags=['Employee']
)
def get(self, request):
...
"""
# Add pagination parameters for list views
if manual_parameters is None and query_params == "paginated":
2025-12-23 15:01:24 +05:30
manual_parameters = pagination_params
2025-12-23 15:01:24 +05:30
# Add common error responses
if responses and 400 not in responses:
responses[400] = error_response
if responses and 401 not in responses:
responses[401] = error_response
if responses and 403 not in responses:
responses[403] = error_response
2025-12-23 15:01:24 +05:30
# Add security requirement (Bearer only)
security = [{"Bearer": []}]
2025-12-23 15:01:24 +05:30
return swagger_auto_schema(
operation_description=operation_description,
request_body=request_body,
responses=responses,
manual_parameters=manual_parameters,
tags=tags,
security=security,
**kwargs
)