예제 #1
0
    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
예제 #2
0
 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,
             })
예제 #3
0
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,
            })
예제 #4
0
    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
예제 #5
0
    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
예제 #6
0
    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
예제 #7
0
    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()
예제 #8
0
    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
예제 #9
0
    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
예제 #10
0
 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
     ]
예제 #11
0
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,
    )