Example #1
0
    def diff_list(self, request, lhs_version, rhs_version):
        versions = Version.objects.filter(pk__in=(int(lhs_version), int(rhs_version)))
        if len(versions) != 2:
            raise Http404()
        info = revision.get_registration_info(self.model)
        field_diff = []
        lhs, rhs = versions
        from reversion.helpers import generate_patch_html

        opts = self.model._meta
        for field_name in info.fields:
            field_diff.append(
                {"field": opts.get_field_by_name(field_name)[0], "patch": generate_patch_html(lhs, rhs, field_name)}
            )

        context = {
            "opts": opts,
            "admin": self,
            "app_label": opts.app_label,
            "module_name": capfirst(opts.verbose_name),
            "title": _("Compare versions of %(name)s") % {"name": force_unicode(opts.verbose_name_plural)},
            "changelist_url": reverse("admin:%s_%s_changelist" % (opts.app_label, opts.module_name)),
            "diff_list": field_diff,
        }
        return render_to_response(self.diff_view_template, context, template.RequestContext(request))
Example #2
0
    def diff_list(self, request, lhs_version, rhs_version):
        versions = Version.objects.filter(pk__in=(int(lhs_version), int(rhs_version)))
        if len(versions) != 2:
            raise Http404()
        info = revision.get_registration_info(self.model)
        field_diff = [] 
        lhs, rhs = versions
        from reversion.helpers import generate_patch_html
        opts = self.model._meta
        for field_name in info.fields:
            field_diff.append({
                'field':opts.get_field_by_name(field_name)[0],
                'patch':generate_patch_html(lhs, rhs, field_name),
            }) 

        context = {
            'opts': opts,
            'admin': self,
            'app_label': opts.app_label,
            'module_name': capfirst(opts.verbose_name),
            'title': _("Compare versions of %(name)s") % {'name': force_unicode(opts.verbose_name_plural)},
            'changelist_url': reverse('admin:%s_%s_changelist' % (opts.app_label, opts.module_name)),
            'diff_list':field_diff,
        }
        return render_to_response(self.diff_view_template, context, template.RequestContext(request))
Example #3
0
 def get_object_version(self):
     """Returns the stored version of the model."""
     data = self.serialized_data
     if isinstance(data, unicode):
         data = data.encode("utf8")
     obj = list(serializers.deserialize(self.format, data))[0]
     
     # Populate un-versioned fields with data from the "real" current object
     from reversion.revisions import revision
     fields = revision.get_registration_info(obj.object.__class__).fields
     
     if len(fields) > 0:
         try:
             current_obj = self.content_type.model_class().objects.get(id=self.object_id)
             
             for field in current_obj._meta.fields:
                 if not field.name in fields:
                     setattr(obj.object, field.name, getattr(current_obj, field.name))
                         
         except ObjectDoesNotExist:
             pass
     
     return obj
Example #4
0
def diff_vers(v1, v2=None):
    from reversion.revisions import revision
    
    o1 = v1.get_object_version()
    registered_fields = revision.get_registration_info(o1.object.__class__).fields
    
    o2 = None
    result = []
    
    if v2:
        o2 = v2.get_object_version()

    for field in registered_fields: #IGNORE:W0212
        field = o1.object._meta.get_field(field)
        
        # Hide the internal plumbing 
        #if field.rel or field.primary_key or field.db_index:
        if field.primary_key:
            continue

        try:
            # Get related fields by their pk is much faster.
            #new_value = getattr(o1.object, field.name)
            new_value = getattr(o1.object, field.attname)
            if field.choices:
                new_value = o1.object._get_FIELD_display(field)
        except ObjectDoesNotExist:
            new_value = getattr(o1.object, field.attname)
        
        if isinstance(new_value, (models.Manager, QuerySet)):
            new_value = new_value.model.objects.filter(id__in=o1.m2m_data.get(field.name, []))
            #new_value = list(new_value.all())
            #print new_value, o1.m2m_data.get(field.name)
        
        if o2:
            try:
                #old_value = getattr(o2.object, field.name, None)
                old_value = getattr(o2.object, field.attname, None)
                if field.choices:
                    old_value = o2.object._get_FIELD_display(field)
            except ObjectDoesNotExist:
                old_value = getattr(o2.object, field.attname, None)

            if isinstance(old_value, (models.Manager, QuerySet)):
                old_value = old_value.model.objects.filter(id__in=o2.m2m_data.get(field.name, []))
                #old_value = list(old_value.all())
                #print new_value, old_value
        else:
            old_value = None

#        if field.name == '_peer':
#            print new_value, old_value
        if (v1.is_change() and (new_value or old_value) and new_value != old_value) or \
           (v1.is_addition() or v1.is_deletion()):
            # Strip microseconds from datetime objects
            if isinstance(new_value, datetime) and isinstance(old_value, datetime) and \
               new_value.strftime('%s') == old_value.strftime('%s'):
                continue
            
            # XXX: Incomplete.
            if field.rel and isinstance(new_value, int):
                if issubclass(field.rel.to, User):
                    new_value = getattr(o1.object, field.name, None)
                    if o2:
                        old_value = getattr(o2.object, field.name, None)
                else:
                    content_type = ContentType.objects.get_for_model(field.rel.to)
                    try:
                        rel_v = v1.revision.version_set.get(content_type=content_type,
                                                            object_id=new_value)
                        new_value = rel_v.object_repr
                    except ObjectDoesNotExist:
                        pass

            result.append((field.name, new_value, old_value))
    
    return result