Skip to content

Commit 85073b9

Browse files
authored
Merge pull request #481 from vizor-games/master
Fix Empty Queue operation for Registries that has no exists jobs
2 parents cad3b8b + 026aef1 commit 85073b9

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

rq_dashboard/cli.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ def make_flask_app(config, username, password, url_prefix, compatibility_mode=Tr
152152
hidden=True,
153153
help="[DEPRECATED] Delete jobs instead of cancel",
154154
)
155+
@click.option(
156+
"--disable-delete", is_flag=True, default=False, help="Disable delete jobs, clean up registries"
157+
)
155158
@click.option("--debug/--normal", default=False, help="Enter DEBUG mode")
156159
@click.option(
157160
"-v", "--verbose", is_flag=True, default=False, help="Enable verbose logging"
@@ -178,6 +181,7 @@ def run(
178181
web_background,
179182
debug,
180183
delete_jobs,
184+
disable_delete,
181185
verbose,
182186
json,
183187
):
@@ -252,7 +256,9 @@ def run(
252256
url,
253257
)
254258
app.config["RQ_DASHBOARD_REDIS_URL"] = url
255-
259+
260+
app.config["RQ_DASHBOARD_DISABLE_DELETE"] = disable_delete
261+
256262
if json:
257263
service_config.serializer = JSONSerializer
258264

rq_dashboard/templates/rq_dashboard/job.html

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
<span class="col-10">
77
<h2><strong>Job ID</strong>: {{ id }}</h2>
88
</span>
9-
9+
1010
<span class="col-2">
1111
<button id="requeue-job-btn" class="btn btn-outline-warning btn-sm" style="display: none">Requeue</button>
12+
{% if enable_delete %}
1213
<button id="delete-job-btn" class="btn btn-outline-danger btn-sm">Delete</button>
14+
{% endif %}
1315
</span>
1416
</div>
1517
<div id="job-data" class="row"></div>
16-
18+
1719

1820
<script name="job-info" type="text/template">
1921

rq_dashboard/templates/rq_dashboard/jobs.html

+4
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
</div>
3030

3131
<p class="intro">
32+
{% if enable_delete %}
3233
<a href="{{ url_for('rq_dashboard.empty_queue', queue_name=queue.name, registry_name=registry_name) }}" id="empty-btn"
3334
class="btn btn-outline-danger btn-sm" style="float: right" data-toggle="tooltip"
3435
title="Remove all jobs from this queue (<b>destructive</b>)" data-html=true>Empty queue</a>
36+
{% endif %}
3537
{% if registry_name == 'queued' %}
3638
<a href="{{ url_for('rq_dashboard.compact_queue', queue_name=queue.name) }}" id="compact-btn"
3739
class="btn btn-outline-success btn-sm" style="float: right; margin-right: 8px;" data-toggle="tooltip"
@@ -76,7 +78,9 @@
7678
<% if (d.exc_info) { %>
7779
<a href="#" data-role="requeue-job-btn" class="btn btn-outline-warning btn-sm btn-block">Requeue</a>
7880
<% } %>
81+
{% if enable_delete %}
7982
<a href="#" data-role="delete-job-btn" class="btn btn-outline-danger btn-sm">Delete</a>
83+
{% endif %}
8084
</td>
8185
</tr>
8286
</script>

rq_dashboard/web.py

+40-21
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
push_connection,
4242
requeue_job,
4343
)
44+
from rq.exceptions import NoSuchJobError
4445
from rq.job import Job
4546
from rq.registry import (
4647
DeferredJobRegistry,
@@ -113,6 +114,13 @@ def _wrapped(*args, **kwargs):
113114

114115
return _wrapped
115116

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
116124

117125
def serialize_queues(instance_number, queues):
118126
return [
@@ -360,6 +368,7 @@ def jobs_overview(instance_number, queue_name, registry_name, per_page, page):
360368
deprecation_options_usage=current_app.config.get(
361369
"DEPRECATED_OPTIONS", False
362370
),
371+
enable_delete=not current_app.config.get("RQ_DASHBOARD_DISABLE_DELETE"),
363372
)
364373
)
365374
r.headers.set("Cache-Control", "no-store")
@@ -381,17 +390,25 @@ def job_view(instance_number, job_id):
381390
deprecation_options_usage=current_app.config.get(
382391
"DEPRECATED_OPTIONS", False
383392
),
393+
enable_delete=not current_app.config.get("RQ_DASHBOARD_DISABLE_DELETE"),
384394
)
385395
)
386396
r.headers.set("Cache-Control", "no-store")
387397
return r
388398

389399

390400
@blueprint.route("/job/<job_id>/delete", methods=["POST"])
401+
@check_delete_enable
391402
@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+
395412
return dict(status="OK")
396413

397414

@@ -414,35 +431,37 @@ def requeue_all(queue_name):
414431

415432

416433
@blueprint.route("/queue/<queue_name>/<registry_name>/empty", methods=["POST"])
434+
@check_delete_enable
417435
@jsonify
418436
def empty_queue(queue_name, registry_name):
419437
if registry_name == "queued":
420438
q = Queue(queue_name, serializer=config.serializer)
421439
q.empty()
422440
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)
426444
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)
430448
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)
434452
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)
438456
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)
442460
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+
446465
return dict(status="OK")
447466

448467

0 commit comments

Comments
 (0)