"""
Handled exceptions raised by REST framework.
In addition Django's built in 403 and 404 exceptions are handled.
(`django.http.Http404` and `django.core.exceptions.PermissionDenied`)
"""fromdjangorestframeworkimportstatusclassAPIException(Exception):"""
Base class for REST framework exceptions.
Subclasses should provide `.status_code` and `.detail` properties.
"""passclassParseError(APIException):status_code=status.HTTP_400_BAD_REQUESTdefault_detail='Malformed request.'def__init__(self,detail=None):self.detail=detailorself.default_detailclassPermissionDenied(APIException):status_code=status.HTTP_403_FORBIDDENdefault_detail='You do not have permission to perform this action.'def__init__(self,detail=None):self.detail=detailorself.default_detailclassMethodNotAllowed(APIException):status_code=status.HTTP_405_METHOD_NOT_ALLOWEDdefault_detail="Method '%s' not allowed."def__init__(self,method,detail=None):self.detail=(detailorself.default_detail)%methodclassNotAcceptable(APIException):status_code=status.HTTP_406_NOT_ACCEPTABLEdefault_detail="Could not satisfy the request's Accept header"def__init__(self,detail=None,available_renderers=None):self.detail=detailorself.default_detailself.available_renderers=available_renderersclassUnsupportedMediaType(APIException):status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPEdefault_detail="Unsupported media type '%s' in request."def__init__(self,media_type,detail=None):self.detail=(detailorself.default_detail)%media_typeclassThrottled(APIException):status_code=status.HTTP_429_TOO_MANY_REQUESTSdefault_detail="Request was throttled."extra_detail="Expected available in %d second%s."def__init__(self,wait=None,detail=None):importmathself.wait=waitandmath.ceil(wait)orNoneifwaitisnotNone:format=detailorself.default_detail+self.extra_detailself.detail=format%(self.wait,self.wait!=1and's'or'')else:self.detail=detailorself.default_detail