Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 40 additions & 23 deletions ietf/utils/db.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,44 @@
# Copyright The IETF Trust 2021, All Rights Reserved
# -*- coding: utf-8 -*-

# Taken from/inspired by
# https://stackoverflow.com/questions/55147169/django-admin-jsonfield-default-empty-dict-wont-save-in-admin
#
# JSONField should recognize {}, (), and [] as valid, non-empty JSON
# values. However, the base Field class excludes them
# Copyright The IETF Trust 2021-2025, All Rights Reserved

import jsonfield
from django.db import models

from ietf.utils.fields import IETFJSONField as FormIETFJSONField, EmptyAwareJSONField as FormEmptyAwareJSONField
from ietf.utils.fields import (
IETFJSONField as FormIETFJSONField,
EmptyAwareJSONField as FormEmptyAwareJSONField,
)


class EmptyAwareJSONField(models.JSONField):
form_class = FormEmptyAwareJSONField
"""JSONField that allows empty JSON values when model specifies empty=False

Taken from/inspired by
https://stackoverflow.com/questions/55147169/django-admin-jsonfield-default-empty-dict-wont-save-in-admin

JSONField should recognize {}, (), and [] as valid, non-empty JSON values.

def __init__(self, *args, empty_values=FormEmptyAwareJSONField.empty_values, accepted_empty_values=None, **kwargs):
If customizing the formfield, the field must accept the `empty_values` argument.
"""

def __init__(
self,
*args,
empty_values=FormEmptyAwareJSONField.empty_values,
accepted_empty_values=None,
**kwargs,
):
if accepted_empty_values is None:
accepted_empty_values = []
self.empty_values = [x
for x in empty_values
if x not in accepted_empty_values]
self.empty_values = [x for x in empty_values if x not in accepted_empty_values]
super().__init__(*args, **kwargs)

def formfield(self, **kwargs):
if 'form_class' not in kwargs or issubclass(kwargs['form_class'], FormEmptyAwareJSONField):
kwargs.setdefault('empty_values', self.empty_values)
return super().formfield(**{**kwargs})
defaults = {
"form_class": FormEmptyAwareJSONField,
"empty_values": self.empty_values,
}
defaults.update(kwargs)
return super().formfield(**defaults)


class IETFJSONField(jsonfield.JSONField): # pragma: no cover
Expand All @@ -36,15 +47,21 @@ class IETFJSONField(jsonfield.JSONField): # pragma: no cover
# Remove this class when migrations are squashed and it is no longer referenced
form_class = FormIETFJSONField

def __init__(self, *args, empty_values=FormIETFJSONField.empty_values, accepted_empty_values=None, **kwargs):
def __init__(
self,
*args,
empty_values=FormIETFJSONField.empty_values,
accepted_empty_values=None,
**kwargs,
):
if accepted_empty_values is None:
accepted_empty_values = []
self.empty_values = [x
for x in empty_values
if x not in accepted_empty_values]
self.empty_values = [x for x in empty_values if x not in accepted_empty_values]
super().__init__(*args, **kwargs)

def formfield(self, **kwargs):
if 'form_class' not in kwargs or issubclass(kwargs['form_class'], FormIETFJSONField):
kwargs.setdefault('empty_values', self.empty_values)
if "form_class" not in kwargs or issubclass(
kwargs["form_class"], FormIETFJSONField
):
kwargs.setdefault("empty_values", self.empty_values)
return super().formfield(**{**kwargs})
Loading