Skip to content

Commit 0bb3859

Browse files
committed
Prevent REST's TranslatableModelMixin from creating instances without translation. Fixes KristianOellegaard#322.
1 parent 9d247c2 commit 0bb3859

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

docs/public/release_notes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ Fixes:
5858
- Attempting to use a reserved name for a translated field now raises an
5959
:exc:`~django.core.exceptions.ImproperlyConfigured` exception instead of silently
6060
ignoring the field.
61+
- Instances created by serializers using
62+
:class:`~hvad.contrib.restframework.serializers.TranslatableModelMixin`
63+
in normal, non-*enforcing* mode can no longer be created without a translation.
64+
:issue:`322`.
6165

6266
*****************************
6367
1.7.0 - current release

hvad/contrib/restframework/serializers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,14 @@ def validate(self, data):
238238
data['language_code'] = self.language
239239
return data
240240

241+
def create(self, validated_data):
242+
# Having a language_code key forces creation of a translation in default
243+
# language, even if no translated field is provided.
244+
# This ensures the serializer will not create untranslated instances.
245+
if 'language_code' not in validated_data:
246+
validated_data['language_code'] = None
247+
return super(TranslatableModelMixin, self).create(validated_data)
248+
241249
def update(self, instance, data):
242250
'Handle switching to correct translation before actual update'
243251
enforce = 'language_code' in data

hvad/test_utils/project/app/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class Normal(TranslatableModel):
1313
shared_field = models.CharField(max_length=255)
1414
translations = TranslatedFields(
15-
translated_field = models.CharField(max_length=255)
15+
translated_field = models.CharField(max_length=255, blank=True)
1616
)
1717

1818
def __str__(self):

hvad/tests/contrib/restframework.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ def test_create_normal(self):
154154
self.assertIsNotNone(obj.pk)
155155
self.assertSavedObject(obj, 'en', **data)
156156

157+
def test_create_normal_no_language(self):
158+
'Deserialize a new instance, without including any translated field'
159+
data = {
160+
'shared_field': 'shared',
161+
}
162+
serializer = AutoSerializer(data=data)
163+
self.assertTrue(serializer.is_valid())
164+
165+
with translation.override('en'):
166+
obj = serializer.save()
167+
self.assertIsNotNone(obj.pk)
168+
self.assertSavedObject(obj, 'en', **data)
169+
self.assertEqual(obj.language_code, 'en')
170+
157171
def test_create_enforce(self):
158172
'Deserialize a new instance, with language-enforcing mode'
159173
data = {

0 commit comments

Comments
 (0)