From f2c323754b5c16a4540f0846a8ac79c11b96cfaf Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Wed, 17 Feb 2016 11:13:40 +0100 Subject: [PATCH] update third-party docs for better reversion support also mention mptt options --- docs/third-party.rst | 61 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/docs/third-party.rst b/docs/third-party.rst index 03efe3d..883c66a 100644 --- a/docs/third-party.rst +++ b/docs/third-party.rst @@ -1,23 +1,21 @@ Third-party applications support ================================ -Django-reversion support +django-reversion support ------------------------ -`Django-reversion `_ works as -expected with polymorphic models. However, they require more setup than -standard models. We have to face these problems: +Support for django-reversion_ works as expected with polymorphic models. +However, they require more setup than standard models. That's become: * The children models are not registered in the admin site. - You will therefore need to manually register them to django-reversion. -* Polymorphic models use - `multi-table inheritance `_. - The django-reversion wiki explains - `how to deal with this `_. + You will therefore need to manually register them to django-reversion_. +* Polymorphic models use `multi-table inheritance `_. + See the `reversion documentation `_ + how to deal with this by adding a ``follow`` field for the primary key. Example -....... +~~~~~~~ The admin :ref:`admin-example` becomes: @@ -25,8 +23,8 @@ The admin :ref:`admin-example` becomes: from django.contrib import admin from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin - import reversion - from reversion import VersionAdmin + from reversion.admin import VersionAdmin + from reversion import revisions from .models import ModelA, ModelB, ModelC @@ -51,6 +49,41 @@ The admin :ref:`admin-example` becomes: (ModelC, ModelCAdmin), ) - reversion.register(ModelB, follow=['modela_ptr']) - reversion.register(ModelC, follow=['modelb_ptr']) + revisions.register(ModelB, follow=['modela_ptr']) + revisions.register(ModelC, follow=['modelb_ptr']) admin.site.register(ModelA, ModelAParentAdmin) + +.. _django-reversion-compare-support: + +django-reversion-compare support +-------------------------------- + +The django-reversion-compare_ views work as expected, the admin requires a little tweak. +In your parent admin, include the following method: + +.. code-block:: python + + def compare_view(self, request, object_id, extra_context=None): + """Redirect the reversion-compare view to the child admin.""" + real_admin = self._get_real_admin(object_id) + return real_admin.compare_view(request, object_id, extra_context=extra_context) + +As the compare view resolves the the parent admin, it uses it's base model to find revisions. +This doesn't work, since it needs to look for revisions of the child model. Using this tweak, +the view of the actual child model is used, similar to the way the regular change and delete views are redirected. + + +django-mptt support +------------------- + +Combining polymorphic with django-mptt_ is certainly possible, but not straightforward. +It involves combining both managers, querysets, models, meta-classes and admin classes +using multiple inheritance. + +The django-polymorphic-tree_ package provides this out of the box. + + +.. _django-reversion: https://github.com/etianen/django-reversion +.. _django-reversion-compare: https://github.com/jedie/django-reversion-compare +.. _django-mptt: https://github.com/django-mptt/django-mptt +.. _django-polymorphic-tree: https://github.com/edoburu/django-polymorphic-tree