Skip to content

renderers#

CustomTimeJSONRenderer#

Bases: JSONRenderer

Source code in src/apps/common/renderers.py
class CustomTimeJSONRenderer(renderers.JSONRenderer):
    format = "json"

    def render(self, data, media_type=None, renderer_context=None):
        request = renderer_context["request"]
        if t_format := request.META.get("HTTP_TIME_FORMAT"):
            # Change the format of all DateTime fields in the response data
            data = self.adjust_datetime_format(data, t_format)
        return super().render(data, media_type, renderer_context)

    def adjust_datetime_format(self, data, time_format):
        datetime_pattern = r"^\d{4}-\d{2}"
        if isinstance(data, list):
            return [self.adjust_datetime_format(item, time_format) for item in data]
        elif isinstance(data, dict):
            return {
                key: self.adjust_datetime_format(value, time_format) for key, value in data.items()
            }
        elif isinstance(data, str):
            if re.match(datetime_pattern, data) is not None:
                try:
                    datetime_obj = parse_datetime(data)
                    current_timezone = timezone.get_current_timezone()
                    if timezone.is_naive(datetime_obj):
                        datetime_obj = timezone.make_aware(datetime_obj, current_timezone)
                    utc_datetime = datetime_obj.astimezone(timezone.utc)
                    return utc_datetime.strftime(time_format)
                except ValueError as e:
                    logger.error(e)
                    return data
            else:
                return data
        else:
            return data