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.
Files changed (61) hide show
  1. {dj_queue-0.2.4 → dj_queue-0.3.0}/PKG-INFO +1 -1
  2. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/admin.py +37 -42
  3. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/dashboard.py +248 -183
  4. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/base.py +39 -13
  5. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/supervisor.py +30 -5
  6. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_process_rows.html +14 -0
  7. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_recurring_rows.html +11 -0
  8. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_section_table.html +23 -0
  9. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_dashboard_semaphore_rows.html +9 -0
  10. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_paginator.html +19 -0
  11. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_queue_controls.html +18 -0
  12. dj_queue-0.3.0/dj_queue/templates/admin/dj_queue/_sortable_header_cells.html +13 -0
  13. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/dashboard.html +9 -279
  14. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/queue_jobs.html +3 -46
  15. {dj_queue-0.2.4 → dj_queue-0.3.0}/pyproject.toml +1 -1
  16. {dj_queue-0.2.4 → dj_queue-0.3.0}/LICENSE +0 -0
  17. {dj_queue-0.2.4 → dj_queue-0.3.0}/README.md +0 -0
  18. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/__init__.py +0 -0
  19. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/api.py +0 -0
  20. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/apps.py +0 -0
  21. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/backend.py +0 -0
  22. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/config.py +0 -0
  23. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/__init__.py +0 -0
  24. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/asgi.py +0 -0
  25. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/contrib/gunicorn.py +0 -0
  26. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/db.py +0 -0
  27. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/exceptions.py +0 -0
  28. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/hooks.py +0 -0
  29. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/log.py +0 -0
  30. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/__init__.py +0 -0
  31. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/__init__.py +0 -0
  32. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue.py +0 -0
  33. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue_health.py +0 -0
  34. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/management/commands/dj_queue_prune.py +0 -0
  35. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0001_initial.py +0 -0
  36. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0002_pause_semaphore.py +0 -0
  37. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0003_recurringtask_recurringexecution.py +0 -0
  38. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/0004_dashboard.py +0 -0
  39. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/migrations/__init__.py +0 -0
  40. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/__init__.py +0 -0
  41. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/jobs.py +0 -0
  42. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/recurring.py +0 -0
  43. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/models/runtime.py +0 -0
  44. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/__init__.py +0 -0
  45. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/cleanup.py +0 -0
  46. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/concurrency.py +0 -0
  47. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/jobs.py +0 -0
  48. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/operations/recurring.py +0 -0
  49. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/routers.py +0 -0
  50. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/__init__.py +0 -0
  51. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/dispatcher.py +0 -0
  52. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/errors.py +0 -0
  53. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/interruptible.py +0 -0
  54. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/notify.py +0 -0
  55. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/pidfile.py +0 -0
  56. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/pool.py +0 -0
  57. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/procline.py +0 -0
  58. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/scheduler.py +0 -0
  59. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/runtime/worker.py +0 -0
  60. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/change_form.html +0 -0
  61. {dj_queue-0.2.4 → dj_queue-0.3.0}/dj_queue/templates/admin/dj_queue/change_list.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dj-queue
3
- Version: 0.2.4
3
+ Version: 0.3.0
4
4
  Summary: Database-backed task queue backend for Django's django.tasks framework
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -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
- action = request.POST.get("action")
139
- try:
140
- message = dashboard.apply_queue_action(
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
- except ValueError as exc:
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
- job_ids = [job_id for job_id in request.POST.getlist("job_ids") if job_id]
160
- try:
161
- message = dashboard.apply_job_action(
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 Exception as exc:
507
+ except (EnqueueError, ImportError, AttributeError) as exc:
505
508
  self.message_user(request, f"Could not enqueue job: {exc}", level=messages.ERROR)
506
- return HttpResponseRedirect(
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 HttpResponseRedirect(
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 HttpResponseRedirect(
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 HttpResponseRedirect(
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 HttpResponseRedirect(self._change_url(object_id=obj.pk, backend_alias=obj.backend_name))
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 HttpResponseRedirect(self._change_url(object_id=obj.pk, backend_alias=backend_alias))
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 HttpResponseRedirect(self._change_url(object_id=obj.pk, backend_alias=backend_alias))
685
+ return self._current_object_redirect(obj, backend_alias=backend_alias)
691
686
 
692
687
 
693
688
  @admin.register(Semaphore)