Skip to content

Commit 4e9688d

Browse files
committed
Bump version to 0.10.7
1 parent 5622ef3 commit 4e9688d

4 files changed

Lines changed: 28 additions & 91 deletions

File tree

drfexts/exceptions.py

Lines changed: 13 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
import traceback
55

66
from django.conf import settings
7-
from django.core.exceptions import PermissionDenied as _PermissionDenied, PermissionDenied
8-
from django.http import Http404
9-
from rest_framework import exceptions, status
107
from rest_framework.response import Response
11-
from rest_framework.status import HTTP_200_OK, HTTP_500_INTERNAL_SERVER_ERROR
12-
from rest_framework.utils.serializer_helpers import ReturnList
13-
from rest_framework.views import set_rollback
8+
from rest_framework.status import HTTP_500_INTERNAL_SERVER_ERROR
9+
from rest_framework.views import set_rollback, exception_handler
1410

1511

1612
def _get_detail(detail):
@@ -22,85 +18,17 @@ def _get_detail(detail):
2218
return result
2319

2420

25-
class BaseError(Exception):
26-
code = HTTP_500_INTERNAL_SERVER_ERROR
27-
params = None
28-
message = 'internal error'
29-
30-
def __init__(self, message=None, detail=None, data=None):
31-
self.message = message or self.message
32-
super().__init__(self.message, self.code, self.params)
33-
34-
35-
def exception_handler(exc, context):
36-
"""
37-
Returns the response that should be used for any given exception.
38-
39-
By default we handle the REST framework `APIException`, and also
40-
Django's built-in `Http404` and `PermissionDenied` exceptions.
41-
42-
Any unhandled exceptions may return `None`, which will cause a 500 error
43-
to be raised.
44-
"""
45-
if isinstance(exc, Http404):
46-
exc = exceptions.NotFound()
47-
elif isinstance(exc, _PermissionDenied):
48-
exc = exceptions.PermissionDenied()
49-
50-
headers = {}
51-
if isinstance(exc, exceptions.ValidationError):
52-
data = {"code": exc.status_code, 'message': exc.default_code, 'data': exc.detail}
53-
elif isinstance(exc, exceptions.APIException):
54-
# DRF异常处理
55-
code = exc.status_code
56-
if getattr(exc, 'auth_header', None):
57-
headers['WWW-Authenticate'] = exc.auth_header
58-
if getattr(exc, 'wait', None):
59-
headers['Retry-After'] = '%d' % exc.wait
60-
data = {"code": code, 'message': str(exc.detail), 'data': exc.detail}
61-
elif isinstance(exc, BaseError):
62-
# 自定义异常处理
63-
data = {"code": exc.code, "message": exc.message}
64-
else:
65-
data = {"code": HTTP_500_INTERNAL_SERVER_ERROR, "message": "Internal Error", "data": getattr(exc, 'message', repr(exc))}
66-
67-
set_rollback()
68-
if settings.DEBUG:
69-
traceback.print_exc()
70-
data.update(traceback=traceback.format_exc())
71-
return Response(data, status=HTTP_200_OK, headers=headers)
72-
73-
74-
def exception_handler(exc, context):
75-
"""
76-
Returns the response that should be used for any given exception.
77-
78-
By default we handle the REST framework `APIException`, and also
79-
Django's built-in `Http404` and `PermissionDenied` exceptions.
80-
81-
Any unhandled exceptions may return `None`, which will cause a 500 error
82-
to be raised.
83-
"""
84-
if isinstance(exc, Http404):
85-
exc = exceptions.NotFound()
86-
elif isinstance(exc, PermissionDenied):
87-
exc = exceptions.PermissionDenied()
88-
89-
if isinstance(exc, exceptions.APIException):
90-
headers = {}
91-
if getattr(exc, 'auth_header', None):
92-
headers['WWW-Authenticate'] = exc.auth_header
93-
if getattr(exc, 'wait', None):
94-
headers['Retry-After'] = '%d' % exc.wait
95-
96-
if isinstance(exc.detail, (list, dict)):
97-
data = exc.detail
98-
else:
99-
data = {'detail': exc.detail}
21+
def custom_exception_handler(exc, context):
22+
# Call REST framework's default exception handler first,
23+
# to get the standard error response.
24+
response = exception_handler(exc, context)
10025

26+
# Catch other exceptions.
27+
if response is None:
28+
response = Response({"detail": str(exc)}, status=HTTP_500_INTERNAL_SERVER_ERROR)
10129
set_rollback()
102-
resp = Response(data, status=status.HTTP_200_OK, headers=headers)
103-
resp.error_code = exc.status_code
104-
return resp
30+
if settings.DEBUG:
31+
traceback.print_exc()
32+
response.data.update(traceback=traceback.format_exc())
10533

106-
return None
34+
return response

drfexts/models.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
StatusField,
1212
DefaultCodeField,
1313
AuditStatusField,
14-
CreatedByField, UpdatedByField,
14+
CreatedByField,
15+
UpdatedByField,
1516
)
1617

1718
User = get_user_model()
@@ -30,12 +31,16 @@ class NotNull(Func):
3031

3132

3233
class StatusQueryset(models.QuerySet):
34+
3335
def editable(self):
3436
return self.exclude(status__in=[CommonStatus.DELETED, CommonStatus.INVALID])
3537

36-
def valid(self):
38+
def active(self):
3739
return self.filter(status__in=[CommonStatus.VALID, CommonStatus.PAUSED, CommonStatus.TO_INVALID])
3840

41+
def valid(self):
42+
return self.filter(status__in=CommonStatus.VALID)
43+
3944

4045
class BaseModel(models.Model):
4146
"""
@@ -46,7 +51,7 @@ class BaseModel(models.Model):
4651
updated_at = UpdatedAtField() # 修改时间
4752
created_at = CreatedAtField() # 创建时间
4853

49-
objects = models.Manager()
54+
objects = StatusQueryset.as_manager()
5055

5156
class Meta:
5257
abstract = True
@@ -63,7 +68,7 @@ class BaseCodeModel(models.Model):
6368
updated_at = UpdatedAtField() # 修改时间
6469
created_at = CreatedAtField() # 创建时间
6570

66-
objects = models.Manager()
71+
objects = StatusQueryset.as_manager()
6772

6873
class Meta:
6974
abstract = True
@@ -82,6 +87,8 @@ class BaseCreatorModel(models.Model):
8287
updated_at = UpdatedAtField() # 修改时间
8388
created_at = CreatedAtField() # 创建时间
8489

90+
objects = StatusQueryset.as_manager()
91+
8592
class Meta:
8693
abstract = True
8794

@@ -113,6 +120,8 @@ class AuditModel(models.Model):
113120
updated_at = UpdatedAtField() # 修改时间
114121
created_at = CreatedAtField() # 创建时间
115122

123+
objects = StatusQueryset.as_manager()
124+
116125
class Meta:
117126
abstract = True
118127
verbose_name = '审核模型'

drfexts/renderers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def render(
101101
payload["msg"] = data["detail"]
102102
payload.pop("data", None)
103103
except KeyError:
104-
payload["msg"] = "error"
104+
payload["msg"] = "Invalid input."
105105

106106
response.status_code = status.HTTP_200_OK # Set all response status to HTTP 200
107107
elif data is None:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "drfexts"
3-
version = "0.10.4"
3+
version = "0.10.7"
44
readme = "README.md"
55
description = "Django Restframework Utils"
66
authors = ["aiden <allaher@icloud.com>"]

0 commit comments

Comments
 (0)