diff --git a/docs/public/release_notes.rst b/docs/public/release_notes.rst index 0c9ef5ca..f6318e12 100644 --- a/docs/public/release_notes.rst +++ b/docs/public/release_notes.rst @@ -58,6 +58,10 @@ Fixes: - Attempting to use a reserved name for a translated field now raises an :exc:`~django.core.exceptions.ImproperlyConfigured` exception instead of silently ignoring the field. +- Instances created by serializers using + :class:`~hvad.contrib.restframework.serializers.TranslatableModelMixin` + in normal, non-*enforcing* mode can no longer be created without a translation. + — :issue:`322`. ***************************** 1.7.0 - current release diff --git a/hvad/contrib/restframework/serializers.py b/hvad/contrib/restframework/serializers.py index 75e3bfe5..e1d28a62 100644 --- a/hvad/contrib/restframework/serializers.py +++ b/hvad/contrib/restframework/serializers.py @@ -238,6 +238,14 @@ def validate(self, data): data['language_code'] = self.language return data + def create(self, validated_data): + # Having a language_code key forces creation of a translation in default + # language, even if no translated field is provided. + # This ensures the serializer will not create untranslated instances. + if 'language_code' not in validated_data: + validated_data['language_code'] = None + return super(TranslatableModelMixin, self).create(validated_data) + def update(self, instance, data): 'Handle switching to correct translation before actual update' enforce = 'language_code' in data diff --git a/hvad/test_utils/project/app/models.py b/hvad/test_utils/project/app/models.py index 964e9dcf..a1899daa 100644 --- a/hvad/test_utils/project/app/models.py +++ b/hvad/test_utils/project/app/models.py @@ -12,7 +12,7 @@ class Normal(TranslatableModel): shared_field = models.CharField(max_length=255) translations = TranslatedFields( - translated_field = models.CharField(max_length=255) + translated_field = models.CharField(max_length=255, blank=True) ) def __str__(self): diff --git a/hvad/tests/contrib/restframework.py b/hvad/tests/contrib/restframework.py index ab8083c7..c5d9a70e 100644 --- a/hvad/tests/contrib/restframework.py +++ b/hvad/tests/contrib/restframework.py @@ -154,6 +154,20 @@ def test_create_normal(self): self.assertIsNotNone(obj.pk) self.assertSavedObject(obj, 'en', **data) + def test_create_normal_no_language(self): + 'Deserialize a new instance, without including any translated field' + data = { + 'shared_field': 'shared', + } + serializer = AutoSerializer(data=data) + self.assertTrue(serializer.is_valid()) + + with translation.override('en'): + obj = serializer.save() + self.assertIsNotNone(obj.pk) + self.assertSavedObject(obj, 'en', **data) + self.assertEqual(obj.language_code, 'en') + def test_create_enforce(self): 'Deserialize a new instance, with language-enforcing mode' data = {