Skip to content

Commit

Permalink
feat: scoursen#76 hard delete option in django admin
Browse files Browse the repository at this point in the history
  • Loading branch information
Pratik Bodawala committed Apr 3, 2022
1 parent e7bdc46 commit 492cbfb
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
33 changes: 25 additions & 8 deletions softdelete/admin/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from softdelete.admin.forms import *
import logging


class SoftDeleteObjectInline(admin.TabularInline):
class Meta:
exclude = ('deleted_at',)
Expand All @@ -22,21 +23,32 @@ def get_queryset(self, request):
if ordering:
qs = qs.order_by(*ordering)
return qs

queryset = get_queryset


class SoftDeleteObjectAdmin(admin.ModelAdmin):
form = SoftDeleteObjectAdminForm
actions = ['delete_selected', 'soft_undelete']
actions = ['delete_selected', 'soft_undelete', 'hard_delete']

def delete_selected(self, request, queryset):
queryset.delete()

delete_selected.short_description = 'Soft delete selected objects'

def soft_undelete(self, request, queryset):
queryset.undelete()

soft_undelete.short_description = 'Undelete selected objects'

def hard_delete(self, request, queryset):
for obj in queryset:
if obj.deleted_at:
obj.delete()
else:
obj.hard_delete()
hard_delete.short_description = 'Hard delete selected objects'

def response_change(self, request, obj, *args, **kwargs):
if 'undelete' in request.POST:
return HttpResponseRedirect('../')
Expand All @@ -52,37 +64,41 @@ def get_queryset(self, request):
if ordering:
qs = qs.order_by(*ordering)
return qs

queryset = get_queryset


class SoftDeleteRecordInline(admin.TabularInline):
model = SoftDeleteRecord
max_num = 0
exclude = ('content_type', 'object_id',)
readonly_fields = ('content',)


class SoftDeleteRecordAdmin(admin.ModelAdmin):
model = SoftDeleteRecord
form = SoftDeleteRecordAdminForm
actions = ['soft_undelete']

def soft_undelete(self, request, queryset):
[x.undelete() for x in queryset.all()]

soft_undelete.short_description = 'Undelete selected objects'

def response_change(self, request, obj, *args, **kwargs):
if 'undelete' in request.POST:
obj.undelete()
return HttpResponseRedirect('../../')
return super(SoftDeleteRecordAdmin, self).response_change(request, obj,
return super(SoftDeleteRecordAdmin, self).response_change(request, obj,
*args, **kwargs)

def has_add_permission(self, *args, **kwargs):
return False

def has_delete_permission(self, *args, **kwargs):
return False


class ChangeSetAdmin(admin.ModelAdmin):
model = ChangeSet
form = ChangeSetAdminForm
Expand All @@ -91,21 +107,22 @@ class ChangeSetAdmin(admin.ModelAdmin):

def soft_undelete(self, request, queryset):
[x.undelete() for x in queryset.all()]

soft_undelete.short_description = 'Undelete selected objects'

def response_change(self, request, obj, *args, **kwargs):
if 'undelete' in request.POST:
obj.undelete()
return HttpResponseRedirect('../../')
return super(ChangeSetAdmin, self).response_change(request, obj,
return super(ChangeSetAdmin, self).response_change(request, obj,
*args, **kwargs)

def has_add_permission(self, *args, **kwargs):
return False

def has_delete_permission(self, *args, **kwargs):
return False


admin.site.register(SoftDeleteRecord, SoftDeleteRecordAdmin)
admin.site.register(ChangeSet, ChangeSetAdmin)

3 changes: 3 additions & 0 deletions softdelete/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,9 @@ def _do_delete(self, changeset, related):
except:
getattr(self, rel).__class__.objects.all().delete()

def hard_delete(self, *args, **kwargs):
super(SoftDeleteObject, self).delete(*args, **kwargs)

def delete(self, *args, **kwargs):
if self.deleted_at:
logging.debug("HARD DELETEING type %s, %s", type(self), self)
Expand Down

0 comments on commit 492cbfb

Please sign in to comment.