Skip to main content

history compare for django-reversion

Project description

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.

Coverage Status on coveralls.io

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

Build Status on travis-ci.org

travis-ci.org/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

Unittests

(Unittests need django-tools)

Run unittests

via setup.py:

$ cd path/to/django-reversion-compare
django-reversion-compare$ ./setup.py test

via runtests.py:

$ cd path/to/django-reversion-compare
django-reversion-compare$ ./runtests.py

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

v0.7.x

v2.0

v1.8, v1.9

v0.6.x

v1.9, v1.10

v1.8, v1.9

>=v0.5.2

v1.9

v1.7, v1.8

>=v0.4

v1.8

v1.7

<v0.4

v1.6

v1.4

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

Changelog

Contact

Come into the conversation, besides the Github communication features:

IRC

#pylucid on freenode.net (Yes, the PyLucid channel…)

webchat

http://webchat.freenode.net/?channels=pylucid

Donation

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-reversion-compare-0.7.0.tar.gz (3.1 MB view details)

Uploaded Source

Built Distributions

django_reversion_compare-0.7.0-py3.5.egg (68.8 kB view details)

Uploaded Source

django_reversion_compare-0.7.0-py2.py3-none-any.whl (70.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-reversion-compare-0.7.0.tar.gz.

File metadata

File hashes

Hashes for django-reversion-compare-0.7.0.tar.gz
Algorithm Hash digest
SHA256 aba506bad134c29eb6933d2a069bcb836e5ea3fce807255fee659c84855b4d48
MD5 d4dd827ff9291f5c6cf62ed1523c955e
BLAKE2b-256 7b352d15c78e7528bc80fb25c9e5ea160c23d18557ecb533d0f4681189c45d1a

See more details on using hashes here.

Provenance

File details

Details for the file django_reversion_compare-0.7.0-py3.5.egg.

File metadata

File hashes

Hashes for django_reversion_compare-0.7.0-py3.5.egg
Algorithm Hash digest
SHA256 a87757759cb5a0b2c71da8a3febcce37b88b0e89bd186c56a6ed24ce00248d9b
MD5 1c15eedb85410820746925391ae2193b
BLAKE2b-256 d3a221a44e074cf26f0444e104967dfa206648f5fdebc274f3bc55f8ce0d695c

See more details on using hashes here.

Provenance

File details

Details for the file django_reversion_compare-0.7.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_reversion_compare-0.7.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7eff3846a2cd9f353655a9c3c5f1b182e6d803f073962eae09ebc3e304b634b0
MD5 825b49743f179f7ae0292d9cd93bfc7f
BLAKE2b-256 8a56ff7b464f49d2609b591e1bbadd7c7f38d16f74cc5e25435bf1c96bea99dc

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page