Skip to content

Commit a360b84

Browse files
committedNov 13, 2019
DictionaryField 🤑
1 parent 123c59c commit a360b84

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed
 

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.4.0 : 13.11.2019
2+
3+
- **Feature**: Introduced `DictionaryField`
4+
15
## 0.3.0 : 11.11.2019
26

37
- **Feature**: Propagate `kwargs` from `Form.is_valid()` to `Form.validate()` and `Form.validate_{key}()` methods.

‎README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ python setup.py install
6969
"duration": "4:48"
7070
}
7171
],
72-
"created_at": "2019-10-21T18:57:03+00:00"
72+
"metadata": {
73+
"created_at": "2019-10-21T18:57:03+00:00",
74+
"updated_at": "2019-10-21T18:57:03+00:00"
75+
}
7376
}
7477
```
7578

@@ -97,7 +100,7 @@ class AlbumForm(Form):
97100
year = fields.IntegerField()
98101
artist = fields.FormField(form=ArtistForm)
99102
songs = fields.FormFieldList(form=SongForm)
100-
created_at = fields.DateField()
103+
metadata = fields.DictionaryField(fields.DateTimeField())
101104

102105
def validate_year(self, value):
103106
if value == "1992":
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.3.0'
1+
__version__ = '0.4.0'

‎django_request_formatter/fields.py

+32
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ def validate(self, value):
340340
if isinstance(self.field, Field):
341341
self.field.validate(item)
342342
else:
343+
# TODO: toto nemoze byt RuntimeError
343344
raise RuntimeError(f"Invalid field_type {type(self.field)} in FieldList")
344345

345346

@@ -408,3 +409,34 @@ def validate(self, value):
408409
self.enum(value)
409410
except ValueError:
410411
raise ValidationError(f"Invalid enum value {value} passed to {type(self.enum)}")
412+
413+
414+
class DictionaryField(Field):
415+
def __init__(self, value, **kwargs):
416+
if not isinstance(value, Field):
417+
raise RuntimeError("Invalid Field type passed into DictionaryField!")
418+
self._value = value
419+
super().__init__(**kwargs)
420+
421+
def to_python(self, value) -> dict:
422+
result = {}
423+
424+
for key, item in value.items():
425+
result[key] = self._value.to_python(item)
426+
427+
return result
428+
429+
def validate(self, value):
430+
if not isinstance(value, dict):
431+
raise ValidationError(f"Invalid value passed to DictionaryField (got {type(value)}, expected dict)")
432+
433+
errors = {}
434+
435+
for key, item in value.items():
436+
try:
437+
self._value.validate(value)
438+
except ValidationError as e:
439+
errors[key] = e
440+
441+
if errors:
442+
raise ValidationError(errors)

0 commit comments

Comments
 (0)
Please sign in to comment.