def __init__(self, field, field_name, obj, version1, version2, is_reversed): self.field = field self.field_name = field_name self.obj = obj # is a related field (ForeignKey, ManyToManyField etc.) self.is_related = getattr(self.field, "related_model", None) is not None self.is_reversed = is_reversed if not self.is_related: self.follow = None elif self.field_name in _get_options(self.obj.__class__).follow: self.follow = True else: self.follow = False self.compare_obj1 = CompareObject(field, field_name, obj, version1, self.follow) self.compare_obj2 = CompareObject(field, field_name, obj, version2, self.follow) self.value1 = self.compare_obj1.value self.value2 = self.compare_obj2.value self.M2O_CHANGE_INFO = None self.M2M_CHANGE_INFO = None
def _object_version(self): version_options = _get_options(self._model) data = self.serialized_data data = force_str(data.encode("utf8")) try: return list( serializers.deserialize( self.format, data, ignorenonexistent=True, use_natural_foreign_keys=version_options. use_natural_foreign_keys))[0] except DeserializationError: raise RevertError( ugettext( "Could not load %(object_repr)s version - incompatible version data." ) % { "object_repr": self.object_repr, }) except serializers.SerializerDoesNotExist: raise RevertError( ugettext( "Could not load %(object_repr)s version - unknown serializer %(format)s." ) % { "object_repr": self.object_repr, "format": self.format, })
def get_object_version(model, data, object_repr, format): version_options = _get_options(model) data = force_str(data.encode('utf8')) try: return list( serializers.deserialize(format, data, ignorenonexistent=True, use_natural_foreign_keys=version_options. use_natural_foreign_keys))[0] except DeserializationError: raise RevertError( ugettext( 'Could not load %(object_repr)s version - incompatible version data.' ) % { 'object_repr': object_repr, }) except serializers.SerializerDoesNotExist: raise RevertError( ugettext( 'Could not load %(object_repr)s version - unknown serializer %(format)s.' ) % { 'object_repr': object_repr, 'format': format, })
def _local_field_dict(self): """ A dictionary mapping field names to field values in this version of the model. Parent links of inherited multi-table models will not be followed. """ version_options = _get_options(self._model) object_version = self._object_version obj = object_version.object model = self._model field_dict = {} for field_name in version_options.fields: field = model._meta.get_field(field_name) if isinstance(field, models.ManyToManyField): # M2M fields with a custom through are not stored in m2m_data, but as a separate model. if object_version.m2m_data and field.attname in object_version.m2m_data: field_dict[field.attname] = object_version.m2m_data[ field.attname] else: field_dict[field.attname] = getattr(obj, field.attname) return field_dict
def _local_field_dict(self): """ A dictionary mapping field names to field values in this version of the model. Parent links of inherited multi-table models will not be followed. """ version_options = _get_options(self._model) object_version = self._object_version obj = object_version.object model = self._model field_dict = {} for field_name in version_options.fields: field = model._meta.get_field(field_name) field_dict[field.attname] = object_version.m2m_data.get(field.attname, getattr(obj, field.attname)) return field_dict
def _local_field_dict(self): """ A dictionary mapping field names to field values in this version of the model. Parent links of inherited multi-table models will not be followed. """ version_options = _get_options(self._model) object_version = self._object_version obj = object_version.object model = self._model field_dict = {} for field_name in version_options.fields: field = model._meta.get_field(field_name) field_dict[field.attname] = object_version.m2m_data.get( field.attname, getattr(obj, field.attname)) return field_dict
def _perform_version_update(version, update_data): from reversion import revisions local_obj = version._object_version.object for field, value in update_data.items(): setattr(local_obj, field, value) if hasattr(revisions, '_get_options'): version_options = revisions._get_options( get_reversion_version_model(version)) version_format = version_options.format version_fields = version_options.fields else: version_adapter = revisions.get_adapter( get_reversion_version_model(version)) version_format = version_adapter.get_serialization_format() version_fields = list(version_adapter.get_fields_to_serialize()) version.serialized_data = serializers.serialize(version_format, (local_obj, ), fields=version_fields) version.save()
def _local_field_dict(self): """ A dictionary mapping field names to field values in this version of the model. Parent links of inherited multi-table models will not be followed. """ version_options = _get_options(self._model) object_version = self._object_version obj = object_version.object model = self._model field_dict = {} for field_name in version_options.fields: field = model._meta.get_field(field_name) if isinstance(field, models.ManyToManyField): # M2M fields with a custom through are not stored in m2m_data, but as a separate model. if field.attname in object_version.m2m_data: field_dict[field.attname] = object_version.m2m_data[field.attname] else: field_dict[field.attname] = getattr(obj, field.attname) return field_dict
def get_version_fields(self): """ Get field that are tracked in object history versions. """ options = reversion._get_options(self) return options.fields or [ f.name for f in self._meta.fields if f not in options.exclude ]
def _get_content_type(model, using=None): version_options = _get_options(model) return ContentType.objects.db_manager(using).get_for_model( model, for_concrete_model=version_options.for_concrete_model, )