Skip to main content

django-reversion-compare is an extension to django-reversion that provides a history compare view to compare two versions of a model which is under reversion.

Comparing model versions is not a easy task. Maybe there are different view how this should looks like. This project will gives you a generic way to see whats has been changed.

Many parts are customizable by overwrite methods or subclassing, see above.

Build Status on travis-ci.org

travis-ci.org/jedie/django-reversion-compare

Coverage Status on coveralls.io

coveralls.io/r/jedie/django-reversion-compare

Coverage Status on codecov.io

codecov.io/gh/jedie/django-reversion-compare

Requirements Status on requires.io

requires.io/github/jedie/django-reversion-compare/requirements/

Installation

Just use:

pip install django-reversion-compare

Optionally you can install google-diff-match-patch, otherwise difflib would be used. The easiest way is to use the unofficial package diff-match-patch, e.g.:

pip install diff-match-patch

Setup

Add reversion_compare to INSTALLED_APPS in your settings.py, e.g.:

INSTALLED_APPS = (
    'django...',
    ...
    'reversion', # https://github.com/etianen/django-reversion
    'reversion_compare', # https://github.com/jedie/django-reversion-compare
    ...
)

# Add reversion models to admin interface:
ADD_REVERSION_ADMIN=True

Usage

Inherit from CompareVersionAdmin instead of VersionAdmin to get the comparison feature.

admin.py e.g.:

from django.contrib import admin
from reversion_compare.admin import CompareVersionAdmin

from my_app.models import ExampleModel

class ExampleModelAdmin(CompareVersionAdmin):
    pass

admin.site.register(ExampleModel, ExampleModelAdmin)

If you’re using an existing third party app, then you can add patch django-reversion-compare into its admin class by using the reversion_compare.helpers.patch_admin() method. For example, to add version control to the built-in User model:

from reversion_compare.helpers import patch_admin

patch_admin(User)

e.g.: Add django-cms Page model:

from cms.models.pagemodel import Page
from reversion_compare.helpers import patch_admin


# Patch django-cms Page Model to add reversion-compare functionality:
patch_admin(Page)

Customize

It’s possible to change the look for every field or for a entire field type. You must only define a methods to your admin class with this name scheme:

  • "compare_%s" % field_name

  • "compare_%s" % field.get_internal_type()

If there is no method with this name scheme, the fallback_compare() method will be used.

An example for specifying a compare method for a model field by name:

class YourAdmin(CompareVersionAdmin):
    def compare_foo_bar(self, obj_compare):
        """ compare the foo_bar model field """
        return "%r <-> %r" % (obj_compare.value1, obj_compare.value2)

and example using patch_admin with custom version admin class:

patch_admin(User, AdminClass=YourAdmin)

Class Based View

Beyond the Admin views, you can also create a Class Based View for displaying and comparing version differences. This is a single class-based-view that either displays the list of versions to select for an object or displays both the versions and their differences (if the versions to be compared have been selected). This class can be used just like a normal DetailView:

Inherit from it in your class and add a model (or queryset), for example:

from reversion_compare.views import HistoryCompareDetailView

class SimpleModelHistoryCompareView(HistoryCompareDetailView):
    model = SimpleModel

Then, assign that CBV to a url, for example:

url(r'^test_view/(?P<pk>\d+)$', views.SimpleModelHistoryCompareView.as_view() ),

Last step, you need to create a template to display both the version select form and the changes part (if the form is submitted). An example template is the following:

<style type="text/css">
/* minimal style for the diffs */
del, ins {
    color: #000;
    text-decoration: none;
}
del { background-color: #ffe6e6; }
ins { background-color: #e6ffe6; }
sup.follow { color: #5555ff; }
</style>

{% include "reversion-compare/action_list_partial.html"  %}
{% if request.GET.version_id1 %}
    {% include "reversion-compare/compare_partial.html"  %}
    {% include "reversion-compare/compare_links_partial.html"  %}
{% endif %}

Beyond the styling, you should include:

  • reversion-compare/action_list_partial.html partial template to display the version select form

  • reversion-compare/compare_partial.html partial template to display the actual version

  • reversion-compare/compare_links_partial.html to include previous/next comparison links

compare_partial.html and compare_links_partial.html will show the compare-related information so it’s better to display them only when the select-versions-tocompare-form has been submitted. If you want more control on the appearence of your templates you can check the above partials to understand how the availabble context variables are used and override them completely.

Screenshots

Here some screenshots of django-reversion-compare:


How to select the versions to compare:

django-reversion-compare_v0_1_0-01.png


from v0.1.0: DateTimeField compare (last update), TextField compare (content) with small changes and a ForeignKey compare (child model instance was added):

django-reversion-compare_v0_1_0-02.png


from v0.1.0: Same as above, but the are more lines changed in TextField and the ForeignKey relation was removed:

django-reversion-compare_v0_1_0-03.png


Example screenshot from v0.3.0: a many-to-many field compare (friends, hobbies):

django-reversion-compare_v0_3_0-01.png

  • In the first line, the m2m object has been changed.

  • line 2: A m2m object was deleted

  • line 3: A m2m object was removed from this entry (but not deleted)

  • line 4: This m2m object has not changed

create developer environment

e.g.:

# Clone project (Use your fork SSH url!):
~$ git clone https://github.com/jedie/django-reversion-compare.git
~$ cd django-reversion-compare

# create ".virtualenv" and install everything:
django-reversion-compare$ ./create_env.sh

# Activate virtual environment:
django-reversion-compare$ source .virtualenv/bin/activate

# Run all tests via "tox":
(.virtualenv) django-reversion-compare$ tox

running tests

Run all tests in all environment combinations via tox:

$ python3 setup.py tox

Run all tests in current environment via pytest:

$ python3 setup.py test

Helpfull for writing and debugging unittests is to run a local test server with the same data. e.g.:

~$ cd path/to/django-reversion-compare/
/django-reversion-compare$ ./run_testserver.py

migration will be run and a superuser will be created. Username: test Password: 12345678

Version compatibility

Reversion-Compare

django-reversion

Django

Python

>=v0.8.6

v2.0

v1.11, v2.0

v3.5, v3.6, v3.7, pypy3

>=v0.8.4

v2.0

v1.8, v1.11, v2.0

v3.5, v3.6, pypy3

>=v0.8.3

v2.0

v1.8, v1.11

v3.5, v3.6, pypy3

v0.8.x

v2.0

v1.8, v1.10, v1.11

v2.7, v3.4, v3.5, v3.6 (only with Django 1.11)

>=v0.7.2

v2.0

v1.8, v1.9, v1.10

v2.7, v3.4, v3.5

v0.7.x

v2.0

v1.8, v1.9

v2.7, v3.4, v3.5

v0.6.x

v1.9, v1.10

v1.8, v1.9

v2.7, v3.4, v3.5

>=v0.5.2

v1.9

v1.7, v1.8

v2.7, v3.4

>=v0.4

v1.8

v1.7

v2.7, v3.4

<v0.4

v1.6

v1.4

v2.7

These are the unittests variants. See also: /.travis.yml Maybe other versions are compatible, too.

Changelog

Donation

Release files for django-reversion-compare 0.8.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-reversion-compare 0.8.6
File Size Uploaded
django-reversion-compare-0.8.6.tar.gz 60.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for django-reversion-compare 0.8.6
File Interpreter ABI Platform
django_reversion_compare-0.8.6-py3.6.egg Legacy Egg format - - Details
django_reversion_compare-0.8.6-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 209.1 kB

Release files / django-reversion-compare-0.8.6.tar.gz

Download URL django-reversion-compare-0.8.6.tar.gz
Size 60.0 kB
Tags Source
SHA-256 checksum
How to use checksums
c7b08298b5ce93ccd07a639c6506842649e5f4efd8ffd53317a08323456add15
BLAKE2b-256 checksum
How to use checksums
55fe4ff5fa13f1236878c639537a66521886daa33eb2e317ce3a1841ec743fbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.7

Release files / django_reversion_compare-0.8.6-py3.6.egg

Download URL django_reversion_compare-0.8.6-py3.6.egg
Size 73.3 kB
Tags Egg
SHA-256 checksum
How to use checksums
989e9d3937446c6e9b6200dc5d8562f75140b0fce4ecd4c24bc472f6b3f80528
BLAKE2b-256 checksum
How to use checksums
97c3f5d16b483ca8708e13f46cb28edfd5359c1228e4b9eba517baf5974e4a71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.7

Release files / django_reversion_compare-0.8.6-py2.py3-none-any.whl

Download URL django_reversion_compare-0.8.6-py2.py3-none-any.whl
Size 75.8 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
a0e77925d8f373f7536c6749aa197a136a55246765ac2c1b456244fdd8b086bb
BLAKE2b-256 checksum
How to use checksums
1fe3eec9596375a947a9e111bc2c9ac70490f7a16132e5fc1acfd604ee818aa3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.7

Release history Release notifications | RSS feed

0.19.1

2 release files

0.19.0

2 release files

0.18.1

2 release files

0.18.0

2 release files

0.17.0

2 release files

0.15.0

2 release files

0.14.1

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.2

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.1

2 release files

0.9.0

3 release files

0.8.7

3 release files

This release

0.8.6 This release

3 release files

0.8.5

3 release files

0.8.4

3 release files

0.8.3

3 release files

0.8.2

3 release files

0.8.1

3 release files

0.8.0

3 release files

0.7.5

3 release files

0.7.4

3 release files

0.7.3

3 release files

0.7.2

3 release files

0.7.1

3 release files

0.7.0

3 release files

0.6.3

1 release file

0.6.2

3 release files

0.6.1

3 release files

0.6.0

3 release files

0.5.6

3 release files

0.5.5

3 release files

0.5.4

3 release files

0.5.3

3 release files

0.5.2

2 release files

0.5.1

1 release file

0.5.0

1 release file

0.4.0

1 release file

0.3.5

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page