41
41
push_connection ,
42
42
requeue_job ,
43
43
)
44
+ from rq .exceptions import NoSuchJobError
44
45
from rq .job import Job
45
46
from rq .registry import (
46
47
DeferredJobRegistry ,
@@ -113,6 +114,13 @@ def _wrapped(*args, **kwargs):
113
114
114
115
return _wrapped
115
116
117
+ def check_delete_enable (f ):
118
+ @wraps (f )
119
+ def wrapper (* args , ** kwargs ):
120
+ if current_app .config .get ("RQ_DASHBOARD_DISABLE_DELETE" ):
121
+ return dict (status = "DISABLED" )
122
+ return f (* args , ** kwargs )
123
+ return wrapper
116
124
117
125
def serialize_queues (instance_number , queues ):
118
126
return [
@@ -360,6 +368,7 @@ def jobs_overview(instance_number, queue_name, registry_name, per_page, page):
360
368
deprecation_options_usage = current_app .config .get (
361
369
"DEPRECATED_OPTIONS" , False
362
370
),
371
+ enable_delete = not current_app .config .get ("RQ_DASHBOARD_DISABLE_DELETE" ),
363
372
)
364
373
)
365
374
r .headers .set ("Cache-Control" , "no-store" )
@@ -381,17 +390,25 @@ def job_view(instance_number, job_id):
381
390
deprecation_options_usage = current_app .config .get (
382
391
"DEPRECATED_OPTIONS" , False
383
392
),
393
+ enable_delete = not current_app .config .get ("RQ_DASHBOARD_DISABLE_DELETE" ),
384
394
)
385
395
)
386
396
r .headers .set ("Cache-Control" , "no-store" )
387
397
return r
388
398
389
399
390
400
@blueprint .route ("/job/<job_id>/delete" , methods = ["POST" ])
401
+ @check_delete_enable
391
402
@jsonify
392
- def delete_job_view (job_id ):
393
- job = Job .fetch (job_id )
394
- job .delete ()
403
+ def delete_job_view (job_id , registry = None ):
404
+ try :
405
+ job = Job .fetch (job_id )
406
+ job .delete ()
407
+ except NoSuchJobError :
408
+ if registry :
409
+ registry .remove (job_id )
410
+ return dict (status = "ERROR" )
411
+
395
412
return dict (status = "OK" )
396
413
397
414
@@ -414,35 +431,37 @@ def requeue_all(queue_name):
414
431
415
432
416
433
@blueprint .route ("/queue/<queue_name>/<registry_name>/empty" , methods = ["POST" ])
434
+ @check_delete_enable
417
435
@jsonify
418
436
def empty_queue (queue_name , registry_name ):
419
437
if registry_name == "queued" :
420
438
q = Queue (queue_name , serializer = config .serializer )
421
439
q .empty ()
422
440
elif registry_name == "failed" :
423
- ids = FailedJobRegistry (queue_name ). get_job_ids ( )
424
- for id in ids :
425
- delete_job_view (id )
441
+ registry = FailedJobRegistry (queue_name )
442
+ for id in registry . get_job_ids () :
443
+ delete_job_view (id , registry )
426
444
elif registry_name == "deferred" :
427
- ids = DeferredJobRegistry (queue_name ). get_job_ids ( )
428
- for id in ids :
429
- delete_job_view (id )
445
+ registry = DeferredJobRegistry (queue_name )
446
+ for id in registry . get_job_ids () :
447
+ delete_job_view (id , registry )
430
448
elif registry_name == "started" :
431
- ids = StartedJobRegistry (queue_name ). get_job_ids ( )
432
- for id in ids :
433
- delete_job_view (id )
449
+ registry = StartedJobRegistry (queue_name )
450
+ for id in registry . get_job_ids () :
451
+ delete_job_view (id , registry )
434
452
elif registry_name == "finished" :
435
- ids = FinishedJobRegistry (queue_name ). get_job_ids ( )
436
- for id in ids :
437
- delete_job_view (id )
453
+ registry = FinishedJobRegistry (queue_name )
454
+ for id in registry . get_job_ids () :
455
+ delete_job_view (id , registry )
438
456
elif registry_name == "canceled" :
439
- ids = CanceledJobRegistry (queue_name ). get_job_ids ( )
440
- for id in ids :
441
- delete_job_view (id )
457
+ registry = CanceledJobRegistry (queue_name )
458
+ for id in registry . get_job_ids () :
459
+ delete_job_view (id , registry )
442
460
elif registry_name == "scheduled" :
443
- ids = ScheduledJobRegistry (queue_name ).get_job_ids ()
444
- for id in ids :
445
- delete_job_view (id )
461
+ registry = ScheduledJobRegistry (queue_name )
462
+ for id in registry .get_job_ids ():
463
+ delete_job_view (id , registry )
464
+
446
465
return dict (status = "OK" )
447
466
448
467
0 commit comments