Implement unified API standard across backend viewsets and serializers, enhancing error handling and response formatting. Update AccountModelViewSet to standardize CRUD operations with success and error responses. Refactor various viewsets to inherit from AccountModelViewSet, ensuring compliance with the new standard. Improve frontend components to handle API responses consistently and update configuration for better user experience.
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
"""
|
||||
Base ViewSet with account filtering support
|
||||
Unified API Standard v1.0 compliant
|
||||
"""
|
||||
from rest_framework import viewsets
|
||||
from rest_framework import viewsets, status
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.exceptions import ValidationError as DRFValidationError
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from .response import success_response, error_response
|
||||
|
||||
|
||||
class AccountModelViewSet(viewsets.ModelViewSet):
|
||||
@@ -74,6 +77,123 @@ class AccountModelViewSet(viewsets.ModelViewSet):
|
||||
if account:
|
||||
context['account'] = account
|
||||
return context
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
"""
|
||||
Override retrieve to return unified format
|
||||
"""
|
||||
try:
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance)
|
||||
return success_response(data=serializer.data, request=request)
|
||||
except Exception as e:
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
request=request
|
||||
)
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
"""
|
||||
Override create to return unified format
|
||||
"""
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
try:
|
||||
serializer.is_valid(raise_exception=True)
|
||||
self.perform_create(serializer)
|
||||
headers = self.get_success_headers(serializer.data)
|
||||
return success_response(
|
||||
data=serializer.data,
|
||||
message='Created successfully',
|
||||
request=request,
|
||||
status_code=status.HTTP_201_CREATED
|
||||
)
|
||||
except DRFValidationError as e:
|
||||
return error_response(
|
||||
error='Validation error',
|
||||
errors=e.detail if hasattr(e, 'detail') else str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
except Exception as e:
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.error(f"Error in create method: {str(e)}", exc_info=True)
|
||||
# Check if it's a validation-related error
|
||||
if 'required' in str(e).lower() or 'invalid' in str(e).lower() or 'validation' in str(e).lower():
|
||||
return error_response(
|
||||
error='Validation error',
|
||||
errors=str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
# For other errors, return 500
|
||||
return error_response(
|
||||
error=f'Internal server error: {str(e)}',
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
request=request
|
||||
)
|
||||
|
||||
def update(self, request, *args, **kwargs):
|
||||
"""
|
||||
Override update to return unified format
|
||||
"""
|
||||
partial = kwargs.pop('partial', False)
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance, data=request.data, partial=partial)
|
||||
try:
|
||||
serializer.is_valid(raise_exception=True)
|
||||
self.perform_update(serializer)
|
||||
return success_response(
|
||||
data=serializer.data,
|
||||
message='Updated successfully',
|
||||
request=request
|
||||
)
|
||||
except DRFValidationError as e:
|
||||
return error_response(
|
||||
error='Validation error',
|
||||
errors=e.detail if hasattr(e, 'detail') else str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
except Exception as e:
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.error(f"Error in create method: {str(e)}", exc_info=True)
|
||||
# Check if it's a validation-related error
|
||||
if 'required' in str(e).lower() or 'invalid' in str(e).lower() or 'validation' in str(e).lower():
|
||||
return error_response(
|
||||
error='Validation error',
|
||||
errors=str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
# For other errors, return 500
|
||||
return error_response(
|
||||
error=f'Internal server error: {str(e)}',
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
request=request
|
||||
)
|
||||
|
||||
def destroy(self, request, *args, **kwargs):
|
||||
"""
|
||||
Override destroy to return unified format
|
||||
"""
|
||||
try:
|
||||
instance = self.get_object()
|
||||
self.perform_destroy(instance)
|
||||
return success_response(
|
||||
data=None,
|
||||
message='Deleted successfully',
|
||||
request=request,
|
||||
status_code=status.HTTP_204_NO_CONTENT
|
||||
)
|
||||
except Exception as e:
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
request=request
|
||||
)
|
||||
|
||||
|
||||
class SiteSectorModelViewSet(AccountModelViewSet):
|
||||
|
||||
Reference in New Issue
Block a user