dj-queue 0.2.4__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dj_queue-0.2.4 → dj_queue-0.3.0}/PKG-INFO +1 -1
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/admin.py +37 -42
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/dashboard.py +248 -183
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/base.py +39 -13
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/supervisor.py +30 -5
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_process_rows.html +14 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_recurring_rows.html +11 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_section_table.html +23 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_semaphore_rows.html +9 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_paginator.html +19 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_queue_controls.html +18 -0
- dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_sortable_header_cells.html +13 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/dashboard.html +9 -279
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/queue_jobs.html +3 -46
- {dj_queue-0.2.4 → dj_queue-0.3.0}/pyproject.toml +1 -1
- {dj_queue-0.2.4 → dj_queue-0.3.0}/LICENSE +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/README.md +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/api.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/apps.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/backend.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/config.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/asgi.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/gunicorn.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/db.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/exceptions.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/hooks.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/log.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue_health.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue_prune.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0001_initial.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0002_pause_semaphore.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0003_recurringtask_recurringexecution.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0004_dashboard.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/jobs.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/recurring.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/runtime.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/cleanup.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/concurrency.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/jobs.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/recurring.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/routers.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/__init__.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/dispatcher.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/errors.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/interruptible.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/notify.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/pidfile.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/pool.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/procline.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/scheduler.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/worker.py +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/change_form.html +0 -0
- {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/change_list.html +0 -0
|
@@ -17,6 +17,7 @@ from dj_queue.config import load_backend_config
|
|
|
17
17
|
from dj_queue import dashboard
|
|
18
18
|
from dj_queue.api import QueueInfo
|
|
19
19
|
from dj_queue.db import get_database_alias
|
|
20
|
+
from dj_queue.exceptions import EnqueueError
|
|
20
21
|
from dj_queue.models import (
|
|
21
22
|
BlockedExecution,
|
|
22
23
|
Dashboard,
|
|
@@ -131,48 +132,44 @@ class DashboardAdmin(admin.ModelAdmin):
|
|
|
131
132
|
return TemplateResponse(request, "admin/dj_queue/queue_jobs.html", context)
|
|
132
133
|
|
|
133
134
|
def queue_action_view(self, request, queue_name):
|
|
134
|
-
if request.method != "POST":
|
|
135
|
-
return HttpResponseNotAllowed(["POST"])
|
|
136
|
-
|
|
137
135
|
backend_alias = dashboard.resolve_backend_alias(request.POST.get("backend"))
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
return self._post_action_response(
|
|
137
|
+
request,
|
|
138
|
+
operation=lambda: dashboard.apply_queue_action(
|
|
141
139
|
backend_alias=backend_alias,
|
|
142
140
|
queue_name=queue_name,
|
|
143
|
-
action=action,
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
self.message_user(request, str(exc), level=messages.ERROR)
|
|
147
|
-
else:
|
|
148
|
-
self.message_user(request, message, level=messages.SUCCESS)
|
|
149
|
-
return self._redirect(
|
|
150
|
-
request, self._queue_url(backend_alias=backend_alias, queue_name=queue_name)
|
|
141
|
+
action=request.POST.get("action"),
|
|
142
|
+
),
|
|
143
|
+
fallback_url=self._queue_url(backend_alias=backend_alias, queue_name=queue_name),
|
|
151
144
|
)
|
|
152
145
|
|
|
153
146
|
def job_action_view(self, request, queue_name):
|
|
154
|
-
if request.method != "POST":
|
|
155
|
-
return HttpResponseNotAllowed(["POST"])
|
|
156
|
-
|
|
157
147
|
backend_alias = dashboard.resolve_backend_alias(request.POST.get("backend"))
|
|
158
148
|
state = request.POST.get("state", "ready")
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
149
|
+
return self._post_action_response(
|
|
150
|
+
request,
|
|
151
|
+
operation=lambda: dashboard.apply_job_action(
|
|
162
152
|
backend_alias=backend_alias,
|
|
163
153
|
queue_name=queue_name,
|
|
164
154
|
state=state,
|
|
165
155
|
action=request.POST.get("action"),
|
|
166
|
-
job_ids=job_ids,
|
|
167
|
-
)
|
|
156
|
+
job_ids=[job_id for job_id in request.POST.getlist("job_ids") if job_id],
|
|
157
|
+
),
|
|
158
|
+
fallback_url=self._queue_url(
|
|
159
|
+
backend_alias=backend_alias, queue_name=queue_name, state=state
|
|
160
|
+
),
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
def _post_action_response(self, request, operation, fallback_url):
|
|
164
|
+
if request.method != "POST":
|
|
165
|
+
return HttpResponseNotAllowed(["POST"])
|
|
166
|
+
try:
|
|
167
|
+
message = operation()
|
|
168
168
|
except ValueError as exc:
|
|
169
169
|
self.message_user(request, str(exc), level=messages.ERROR)
|
|
170
170
|
else:
|
|
171
171
|
self.message_user(request, message, level=messages.SUCCESS)
|
|
172
|
-
return self._redirect(
|
|
173
|
-
request,
|
|
174
|
-
self._queue_url(backend_alias=backend_alias, queue_name=queue_name, state=state),
|
|
175
|
-
)
|
|
172
|
+
return self._redirect(request, fallback_url)
|
|
176
173
|
|
|
177
174
|
def _redirect(self, request, fallback_url):
|
|
178
175
|
next_url = request.POST.get("next")
|
|
@@ -295,6 +292,12 @@ class HiddenSidebarAdminMixin:
|
|
|
295
292
|
def handle_change_action(self, request, obj, action):
|
|
296
293
|
return HttpResponseRedirect(request.get_full_path())
|
|
297
294
|
|
|
295
|
+
def _change_redirect(self, *, object_id, backend_alias):
|
|
296
|
+
return HttpResponseRedirect(self._change_url(object_id=object_id, backend_alias=backend_alias))
|
|
297
|
+
|
|
298
|
+
def _current_object_redirect(self, obj, *, backend_alias):
|
|
299
|
+
return self._change_redirect(object_id=obj.pk, backend_alias=backend_alias)
|
|
300
|
+
|
|
298
301
|
def _change_url(self, *, object_id, backend_alias):
|
|
299
302
|
url = reverse(
|
|
300
303
|
f"admin:{self.model._meta.app_label}_{self.model._meta.model_name}_change",
|
|
@@ -501,11 +504,9 @@ class JobAdmin(HiddenSidebarAdminMixin, admin.ModelAdmin):
|
|
|
501
504
|
if action == "enqueue":
|
|
502
505
|
try:
|
|
503
506
|
new_job = enqueue_job_again(obj.pk, backend_alias=obj.backend_name)
|
|
504
|
-
except
|
|
507
|
+
except (EnqueueError, ImportError, AttributeError) as exc:
|
|
505
508
|
self.message_user(request, f"Could not enqueue job: {exc}", level=messages.ERROR)
|
|
506
|
-
return
|
|
507
|
-
self._change_url(object_id=obj.pk, backend_alias=obj.backend_name)
|
|
508
|
-
)
|
|
509
|
+
return self._current_object_redirect(obj, backend_alias=obj.backend_name)
|
|
509
510
|
|
|
510
511
|
self.message_user(
|
|
511
512
|
request,
|
|
@@ -516,29 +517,23 @@ class JobAdmin(HiddenSidebarAdminMixin, admin.ModelAdmin):
|
|
|
516
517
|
),
|
|
517
518
|
level=messages.SUCCESS,
|
|
518
519
|
)
|
|
519
|
-
return
|
|
520
|
-
self._change_url(object_id=obj.pk, backend_alias=obj.backend_name)
|
|
521
|
-
)
|
|
520
|
+
return self._current_object_redirect(obj, backend_alias=obj.backend_name)
|
|
522
521
|
|
|
523
522
|
if obj.status != "failed":
|
|
524
523
|
self.message_user(request, "This job is not failed", level=messages.ERROR)
|
|
525
|
-
return
|
|
526
|
-
self._change_url(object_id=obj.pk, backend_alias=obj.backend_name)
|
|
527
|
-
)
|
|
524
|
+
return self._current_object_redirect(obj, backend_alias=obj.backend_name)
|
|
528
525
|
|
|
529
526
|
if action == "retry":
|
|
530
527
|
obj.failed_execution.retry()
|
|
531
528
|
self.message_user(request, "Retried failed job", level=messages.SUCCESS)
|
|
532
|
-
return
|
|
533
|
-
self._change_url(object_id=obj.pk, backend_alias=obj.backend_name)
|
|
534
|
-
)
|
|
529
|
+
return self._current_object_redirect(obj, backend_alias=obj.backend_name)
|
|
535
530
|
|
|
536
531
|
if action == "discard":
|
|
537
532
|
obj.failed_execution.discard()
|
|
538
533
|
self.message_user(request, "Discarded failed job", level=messages.SUCCESS)
|
|
539
534
|
return HttpResponseRedirect(self._changelist_url(backend_alias=obj.backend_name))
|
|
540
535
|
|
|
541
|
-
return
|
|
536
|
+
return self._current_object_redirect(obj, backend_alias=obj.backend_name)
|
|
542
537
|
|
|
543
538
|
|
|
544
539
|
@admin.register(FailedExecution)
|
|
@@ -594,7 +589,7 @@ class FailedExecutionAdmin(HiddenSidebarAdminMixin, admin.ModelAdmin):
|
|
|
594
589
|
self.message_user(request, "Discarded failed job", level=messages.SUCCESS)
|
|
595
590
|
return HttpResponseRedirect(self._changelist_url(backend_alias=backend_alias))
|
|
596
591
|
|
|
597
|
-
return
|
|
592
|
+
return self._current_object_redirect(obj, backend_alias=backend_alias)
|
|
598
593
|
|
|
599
594
|
|
|
600
595
|
@admin.register(Process)
|
|
@@ -687,7 +682,7 @@ class PauseAdmin(HiddenSidebarAdminMixin, admin.ModelAdmin):
|
|
|
687
682
|
)
|
|
688
683
|
return HttpResponseRedirect(self._changelist_url(backend_alias=backend_alias))
|
|
689
684
|
|
|
690
|
-
return
|
|
685
|
+
return self._current_object_redirect(obj, backend_alias=backend_alias)
|
|
691
686
|
|
|
692
687
|
|
|
693
688
|
@admin.register(Semaphore)
|