33from django .conf import settings
44from django .contrib import admin
55from django .utils .translation import gettext_lazy as _
6+ from django .contrib import messages
7+ from celery import current_app as celery_app
8+
69
710try :
811 ALLOW_EDITS = settings .DJANGO_CELERY_RESULTS ['ALLOW_EDITS' ]
@@ -58,6 +61,7 @@ class TaskResultAdmin(admin.ModelAdmin):
5861 'classes' : ('extrapretty' , 'wide' )
5962 }),
6063 )
64+ actions = ['terminate_task' ]
6165
6266 def get_readonly_fields (self , request , obj = None ):
6367 if ALLOW_EDITS :
@@ -67,6 +71,26 @@ def get_readonly_fields(self, request, obj=None):
6771 field .name for field in self .opts .local_fields
6872 })
6973
74+ def terminate_task (self , request , queryset ):
75+ """Terminate selected tasks."""
76+ for task_result in queryset :
77+ task_id = task_result .task_id
78+ try :
79+ celery_app .control .revoke (task_id , terminate = True )
80+ self .message_user (
81+ request ,
82+ f"Task { task_id } was terminated successfully." ,
83+ messages .SUCCESS ,
84+ )
85+ except Exception as e :
86+ self .message_user (
87+ request ,
88+ f"Failed to terminate task { task_id } . Error: { e } " ,
89+ messages .ERROR ,
90+ )
91+
92+ terminate_task .short_description = "Terminate selected tasks"
93+
7094
7195admin .site .register (TaskResult , TaskResultAdmin )
7296
0 commit comments