django-cfg 1.4.120__py3-none-any.whl → 1.5.2__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 (182) hide show
  1. django_cfg/__init__.py +8 -4
  2. django_cfg/apps/centrifugo/admin/centrifugo_log.py +33 -71
  3. django_cfg/apps/dashboard/TRANSACTION_FIX.md +73 -0
  4. django_cfg/apps/dashboard/serializers/__init__.py +0 -12
  5. django_cfg/apps/dashboard/serializers/activity.py +1 -1
  6. django_cfg/apps/dashboard/services/__init__.py +0 -2
  7. django_cfg/apps/dashboard/services/charts_service.py +4 -3
  8. django_cfg/apps/dashboard/services/statistics_service.py +11 -2
  9. django_cfg/apps/dashboard/services/system_health_service.py +64 -106
  10. django_cfg/apps/dashboard/urls.py +0 -2
  11. django_cfg/apps/dashboard/views/__init__.py +0 -2
  12. django_cfg/apps/dashboard/views/commands_views.py +3 -6
  13. django_cfg/apps/dashboard/views/overview_views.py +14 -13
  14. django_cfg/apps/grpc/__init__.py +9 -0
  15. django_cfg/apps/grpc/admin/__init__.py +11 -0
  16. django_cfg/apps/{tasks → grpc}/admin/config.py +32 -41
  17. django_cfg/apps/grpc/admin/grpc_request_log.py +252 -0
  18. django_cfg/apps/grpc/apps.py +28 -0
  19. django_cfg/apps/grpc/auth/__init__.py +9 -0
  20. django_cfg/apps/grpc/auth/jwt_auth.py +295 -0
  21. django_cfg/apps/grpc/interceptors/__init__.py +19 -0
  22. django_cfg/apps/grpc/interceptors/errors.py +241 -0
  23. django_cfg/apps/grpc/interceptors/logging.py +270 -0
  24. django_cfg/apps/grpc/interceptors/metrics.py +306 -0
  25. django_cfg/apps/grpc/interceptors/request_logger.py +515 -0
  26. django_cfg/apps/grpc/management/__init__.py +1 -0
  27. django_cfg/apps/grpc/management/commands/rungrpc.py +302 -0
  28. django_cfg/apps/grpc/managers/__init__.py +10 -0
  29. django_cfg/apps/grpc/managers/grpc_request_log.py +310 -0
  30. django_cfg/apps/grpc/migrations/0001_initial.py +69 -0
  31. django_cfg/apps/grpc/migrations/0002_rename_django_cfg__service_4c4a8e_idx_django_cfg__service_584308_idx_and_more.py +38 -0
  32. django_cfg/apps/grpc/models/__init__.py +9 -0
  33. django_cfg/apps/grpc/models/grpc_request_log.py +219 -0
  34. django_cfg/apps/grpc/serializers/__init__.py +23 -0
  35. django_cfg/apps/grpc/serializers/health.py +18 -0
  36. django_cfg/apps/grpc/serializers/requests.py +18 -0
  37. django_cfg/apps/grpc/serializers/services.py +50 -0
  38. django_cfg/apps/grpc/serializers/stats.py +22 -0
  39. django_cfg/apps/grpc/services/__init__.py +16 -0
  40. django_cfg/apps/grpc/services/base.py +375 -0
  41. django_cfg/apps/grpc/services/discovery.py +415 -0
  42. django_cfg/apps/grpc/urls.py +23 -0
  43. django_cfg/apps/grpc/utils/__init__.py +13 -0
  44. django_cfg/apps/grpc/utils/proto_gen.py +423 -0
  45. django_cfg/apps/grpc/views/__init__.py +9 -0
  46. django_cfg/apps/grpc/views/monitoring.py +497 -0
  47. django_cfg/apps/knowbase/apps.py +2 -2
  48. django_cfg/apps/maintenance/admin/api_key_admin.py +7 -9
  49. django_cfg/apps/maintenance/admin/site_admin.py +5 -4
  50. django_cfg/apps/newsletter/admin/newsletter_admin.py +12 -11
  51. django_cfg/apps/payments/admin/balance_admin.py +26 -36
  52. django_cfg/apps/payments/admin/payment_admin.py +65 -85
  53. django_cfg/apps/payments/admin/withdrawal_admin.py +65 -100
  54. django_cfg/apps/rq/__init__.py +9 -0
  55. django_cfg/apps/rq/apps.py +80 -0
  56. django_cfg/apps/rq/management/__init__.py +1 -0
  57. django_cfg/apps/rq/management/commands/__init__.py +1 -0
  58. django_cfg/apps/rq/management/commands/rqscheduler.py +31 -0
  59. django_cfg/apps/rq/management/commands/rqstats.py +33 -0
  60. django_cfg/apps/rq/management/commands/rqworker.py +31 -0
  61. django_cfg/apps/rq/management/commands/rqworker_pool.py +27 -0
  62. django_cfg/apps/rq/serializers/__init__.py +40 -0
  63. django_cfg/apps/rq/serializers/health.py +60 -0
  64. django_cfg/apps/rq/serializers/job.py +100 -0
  65. django_cfg/apps/rq/serializers/queue.py +80 -0
  66. django_cfg/apps/rq/serializers/schedule.py +178 -0
  67. django_cfg/apps/rq/serializers/testing.py +139 -0
  68. django_cfg/apps/rq/serializers/worker.py +58 -0
  69. django_cfg/apps/rq/services/__init__.py +25 -0
  70. django_cfg/apps/rq/services/config_helper.py +233 -0
  71. django_cfg/apps/rq/services/models/README.md +417 -0
  72. django_cfg/apps/rq/services/models/__init__.py +30 -0
  73. django_cfg/apps/rq/services/models/event.py +123 -0
  74. django_cfg/apps/rq/services/models/job.py +99 -0
  75. django_cfg/apps/rq/services/models/queue.py +92 -0
  76. django_cfg/apps/rq/services/models/worker.py +104 -0
  77. django_cfg/apps/rq/services/rq_converters.py +183 -0
  78. django_cfg/apps/rq/tasks/__init__.py +23 -0
  79. django_cfg/apps/rq/tasks/demo_tasks.py +284 -0
  80. django_cfg/apps/rq/urls.py +54 -0
  81. django_cfg/apps/rq/views/__init__.py +19 -0
  82. django_cfg/apps/rq/views/jobs.py +882 -0
  83. django_cfg/apps/rq/views/monitoring.py +248 -0
  84. django_cfg/apps/rq/views/queues.py +261 -0
  85. django_cfg/apps/rq/views/schedule.py +400 -0
  86. django_cfg/apps/rq/views/testing.py +761 -0
  87. django_cfg/apps/rq/views/workers.py +195 -0
  88. django_cfg/apps/urls.py +13 -8
  89. django_cfg/config.py +106 -0
  90. django_cfg/core/base/config_model.py +16 -26
  91. django_cfg/core/builders/apps_builder.py +7 -11
  92. django_cfg/core/generation/integration_generators/__init__.py +3 -6
  93. django_cfg/core/generation/integration_generators/django_rq.py +80 -0
  94. django_cfg/core/generation/integration_generators/grpc_generator.py +318 -0
  95. django_cfg/core/generation/orchestrator.py +15 -15
  96. django_cfg/core/integration/display/startup.py +6 -20
  97. django_cfg/mixins/__init__.py +2 -0
  98. django_cfg/mixins/superadmin_api.py +59 -0
  99. django_cfg/models/__init__.py +3 -3
  100. django_cfg/models/api/grpc/__init__.py +59 -0
  101. django_cfg/models/api/grpc/config.py +364 -0
  102. django_cfg/models/django/__init__.py +3 -3
  103. django_cfg/models/django/django_rq.py +621 -0
  104. django_cfg/models/django/revolution_legacy.py +1 -1
  105. django_cfg/modules/base.py +19 -6
  106. django_cfg/modules/django_admin/base/pydantic_admin.py +2 -2
  107. django_cfg/modules/django_admin/config/background_task_config.py +4 -4
  108. django_cfg/modules/django_admin/utils/__init__.py +41 -3
  109. django_cfg/modules/django_admin/utils/badges/__init__.py +13 -0
  110. django_cfg/modules/django_admin/utils/{badges.py → badges/status_badges.py} +3 -3
  111. django_cfg/modules/django_admin/utils/displays/__init__.py +13 -0
  112. django_cfg/modules/django_admin/utils/{displays.py → displays/data_displays.py} +2 -2
  113. django_cfg/modules/django_admin/utils/html/__init__.py +26 -0
  114. django_cfg/modules/django_admin/utils/html/badges.py +47 -0
  115. django_cfg/modules/django_admin/utils/html/base.py +167 -0
  116. django_cfg/modules/django_admin/utils/html/code.py +87 -0
  117. django_cfg/modules/django_admin/utils/html/composition.py +205 -0
  118. django_cfg/modules/django_admin/utils/html/formatting.py +231 -0
  119. django_cfg/modules/django_admin/utils/html/keyvalue.py +219 -0
  120. django_cfg/modules/django_admin/utils/html/markdown_integration.py +108 -0
  121. django_cfg/modules/django_admin/utils/html/progress.py +127 -0
  122. django_cfg/modules/django_admin/utils/html_builder.py +55 -408
  123. django_cfg/modules/django_admin/utils/markdown/__init__.py +21 -0
  124. django_cfg/modules/django_unfold/navigation.py +21 -18
  125. django_cfg/pyproject.toml +4 -6
  126. django_cfg/registry/core.py +4 -7
  127. django_cfg/registry/modules.py +6 -0
  128. django_cfg/static/frontend/admin.zip +0 -0
  129. django_cfg/templates/admin/constance/includes/results_list.html +73 -0
  130. django_cfg/templates/admin/index.html +187 -62
  131. django_cfg/templatetags/django_cfg.py +61 -1
  132. {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/METADATA +12 -4
  133. {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/RECORD +140 -96
  134. django_cfg/apps/dashboard/permissions.py +0 -48
  135. django_cfg/apps/dashboard/serializers/django_q2.py +0 -50
  136. django_cfg/apps/dashboard/services/django_q2_service.py +0 -159
  137. django_cfg/apps/dashboard/views/django_q2_views.py +0 -79
  138. django_cfg/apps/tasks/__init__.py +0 -64
  139. django_cfg/apps/tasks/admin/__init__.py +0 -4
  140. django_cfg/apps/tasks/admin/task_log.py +0 -265
  141. django_cfg/apps/tasks/apps.py +0 -15
  142. django_cfg/apps/tasks/filters/__init__.py +0 -10
  143. django_cfg/apps/tasks/filters/task_log.py +0 -121
  144. django_cfg/apps/tasks/migrations/0001_initial.py +0 -196
  145. django_cfg/apps/tasks/migrations/0002_delete_tasklog.py +0 -16
  146. django_cfg/apps/tasks/models/__init__.py +0 -4
  147. django_cfg/apps/tasks/models/task_log.py +0 -246
  148. django_cfg/apps/tasks/serializers/__init__.py +0 -28
  149. django_cfg/apps/tasks/serializers/task_log.py +0 -249
  150. django_cfg/apps/tasks/services/__init__.py +0 -10
  151. django_cfg/apps/tasks/services/client/__init__.py +0 -7
  152. django_cfg/apps/tasks/services/client/client.py +0 -234
  153. django_cfg/apps/tasks/services/config_helper.py +0 -63
  154. django_cfg/apps/tasks/services/sync.py +0 -204
  155. django_cfg/apps/tasks/urls.py +0 -16
  156. django_cfg/apps/tasks/views/__init__.py +0 -10
  157. django_cfg/apps/tasks/views/task_log.py +0 -41
  158. django_cfg/apps/tasks/views/task_log_base.py +0 -41
  159. django_cfg/apps/tasks/views/task_log_overview.py +0 -100
  160. django_cfg/apps/tasks/views/task_log_related.py +0 -41
  161. django_cfg/apps/tasks/views/task_log_stats.py +0 -91
  162. django_cfg/apps/tasks/views/task_log_timeline.py +0 -81
  163. django_cfg/core/generation/integration_generators/django_q2.py +0 -133
  164. django_cfg/core/generation/integration_generators/tasks.py +0 -88
  165. django_cfg/models/django/django_q2.py +0 -514
  166. django_cfg/models/tasks/__init__.py +0 -49
  167. django_cfg/models/tasks/backends.py +0 -122
  168. django_cfg/models/tasks/config.py +0 -209
  169. django_cfg/models/tasks/utils.py +0 -162
  170. django_cfg/modules/django_admin/utils/CODE_BLOCK_DOCS.md +0 -396
  171. django_cfg/modules/django_q2/README.md +0 -140
  172. django_cfg/modules/django_q2/__init__.py +0 -8
  173. django_cfg/modules/django_q2/apps.py +0 -107
  174. django_cfg/modules/django_q2/management/commands/__init__.py +0 -0
  175. django_cfg/modules/django_q2/management/commands/sync_django_q_schedules.py +0 -74
  176. /django_cfg/apps/{tasks/migrations → grpc/management/commands}/__init__.py +0 -0
  177. /django_cfg/{modules/django_q2/management → apps/grpc/migrations}/__init__.py +0 -0
  178. /django_cfg/modules/django_admin/utils/{mermaid_plugin.py → markdown/mermaid_plugin.py} +0 -0
  179. /django_cfg/modules/django_admin/utils/{markdown_renderer.py → markdown/renderer.py} +0 -0
  180. {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/WHEEL +0 -0
  181. {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/entry_points.txt +0 -0
  182. {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,284 @@
1
+ """
2
+ Demo tasks for RQ testing and simulation.
3
+
4
+ These tasks provide various scenarios for testing RQ functionality:
5
+ - Successful completion
6
+ - Failure scenarios
7
+ - Long-running tasks
8
+ - Progress tracking
9
+ - Crash simulation
10
+ - Retry logic
11
+ """
12
+
13
+ import time
14
+ import random
15
+ from django_cfg.modules.django_logging import get_logger
16
+
17
+ logger = get_logger("rq.demo_tasks")
18
+
19
+
20
+ def demo_success_task(duration: int = 2, message: str = "Demo task completed"):
21
+ """
22
+ Simple task that always succeeds.
23
+
24
+ Args:
25
+ duration: How long to run (seconds)
26
+ message: Custom message to return
27
+
28
+ Returns:
29
+ dict: Success result with message and metadata
30
+ """
31
+ logger.info(f"Starting demo_success_task (duration={duration}s)")
32
+ time.sleep(duration)
33
+
34
+ result = {
35
+ "status": "success",
36
+ "message": message,
37
+ "duration": duration,
38
+ "timestamp": time.time(),
39
+ }
40
+
41
+ logger.info(f"Completed demo_success_task: {result}")
42
+ return result
43
+
44
+
45
+ def demo_failure_task(error_message: str = "Simulated failure"):
46
+ """
47
+ Task that always fails with an exception.
48
+
49
+ Args:
50
+ error_message: Custom error message
51
+
52
+ Raises:
53
+ ValueError: Always raises this exception
54
+ """
55
+ logger.warning(f"Starting demo_failure_task (will fail with: {error_message})")
56
+ time.sleep(1)
57
+ raise ValueError(error_message)
58
+
59
+
60
+ def demo_slow_task(duration: int = 30, step_interval: int = 5):
61
+ """
62
+ Long-running task for testing worker timeouts and monitoring.
63
+
64
+ Args:
65
+ duration: Total duration (seconds)
66
+ step_interval: How often to log progress (seconds)
67
+
68
+ Returns:
69
+ dict: Success result with timing info
70
+ """
71
+ logger.info(f"Starting demo_slow_task (duration={duration}s)")
72
+
73
+ steps = duration // step_interval
74
+ for i in range(steps):
75
+ time.sleep(step_interval)
76
+ progress = ((i + 1) / steps) * 100
77
+ logger.info(f"Progress: {progress:.1f}%")
78
+
79
+ result = {
80
+ "status": "success",
81
+ "message": "Slow task completed",
82
+ "duration": duration,
83
+ "steps": steps,
84
+ }
85
+
86
+ logger.info(f"Completed demo_slow_task: {result}")
87
+ return result
88
+
89
+
90
+ def demo_progress_task(total_items: int = 100):
91
+ """
92
+ Task that updates progress in job meta.
93
+
94
+ Args:
95
+ total_items: Number of items to process
96
+
97
+ Returns:
98
+ dict: Success result with processed items count
99
+ """
100
+ from rq import get_current_job
101
+
102
+ logger.info(f"Starting demo_progress_task (items={total_items})")
103
+
104
+ job = get_current_job()
105
+
106
+ for i in range(total_items):
107
+ # Simulate work
108
+ time.sleep(0.1)
109
+
110
+ # Update progress in job meta
111
+ if job:
112
+ job.meta['progress'] = {
113
+ 'current': i + 1,
114
+ 'total': total_items,
115
+ 'percentage': ((i + 1) / total_items) * 100,
116
+ }
117
+ job.save_meta()
118
+
119
+ if (i + 1) % 10 == 0:
120
+ logger.info(f"Processed {i + 1}/{total_items} items")
121
+
122
+ result = {
123
+ "status": "success",
124
+ "message": "Progress task completed",
125
+ "processed_items": total_items,
126
+ }
127
+
128
+ logger.info(f"Completed demo_progress_task: {result}")
129
+ return result
130
+
131
+
132
+ def demo_crash_task():
133
+ """
134
+ Task that simulates a worker crash (raises SystemExit).
135
+
136
+ WARNING: This will actually crash the worker! Use with caution.
137
+
138
+ Raises:
139
+ SystemExit: Simulates worker crash
140
+ """
141
+ logger.warning("Starting demo_crash_task (will crash worker!)")
142
+ time.sleep(1)
143
+ raise SystemExit("Simulated worker crash")
144
+
145
+
146
+ def demo_retry_task(max_attempts: int = 3, fail_until_attempt: int = 2):
147
+ """
148
+ Task that fails N times before succeeding.
149
+
150
+ Useful for testing retry logic.
151
+
152
+ Args:
153
+ max_attempts: Maximum retry attempts
154
+ fail_until_attempt: Succeed on this attempt
155
+
156
+ Returns:
157
+ dict: Success result if attempt succeeds
158
+
159
+ Raises:
160
+ ValueError: If attempt should fail
161
+ """
162
+ from rq import get_current_job
163
+
164
+ job = get_current_job()
165
+
166
+ # Track attempt count in job meta
167
+ if job:
168
+ attempts = job.meta.get('attempts', 0) + 1
169
+ job.meta['attempts'] = attempts
170
+ job.save_meta()
171
+ else:
172
+ attempts = 1
173
+
174
+ logger.info(f"demo_retry_task attempt {attempts}/{max_attempts}")
175
+
176
+ if attempts < fail_until_attempt:
177
+ error_msg = f"Retry attempt {attempts} - failing until attempt {fail_until_attempt}"
178
+ logger.warning(error_msg)
179
+ raise ValueError(error_msg)
180
+
181
+ result = {
182
+ "status": "success",
183
+ "message": f"Succeeded on attempt {attempts}",
184
+ "attempts": attempts,
185
+ }
186
+
187
+ logger.info(f"Completed demo_retry_task: {result}")
188
+ return result
189
+
190
+
191
+ def demo_random_task(success_rate: float = 0.7):
192
+ """
193
+ Task that randomly succeeds or fails.
194
+
195
+ Args:
196
+ success_rate: Probability of success (0.0 to 1.0)
197
+
198
+ Returns:
199
+ dict: Success result if task succeeds
200
+
201
+ Raises:
202
+ ValueError: If task randomly fails
203
+ """
204
+ logger.info(f"Starting demo_random_task (success_rate={success_rate})")
205
+ time.sleep(2)
206
+
207
+ if random.random() < success_rate:
208
+ result = {
209
+ "status": "success",
210
+ "message": "Random task succeeded",
211
+ "success_rate": success_rate,
212
+ }
213
+ logger.info(f"demo_random_task succeeded: {result}")
214
+ return result
215
+ else:
216
+ error_msg = f"Random task failed (success_rate={success_rate})"
217
+ logger.warning(error_msg)
218
+ raise ValueError(error_msg)
219
+
220
+
221
+ def demo_memory_intensive_task(mb_to_allocate: int = 100):
222
+ """
223
+ Task that allocates memory for testing worker memory limits.
224
+
225
+ Args:
226
+ mb_to_allocate: Megabytes of memory to allocate
227
+
228
+ Returns:
229
+ dict: Success result with memory info
230
+ """
231
+ logger.info(f"Starting demo_memory_intensive_task (allocating {mb_to_allocate}MB)")
232
+
233
+ # Allocate memory (1MB = 1024*1024 bytes, store as list of integers)
234
+ data = []
235
+ chunk_size = 1024 * 1024 # 1MB chunks
236
+
237
+ for i in range(mb_to_allocate):
238
+ chunk = [0] * (chunk_size // 8) # 8 bytes per integer
239
+ data.append(chunk)
240
+
241
+ if (i + 1) % 10 == 0:
242
+ logger.info(f"Allocated {i + 1}MB")
243
+
244
+ time.sleep(2)
245
+
246
+ result = {
247
+ "status": "success",
248
+ "message": "Memory intensive task completed",
249
+ "mb_allocated": mb_to_allocate,
250
+ }
251
+
252
+ logger.info(f"Completed demo_memory_intensive_task: {result}")
253
+ return result
254
+
255
+
256
+ def demo_cpu_intensive_task(iterations: int = 1000000):
257
+ """
258
+ CPU-intensive task for testing worker CPU limits.
259
+
260
+ Args:
261
+ iterations: Number of iterations to compute
262
+
263
+ Returns:
264
+ dict: Success result with computation info
265
+ """
266
+ logger.info(f"Starting demo_cpu_intensive_task (iterations={iterations})")
267
+
268
+ # Perform CPU-intensive calculation
269
+ result_value = 0
270
+ for i in range(iterations):
271
+ result_value += i ** 2
272
+
273
+ if (i + 1) % 100000 == 0:
274
+ logger.info(f"Processed {i + 1}/{iterations} iterations")
275
+
276
+ result = {
277
+ "status": "success",
278
+ "message": "CPU intensive task completed",
279
+ "iterations": iterations,
280
+ "result": result_value,
281
+ }
282
+
283
+ logger.info(f"Completed demo_cpu_intensive_task: {result}")
284
+ return result
@@ -0,0 +1,54 @@
1
+ """
2
+ URL patterns for Django-RQ monitoring and management API.
3
+
4
+ Public API endpoints for RQ task queue monitoring, job management,
5
+ queue management, worker monitoring, and schedule management.
6
+
7
+ Endpoints:
8
+ /rq/monitor/ - Monitoring, health checks, and metrics
9
+ /rq/queues/ - Queue management (list, details, empty)
10
+ /rq/workers/ - Worker monitoring and statistics
11
+ /rq/jobs/ - Job management (view, cancel, requeue, delete)
12
+ /rq/schedules/ - Schedule management (create, list, cancel)
13
+ /rq/testing/ - Testing and simulation (demo tasks, stress tests)
14
+ """
15
+
16
+ from django.urls import include, path
17
+ from rest_framework import routers
18
+
19
+ from .views import (
20
+ RQMonitorViewSet,
21
+ QueueViewSet,
22
+ WorkerViewSet,
23
+ JobViewSet,
24
+ ScheduleViewSet,
25
+ TestingViewSet,
26
+ )
27
+
28
+ app_name = 'django_cfg_rq'
29
+
30
+ # Create router
31
+ router = routers.DefaultRouter()
32
+
33
+ # Monitoring endpoints (health, config, metrics)
34
+ router.register(r'monitor', RQMonitorViewSet, basename='monitor')
35
+
36
+ # Queue management endpoints
37
+ router.register(r'queues', QueueViewSet, basename='queues')
38
+
39
+ # Worker monitoring endpoints
40
+ router.register(r'workers', WorkerViewSet, basename='workers')
41
+
42
+ # Job management endpoints
43
+ router.register(r'jobs', JobViewSet, basename='jobs')
44
+
45
+ # Schedule management endpoints (requires rq-scheduler)
46
+ router.register(r'schedules', ScheduleViewSet, basename='schedules')
47
+
48
+ # Testing and simulation endpoints (admin-only)
49
+ router.register(r'testing', TestingViewSet, basename='testing')
50
+
51
+ urlpatterns = [
52
+ # Include router URLs
53
+ path('', include(router.urls)),
54
+ ]
@@ -0,0 +1,19 @@
1
+ """
2
+ Views for Django-RQ monitoring and management API.
3
+ """
4
+
5
+ from .monitoring import RQMonitorViewSet
6
+ from .queues import QueueViewSet
7
+ from .workers import WorkerViewSet
8
+ from .jobs import JobViewSet
9
+ from .schedule import ScheduleViewSet
10
+ from .testing import TestingViewSet
11
+
12
+ __all__ = [
13
+ 'RQMonitorViewSet',
14
+ 'QueueViewSet',
15
+ 'WorkerViewSet',
16
+ 'JobViewSet',
17
+ 'ScheduleViewSet',
18
+ 'TestingViewSet',
19
+ ]