Advertisement
Guest User

Untitled

a guest
Nov 29th, 2012
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.72 KB | None | 0 0
  1. from django.contrib import admin
  2. class ModelBModelAdmin(admin.ModelAdmin):
  3.     rel_dump = {}
  4.    
  5.     def delete_view(self, request, object_id, extra_context=None):
  6.         """
  7.         handling deletion from change_form
  8.         """
  9.    
  10.         obj = models.ModelB.objects.get(pk=object_id)
  11.         self.before_delete(obj)
  12.         res = super(ModelBModelAdmin, self).delete_view(request, object_id, extra_context)
  13.         self.after_delete(obj)
  14.         return res
  15.  
  16.     def response_action(self, request, queryset):
  17.         """
  18.         handling deletion from change_list
  19.         """
  20.    
  21.         #copy & pasted from super method:
  22.         try: action_index = int(request.POST.get('index', 0))
  23.         except ValueError: action_index = 0
  24.         try: action = request.POST.getlist('action')[action_index]
  25.         except IndexError: action = ''
  26.  
  27.         if action == 'delete_selected':
  28.             for obj in queryset:
  29.                 self.before_delete(obj)
  30.         res = super(ModelBModelAdmin, self).response_action(request, queryset)
  31.         if action == 'delete_selected':
  32.             for obj in queryset:
  33.                 self.after_delete(obj)
  34.         return res
  35.  
  36.     def before_delete(self, obj):
  37.         """
  38.         removing "problem" relation from _meta._m2m_cache and saving them into rel_dump dictionary to restore at the end.
  39.         consequently it will be ignored during the cascade-deletion of all related objects
  40.         """
  41.         self.rel_dump[obj] = {}
  42.         for key in obj._meta._m2m_cache.keys():
  43.             if isinstance(key, generic.GenericRelation) and key.rel.to == ModelA:
  44.                 self.rel_dump[obj].update({key: obj._meta._m2m_cache.pop(key)})
  45.  
  46.     def after_delete(self, obj):
  47.         """
  48.         restoring relations and manual deletion of related objects
  49.         """
  50.         obj._meta._m2m_cache.update(self.rel_dump.pop(obj))
  51.         ModelA.objects.filter(content_type=ContentType.objects.get_for_model(obj.__class__), object_pk=obj.pk).delete()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement