vbv/server/vbv_lernwelt/core/utils.py

87 lines
2.2 KiB
Python

import json
import re
from datetime import date, datetime, time
from typing import Any, Dict
from django.utils.safestring import mark_safe
from rest_framework import serializers
from rest_framework.throttling import UserRateThrottle
class FailSafeJSONEncoder(json.JSONEncoder):
def default(self, obj):
try:
return super(FailSafeJSONEncoder, self).default(obj)
except Exception:
return str(obj)
def safe_json_dumps(data, **kwargs):
return json.dumps(data, cls=FailSafeJSONEncoder, **kwargs)
class HourUserRateThrottle(UserRateThrottle):
scope = "hour-throttle"
class DayUserRateThrottle(UserRateThrottle):
scope = "day-throttle"
def find_first(iterable, pred=None, default=None):
return next(filter(pred, iterable), default)
def find_first_index(iterable, pred, default=None):
return next((i for i, x in enumerate(iterable) if pred(x)), default)
def replace_whitespace(text, replacement=" "):
return re.sub(r"\s+", replacement, text).strip()
def get_django_content_type(obj):
return obj._meta.app_label + "." + type(obj).__name__
class StringIDField(serializers.Field):
def to_representation(self, value):
return str(value)
def pretty_print_json(json_string):
try:
parsed = json_string
if isinstance(json_string, str):
parsed = json.loads(json_string)
return mark_safe(
"<pre>{}</pre>".format(json.dumps(parsed, indent=4, sort_keys=True))
)
# pylint: disable=broad-except
except Exception:
return json_string
def safe_deque_popleft(deq, default=None):
try:
return deq.popleft()
except IndexError:
return default
def sanitize_json_data_input(data: Dict[str, Any]) -> Dict[str, Any]:
"""
Saving additional_json_data fails if the data contains datetime objects.
This is a quick and dirty fix to convert datetime objects to iso strings.
"""
for key, value in data.items():
if isinstance(value, datetime):
data[key] = value.isoformat()
elif isinstance(value, date):
data[key] = value.isoformat()
elif isinstance(value, time):
data[key] = value.isoformat()
else:
data[key] = value
return data