Skip to main content

Add compare view to django-reversion for comparing two versions of a reversion model.

Project description

django-reversion-compare

tests codecov reversion_compare @ PyPi Python Versions License GPL-3.0-or-later

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.

Installation

Just use:

pip install django-reversion-compare

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
# optional settings:
REVERSION_COMPARE_FOREIGN_OBJECTS_AS_ID=False
REVERSION_COMPARE_IGNORE_NOT_REGISTERED=False

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

@admin.register(ExampleModel)
class ExampleModelAdmin(CompareVersionAdmin):
    pass

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:

More information about this can be found in DocString of:

The make run-test-server test project contains a Demo, use the links under:

HistoryCompareDetailView Examples:

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

We use manage_django_project, so you just need to clone the sources and call manage.py to start hacking.

e.g.:

~$ git clone https://github.com/jedie/django-reversion-compare.git
~$ cd django-reversion-compare

# Just call manage.py and the magic happen:
~/django-reversion-compare$ ./manage.py

# start local dev. web server:
~/django-reversion-compare$ ./manage.py run_dev_server

# run tests:
~/django-reversion-compare$ ./manage.py test
# or with coverage
~/django-reversion-compare$ ./manage.py coverage
# or via tox:
~/django-reversion-compare$ ./manage.py tox

Backwards-incompatible changes

v0.16.0

We use https://github.com/jedie/manage_django_project You must reinit your dev setup.

v0.12.0

Google "diff-match-patch" is now mandatory and not optional.

Version compatibility

Reversion-Compare django-reversion Django Python
>=v0.16.0 v3.0 v3.2, v4.0, v4.1 v3.9, v3.10, v3.11
>=v0.15.0 v3.0 v2.2, v3.2, v4.0 v3.7, v3.8, v3.9
>=v0.13.0 v3.0 v2.2, v3.0, v3.1 v3.7, v3.8, v3.9
>=v0.10.0 v3.0 v2.2, v3.0 v3.6, v3.7, v3.8, pypy3
>=v0.9.0 v2.0 v2.2, v3.0 v3.6, v3.7, v3.8, pypy3
>=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: /pyproject.toml Maybe other versions are compatible, too.

Changelog

Links

| Github | https://github.com/jedie/django-reversion-compare | | Python Packages | https://pypi.org/project/django-reversion-compare/ |

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.16.0rc0.tar.gz (90.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_reversion_compare-0.16.0rc0-py3-none-any.whl (95.5 kB view details)

Uploaded Python 3

File details

Details for the file django-reversion-compare-0.16.0rc0.tar.gz.

File metadata

File hashes

Hashes for django-reversion-compare-0.16.0rc0.tar.gz
Algorithm Hash digest
SHA256 ac8b35a06837649f713c268997fcd564955b0aebd6370b4687effc260d73aec0
MD5 b30379862f3fc01b3cb7311dd123107a
BLAKE2b-256 c286c77b80d24db19bcba301192092019f4e346d8371f6a171e30c6f2ef5d407

See more details on using hashes here.

File details

Details for the file django_reversion_compare-0.16.0rc0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_reversion_compare-0.16.0rc0-py3-none-any.whl
Algorithm Hash digest
SHA256 50057f04ac589285efc22b7cdbf9bd60fe70bfd9e43a6d09f2c4cab4b64d5932
MD5 f38e6e699a18fae10cf435d0845849e2
BLAKE2b-256 736debb05bd7e8281900a9cebbfa670f5de145df29cec5f70f96cc52f0465ce0

See more details on using hashes here.

Supported by

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