Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django/contrib/postgres/forms/hstore.py: 30%
30 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1import json
3from django import forms
4from django.core.exceptions import ValidationError
5from django.utils.translation import gettext_lazy as _
7__all__ = ["HStoreField"]
10class HStoreField(forms.CharField):
11 """
12 A field for HStore data which accepts dictionary JSON input.
13 """
15 widget = forms.Textarea
16 default_error_messages = {
17 "invalid_json": _("Could not load JSON data."),
18 "invalid_format": _("Input must be a JSON dictionary."),
19 }
21 def prepare_value(self, value):
22 if isinstance(value, dict):
23 return json.dumps(value)
24 return value
26 def to_python(self, value):
27 if not value:
28 return {}
29 if not isinstance(value, dict):
30 try:
31 value = json.loads(value)
32 except json.JSONDecodeError:
33 raise ValidationError(
34 self.error_messages["invalid_json"],
35 code="invalid_json",
36 )
38 if not isinstance(value, dict):
39 raise ValidationError(
40 self.error_messages["invalid_format"],
41 code="invalid_format",
42 )
44 # Cast everything to strings for ease.
45 for key, val in value.items():
46 if val is not None:
47 val = str(val)
48 value[key] = val
49 return value
51 def has_changed(self, initial, data):
52 """
53 Return True if data differs from initial.
54 """
55 # For purposes of seeing whether something has changed, None is
56 # the same as an empty dict, if the data or initial value we get
57 # is None, replace it w/ {}.
58 initial_value = self.to_python(initial)
59 return super().has_changed(initial_value, data)