diff options
| author | Chris Guethle | 2013-10-24 09:40:43 -0500 | 
|---|---|---|
| committer | Chris Guethle | 2013-10-24 09:40:43 -0500 | 
| commit | 7a87893b962d155f5e9d06bd0001a7f994419a2d (patch) | |
| tree | 6528d70d0afb1670cd1605dc57fc150798b7e814 /rest_framework/exceptions.py | |
| parent | 2ddf7869e3ce57d056c5b0546154c7bbe524cc09 (diff) | |
| download | django-rest-framework-7a87893b962d155f5e9d06bd0001a7f994419a2d.tar.bz2 | |
reworked APIException, pushing some of the status_code and detail management up.  Also, makes the APIException useful in isolation (defaults to status code 500)
Diffstat (limited to 'rest_framework/exceptions.py')
| -rw-r--r-- | rest_framework/exceptions.py | 35 | 
1 files changed, 14 insertions, 21 deletions
| diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py index 425a7214..2bd21de3 100644 --- a/rest_framework/exceptions.py +++ b/rest_framework/exceptions.py @@ -13,47 +13,40 @@ class APIException(Exception):      Base class for REST framework exceptions.      Subclasses should provide `.status_code` and `.detail` properties.      """ -    pass +    status_code = status.HTTP_500_INTERNAL_SERVER_ERROR +    default_detail = "" + +    def __init__(self, detail=None, status_code=None): +        self.status_code = status_code or self.status_code +        self.detail = detail or self.default_detail  class ParseError(APIException):      status_code = status.HTTP_400_BAD_REQUEST      default_detail = 'Malformed request.' -    def __init__(self, detail=None): -        self.detail = detail or self.default_detail -  class AuthenticationFailed(APIException):      status_code = status.HTTP_401_UNAUTHORIZED      default_detail = 'Incorrect authentication credentials.' -    def __init__(self, detail=None): -        self.detail = detail or self.default_detail -  class NotAuthenticated(APIException):      status_code = status.HTTP_401_UNAUTHORIZED      default_detail = 'Authentication credentials were not provided.' -    def __init__(self, detail=None): -        self.detail = detail or self.default_detail -  class PermissionDenied(APIException):      status_code = status.HTTP_403_FORBIDDEN      default_detail = 'You do not have permission to perform this action.' -    def __init__(self, detail=None): -        self.detail = detail or self.default_detail -  class MethodNotAllowed(APIException):      status_code = status.HTTP_405_METHOD_NOT_ALLOWED      default_detail = "Method '%s' not allowed."      def __init__(self, method, detail=None): -        self.detail = (detail or self.default_detail) % method +        super(MethodNotAllowed, self).__init__((detail or self.default_detail) % method)  class NotAcceptable(APIException): @@ -61,7 +54,7 @@ class NotAcceptable(APIException):      default_detail = "Could not satisfy the request's Accept header"      def __init__(self, detail=None, available_renderers=None): -        self.detail = detail or self.default_detail +        super(NotAcceptable, self).__init__(detail)          self.available_renderers = available_renderers @@ -70,19 +63,19 @@ class UnsupportedMediaType(APIException):      default_detail = "Unsupported media type '%s' in request."      def __init__(self, media_type, detail=None): -        self.detail = (detail or self.default_detail) % media_type +        super(UnsupportedMediaType, self).__init__((detail or self.default_detail) % media_type)  class Throttled(APIException):      status_code = status.HTTP_429_TOO_MANY_REQUESTS -    default_detail = "Request was throttled." +    default_detail = 'Request was throttled.'      extra_detail = "Expected available in %d second%s."      def __init__(self, wait=None, detail=None): +        super(Throttled, self).__init__(detail) +          import math          self.wait = wait and math.ceil(wait) or None          if wait is not None: -            format = detail or self.default_detail + self.extra_detail -            self.detail = format % (self.wait, self.wait != 1 and 's' or '') -        else: -            self.detail = detail or self.default_detail +            format = self.detail + self.extra_detail +            self.detail = format % (self.wait, self.wait != 1 and 's' or '')
\ No newline at end of file | 
