From 709b650f2eb0bca6b4f5c77564f869b95b063ac0 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Thu, 3 Oct 2024 12:48:39 +0100 Subject: [PATCH] fix: JSON renderer not always casting when it should --- apps/api/renderers.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/api/renderers.py b/apps/api/renderers.py index b7d14d5..b367369 100644 --- a/apps/api/renderers.py +++ b/apps/api/renderers.py @@ -5,10 +5,23 @@ from rest_framework.renderers import JSONRenderer # custom renderer to fix a horrible python json issue, that corrupts large integers # issue example: parsing an integer 1204426362794811453 will corrupt the integer into 1204426362794811400. class FixedJSONRenderer(JSONRenderer): - def render(self, data, *args, **kwargs): + def handle_large_ints(self, data): if isinstance(data, dict): - data = { - key: str(value) if isinstance(value, int) and value > 9007199254740991 else value - for key, value in data.items() + return { + key: self.handle_large_ints(value) # Recursively apply to nested dicts + if isinstance(value, (dict, list)) else str(value) + if isinstance(value, int) and value > 1000000000000000 else value + for key, value in data.items() } + elif isinstance(data, list): + return [ + self.handle_large_ints(item) # Recursively apply to lists + if isinstance(item, (dict, list)) else str(item) + if isinstance(item, int) and item > 1000000000000000 else item + for item in data + ] + return data + + def render(self, data, *args, **kwargs): + data = self.handle_large_ints(data) # Preprocess data to convert large ints return super().render(data, *args, **kwargs)