File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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*****************************
63671.7.0 - current release
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 1212class 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 ):
Original file line number Diff line number Diff 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 = {
You can’t perform that action at this time.
0 commit comments