Skip to content

Commit b6667e4

Browse files
authored
Merge pull request #388 from peopledoc/from-json-pass-context
Pass context to serializer in from_json
2 parents d5a7274 + 671e6b9 commit b6667e4

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ ChangeLog
55
master (unreleased)
66
===================
77

8-
Nothing to see here yet.
8+
- Pass context to serializer in from_json.
99

1010
Release 6.0.0 (2020-10-07)
1111
==========================

demo/tests/test_forms.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
import os
2+
from os.path import dirname, join
33

44
from django import forms
55
from django.core.exceptions import ValidationError
@@ -8,7 +8,7 @@
88
from freezegun import freeze_time
99

1010
from formidable.constants import REQUIRED, EDITABLE, READONLY, HIDDEN
11-
from formidable.models import Formidable
11+
from formidable.models import Formidable, get_serializer
1212
from formidable.forms import FormidableForm, widgets, fields
1313

1414

@@ -787,8 +787,10 @@ def test_from_json(self):
787787
We should have an instance of ``Formidable``.
788788
789789
"""
790-
filepath = os.path.join(os.path.dirname(__file__),
791-
'../fixtures/augmentation_heures.json')
790+
filepath = join(
791+
dirname(__file__),
792+
'../fixtures/augmentation_heures.json'
793+
)
792794
with open(filepath) as f:
793795
schema_definition = json.load(f)
794796

@@ -808,3 +810,20 @@ def test_from_json_raised_error(self):
808810
self.assertEqual(len(context.exception.messages), 3)
809811
for message in context.exception.messages:
810812
self.assertEqual(message, 'This field is required.')
813+
814+
def test_get_serializer_with_context(self):
815+
filepath = join(
816+
dirname(__file__),
817+
'../fixtures/augmentation_heures.json'
818+
)
819+
with open(filepath) as f:
820+
schema_definition = json.load(f)
821+
822+
# get_serializer is a function that is called in from_json.
823+
serializer = get_serializer(schema_definition)
824+
self.assertEqual(serializer.context, {})
825+
826+
serializer = get_serializer(
827+
schema_definition,
828+
context={"hello": "world"})
829+
self.assertEqual(serializer.context, {"hello": "world"})

formidable/models.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@
77
from formidable.register import FieldSerializerRegister
88

99

10+
def get_serializer(definition_schema, context=None):
11+
"""
12+
Return a FormidableSerializer instance, including eventual context.
13+
"""
14+
from formidable.serializers import FormidableSerializer
15+
serializer = FormidableSerializer(data=definition_schema)
16+
# pass context to serializer so we can use it during data validation
17+
serializer.context.update(context or {}) # If None, will default to {}
18+
return serializer
19+
20+
1021
class Formidable(models.Model):
1122

1223
label = models.CharField(max_length=256)
@@ -48,9 +59,8 @@ def from_json(definition_schema, **kwargs):
4859
<Formidable: Formidable object>
4960
5061
"""
51-
from formidable.serializers import FormidableSerializer
52-
53-
serializer = FormidableSerializer(data=definition_schema)
62+
context = kwargs.pop("context", {})
63+
serializer = get_serializer(definition_schema, context)
5464
if not serializer.is_valid():
5565
raise ValidationError(serializer.errors)
5666

0 commit comments

Comments
 (0)