49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
from enum import Enum
|
|
from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network
|
|
from typing import Any, FrozenSet
|
|
|
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
from django.http import JsonResponse
|
|
from pydantic import BaseModel
|
|
from pydantic_core import Url
|
|
|
|
__all__ = [
|
|
"NinjaJSONEncoder",
|
|
"Response",
|
|
"codes_1xx",
|
|
"codes_2xx",
|
|
"codes_3xx",
|
|
"codes_4xx",
|
|
"codes_5xx",
|
|
]
|
|
|
|
|
|
class NinjaJSONEncoder(DjangoJSONEncoder):
|
|
def default(self, o: Any) -> Any:
|
|
if isinstance(o, BaseModel):
|
|
return o.model_dump()
|
|
if isinstance(o, Url):
|
|
return str(o)
|
|
if isinstance(o, (IPv4Address, IPv4Network, IPv6Address, IPv6Network)):
|
|
return str(o)
|
|
if isinstance(o, Enum):
|
|
return str(o)
|
|
return super().default(o)
|
|
|
|
|
|
class Response(JsonResponse):
|
|
def __init__(self, data: Any, **kwargs: Any) -> None:
|
|
super().__init__(data, encoder=NinjaJSONEncoder, safe=False, **kwargs)
|
|
|
|
|
|
def resp_codes(from_code: int, to_code: int) -> FrozenSet[int]:
|
|
return frozenset(range(from_code, to_code + 1))
|
|
|
|
|
|
# most common http status codes
|
|
codes_1xx = resp_codes(100, 101)
|
|
codes_2xx = resp_codes(200, 206)
|
|
codes_3xx = resp_codes(300, 308)
|
|
codes_4xx = resp_codes(400, 412) | frozenset({416, 418, 425, 429, 451})
|
|
codes_5xx = resp_codes(500, 504)
|