11import uuid
22
3+ from django .conf import settings
34from django .db import models , transaction
45from django .utils .translation import ugettext_lazy as _
56from parler .managers import TranslatableQuerySet as ParlerTranslatableQuerySet
67from parler .models import TranslatableModel as ParlerTranslatableModel
8+ from parler .utils .context import switch_language
9+
10+ from common .utils import update_object
711
812
913class TimestampedModel (models .Model ):
@@ -28,9 +32,7 @@ class TranslatableQuerySet(ParlerTranslatableQuerySet):
2832 def create_translatable_object (self , ** kwargs ):
2933 translations = kwargs .pop ("translations" )
3034 obj = self .create (** kwargs )
31- for translation in translations :
32- language_code = translation .pop ("language_code" )
33- obj .create_translation (language_code = language_code , ** translation )
35+ obj .create_or_update_translations (translations )
3436 return obj
3537
3638
@@ -39,3 +41,25 @@ class TranslatableModel(ParlerTranslatableModel):
3941
4042 class Meta :
4143 abstract = True
44+
45+ @transaction .atomic
46+ def delete_translations (self , language_codes ):
47+ for code in language_codes :
48+ self .delete_translation (code )
49+
50+ @transaction .atomic
51+ def create_or_update_translations (
52+ self , translations = None , translations_to_delete = None
53+ ):
54+ for translation in translations :
55+ language_code = translation .pop ("language_code" )
56+ if language_code not in settings .PARLER_SUPPORTED_LANGUAGE_CODES :
57+ continue
58+ if self .has_translation (language_code ):
59+ with switch_language (self , language_code ):
60+ update_object (self , translation )
61+ else :
62+ self .create_translation (language_code = language_code , ** translation )
63+
64+ if translations_to_delete :
65+ self .delete_translations (translations_to_delete )
0 commit comments