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.
coveralls.io/r/jedie/django-reversion-compare | |
travis-ci.org/jedie/django-reversion-compare | |
requires.io/github/jedie/django-reversion-compare/requirements/ |
Just use:
pip install django-reversion-compare
Optional you can install google-diff-match-patch otherwise difflib would be used. The easiest way it to use the unofficial package diff-match-patch, e.g.:
pip install diff-match-patch
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
Inherit from CompareVersionAdmin instead of VersionAdmin to get the compare 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)
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 exist no method with this name scheme, the fallback_compare() method would be used.
example for specify 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)
Here some screenshots of django-reversion-compare:
How to select the versions to compare:
from v0.1.0: DateTimeField compare (last update), TextField compare (content) with small changes and a ForeignKey compare (child model instance was added):
from v0.1.0: Same as above, but the are more lines changed in TextField and the ForeignKey relation was removed:
Example screenshot from v0.3.0: a many-to-many field compare (friends, hobbies):
- 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 need django-tools)
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
Reversion-Compare | Django | Python |
---|---|---|
>=v0.5.2 | v1.7, v1.8 | v2.7, v3.4 |
>=v0.4 | v1.7 | v2.7, v3.4 |
<v0.4 | v1.4 |
These are the unittests variants. See also: /.travis.yml Maybe other versions are compatible, too.
- v0.5.5 - 24.07.2015:
- UnboundLocalError ('version') when creating deleted list in get_many_to_something() #41
- v0.5.4 - 22.07.2015:
- One to one field custom related name fix #42 (contributed by frwickst and aemdy)
- v0.5.3 - 13.07.2015:
- Update admin.py to avoid RemovedInDjango19Warning (contributed by luzfcb)
- v0.5.2 - 14.04.2015:
- contributed by Samuel Spencer:
- Added Django 1.8 support: pull #35
- list of changes for reverse fields incorrectly includes a "deletion" for the item that was added in: issues #34
- contributed by Samuel Spencer:
- v0.5.1 - 28.02.2015:
- activate previous/next links and add unitests for them
- v0.5.0 - 27.02.2015:
- refactory unittests, test with Django v1.7 and Python 2.7 & 3.4
- v0.4.0 - 02.02.2015:
- Updates for django 1.7 support
- Add settings.ADD_REVERSION_ADMIN
- v0.3.5 - 03.01.2013:
- Remove date from version string. issues 9
- v0.3.4 - 20.06.2012:
- Use VersionAdmin.revision_manager rather than default_revision_manager, contributed by Mark Lavin - see: pull request 7
- Use logging for all debug prints, contributed by Bojan Mihelac - see: pull request 8
- v0.3.3 - 11.06.2012:
- Bugfix "ValueError: zero length field name in format" with Python 2.6 issues 5
- v0.3.2 - 04.06.2012:
- Bugfix for Python 2.6 in unified_diff(), see: AttributeError: 'module' object has no attribute '_format_range_unified'
- v0.3.1 - 01.06.2012:
- Bugfix: force unicode in html diff
- Bugfix in unittests
- v0.3.0 - 16.05.2012:
- Enhanced handling of m2m changes with follow and non-follow relations.
- v0.2.2 - 15.05.2012:
- Compare many-to-many in the right way.
- v0.2.1 - 10.05.2012:
- Bugfix for models which has no m2m field: https://github.com/jedie/django-reversion-compare/commit/c8e042945a6e78e5540b6ae27666f9b0cfc94880
- v0.2.0 - 09.05.2012:
- many-to-many compare works, too.
- v0.1.0 - 08.05.2012:
- First release
- v0.0.1 - 08.05.2012:
- collect all compare stuff from old "diff" branch
- see also: etianen/django-reversion#147
IRC | #pylucid on freenode.net |
Github | http://github.com/jedie/django-reversion-compare |
Python Packages | http://pypi.python.org/pypi/django-reversion-compare/ |
Come into the conversation, besides the github communication features:
Forum | official 'django-reversion-compare' Forum |
IRC | #pylucid on freenode.net (Yes, the PyLucid channel...) |
webchat | http://webchat.freenode.net/?channels=pylucid |