Metadata-Version: 2.0
Name: django-reversion-compare
Version: 0.5.4
Summary: history compare for django-reversion
Home-page: https://github.com/jedie/django-reversion-compare/
Author: Jens Diemer
Author-email: django-reversion-compare@jensdiemer.de
License: UNKNOWN
Download-URL: http://pypi.python.org/pypi/django-reversion-compare/
Keywords: django,django-reversion,reversion,diff,compare
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.4
Classifier: Framework :: Django
Classifier: Framework :: Django :: 1.7
Classifier: Framework :: Django :: 1.8
Classifier: Topic :: Database :: Front-Ends
Classifier: Topic :: Documentation
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Operating System :: OS Independent
Requires-Dist: Django (>=1.7,<1.9)
Requires-Dist: django-reversion (>=1.8)

========================
django-reversion-compare
========================

**django-reversion-compare** is an extension to `django-reversion <https://github.com/etianen/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/`_ |
+--------------------------------------+--------------------------------------------------------------------+

.. |Coverage Status on coveralls.io| image:: https://coveralls.io/repos/jedie/django-reversion-compare/badge.svg
.. _coveralls.io/r/jedie/django-reversion-compare: https://coveralls.io/r/jedie/django-reversion-compare
.. |Build Status on travis-ci.org| image:: https://travis-ci.org/jedie/django-reversion-compare.svg
.. _travis-ci.org/jedie/django-reversion-compare: https://travis-ci.org/jedie/django-reversion-compare/
.. |Requirements Status on requires.io| image:: https://requires.io/github/jedie/django-reversion-compare/requirements.svg
.. _requires.io/github/jedie/django-reversion-compare/requirements/: https://requires.io/github/jedie/django-reversion-compare/requirements/

------------
installation
------------

Just use:

::

    pip install django-reversion-compare

Optional you can install `google-diff-match-patch <https://code.google.com/p/google-diff-match-patch/>`_ otherwise difflib would be used.
The easiest way it to use the unofficial package `diff-match-patch <http://pypi.python.org/pypi/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 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)

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 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)

-----------
screenshots
-----------

Here some screenshots of django-reversion-compare:

----

How to select the versions to compare:

|django-reversion-compare_v0_1_0-01.png|

.. |django-reversion-compare_v0_1_0-01.png| image:: http://www.pylucid.org/static/pylucid.org/screenshots_PyLucid/django-reversion/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|

.. |django-reversion-compare_v0_1_0-02.png| image:: http://www.pylucid.org/static/pylucid.org/screenshots_PyLucid/django-reversion/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|

.. |django-reversion-compare_v0_1_0-03.png| image:: http://www.pylucid.org/static/pylucid.org/screenshots_PyLucid/django-reversion/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|

.. |django-reversion-compare_v0_3_0-01.png| image:: http://www.pylucid.org/static/pylucid.org/screenshots_PyLucid/django-reversion/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 <https://github.com/jedie/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$ ./tests/manage.py run_testserver

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

---------------------
Version compatibility
---------------------

+-------------------+------------+
| Reversion-Compare | Django     |
+===================+============+
| >=v0.5.2          | v1.7, v1.8 |
+-------------------+------------+
| >=v0.4            | v1.7       |
+-------------------+------------+
| <v0.4             | v1.4       |
+-------------------+------------+

These are the unittests variants. See also: `/.travis.yml <https://github.com/jedie/django-reversion-compare/blob/master/.travis.yml>`_
Maybe other versions are compatible, too.

---------
changelog
---------

* `v0.5.4 - 22.07.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.5.3...v0.5.4>`_:

    * One to one field custom related name fix `#42 <https://github.com/jedie/django-reversion-compare/pull/42>`_ (contributed by frwickst and aemdy)

* `v0.5.3 - 13.07.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.5.2...v0.5.3>`_:

    * Update admin.py to avoid RemovedInDjango19Warning (contributed by luzfcb)

* `v0.5.2 - 14.04.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.5.1...v0.5.2>`_:

    * contributed by Samuel Spencer:

        * Added Django 1.8 support: `pull #35 <https://github.com/jedie/django-reversion-compare/pull/35>`_

        * list of changes for reverse fields incorrectly includes a "deletion" for the item that was added in: `issues #34 <https://github.com/jedie/django-reversion-compare/issues/34>`_

* `v0.5.1 - 28.02.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.5.0...v0.5.1>`_:

    * activate previous/next links and add unitests for them

* `v0.5.0 - 27.02.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.4.0...v0.5.0>`_:

    * refactory unittests, test with Django v1.7 and Python 2.7 & 3.4

* `v0.4.0 - 02.02.2015 <https://github.com/jedie/django-reversion-compare/compare/v0.3.5...v0.4.0>`_:

    * Updates for django 1.7 support

    * Add ``settings.ADD_REVERSION_ADMIN``

* v0.3.5 - 03.01.2013:

    * Remove date from version string. `issues 9 <https://github.com/jedie/django-reversion-compare/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 <https://github.com/jedie/django-reversion-compare/pull/7>`_

    * Use logging for all debug prints, contributed by Bojan Mihelac - see: `pull request 8 <https://github.com/jedie/django-reversion-compare/pull/8>`_

* v0.3.3 - 11.06.2012:

    * Bugfix "ValueError: zero length field name in format" with Python 2.6 `issues 5 <https://github.com/jedie/django-reversion-compare/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' <https://github.com/jedie/django-reversion-compare/issues/5>`_

* 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 <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: `https://github.com/etianen/django-reversion/issues/147 <https://github.com/etianen/django-reversion/issues/147>`_

-----
Links
-----

+-----------------+----------------------------------------------------------+
| IRC             | `#pylucid on freenode.net`_                              |
+-----------------+----------------------------------------------------------+
| Github          | `http://github.com/jedie/django-reversion-compare`_      |
+-----------------+----------------------------------------------------------+
| Python Packages | `http://pypi.python.org/pypi/django-reversion-compare/`_ |
+-----------------+----------------------------------------------------------+

.. _#pylucid on freenode.net: http://www.pylucid.org/permalink/304/irc-channel
.. _http://github.com/jedie/django-reversion-compare: http://github.com/jedie/django-reversion-compare
.. _http://pypi.python.org/pypi/django-reversion-compare/: http://pypi.python.org/pypi/django-reversion-compare/

-------
contact
-------

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`_       |
+---------+--------------------------------------------------------+

.. _official 'django-reversion-compare' Forum: http://www.pylucid.org/en/forum/13/
.. _http://webchat.freenode.net/?channels=pylucid: http://webchat.freenode.net/?channels=pylucid

--------
donation
--------

* `Flattr This! <https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fjedie%2Fdjango-reversion-compare%2F>`_

* Send `Bitcoins <http://www.bitcoin.org/>`_ to `1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F <https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F>`_

