chore: factorize json.dumps in an util function.

In order to use the Django JSON Encoder by default.
This commit is contained in:
Alexis Métaireau 2024-03-05 11:25:37 +01:00
parent 1b41ff0ddc
commit b0c1f56979
4 changed files with 26 additions and 16 deletions

View file

@ -1,10 +1,11 @@
import json import json
import six import six
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models from django.db import models
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
from .utils import json_dumps
class DictField(models.TextField): class DictField(models.TextField):
""" """
@ -15,7 +16,7 @@ class DictField(models.TextField):
if not value: if not value:
value = {} value = {}
if not isinstance(value, six.string_types): if not isinstance(value, six.string_types):
value = json.dumps(value, cls=DjangoJSONEncoder) value = json_dumps(value)
return value return value
def from_db_value(self, value, expression, connection): def from_db_value(self, value, expression, connection):

View file

@ -1,9 +1,9 @@
import json
from copy import copy from copy import copy
from django import template from django import template
from django.conf import settings from django.conf import settings
from django.core.serializers.json import DjangoJSONEncoder
from umap.utils import json_dumps
register = template.Library() register = template.Library()
@ -26,7 +26,7 @@ def map_fragment(map_instance, **kwargs):
page = kwargs.pop("page", None) or "" page = kwargs.pop("page", None) or ""
unique_id = prefix + str(page) + "_" + str(map_instance.pk) unique_id = prefix + str(page) + "_" + str(map_instance.pk)
return { return {
"map_settings": json.dumps(map_settings, cls=DjangoJSONEncoder), "map_settings": json_dumps(map_settings),
"map": map_instance, "map": map_instance,
"unique_id": unique_id, "unique_id": unique_id,
} }

View file

@ -1,7 +1,9 @@
import gzip import gzip
import json
import os import os
from django.conf import settings from django.conf import settings
from django.core.serializers.json import DjangoJSONEncoder
from django.urls import URLPattern, URLResolver, get_resolver from django.urls import URLPattern, URLResolver, get_resolver
@ -162,3 +164,8 @@ def merge_features(reference: list, latest: list, incoming: list):
merged.append(item) merged.append(item)
return merged return merged
def json_dumps(obj, **kwargs):
"""Utility using the Django JSON Encoder when dumping objects"""
return json.dumps(obj, cls=DjangoJSONEncoder, **kwargs)

View file

@ -23,7 +23,6 @@ from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.core.serializers.json import DjangoJSONEncoder
from django.core.signing import BadSignature, Signer from django.core.signing import BadSignature, Signer
from django.core.validators import URLValidator, ValidationError from django.core.validators import URLValidator, ValidationError
from django.http import ( from django.http import (
@ -67,7 +66,14 @@ from .forms import (
UserProfileForm, UserProfileForm,
) )
from .models import DataLayer, Licence, Map, Pictogram, Star, TileLayer from .models import DataLayer, Licence, Map, Pictogram, Star, TileLayer
from .utils import ConflictError, _urls_for_js, gzip_file, is_ajax, merge_features from .utils import (
ConflictError,
_urls_for_js,
gzip_file,
is_ajax,
json_dumps,
merge_features,
)
User = get_user_model() User = get_user_model()
@ -315,7 +321,7 @@ class UserDownload(DetailView, SearchMixin):
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file: with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file:
for map_ in self.get_maps(): for map_ in self.get_maps():
umapjson = map_.generate_umapjson(self.request) umapjson = map_.generate_umapjson(self.request)
geojson_file = io.StringIO(json.dumps(umapjson, cls=DjangoJSONEncoder)) geojson_file = io.StringIO(json_dumps(umapjson))
file_name = f"umap_backup_{map_.slug}_{map_.pk}.umap" file_name = f"umap_backup_{map_.slug}_{map_.pk}.umap"
zip_file.writestr(file_name, geojson_file.getvalue()) zip_file.writestr(file_name, geojson_file.getvalue())
@ -354,7 +360,7 @@ class MapsShowCase(View):
} }
geojson = {"type": "FeatureCollection", "features": [make(m) for m in maps]} geojson = {"type": "FeatureCollection", "features": [make(m) for m in maps]}
return HttpResponse(smart_bytes(json.dumps(geojson, cls=DjangoJSONEncoder))) return HttpResponse(smart_bytes(json_dumps(geojson)))
showcase = MapsShowCase.as_view() showcase = MapsShowCase.as_view()
@ -441,9 +447,7 @@ ajax_proxy = AjaxProxy.as_view()
def simple_json_response(**kwargs): def simple_json_response(**kwargs):
return HttpResponse( return HttpResponse(json_dumps(kwargs), content_type="application/json")
json.dumps(kwargs, cls=DjangoJSONEncoder), content_type="application/json"
)
# ############## # # ############## #
@ -539,9 +543,7 @@ class MapDetailMixin:
geojson["properties"] = {} geojson["properties"] = {}
geojson["properties"].update(properties) geojson["properties"].update(properties)
geojson["properties"]["datalayers"] = self.get_datalayers() geojson["properties"]["datalayers"] = self.get_datalayers()
context["map_settings"] = json.dumps( context["map_settings"] = json_dumps(geojson, indent=settings.DEBUG)
geojson, indent=settings.DEBUG, cls=DjangoJSONEncoder
)
self.set_preconnect(geojson["properties"], context) self.set_preconnect(geojson["properties"], context)
return context return context
@ -1105,7 +1107,7 @@ class DataLayerUpdate(FormLessEditMixin, GZipMixin, UpdateView):
# Replace the uploaded file by the merged version. # Replace the uploaded file by the merged version.
self.request.FILES["geojson"].file = BytesIO( self.request.FILES["geojson"].file = BytesIO(
json.dumps(merged, cls=DjangoJSONEncoder).encode("utf-8") json_dumps(merged).encode("utf-8")
) )
# Mark the data to be reloaded by form_valid # Mark the data to be reloaded by form_valid