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))
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))
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
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