

def post(self, request, object_id, *args, **kwargs):
    object_id = unquote(object_id)
    self.obj = self.get_object(object_id)
    if (not self.has_change_permission(self.obj)):
        raise PermissionDenied
    params = self.request.POST
    if (('version_a' not in params) or ('version_b' not in params)):
        self.message_user(_('Must select two versions.'), 'error')
        return self.get_response()
    version_a_id = params['version_a']
    version_b_id = params['version_b']
    if (version_a_id == version_b_id):
        self.message_user(_('Please select two different versions.'), 'error')
        return self.get_response()
    version_a = get_object_or_404(Version, pk=version_a_id)
    version_b = get_object_or_404(Version, pk=version_b_id)
    diffs = []
    (obj_a, detail_a) = self.get_version_object(version_a)
    (obj_b, detail_b) = self.get_version_object(version_b)
    for f in (self.opts.fields + self.opts.many_to_many):
        if is_related_field(f):
            label = f.opts.verbose_name
        else:
            label = f.verbose_name
        value_a = f.value_from_object(obj_a)
        value_b = f.value_from_object(obj_b)
        is_diff = (value_a != value_b)
        if ((type(value_a) in (list, tuple)) and (type(value_b) in (list, tuple)) and (len(value_a) == len(value_b)) and is_diff):
            is_diff = False
            for i in xrange(len(value_a)):
                if (value_a[i] != value_a[i]):
                    is_diff = True
                    break
        if ((type(value_a) is QuerySet) and (type(value_b) is QuerySet)):
            is_diff = (list(value_a) != list(value_b))
        diffs.append((label, detail_a.get_field_result(f.name).val, detail_b.get_field_result(f.name).val, is_diff))
    context = super(RevisionListView, self).get_context()
    context.update({
        'object': self.obj,
        'opts': self.opts,
        'version_a': version_a,
        'version_b': version_b,
        'revision_a_url': self.model_admin_url('revision', quote(version_a.object_id), version_a.id),
        'revision_b_url': self.model_admin_url('revision', quote(version_b.object_id), version_b.id),
        'diffs': diffs,
    })
    return TemplateResponse(self.request, (self.revision_diff_template or self.get_template_list('views/revision_diff.html')), context, current_app=self.admin_site.name)

dataset/ETHPy150Open sshwsfc/xadmin/xadmin/plugins/xversion.py RevisionListView.post/original