django-cfg 1.5.1__py3-none-any.whl → 1.5.3__py3-none-any.whl

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.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (121) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/dashboard/TRANSACTION_FIX.md +73 -0
  3. django_cfg/apps/dashboard/serializers/__init__.py +0 -12
  4. django_cfg/apps/dashboard/serializers/activity.py +1 -1
  5. django_cfg/apps/dashboard/services/__init__.py +0 -2
  6. django_cfg/apps/dashboard/services/charts_service.py +4 -3
  7. django_cfg/apps/dashboard/services/statistics_service.py +11 -2
  8. django_cfg/apps/dashboard/services/system_health_service.py +64 -106
  9. django_cfg/apps/dashboard/urls.py +0 -2
  10. django_cfg/apps/dashboard/views/__init__.py +0 -2
  11. django_cfg/apps/dashboard/views/commands_views.py +3 -6
  12. django_cfg/apps/dashboard/views/overview_views.py +14 -13
  13. django_cfg/apps/knowbase/apps.py +2 -2
  14. django_cfg/apps/maintenance/admin/api_key_admin.py +2 -3
  15. django_cfg/apps/newsletter/admin/newsletter_admin.py +12 -11
  16. django_cfg/apps/rq/__init__.py +9 -0
  17. django_cfg/apps/rq/apps.py +80 -0
  18. django_cfg/apps/rq/management/__init__.py +1 -0
  19. django_cfg/apps/rq/management/commands/__init__.py +1 -0
  20. django_cfg/apps/rq/management/commands/rqscheduler.py +31 -0
  21. django_cfg/apps/rq/management/commands/rqstats.py +33 -0
  22. django_cfg/apps/rq/management/commands/rqworker.py +31 -0
  23. django_cfg/apps/rq/management/commands/rqworker_pool.py +27 -0
  24. django_cfg/apps/rq/serializers/__init__.py +40 -0
  25. django_cfg/apps/rq/serializers/health.py +60 -0
  26. django_cfg/apps/rq/serializers/job.py +100 -0
  27. django_cfg/apps/rq/serializers/queue.py +80 -0
  28. django_cfg/apps/rq/serializers/schedule.py +178 -0
  29. django_cfg/apps/rq/serializers/testing.py +139 -0
  30. django_cfg/apps/rq/serializers/worker.py +58 -0
  31. django_cfg/apps/rq/services/__init__.py +25 -0
  32. django_cfg/apps/rq/services/config_helper.py +233 -0
  33. django_cfg/apps/rq/services/models/README.md +417 -0
  34. django_cfg/apps/rq/services/models/__init__.py +30 -0
  35. django_cfg/apps/rq/services/models/event.py +123 -0
  36. django_cfg/apps/rq/services/models/job.py +99 -0
  37. django_cfg/apps/rq/services/models/queue.py +92 -0
  38. django_cfg/apps/rq/services/models/worker.py +104 -0
  39. django_cfg/apps/rq/services/rq_converters.py +183 -0
  40. django_cfg/apps/rq/tasks/__init__.py +23 -0
  41. django_cfg/apps/rq/tasks/demo_tasks.py +284 -0
  42. django_cfg/apps/rq/urls.py +54 -0
  43. django_cfg/apps/rq/views/__init__.py +19 -0
  44. django_cfg/apps/rq/views/jobs.py +882 -0
  45. django_cfg/apps/rq/views/monitoring.py +248 -0
  46. django_cfg/apps/rq/views/queues.py +261 -0
  47. django_cfg/apps/rq/views/schedule.py +400 -0
  48. django_cfg/apps/rq/views/testing.py +761 -0
  49. django_cfg/apps/rq/views/workers.py +195 -0
  50. django_cfg/apps/urls.py +6 -7
  51. django_cfg/core/base/config_model.py +10 -26
  52. django_cfg/core/builders/apps_builder.py +4 -11
  53. django_cfg/core/generation/integration_generators/__init__.py +3 -6
  54. django_cfg/core/generation/integration_generators/django_rq.py +80 -0
  55. django_cfg/core/generation/orchestrator.py +9 -19
  56. django_cfg/core/integration/display/startup.py +6 -20
  57. django_cfg/mixins/__init__.py +2 -0
  58. django_cfg/mixins/superadmin_api.py +59 -0
  59. django_cfg/models/__init__.py +3 -3
  60. django_cfg/models/django/__init__.py +3 -3
  61. django_cfg/models/django/django_rq.py +621 -0
  62. django_cfg/models/django/revolution_legacy.py +1 -1
  63. django_cfg/modules/base.py +4 -6
  64. django_cfg/modules/django_admin/config/background_task_config.py +4 -4
  65. django_cfg/modules/django_admin/utils/html/composition.py +9 -2
  66. django_cfg/modules/django_unfold/navigation.py +1 -26
  67. django_cfg/pyproject.toml +4 -4
  68. django_cfg/registry/core.py +4 -7
  69. django_cfg/static/frontend/admin.zip +0 -0
  70. django_cfg/templates/admin/constance/includes/results_list.html +73 -0
  71. django_cfg/templates/admin/index.html +187 -62
  72. django_cfg/templatetags/django_cfg.py +61 -1
  73. {django_cfg-1.5.1.dist-info → django_cfg-1.5.3.dist-info}/METADATA +5 -6
  74. {django_cfg-1.5.1.dist-info → django_cfg-1.5.3.dist-info}/RECORD +77 -82
  75. django_cfg/apps/dashboard/permissions.py +0 -48
  76. django_cfg/apps/dashboard/serializers/django_q2.py +0 -50
  77. django_cfg/apps/dashboard/services/django_q2_service.py +0 -159
  78. django_cfg/apps/dashboard/views/django_q2_views.py +0 -79
  79. django_cfg/apps/tasks/__init__.py +0 -64
  80. django_cfg/apps/tasks/admin/__init__.py +0 -4
  81. django_cfg/apps/tasks/admin/config.py +0 -98
  82. django_cfg/apps/tasks/admin/task_log.py +0 -238
  83. django_cfg/apps/tasks/apps.py +0 -15
  84. django_cfg/apps/tasks/filters/__init__.py +0 -10
  85. django_cfg/apps/tasks/filters/task_log.py +0 -121
  86. django_cfg/apps/tasks/migrations/0001_initial.py +0 -196
  87. django_cfg/apps/tasks/migrations/0002_delete_tasklog.py +0 -16
  88. django_cfg/apps/tasks/migrations/__init__.py +0 -0
  89. django_cfg/apps/tasks/models/__init__.py +0 -4
  90. django_cfg/apps/tasks/models/task_log.py +0 -246
  91. django_cfg/apps/tasks/serializers/__init__.py +0 -28
  92. django_cfg/apps/tasks/serializers/task_log.py +0 -249
  93. django_cfg/apps/tasks/services/__init__.py +0 -10
  94. django_cfg/apps/tasks/services/client/__init__.py +0 -7
  95. django_cfg/apps/tasks/services/client/client.py +0 -234
  96. django_cfg/apps/tasks/services/config_helper.py +0 -63
  97. django_cfg/apps/tasks/services/sync.py +0 -204
  98. django_cfg/apps/tasks/urls.py +0 -16
  99. django_cfg/apps/tasks/views/__init__.py +0 -10
  100. django_cfg/apps/tasks/views/task_log.py +0 -41
  101. django_cfg/apps/tasks/views/task_log_base.py +0 -41
  102. django_cfg/apps/tasks/views/task_log_overview.py +0 -100
  103. django_cfg/apps/tasks/views/task_log_related.py +0 -41
  104. django_cfg/apps/tasks/views/task_log_stats.py +0 -91
  105. django_cfg/apps/tasks/views/task_log_timeline.py +0 -81
  106. django_cfg/core/generation/integration_generators/django_q2.py +0 -133
  107. django_cfg/core/generation/integration_generators/tasks.py +0 -88
  108. django_cfg/models/django/django_q2.py +0 -514
  109. django_cfg/models/tasks/__init__.py +0 -49
  110. django_cfg/models/tasks/backends.py +0 -122
  111. django_cfg/models/tasks/config.py +0 -209
  112. django_cfg/models/tasks/utils.py +0 -162
  113. django_cfg/modules/django_q2/README.md +0 -140
  114. django_cfg/modules/django_q2/__init__.py +0 -8
  115. django_cfg/modules/django_q2/apps.py +0 -107
  116. django_cfg/modules/django_q2/management/__init__.py +0 -0
  117. django_cfg/modules/django_q2/management/commands/__init__.py +0 -0
  118. django_cfg/modules/django_q2/management/commands/sync_django_q_schedules.py +0 -74
  119. {django_cfg-1.5.1.dist-info → django_cfg-1.5.3.dist-info}/WHEEL +0 -0
  120. {django_cfg-1.5.1.dist-info → django_cfg-1.5.3.dist-info}/entry_points.txt +0 -0
  121. {django_cfg-1.5.1.dist-info → django_cfg-1.5.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,80 @@
1
+ """
2
+ AppConfig for Django-RQ integration with monitoring and API capabilities.
3
+
4
+ This app provides REST API endpoints for Django-RQ task queue monitoring,
5
+ management, and statistics. It wraps django-rq's functionality with modern
6
+ DRF ViewSets and unified django-cfg patterns.
7
+
8
+ Features:
9
+ - REST API for monitoring queues, workers, and jobs
10
+ - Prometheus metrics integration
11
+ - Enhanced monitoring interfaces
12
+ - Job management (view, requeue, delete)
13
+ - Integration with django-cfg ecosystem (Centrifugo, auth)
14
+ """
15
+
16
+ from django.apps import AppConfig
17
+
18
+
19
+ class RQAppConfig(AppConfig):
20
+ """
21
+ AppConfig for Django-RQ monitoring and management application.
22
+
23
+ Provides:
24
+ - REST API endpoints for monitoring
25
+ - Prometheus metrics export
26
+ - Job and queue management
27
+ - Worker statistics
28
+ - Integration with django-cfg authentication
29
+
30
+ Usage:
31
+ Add to INSTALLED_APPS:
32
+ INSTALLED_APPS = [
33
+ ...
34
+ 'django_rq', # Required: django-rq core
35
+ 'django_cfg.apps.rq', # Django-CFG RQ monitoring
36
+ ]
37
+
38
+ Configure in django-cfg config:
39
+ class MyConfig(BaseConfig):
40
+ django_rq: DjangoRQConfig = DjangoRQConfig(
41
+ enabled=True,
42
+ queues={
43
+ 'default': {
44
+ 'host': 'localhost',
45
+ 'port': 6379,
46
+ 'db': 0,
47
+ }
48
+ },
49
+ prometheus_enabled=True,
50
+ )
51
+ """
52
+
53
+ default_auto_field = 'django.db.models.BigAutoField'
54
+ name = 'django_cfg.apps.rq'
55
+ verbose_name = 'Django-CFG RQ Monitoring'
56
+ label = 'django_cfg_rq'
57
+
58
+ def ready(self):
59
+ """
60
+ Initialize the app when Django starts.
61
+
62
+ Registers:
63
+ - Admin interfaces (if not already registered)
64
+ - Signal handlers for monitoring
65
+ - Scheduled jobs from config
66
+ """
67
+ # Import admin to register custom admin classes
68
+ try:
69
+ from . import admin # noqa: F401
70
+ except ImportError:
71
+ pass
72
+
73
+ # Register scheduled jobs from config (runs once on startup)
74
+ try:
75
+ from .services import register_schedules_from_config
76
+ register_schedules_from_config()
77
+ except Exception as e:
78
+ from django_cfg.modules.django_logging import get_logger
79
+ logger = get_logger("rq.apps")
80
+ logger.warning(f"Failed to register schedules: {e}")
@@ -0,0 +1 @@
1
+ """Management commands for Django-RQ integration."""
@@ -0,0 +1 @@
1
+ """Django-RQ management commands for django-cfg."""
@@ -0,0 +1,31 @@
1
+ """
2
+ Django-CFG wrapper for django-rq rqscheduler command.
3
+
4
+ Runs the RQ scheduler daemon for scheduled/periodic jobs.
5
+
6
+ Example:
7
+ python manage.py rqscheduler
8
+ python manage.py rqscheduler --queue default
9
+ """
10
+
11
+ from django_rq.management.commands.rqscheduler import Command as DjangoRQSchedulerCommand
12
+
13
+
14
+ class Command(DjangoRQSchedulerCommand):
15
+ """
16
+ Runs the RQ scheduler daemon.
17
+
18
+ The scheduler handles:
19
+ - Scheduled jobs (enqueue at specific time)
20
+ - Periodic jobs (cron-like scheduling)
21
+ - Delayed job execution
22
+
23
+ Inherits all functionality from django-rq's rqscheduler command.
24
+
25
+ Common options:
26
+ --queue QUEUE Queue to schedule jobs on (default: 'default')
27
+ --interval SECONDS Polling interval (default: 1)
28
+ --pid FILE Write PID to file
29
+ """
30
+
31
+ help = 'Runs RQ scheduler daemon for django-cfg (wrapper for django-rq rqscheduler)'
@@ -0,0 +1,33 @@
1
+ """
2
+ Django-CFG wrapper for django-rq rqstats command.
3
+
4
+ Displays real-time statistics about RQ queues and workers.
5
+
6
+ Example:
7
+ python manage.py rqstats
8
+ python manage.py rqstats --interval 5
9
+ """
10
+
11
+ from django_rq.management.commands.rqstats import Command as DjangoRQStatsCommand
12
+
13
+
14
+ class Command(DjangoRQStatsCommand):
15
+ """
16
+ Displays real-time RQ statistics in terminal.
17
+
18
+ Shows:
19
+ - Queue sizes (queued, started, finished, failed)
20
+ - Worker count and status
21
+ - Job processing rates
22
+ - Updates in real-time
23
+
24
+ Inherits all functionality from django-rq's rqstats command.
25
+
26
+ Common options:
27
+ --interval SECONDS Update interval (default: 1)
28
+ --raw Show raw numbers (no colors)
29
+ --only-queues Show only queue statistics
30
+ --only-workers Show only worker statistics
31
+ """
32
+
33
+ help = 'Shows real-time RQ statistics for django-cfg (wrapper for django-rq rqstats)'
@@ -0,0 +1,31 @@
1
+ """
2
+ Django-CFG wrapper for django-rq rqworker command.
3
+
4
+ This is a simple proxy that inherits all functionality from django-rq's rqworker.
5
+ Allows running: python manage.py rqworker [queues]
6
+
7
+ Example:
8
+ python manage.py rqworker default
9
+ python manage.py rqworker high default low
10
+ python manage.py rqworker default --with-scheduler
11
+ """
12
+
13
+ from django_rq.management.commands.rqworker import Command as DjangoRQWorkerCommand
14
+
15
+
16
+ class Command(DjangoRQWorkerCommand):
17
+ """
18
+ Runs RQ workers on specified queues.
19
+
20
+ Inherits all functionality from django-rq's rqworker command.
21
+ See django-rq documentation for available options.
22
+
23
+ Common options:
24
+ --burst Run in burst mode (exit when queue is empty)
25
+ --with-scheduler Run worker with embedded scheduler
26
+ --name NAME Custom worker name
27
+ --worker-ttl SEC Worker timeout (default: 420)
28
+ --sentry-dsn DSN Report exceptions to Sentry
29
+ """
30
+
31
+ help = 'Runs RQ workers for django-cfg (wrapper for django-rq rqworker)'
@@ -0,0 +1,27 @@
1
+ """
2
+ Django-CFG wrapper for django-rq rqworker-pool command.
3
+
4
+ Runs multiple RQ workers in a pool for better performance.
5
+
6
+ Example:
7
+ python manage.py rqworker_pool default --num-workers 4
8
+ python manage.py rqworker_pool high default --num-workers 8
9
+ """
10
+
11
+ from django_rq.management.commands.rqworker_pool import Command as DjangoRQWorkerPoolCommand
12
+
13
+
14
+ class Command(DjangoRQWorkerPoolCommand):
15
+ """
16
+ Runs a pool of RQ workers for improved throughput.
17
+
18
+ Inherits all functionality from django-rq's rqworker-pool command.
19
+ Creates multiple worker processes to handle jobs in parallel.
20
+
21
+ Common options:
22
+ --num-workers N Number of worker processes (default: CPU count)
23
+ --burst Run in burst mode
24
+ --name NAME Worker name prefix
25
+ """
26
+
27
+ help = 'Runs a pool of RQ workers for django-cfg (wrapper for django-rq rqworker-pool)'
@@ -0,0 +1,40 @@
1
+ """
2
+ DRF serializers for Django-RQ monitoring API.
3
+ """
4
+
5
+ from .health import HealthCheckSerializer, RQConfigSerializer
6
+ from .queue import QueueStatsSerializer, QueueDetailSerializer
7
+ from .worker import WorkerSerializer, WorkerStatsSerializer
8
+ from .job import JobListSerializer, JobDetailSerializer, JobActionResponseSerializer
9
+ from .schedule import (
10
+ ScheduleCreateSerializer,
11
+ ScheduledJobSerializer,
12
+ ScheduleActionResponseSerializer,
13
+ )
14
+ from .testing import (
15
+ TestScenarioSerializer,
16
+ RunDemoRequestSerializer,
17
+ StressTestRequestSerializer,
18
+ TestingActionResponseSerializer,
19
+ CleanupRequestSerializer,
20
+ )
21
+
22
+ __all__ = [
23
+ 'HealthCheckSerializer',
24
+ 'RQConfigSerializer',
25
+ 'QueueStatsSerializer',
26
+ 'QueueDetailSerializer',
27
+ 'WorkerSerializer',
28
+ 'WorkerStatsSerializer',
29
+ 'JobListSerializer',
30
+ 'JobDetailSerializer',
31
+ 'JobActionResponseSerializer',
32
+ 'ScheduleCreateSerializer',
33
+ 'ScheduledJobSerializer',
34
+ 'ScheduleActionResponseSerializer',
35
+ 'TestScenarioSerializer',
36
+ 'RunDemoRequestSerializer',
37
+ 'StressTestRequestSerializer',
38
+ 'TestingActionResponseSerializer',
39
+ 'CleanupRequestSerializer',
40
+ ]
@@ -0,0 +1,60 @@
1
+ """
2
+ Health check and configuration serializers for Django-RQ.
3
+ """
4
+
5
+ from rest_framework import serializers
6
+
7
+
8
+ class HealthCheckSerializer(serializers.Serializer):
9
+ """
10
+ Health check response serializer.
11
+
12
+ Provides overall RQ cluster health status.
13
+ """
14
+
15
+ status = serializers.CharField(help_text="Health status (healthy/degraded/unhealthy)")
16
+ worker_count = serializers.IntegerField(help_text="Total number of active workers")
17
+ queue_count = serializers.IntegerField(help_text="Number of configured queues")
18
+ total_jobs = serializers.IntegerField(help_text="Total jobs across all queues")
19
+ timestamp = serializers.DateTimeField(help_text="Health check timestamp")
20
+ enabled = serializers.BooleanField(help_text="RQ enabled status")
21
+ redis_connected = serializers.BooleanField(help_text="Redis connection status")
22
+ wrapper_url = serializers.CharField(
23
+ required=False,
24
+ allow_blank=True,
25
+ default="",
26
+ help_text="Wrapper URL (optional)"
27
+ )
28
+ has_api_key = serializers.BooleanField(
29
+ required=False,
30
+ default=False,
31
+ help_text="API key configured status"
32
+ )
33
+
34
+
35
+ class RQConfigSerializer(serializers.Serializer):
36
+ """
37
+ RQ configuration serializer.
38
+
39
+ Returns current RQ configuration from django-cfg.
40
+ """
41
+
42
+ enabled = serializers.BooleanField(help_text="RQ enabled status")
43
+ queues = serializers.DictField(help_text="Configured queues")
44
+ async_mode = serializers.BooleanField(
45
+ default=True, help_text="Async mode enabled"
46
+ )
47
+ show_admin_link = serializers.BooleanField(
48
+ default=True, help_text="Show admin link"
49
+ )
50
+ prometheus_enabled = serializers.BooleanField(
51
+ default=True, help_text="Prometheus metrics enabled"
52
+ )
53
+ api_token_configured = serializers.BooleanField(
54
+ default=False, help_text="API token is configured"
55
+ )
56
+ schedules = serializers.ListField(
57
+ required=False,
58
+ default=list,
59
+ help_text="Scheduled tasks from django-cfg config"
60
+ )
@@ -0,0 +1,100 @@
1
+ """
2
+ Job information serializers for Django-RQ.
3
+ """
4
+
5
+ from rest_framework import serializers
6
+
7
+
8
+ class JobListSerializer(serializers.Serializer):
9
+ """
10
+ Job list item serializer.
11
+
12
+ Provides basic job information for list views.
13
+ """
14
+
15
+ id = serializers.CharField(help_text="Job ID")
16
+ func_name = serializers.CharField(help_text="Function name")
17
+ created_at = serializers.DateTimeField(help_text="Job creation time")
18
+ status = serializers.CharField(
19
+ help_text="Job status (queued/started/finished/failed)"
20
+ )
21
+ queue = serializers.CharField(help_text="Queue name")
22
+ timeout = serializers.IntegerField(
23
+ allow_null=True, required=False, help_text="Job timeout in seconds"
24
+ )
25
+
26
+
27
+ class JobDetailSerializer(serializers.Serializer):
28
+ """
29
+ Detailed job information serializer.
30
+
31
+ Provides comprehensive job details including result and metadata.
32
+ """
33
+
34
+ id = serializers.CharField(help_text="Job ID")
35
+ func_name = serializers.CharField(help_text="Function name")
36
+ args = serializers.ListField(default=list, help_text="Function arguments")
37
+ kwargs = serializers.DictField(default=dict, help_text="Function keyword arguments")
38
+
39
+ # Status and timing
40
+ created_at = serializers.DateTimeField(help_text="Job creation time")
41
+ enqueued_at = serializers.DateTimeField(
42
+ allow_null=True, required=False, help_text="Job enqueue time"
43
+ )
44
+ started_at = serializers.DateTimeField(
45
+ allow_null=True, required=False, help_text="Job start time"
46
+ )
47
+ ended_at = serializers.DateTimeField(
48
+ allow_null=True, required=False, help_text="Job end time"
49
+ )
50
+ status = serializers.CharField(
51
+ help_text="Job status (queued/started/finished/failed)"
52
+ )
53
+
54
+ # Queue and worker
55
+ queue = serializers.CharField(help_text="Queue name")
56
+ worker_name = serializers.CharField(
57
+ allow_null=True, required=False, help_text="Worker name if started"
58
+ )
59
+
60
+ # Configuration
61
+ timeout = serializers.IntegerField(
62
+ allow_null=True, required=False, help_text="Job timeout in seconds"
63
+ )
64
+ result_ttl = serializers.IntegerField(
65
+ allow_null=True, required=False, help_text="Result TTL in seconds"
66
+ )
67
+ failure_ttl = serializers.IntegerField(
68
+ allow_null=True, required=False, help_text="Failure TTL in seconds"
69
+ )
70
+
71
+ # Result and error
72
+ result = serializers.JSONField(
73
+ allow_null=True, required=False, help_text="Job result if finished"
74
+ )
75
+ exc_info = serializers.CharField(
76
+ allow_null=True, required=False, help_text="Exception info if failed"
77
+ )
78
+
79
+ # Metadata
80
+ meta = serializers.DictField(default=dict, help_text="Job metadata")
81
+ dependency_ids = serializers.ListField(
82
+ child=serializers.CharField(),
83
+ default=list,
84
+ help_text="List of dependency job IDs",
85
+ )
86
+
87
+
88
+ class JobActionResponseSerializer(serializers.Serializer):
89
+ """
90
+ Job action response serializer.
91
+
92
+ Used for job management actions (requeue, delete, etc.).
93
+ """
94
+
95
+ success = serializers.BooleanField(help_text="Action success status")
96
+ message = serializers.CharField(help_text="Action result message")
97
+ job_id = serializers.CharField(help_text="Job ID")
98
+ action = serializers.CharField(
99
+ help_text="Action performed (requeue/delete/cancel)"
100
+ )
@@ -0,0 +1,80 @@
1
+ """
2
+ Queue statistics serializers for Django-RQ.
3
+ """
4
+
5
+ from rest_framework import serializers
6
+
7
+
8
+ class QueueStatsSerializer(serializers.Serializer):
9
+ """
10
+ Queue statistics serializer.
11
+
12
+ Provides basic queue statistics.
13
+ """
14
+
15
+ name = serializers.CharField(help_text="Queue name")
16
+ count = serializers.IntegerField(help_text="Total jobs in queue")
17
+ queued_jobs = serializers.IntegerField(
18
+ default=0, help_text="Jobs waiting to be processed"
19
+ )
20
+ started_jobs = serializers.IntegerField(
21
+ default=0, help_text="Jobs currently being processed"
22
+ )
23
+ finished_jobs = serializers.IntegerField(default=0, help_text="Completed jobs")
24
+ failed_jobs = serializers.IntegerField(default=0, help_text="Failed jobs")
25
+ deferred_jobs = serializers.IntegerField(default=0, help_text="Deferred jobs")
26
+ scheduled_jobs = serializers.IntegerField(default=0, help_text="Scheduled jobs")
27
+ workers = serializers.IntegerField(
28
+ default=0, help_text="Number of workers for this queue"
29
+ )
30
+
31
+
32
+ class QueueDetailSerializer(serializers.Serializer):
33
+ """
34
+ Detailed queue information serializer.
35
+
36
+ Provides comprehensive queue statistics and metadata.
37
+ """
38
+
39
+ name = serializers.CharField(help_text="Queue name")
40
+ count = serializers.IntegerField(help_text="Total jobs in queue")
41
+
42
+ # Job counts by status
43
+ queued_jobs = serializers.IntegerField(
44
+ default=0, help_text="Jobs waiting to be processed"
45
+ )
46
+ started_jobs = serializers.IntegerField(
47
+ default=0, help_text="Jobs currently being processed"
48
+ )
49
+ finished_jobs = serializers.IntegerField(default=0, help_text="Completed jobs")
50
+ failed_jobs = serializers.IntegerField(default=0, help_text="Failed jobs")
51
+ deferred_jobs = serializers.IntegerField(default=0, help_text="Deferred jobs")
52
+ scheduled_jobs = serializers.IntegerField(default=0, help_text="Scheduled jobs")
53
+
54
+ # Worker information
55
+ workers = serializers.IntegerField(
56
+ default=0, help_text="Number of workers for this queue"
57
+ )
58
+
59
+ # Metadata
60
+ oldest_job_timestamp = serializers.DateTimeField(
61
+ allow_null=True,
62
+ required=False,
63
+ help_text="Timestamp of oldest job in queue",
64
+ )
65
+ connection_kwargs = serializers.DictField(
66
+ default=dict, help_text="Redis connection parameters"
67
+ )
68
+ is_async = serializers.BooleanField(default=True, help_text="Queue is in async mode")
69
+
70
+
71
+ class QueueJobListSerializer(serializers.Serializer):
72
+ """
73
+ List of jobs in queue (simple view).
74
+ """
75
+
76
+ queue_name = serializers.CharField(help_text="Queue name")
77
+ total_jobs = serializers.IntegerField(help_text="Total number of jobs")
78
+ jobs = serializers.ListField(
79
+ child=serializers.CharField(), default=list, help_text="List of job IDs"
80
+ )
@@ -0,0 +1,178 @@
1
+ """
2
+ Schedule management serializers for Django-RQ.
3
+ """
4
+
5
+ from rest_framework import serializers
6
+
7
+
8
+ class ScheduleCreateSerializer(serializers.Serializer):
9
+ """
10
+ Serializer for creating a scheduled job.
11
+
12
+ Supports three scheduling methods:
13
+ 1. scheduled_time: Schedule job at specific time
14
+ 2. interval: Schedule job to repeat at intervals
15
+ 3. cron: Schedule job with cron expression
16
+ """
17
+
18
+ # Job configuration
19
+ func = serializers.CharField(
20
+ help_text="Function path (e.g., 'myapp.tasks.my_task')"
21
+ )
22
+ args = serializers.ListField(
23
+ default=list,
24
+ required=False,
25
+ help_text="Function arguments"
26
+ )
27
+ kwargs = serializers.DictField(
28
+ default=dict,
29
+ required=False,
30
+ help_text="Function keyword arguments"
31
+ )
32
+
33
+ # Queue configuration
34
+ queue_name = serializers.CharField(
35
+ default="default",
36
+ help_text="Queue name to schedule job in"
37
+ )
38
+
39
+ # Scheduling options (choose one)
40
+ scheduled_time = serializers.DateTimeField(
41
+ required=False,
42
+ allow_null=True,
43
+ help_text="Schedule job at specific time (ISO 8601)"
44
+ )
45
+ interval = serializers.IntegerField(
46
+ required=False,
47
+ allow_null=True,
48
+ min_value=1,
49
+ help_text="Schedule job to repeat every N seconds"
50
+ )
51
+ cron = serializers.CharField(
52
+ required=False,
53
+ allow_null=True,
54
+ help_text="Cron expression (e.g., '0 0 * * *' for daily at midnight)"
55
+ )
56
+
57
+ # Job options
58
+ timeout = serializers.IntegerField(
59
+ required=False,
60
+ allow_null=True,
61
+ help_text="Job timeout in seconds"
62
+ )
63
+ result_ttl = serializers.IntegerField(
64
+ required=False,
65
+ allow_null=True,
66
+ help_text="Result TTL in seconds"
67
+ )
68
+ repeat = serializers.IntegerField(
69
+ required=False,
70
+ allow_null=True,
71
+ help_text="Number of times to repeat (None = infinite)"
72
+ )
73
+ description = serializers.CharField(
74
+ required=False,
75
+ allow_null=True,
76
+ max_length=255,
77
+ help_text="Job description"
78
+ )
79
+
80
+ def validate(self, attrs):
81
+ """Validate that exactly one scheduling method is provided."""
82
+ scheduling_methods = [
83
+ attrs.get('scheduled_time'),
84
+ attrs.get('interval'),
85
+ attrs.get('cron'),
86
+ ]
87
+ provided_methods = [m for m in scheduling_methods if m is not None]
88
+
89
+ if len(provided_methods) == 0:
90
+ raise serializers.ValidationError(
91
+ "Must provide one of: scheduled_time, interval, or cron"
92
+ )
93
+
94
+ if len(provided_methods) > 1:
95
+ raise serializers.ValidationError(
96
+ "Can only provide one scheduling method: scheduled_time, interval, or cron"
97
+ )
98
+
99
+ return attrs
100
+
101
+
102
+ class ScheduledJobSerializer(serializers.Serializer):
103
+ """
104
+ Serializer for scheduled job information.
105
+ """
106
+
107
+ id = serializers.CharField(help_text="Job ID")
108
+ func = serializers.CharField(help_text="Function path")
109
+ args = serializers.ListField(default=list, help_text="Function arguments")
110
+ kwargs = serializers.DictField(default=dict, help_text="Function keyword arguments")
111
+
112
+ # Schedule info
113
+ queue_name = serializers.CharField(help_text="Queue name")
114
+ scheduled_time = serializers.DateTimeField(
115
+ allow_null=True,
116
+ required=False,
117
+ help_text="Next scheduled time"
118
+ )
119
+ interval = serializers.IntegerField(
120
+ allow_null=True,
121
+ required=False,
122
+ help_text="Repeat interval in seconds"
123
+ )
124
+ cron = serializers.CharField(
125
+ allow_null=True,
126
+ required=False,
127
+ help_text="Cron expression"
128
+ )
129
+
130
+ # Job options
131
+ timeout = serializers.IntegerField(
132
+ allow_null=True,
133
+ required=False,
134
+ help_text="Job timeout in seconds"
135
+ )
136
+ result_ttl = serializers.IntegerField(
137
+ allow_null=True,
138
+ required=False,
139
+ help_text="Result TTL in seconds"
140
+ )
141
+ repeat = serializers.IntegerField(
142
+ allow_null=True,
143
+ required=False,
144
+ help_text="Times to repeat (None = infinite)"
145
+ )
146
+ description = serializers.CharField(
147
+ allow_null=True,
148
+ required=False,
149
+ help_text="Job description"
150
+ )
151
+
152
+ # Metadata
153
+ created_at = serializers.DateTimeField(
154
+ allow_null=True,
155
+ required=False,
156
+ help_text="Job creation time"
157
+ )
158
+ meta = serializers.DictField(
159
+ default=dict,
160
+ help_text="Job metadata"
161
+ )
162
+
163
+
164
+ class ScheduleActionResponseSerializer(serializers.Serializer):
165
+ """
166
+ Response serializer for schedule actions (create/delete).
167
+ """
168
+
169
+ success = serializers.BooleanField(help_text="Action success status")
170
+ message = serializers.CharField(help_text="Action result message")
171
+ job_id = serializers.CharField(
172
+ required=False,
173
+ allow_null=True,
174
+ help_text="Job ID (for create action)"
175
+ )
176
+ action = serializers.CharField(
177
+ help_text="Action performed (create/delete/cancel)"
178
+ )