def add_translation_fields(model, opts): """ Monkey patches the original model class to provide additional fields for every language. Adds newly created translation fields to the given translation options. """ model_empty_values = getattr(opts, 'empty_values', NONE) for field_name in opts.local_fields.keys(): field_empty_value = parse_field(model_empty_values, field_name, NONE) for l in mt_settings.AVAILABLE_LANGUAGES: # Create a dynamic translation field translation_field = create_translation_field( model=model, field_name=field_name, lang=l, empty_value=field_empty_value) # Construct the name for the localized field localized_field_name = build_localized_fieldname(field_name, l) # Check if the model already has a field by that name if hasattr(model, localized_field_name): raise ValueError( "Error adding translation field. Model '%s' already contains a field named" "'%s'." % (model._meta.object_name, localized_field_name)) # This approach implements the translation fields as full valid # django model fields and therefore adds them via add_to_class model.add_to_class(localized_field_name, translation_field) opts.add_translation_field(field_name, translation_field) # Rebuild information about parents fields. If there are opts.local_fields, field cache would be # invalidated (by model._meta.add_field() function). Otherwise, we need to do it manually. if len(opts.local_fields) == 0: model._meta._fill_fields_cache()
def add_localized_fields(model): """ Monkey patchs the original model class to provide additional fields for every language. Only do that for fields which are defined in the translation options of the model. Returns a dict mapping the original fieldname to a list containing the names of the localized fields created for the original field. """ localized_fields = dict() translation_opts = translator.get_options_for_model(model) for field_name in translation_opts.fields: localized_fields[field_name] = list() for l in settings.LANGUAGES: # Create a dynamic translation field translation_field = create_translation_field(model=model,\ field_name=field_name, lang=l[0]) # Construct the name for the localized field localized_field_name = build_localized_fieldname(field_name, l[0]) # Check if the model already has a field by that name if hasattr(model, localized_field_name): raise ValueError("Error adding translation field. Model '%s' " "already contains a field named '%s'." %\ (instance.__class__.__name__, localized_field_name)) # This approach implements the translation fields as full valid # django model fields and therefore adds them via add_to_class localized_field = model.add_to_class(localized_field_name, translation_field) localized_fields[field_name].append(localized_field_name) return localized_fields
def add_translation_fields(model, opts): """ Monkey patches the original model class to provide additional fields for every language. Adds newly created translation fields to the given translation options. """ model_empty_values = getattr(opts, 'empty_values', NONE) for field_name in opts.local_fields.keys(): field_empty_value = parse_field(model_empty_values, field_name, NONE) for l in mt_settings.AVAILABLE_LANGUAGES: # Create a dynamic translation field translation_field = create_translation_field( model=model, field_name=field_name, lang=l, empty_value=field_empty_value) # Construct the name for the localized field localized_field_name = build_localized_fieldname(field_name, l) # Check if the model already has a field by that name if hasattr(model, localized_field_name): # Check if are not dealing with abstract field inherited. for cls in model.__mro__: if hasattr(cls, '_meta') and cls.__dict__.get( localized_field_name, None): cls_opts = translator._get_options_for_model(cls) if not cls._meta.abstract or field_name not in cls_opts.local_fields: raise ValueError( "Error adding translation field. Model '%s' already" " contains a field named '%s'." % (model._meta.object_name, localized_field_name)) # This approach implements the translation fields as full valid # django model fields and therefore adds them via add_to_class model.add_to_class(localized_field_name, translation_field) opts.add_translation_field(field_name, translation_field) # Rebuild information about parents fields. If there are opts.local_fields, field cache would be # invalidated (by model._meta.add_field() function). Otherwise, we need to do it manually. if len(opts.local_fields) == 0: try: model._meta._fill_fields_cache() except AttributeError: # Django 1.8 removed _fill_fields_cache model._meta._expire_cache() model._meta.get_fields()
def add_translation_fields(model, opts): """ Monkey patches the original model class to provide additional fields for every language. Adds newly created translation fields to the given translation options. """ for field_name in opts.local_fields.keys(): for l in settings.LANGUAGES: # Create a dynamic translation field translation_field = create_translation_field(model=model, field_name=field_name, lang=l[0]) # Construct the name for the localized field localized_field_name = build_localized_fieldname(field_name, l[0]) # Check if the model already has a field by that name if hasattr(model, localized_field_name): raise ValueError( "Error adding translation field. Model '%s' already contains a field named" "'%s'." % (model._meta.object_name, localized_field_name)) # This approach implements the translation fields as full valid # django model fields and therefore adds them via add_to_class model.add_to_class(localized_field_name, translation_field) opts.add_translation_field(field_name, translation_field)