events: fix error when storing events with date/time/datetime/etc (#7028)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
parent
8c891b04f2
commit
29de5d34d6
|
@ -2,6 +2,7 @@
|
||||||
import re
|
import re
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from dataclasses import asdict, is_dataclass
|
from dataclasses import asdict, is_dataclass
|
||||||
|
from datetime import date, datetime, time, timedelta
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from types import GeneratorType
|
from types import GeneratorType
|
||||||
|
@ -13,6 +14,7 @@ from django.core.handlers.wsgi import WSGIRequest
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.base import Model
|
from django.db.models.base import Model
|
||||||
from django.http.request import HttpRequest
|
from django.http.request import HttpRequest
|
||||||
|
from django.utils import timezone
|
||||||
from django.views.debug import SafeExceptionReporterFilter
|
from django.views.debug import SafeExceptionReporterFilter
|
||||||
from geoip2.models import City
|
from geoip2.models import City
|
||||||
from guardian.utils import get_anonymous_user
|
from guardian.utils import get_anonymous_user
|
||||||
|
@ -84,7 +86,7 @@ def get_user(user: User, original_user: Optional[User] = None) -> dict[str, Any]
|
||||||
return user_data
|
return user_data
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-return-statements
|
# pylint: disable=too-many-return-statements,too-many-branches
|
||||||
def sanitize_item(value: Any) -> Any:
|
def sanitize_item(value: Any) -> Any:
|
||||||
"""Sanitize a single item, ensure it is JSON parsable"""
|
"""Sanitize a single item, ensure it is JSON parsable"""
|
||||||
if is_dataclass(value):
|
if is_dataclass(value):
|
||||||
|
@ -134,6 +136,23 @@ def sanitize_item(value: Any) -> Any:
|
||||||
"type": value.__name__,
|
"type": value.__name__,
|
||||||
"module": value.__module__,
|
"module": value.__module__,
|
||||||
}
|
}
|
||||||
|
# See
|
||||||
|
# https://github.com/encode/django-rest-framework/blob/master/rest_framework/utils/encoders.py
|
||||||
|
# For Date Time string spec, see ECMA 262
|
||||||
|
# https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
|
||||||
|
if isinstance(value, datetime):
|
||||||
|
representation = value.isoformat()
|
||||||
|
if representation.endswith("+00:00"):
|
||||||
|
representation = representation[:-6] + "Z"
|
||||||
|
return representation
|
||||||
|
if isinstance(value, date):
|
||||||
|
return value.isoformat()
|
||||||
|
if isinstance(value, time):
|
||||||
|
if timezone and timezone.is_aware(value):
|
||||||
|
raise ValueError("JSON can't represent timezone-aware times.")
|
||||||
|
return value.isoformat()
|
||||||
|
if isinstance(value, timedelta):
|
||||||
|
return str(value.total_seconds())
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue