Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jsonb.py 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import json
  2. from django import forms
  3. from django.utils.translation import gettext_lazy as _
  4. __all__ = ['JSONField']
  5. class InvalidJSONInput(str):
  6. pass
  7. class JSONString(str):
  8. pass
  9. class JSONField(forms.CharField):
  10. default_error_messages = {
  11. 'invalid': _("'%(value)s' value must be valid JSON."),
  12. }
  13. widget = forms.Textarea
  14. def to_python(self, value):
  15. if self.disabled:
  16. return value
  17. if value in self.empty_values:
  18. return None
  19. elif isinstance(value, (list, dict, int, float, JSONString)):
  20. return value
  21. try:
  22. converted = json.loads(value)
  23. except ValueError:
  24. raise forms.ValidationError(
  25. self.error_messages['invalid'],
  26. code='invalid',
  27. params={'value': value},
  28. )
  29. if isinstance(converted, str):
  30. return JSONString(converted)
  31. else:
  32. return converted
  33. def bound_data(self, data, initial):
  34. if self.disabled:
  35. return initial
  36. try:
  37. return json.loads(data)
  38. except ValueError:
  39. return InvalidJSONInput(data)
  40. def prepare_value(self, value):
  41. if isinstance(value, InvalidJSONInput):
  42. return value
  43. return json.dumps(value)