django-polymorphic icon indicating copy to clipboard operation
django-polymorphic copied to clipboard

reversion or polymorphic bug?

Open stas630 opened this issue 9 years ago • 3 comments

I modified the example pexp/admin.py. According to the documentation, connect to Django- reversion. I added data in admin to "ModelC". When I go into the history of a way to view and choose the right time, I can only see a Field1. But it's not possible to see Field2, Field3! This is normal? Whose mistake?

Made the following changes:
--- example/pexp/admin.py.orig  2015-04-30 12:40:14.000000000 +0300
+++ example/pexp/admin.py   2015-05-07 19:23:12.000000000 +0300
@@ -4,2 +4,4 @@

+import reversion
+from reversion import VersionAdmin

@@ -32,3 +34,9 @@

-class ModelAAdmin(PolymorphicParentModelAdmin):
+class ModelBAdmin(VersionAdmin, ModelAChildAdmin):
+  pass
+
+class ModelCAdmin(ModelBAdmin):
+  pass
+
+class ModelAAdmin(VersionAdmin,PolymorphicParentModelAdmin):
     base_model = ModelA
@@ -37,6 +45,8 @@
         (ModelA, ModelAChildAdmin),
-        (ModelB, ModelAChildAdmin),
-        (ModelC, ModelAChildAdmin),
+        (ModelB, ModelBAdmin),
+        (ModelC, ModelCAdmin),
     )

+reversion.register(ModelB, follow=['modela_ptr'])
+reversion.register(ModelC, follow=['modelb_ptr'])
 admin.site.register(ModelA, ModelAAdmin)

stas630 avatar May 07 '15 16:05 stas630

I had the same problem. It was caused by an outdated version of django-reversion. Django-reversion and django-polymorphic only work together as expected on latest versions.

If you are constrained on a specific django version (like me django 1.4.x) you can e.g. only use django-reversion 1.6.6. In that case you have to overwrite some methods of VersionAdmin in your own admin class to circumvent these shortcomings. In detail you have to provide the real admin class to the corresponding views.

I had to consider the following methods/views in my case:

def recoverlist_view(self, request, extra_context=None):
   ...

def recover_view(self, request, version_id, extra_context=None):
   ...

def revision_view(self, request, object_id, version_id, extra_context=None):
   ...

def history_view(self, request, object_id, extra_context=None):
   ...

milkomeda avatar Sep 22 '15 07:09 milkomeda

Hi @milkomeda : could you include the body of those views?

I presume the revision_view looked like this:

        def revision_view(self, request, object_id, version_id, extra_context=None):
            real_admin = self._get_real_admin(object_id)
            return real_admin.recoverlist_view(request, object_id, version_id, extra_context=extra_context)

However I'd love to know what else you had to override.

vdboor avatar Feb 17 '16 12:02 vdboor

I had to override the following methods to get polymorphic working with reversion. You have to extend the recoverlist_view method if there are more than two child models.

Your revision_view seems broken cause you are returning real_admin.recoverlist_view(...) instead of real_admin.revision_view(...).

def recoverlist_view(self, request, extra_context=None):
    if extra_context is None:
        extra_context = {}
    deleted1 = self.revision_manager.get_deleted(ModelB)
    deleted2 = self.revision_manager.get_deleted(ModelC)
    extra_context['deleted'] = self._order_version_queryset(deleted1 | deleted2)
    return super(ModelAAdmin, self).recoverlist_view(request, extra_context=extra_context)

def recover_view(self, request, version_id, extra_context=None):
    version = get_object_or_404(Version, pk=version_id)
    real_admin = self._get_real_admin_by_ct(version.content_type_id)
    return real_admin.recover_view(request, version_id, extra_context=extra_context)

def revision_view(self, request, object_id, version_id, extra_context=None):
    real_admin = self._get_real_admin(object_id)
    return real_admin.revision_view(request, object_id, version_id, extra_context=extra_context)

def history_view(self, request, object_id, extra_context=None):
    real_admin = self._get_real_admin(object_id)
    return real_admin.history_view(request, object_id, extra_context=extra_context)

milkomeda avatar Feb 23 '16 10:02 milkomeda