django-cfg 1.4.106__py3-none-any.whl → 1.4.108__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 (137) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/views/profile.py +19 -9
  3. django_cfg/apps/centrifugo/views/admin_api.py +4 -7
  4. django_cfg/apps/centrifugo/views/monitoring.py +3 -6
  5. django_cfg/apps/centrifugo/views/testing_api.py +3 -6
  6. django_cfg/apps/dashboard/services/system_health_service.py +16 -11
  7. django_cfg/apps/dashboard/views/activity_views.py +3 -5
  8. django_cfg/apps/dashboard/views/apizones_views.py +4 -5
  9. django_cfg/apps/dashboard/views/charts_views.py +4 -5
  10. django_cfg/apps/dashboard/views/overview_views.py +4 -5
  11. django_cfg/apps/dashboard/views/statistics_views.py +4 -5
  12. django_cfg/apps/dashboard/views/system_views.py +4 -5
  13. django_cfg/apps/knowbase/__init__.py +2 -2
  14. django_cfg/apps/knowbase/apps.py +2 -8
  15. django_cfg/apps/knowbase/views/base.py +9 -4
  16. django_cfg/apps/support/views/api.py +16 -7
  17. django_cfg/apps/tasks/__init__.py +61 -2
  18. django_cfg/apps/tasks/admin/__init__.py +3 -10
  19. django_cfg/apps/tasks/admin/config.py +98 -0
  20. django_cfg/apps/tasks/admin/task_log.py +265 -0
  21. django_cfg/apps/tasks/apps.py +7 -9
  22. django_cfg/apps/tasks/filters/__init__.py +10 -0
  23. django_cfg/apps/tasks/filters/task_log.py +121 -0
  24. django_cfg/apps/tasks/migrations/0001_initial.py +196 -0
  25. django_cfg/apps/tasks/models/__init__.py +4 -0
  26. django_cfg/apps/tasks/models/task_log.py +246 -0
  27. django_cfg/apps/tasks/serializers/__init__.py +28 -0
  28. django_cfg/apps/tasks/serializers/task_log.py +249 -0
  29. django_cfg/apps/tasks/services/__init__.py +10 -0
  30. django_cfg/apps/tasks/services/client/__init__.py +7 -0
  31. django_cfg/apps/tasks/services/client/client.py +234 -0
  32. django_cfg/apps/tasks/services/config_helper.py +63 -0
  33. django_cfg/apps/tasks/services/sync.py +204 -0
  34. django_cfg/apps/tasks/urls.py +7 -13
  35. django_cfg/apps/tasks/views/__init__.py +4 -10
  36. django_cfg/apps/tasks/views/task_log.py +41 -0
  37. django_cfg/apps/tasks/views/task_log_base.py +41 -0
  38. django_cfg/apps/tasks/views/task_log_overview.py +100 -0
  39. django_cfg/apps/tasks/views/task_log_related.py +41 -0
  40. django_cfg/apps/tasks/views/task_log_stats.py +91 -0
  41. django_cfg/apps/tasks/views/task_log_timeline.py +81 -0
  42. django_cfg/apps/urls.py +0 -1
  43. django_cfg/cli/commands/info.py +1 -1
  44. django_cfg/cli/utils.py +1 -1
  45. django_cfg/core/base/config_model.py +1 -1
  46. django_cfg/core/builders/apps_builder.py +1 -1
  47. django_cfg/core/generation/integration_generators/__init__.py +1 -1
  48. django_cfg/core/generation/integration_generators/tasks.py +14 -18
  49. django_cfg/core/generation/security_generators/crypto_fields.py +2 -1
  50. django_cfg/core/integration/display/startup.py +1 -1
  51. django_cfg/mixins/__init__.py +12 -0
  52. django_cfg/mixins/admin_api.py +37 -0
  53. django_cfg/mixins/client_api.py +39 -0
  54. django_cfg/models/django/constance.py +2 -8
  55. django_cfg/models/django/crypto_fields.py +13 -48
  56. django_cfg/models/tasks/__init__.py +8 -10
  57. django_cfg/models/tasks/backends.py +76 -207
  58. django_cfg/models/tasks/config.py +20 -127
  59. django_cfg/models/tasks/utils.py +17 -29
  60. django_cfg/modules/django_admin/RESOURCE_CONFIG_ENHANCEMENT.md +350 -0
  61. django_cfg/modules/django_admin/__init__.py +4 -0
  62. django_cfg/modules/django_admin/base/pydantic_admin.py +70 -15
  63. django_cfg/modules/django_admin/config/__init__.py +4 -0
  64. django_cfg/modules/django_admin/config/admin_config.py +13 -1
  65. django_cfg/modules/django_admin/config/background_task_config.py +76 -0
  66. django_cfg/modules/django_admin/config/resource_config.py +129 -0
  67. django_cfg/modules/django_client/management/commands/generate_client.py +13 -1
  68. django_cfg/modules/django_unfold/navigation.py +121 -22
  69. django_cfg/pyproject.toml +2 -2
  70. django_cfg/registry/core.py +1 -1
  71. django_cfg/static/frontend/admin.zip +0 -0
  72. {django_cfg-1.4.106.dist-info → django_cfg-1.4.108.dist-info}/METADATA +5 -3
  73. {django_cfg-1.4.106.dist-info → django_cfg-1.4.108.dist-info}/RECORD +77 -111
  74. django_cfg/apps/tasks/admin/actions.py +0 -29
  75. django_cfg/apps/tasks/admin/tasks_admin.py +0 -154
  76. django_cfg/apps/tasks/api/serializers.py +0 -82
  77. django_cfg/apps/tasks/api/views.py +0 -571
  78. django_cfg/apps/tasks/serializers.py +0 -82
  79. django_cfg/apps/tasks/static/tasks/css/dashboard-alpine.css +0 -299
  80. django_cfg/apps/tasks/static/tasks/css/dashboard.css +0 -120
  81. django_cfg/apps/tasks/static/tasks/js/alpine/README.md +0 -47
  82. django_cfg/apps/tasks/static/tasks/js/alpine/actions/index.js +0 -8
  83. django_cfg/apps/tasks/static/tasks/js/alpine/actions/management.js +0 -123
  84. django_cfg/apps/tasks/static/tasks/js/alpine/actions/pagination.js +0 -21
  85. django_cfg/apps/tasks/static/tasks/js/alpine/actions/tasks.js +0 -101
  86. django_cfg/apps/tasks/static/tasks/js/alpine/actions/workers.js +0 -59
  87. django_cfg/apps/tasks/static/tasks/js/alpine/computed.js +0 -35
  88. django_cfg/apps/tasks/static/tasks/js/alpine/index.js +0 -148
  89. django_cfg/apps/tasks/static/tasks/js/alpine/loaders/index.js +0 -36
  90. django_cfg/apps/tasks/static/tasks/js/alpine/loaders/overview.js +0 -37
  91. django_cfg/apps/tasks/static/tasks/js/alpine/loaders/queues.js +0 -27
  92. django_cfg/apps/tasks/static/tasks/js/alpine/loaders/tasks.js +0 -32
  93. django_cfg/apps/tasks/static/tasks/js/alpine/loaders/workers.js +0 -21
  94. django_cfg/apps/tasks/static/tasks/js/alpine/state.js +0 -36
  95. django_cfg/apps/tasks/static/tasks/js/alpine/utils/formatters.js +0 -42
  96. django_cfg/apps/tasks/static/tasks/js/alpine/utils/helpers.js +0 -68
  97. django_cfg/apps/tasks/static/tasks/js/dashboard-alpine.js +0 -725
  98. django_cfg/apps/tasks/tasks/__init__.py +0 -10
  99. django_cfg/apps/tasks/tasks/demo_tasks.py +0 -127
  100. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +0 -71
  101. django_cfg/apps/tasks/templates/tasks/components/overview_content.html +0 -94
  102. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +0 -44
  103. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +0 -45
  104. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -151
  105. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +0 -61
  106. django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +0 -269
  107. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +0 -60
  108. django_cfg/apps/tasks/templates/tasks/layout/base.html +0 -20
  109. django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +0 -168
  110. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +0 -77
  111. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +0 -40
  112. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +0 -40
  113. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +0 -86
  114. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +0 -90
  115. django_cfg/apps/tasks/urls_admin.py +0 -15
  116. django_cfg/apps/tasks/utils/__init__.py +0 -1
  117. django_cfg/apps/tasks/utils/simulator.py +0 -353
  118. django_cfg/apps/tasks/views/api.py +0 -571
  119. django_cfg/apps/tasks/views/dashboard.py +0 -89
  120. django_cfg/management/commands/rundramatiq.py +0 -24
  121. django_cfg/management/commands/rundramatiq_simulator.py +0 -22
  122. django_cfg/management/commands/task_clear.py +0 -25
  123. django_cfg/management/commands/task_status.py +0 -24
  124. django_cfg/modules/django_tasks/__init__.py +0 -29
  125. django_cfg/modules/django_tasks/dramatiq_setup.py +0 -20
  126. django_cfg/modules/django_tasks/factory.py +0 -127
  127. django_cfg/modules/django_tasks/management/commands/__init__.py +0 -0
  128. django_cfg/modules/django_tasks/management/commands/rundramatiq.py +0 -253
  129. django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +0 -436
  130. django_cfg/modules/django_tasks/management/commands/task_clear.py +0 -226
  131. django_cfg/modules/django_tasks/management/commands/task_status.py +0 -257
  132. django_cfg/modules/django_tasks/service.py +0 -281
  133. django_cfg/modules/django_tasks/settings.py +0 -107
  134. /django_cfg/{modules/django_tasks/management → apps/tasks/migrations}/__init__.py +0 -0
  135. {django_cfg-1.4.106.dist-info → django_cfg-1.4.108.dist-info}/WHEEL +0 -0
  136. {django_cfg-1.4.106.dist-info → django_cfg-1.4.108.dist-info}/entry_points.txt +0 -0
  137. {django_cfg-1.4.106.dist-info → django_cfg-1.4.108.dist-info}/licenses/LICENSE +0 -0
@@ -1,10 +0,0 @@
1
- """
2
- Tasks package for Django CFG Tasks app.
3
-
4
- This package contains Dramatiq actors for background task processing.
5
- """
6
-
7
- # Import all task modules to ensure actors are registered
8
- from . import demo_tasks
9
-
10
- __all__ = ['demo_tasks']
@@ -1,127 +0,0 @@
1
- """
2
- Demo tasks for Tasks Dashboard demonstration.
3
-
4
- These tasks are used to generate test data for the dashboard
5
- and demonstrate different queue behaviors and execution times.
6
- """
7
-
8
- import logging
9
- import random
10
- import time
11
- from datetime import datetime
12
-
13
- import dramatiq
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
-
18
- @dramatiq.actor(queue_name='default')
19
- def quick_task(task_id: str, duration: int = 2):
20
- """Quick processing task (2-3 seconds)."""
21
- logger.info(f'🚀 Quick task {task_id} started at {datetime.now().strftime("%H:%M:%S")}')
22
- time.sleep(duration)
23
- logger.info(f'✅ Quick task {task_id} completed in {duration}s')
24
-
25
-
26
- @dramatiq.actor(queue_name='background')
27
- def medium_task(task_id: str, duration: int = 5):
28
- """Medium processing task (5-8 seconds)."""
29
- logger.info(f'🔄 Medium task {task_id} started at {datetime.now().strftime("%H:%M:%S")}')
30
- time.sleep(duration)
31
- logger.info(f'✅ Medium task {task_id} completed in {duration}s')
32
-
33
-
34
- @dramatiq.actor(queue_name='low')
35
- def slow_task(task_id: str, duration: int = 10):
36
- """Slow processing task (10-15 seconds)."""
37
- logger.info(f'🐌 Slow task {task_id} started at {datetime.now().strftime("%H:%M:%S")}')
38
- time.sleep(duration)
39
- logger.info(f'✅ Slow task {task_id} completed in {duration}s')
40
-
41
-
42
- @dramatiq.actor(queue_name='critical')
43
- def critical_task(task_id: str, duration: int = 3):
44
- """Critical processing task (2-4 seconds)."""
45
- logger.info(f'🔥 Critical task {task_id} started at {datetime.now().strftime("%H:%M:%S")}')
46
- time.sleep(duration)
47
- logger.info(f'✅ Critical task {task_id} completed in {duration}s')
48
-
49
-
50
- @dramatiq.actor(queue_name='payments')
51
- def payment_task(task_id: str, amount: float):
52
- """Payment processing task (1-3 seconds)."""
53
- duration = random.randint(1, 3)
54
- logger.info(f'💳 Payment task {task_id} processing ${amount} at {datetime.now().strftime("%H:%M:%S")}')
55
- time.sleep(duration)
56
- logger.info(f'✅ Payment task {task_id} completed in {duration}s')
57
-
58
-
59
- @dramatiq.actor(queue_name='agents')
60
- def agent_task(task_id: str, query: str):
61
- """AI agent processing task (3-7 seconds)."""
62
- duration = random.randint(3, 7)
63
- logger.info(f'🤖 Agent task {task_id} processing query "{query}" at {datetime.now().strftime("%H:%M:%S")}')
64
- time.sleep(duration)
65
- logger.info(f'✅ Agent task {task_id} completed in {duration}s')
66
-
67
-
68
- @dramatiq.actor(queue_name='high')
69
- def priority_task(task_id: str, priority_level: str):
70
- """High priority task (1-4 seconds)."""
71
- duration = random.randint(1, 4)
72
- logger.info(f'⚡ Priority task {task_id} ({priority_level}) started at {datetime.now().strftime("%H:%M:%S")}')
73
- time.sleep(duration)
74
- logger.info(f'✅ Priority task {task_id} completed in {duration}s')
75
-
76
-
77
- def generate_demo_tasks() -> int:
78
- """
79
- Generate a variety of demo tasks for dashboard demonstration.
80
-
81
- Returns:
82
- Number of tasks created
83
- """
84
- tasks_count = 0
85
-
86
- # Quick tasks (3-5 tasks)
87
- for i in range(random.randint(3, 5)):
88
- quick_task.send(f'quick_{i+1}', random.randint(2, 3))
89
- tasks_count += 1
90
-
91
- # Medium tasks (2-4 tasks)
92
- for i in range(random.randint(2, 4)):
93
- medium_task.send(f'medium_{i+1}', random.randint(5, 8))
94
- tasks_count += 1
95
-
96
- # Slow tasks (1-2 tasks)
97
- for i in range(random.randint(1, 2)):
98
- slow_task.send(f'slow_{i+1}', random.randint(10, 15))
99
- tasks_count += 1
100
-
101
- # Critical tasks (2-3 tasks)
102
- for i in range(random.randint(2, 3)):
103
- critical_task.send(f'critical_{i+1}', random.randint(2, 4))
104
- tasks_count += 1
105
-
106
- # Payment tasks (1-3 tasks)
107
- for i in range(random.randint(1, 3)):
108
- amount = round(random.uniform(10.0, 500.0), 2)
109
- payment_task.send(f'payment_{i+1}', amount)
110
- tasks_count += 1
111
-
112
- # Agent tasks (1-2 tasks)
113
- for i in range(random.randint(1, 2)):
114
- queries = ['analyze data', 'generate report', 'process document', 'classify content']
115
- query = random.choice(queries)
116
- agent_task.send(f'agent_{i+1}', query)
117
- tasks_count += 1
118
-
119
- # Priority tasks (1-2 tasks)
120
- for i in range(random.randint(1, 2)):
121
- priority_levels = ['urgent', 'high', 'critical']
122
- priority = random.choice(priority_levels)
123
- priority_task.send(f'priority_{i+1}', priority)
124
- tasks_count += 1
125
-
126
- logger.info(f"Generated {tasks_count} demo tasks across all queues")
127
- return tasks_count
@@ -1,71 +0,0 @@
1
- <!-- Management Actions -->
2
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 mb-6">
3
- <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
4
- <h2 class="text-lg font-semibold text-gray-900 dark:text-white flex items-center">
5
- <span class="material-icons text-primary-600 dark:text-primary-400 mr-2">settings</span>
6
- Management Actions
7
- </h2>
8
- </div>
9
-
10
- <div class="p-4">
11
- <!-- All Actions in One Row -->
12
- <div class="flex flex-wrap gap-3">
13
- <!-- Primary Actions -->
14
- <button @click="simulateTasks(5)"
15
- :disabled="loading"
16
- class="inline-flex items-center px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white text-sm rounded-lg border border-blue-600 transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed">
17
- <span class="material-icons text-sm mr-2">science</span>
18
- Simulate Data
19
- </button>
20
-
21
- <button @click="clearAllTasks()"
22
- :disabled="loading"
23
- class="inline-flex items-center px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white text-sm rounded-lg border border-orange-600 transition-colors focus:outline-none focus:ring-2 focus:ring-orange-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed">
24
- <span class="material-icons text-sm mr-2">clear_all</span>
25
- Clear Data
26
- </button>
27
-
28
- <!-- Secondary Actions -->
29
- <button @click="clearAllQueues()"
30
- :disabled="loading"
31
- class="inline-flex items-center px-4 py-2 bg-red-600 hover:bg-red-700 text-white text-sm rounded-lg border border-red-600 transition-colors focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed">
32
- <span class="material-icons text-sm mr-2">delete_sweep</span>
33
- Clear Queues
34
- </button>
35
-
36
- <button @click="purgeFailedTasks()"
37
- :disabled="loading"
38
- class="inline-flex items-center px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white text-sm rounded-lg border border-purple-600 transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed">
39
- <span class="material-icons text-sm mr-2">cleaning_services</span>
40
- Purge Failed
41
- </button>
42
- </div>
43
-
44
- <!-- Action Status (Managed by Alpine.js state) -->
45
- <div x-show="actionMessage" x-cloak class="mt-4">
46
- <div class="p-3 rounded-lg"
47
- :class="{
48
- 'bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800': actionType === 'info',
49
- 'bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800': actionType === 'success',
50
- 'bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800': actionType === 'error'
51
- }">
52
- <div class="flex items-center">
53
- <span class="material-icons text-sm mr-2"
54
- :class="{
55
- 'text-blue-600 dark:text-blue-400': actionType === 'info',
56
- 'text-green-600 dark:text-green-400': actionType === 'success',
57
- 'text-red-600 dark:text-red-400': actionType === 'error'
58
- }"
59
- x-text="actionType === 'success' ? 'check_circle' : (actionType === 'error' ? 'error' : 'info')"></span>
60
- <span class="text-sm"
61
- :class="{
62
- 'text-blue-800 dark:text-blue-200': actionType === 'info',
63
- 'text-green-800 dark:text-green-200': actionType === 'success',
64
- 'text-red-800 dark:text-red-200': actionType === 'error'
65
- }"
66
- x-text="actionMessage"></span>
67
- </div>
68
- </div>
69
- </div>
70
- </div>
71
- </div>
@@ -1,94 +0,0 @@
1
- <!-- Overview Content -->
2
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
3
- <!-- Status Cards -->
4
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6 card-hover">
5
- <div class="flex items-center">
6
- <div class="flex-shrink-0">
7
- <span class="material-icons text-2xl text-blue-600 dark:text-blue-400">queue</span>
8
- </div>
9
- <div class="ml-4">
10
- <p class="text-sm font-medium text-gray-500 dark:text-gray-400">Active Queues</p>
11
- <p class="text-2xl font-semibold text-gray-900 dark:text-white" x-text="stats.active_queues || 0"></p>
12
- </div>
13
- </div>
14
- </div>
15
-
16
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6 card-hover">
17
- <div class="flex items-center">
18
- <div class="flex-shrink-0">
19
- <span class="material-icons text-2xl text-green-600 dark:text-green-400">engineering</span>
20
- </div>
21
- <div class="ml-4">
22
- <p class="text-sm font-medium text-gray-500 dark:text-gray-400">Workers</p>
23
- <p class="text-2xl font-semibold text-gray-900 dark:text-white" x-text="stats.workers || 0"></p>
24
- </div>
25
- </div>
26
- </div>
27
-
28
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6 card-hover">
29
- <div class="flex items-center">
30
- <div class="flex-shrink-0">
31
- <span class="material-icons text-2xl text-yellow-600 dark:text-yellow-400">schedule</span>
32
- </div>
33
- <div class="ml-4">
34
- <p class="text-sm font-medium text-gray-500 dark:text-gray-400">Pending Tasks</p>
35
- <p class="text-2xl font-semibold text-gray-900 dark:text-white" x-text="stats.pending_tasks || 0"></p>
36
- </div>
37
- </div>
38
- </div>
39
-
40
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6 card-hover">
41
- <div class="flex items-center">
42
- <div class="flex-shrink-0">
43
- <span class="material-icons text-2xl text-red-600 dark:text-red-400">error</span>
44
- </div>
45
- <div class="ml-4">
46
- <p class="text-sm font-medium text-gray-500 dark:text-gray-400">Failed Tasks</p>
47
- <p class="text-2xl font-semibold text-gray-900 dark:text-white" x-text="stats.failed_tasks || 0"></p>
48
- </div>
49
- </div>
50
- </div>
51
- </div>
52
-
53
- <!-- System Status -->
54
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
55
- <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
56
- <h2 class="text-lg font-semibold text-gray-900 dark:text-white flex items-center">
57
- <span class="material-icons text-primary-600 dark:text-primary-400 mr-2">monitor_heart</span>
58
- System Status
59
- </h2>
60
- </div>
61
- <div class="p-6">
62
- <!-- Loading State -->
63
- <div x-show="loading && Object.keys(stats).length === 0" x-cloak>
64
- <div class="flex items-center justify-center py-12">
65
- <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600"></div>
66
- <span class="ml-3 text-gray-600 dark:text-gray-400">Loading status...</span>
67
- </div>
68
- </div>
69
-
70
- <!-- Stats Grid -->
71
- <div x-show="!loading || Object.keys(stats).length > 0" x-cloak>
72
- <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
73
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
74
- <div class="text-xs text-gray-600 dark:text-gray-400 mb-1">Total Tasks</div>
75
- <div class="text-xl font-bold text-gray-900 dark:text-white" x-text="stats.total_tasks || 0"></div>
76
- </div>
77
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
78
- <div class="text-xs text-gray-600 dark:text-gray-400 mb-1">Completed</div>
79
- <div class="text-xl font-bold text-green-600 dark:text-green-400" x-text="stats.completed_tasks || 0"></div>
80
- </div>
81
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
82
- <div class="text-xs text-gray-600 dark:text-gray-400 mb-1">Running</div>
83
- <div class="text-xl font-bold text-blue-600 dark:text-blue-400" x-text="stats.running_tasks || 0"></div>
84
- </div>
85
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
86
- <div class="text-xs text-gray-600 dark:text-gray-400 mb-1">Success Rate</div>
87
- <div class="text-xl font-bold text-gray-900 dark:text-white">
88
- <span x-text="stats.success_rate ? (stats.success_rate * 100).toFixed(1) : '0.0'"></span>%
89
- </div>
90
- </div>
91
- </div>
92
- </div>
93
- </div>
94
- </div>
@@ -1,44 +0,0 @@
1
- <!-- Queues Content -->
2
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
3
- <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between">
4
- <h2 class="text-lg font-semibold text-gray-900 dark:text-white flex items-center">
5
- <span class="material-icons text-blue-600 dark:text-blue-400 mr-2">queue</span>
6
- Queue Details
7
- </h2>
8
- <button @click="loadQueues()"
9
- :disabled="loading"
10
- class="inline-flex items-center px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white text-sm rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
11
- <span class="material-icons text-sm" :class="{ 'animate-spin': loading }">refresh</span>
12
- </button>
13
- </div>
14
- <div class="p-6">
15
- <!-- Loading State -->
16
- <div x-show="loading && queues.length === 0" x-cloak>
17
- <p class="text-gray-600 dark:text-gray-400">Loading queues...</p>
18
- </div>
19
-
20
- <!-- Empty State -->
21
- <div x-show="!loading && queues.length === 0" x-cloak>
22
- <p class="text-gray-600 dark:text-gray-400">No queues found.</p>
23
- </div>
24
-
25
- <!-- Queues List -->
26
- <div x-show="queues.length > 0" x-cloak>
27
- <div class="space-y-3">
28
- <template x-for="queue in queues" :key="queue.name">
29
- <div class="p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
30
- <div class="flex items-center justify-between">
31
- <div>
32
- <h3 class="font-medium text-gray-900 dark:text-white" x-text="queue.name"></h3>
33
- <p class="text-sm text-gray-600 dark:text-gray-400" x-text="queue.size + ' tasks'"></p>
34
- </div>
35
- <div class="px-3 py-1 text-xs rounded-full"
36
- :class="queue.is_active ? 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200' : 'bg-gray-100 dark:bg-gray-600 text-gray-800 dark:text-gray-200'"
37
- x-text="queue.is_active ? 'Active' : 'Inactive'"></div>
38
- </div>
39
- </div>
40
- </template>
41
- </div>
42
- </div>
43
- </div>
44
- </div>
@@ -1,45 +0,0 @@
1
- <!-- Tab Navigation -->
2
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
3
- <div class="border-b border-gray-200 dark:border-gray-700">
4
- <nav class="-mb-px flex space-x-8 px-6" aria-label="Tabs">
5
- <button @click="activeTab = 'overview'"
6
- class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm flex items-center gap-2 transition-colors"
7
- :class="activeTab === 'overview'
8
- ? 'border-primary-500 text-primary-600 dark:text-primary-400'
9
- : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'">
10
- <span class="material-icons text-sm">dashboard</span>
11
- <span>Overview</span>
12
- </button>
13
-
14
- <button @click="activeTab = 'queues'"
15
- class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm flex items-center gap-2 transition-colors"
16
- :class="activeTab === 'queues'
17
- ? 'border-primary-500 text-primary-600 dark:text-primary-400'
18
- : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'">
19
- <span class="material-icons text-sm">queue</span>
20
- <span>Queues</span>
21
- <span class="px-2 py-1 text-xs rounded-full bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200" x-text="counts.queues"></span>
22
- </button>
23
-
24
- <button @click="activeTab = 'workers'"
25
- class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm flex items-center gap-2 transition-colors"
26
- :class="activeTab === 'workers'
27
- ? 'border-primary-500 text-primary-600 dark:text-primary-400'
28
- : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'">
29
- <span class="material-icons text-sm">engineering</span>
30
- <span>Workers</span>
31
- <span class="px-2 py-1 text-xs rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200" x-text="counts.workers"></span>
32
- </button>
33
-
34
- <button @click="activeTab = 'tasks'"
35
- class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm flex items-center gap-2 transition-colors"
36
- :class="activeTab === 'tasks'
37
- ? 'border-primary-500 text-primary-600 dark:text-primary-400'
38
- : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'">
39
- <span class="material-icons text-sm">list</span>
40
- <span>Tasks</span>
41
- <span class="px-2 py-1 text-xs rounded-full bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200" x-text="counts.tasks"></span>
42
- </button>
43
- </nav>
44
- </div>
45
- </div>
@@ -1,151 +0,0 @@
1
- <!-- Task Details Modal -->
2
- <div x-show="showTaskModal"
3
- x-cloak
4
- @click.self="closeTaskModal()"
5
- class="fixed inset-0 z-50 overflow-y-auto bg-gray-900 bg-opacity-50 flex items-center justify-center p-4"
6
- style="display: none;">
7
-
8
- <div @click.stop
9
- x-show="showTaskModal"
10
- x-transition:enter="transition ease-out duration-300"
11
- x-transition:enter-start="opacity-0 transform scale-90"
12
- x-transition:enter-end="opacity-100 transform scale-100"
13
- x-transition:leave="transition ease-in duration-200"
14
- x-transition:leave-start="opacity-100 transform scale-100"
15
- x-transition:leave-end="opacity-0 transform scale-90"
16
- class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl max-w-3xl w-full max-h-[90vh] overflow-hidden flex flex-col">
17
-
18
- <!-- Modal Header -->
19
- <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between bg-gray-50 dark:bg-gray-900">
20
- <div class="flex items-center space-x-3">
21
- <span class="material-icons text-2xl text-blue-600 dark:text-blue-400">task_alt</span>
22
- <div>
23
- <h3 class="text-lg font-semibold text-gray-900 dark:text-white">Task Details</h3>
24
- <p class="text-sm text-gray-500 dark:text-gray-400" x-text="selectedTask?.message_id || selectedTask?.task_id || 'N/A'"></p>
25
- </div>
26
- </div>
27
- <button @click="closeTaskModal()"
28
- class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors">
29
- <span class="material-icons">close</span>
30
- </button>
31
- </div>
32
-
33
- <!-- Modal Body -->
34
- <div class="flex-1 overflow-y-auto p-6 space-y-6">
35
-
36
- <!-- Status Badge -->
37
- <div class="flex items-center space-x-3">
38
- <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Status:</span>
39
- <span class="status-badge"
40
- :class="'status-badge ' + (selectedTask?.status || 'pending')"
41
- x-text="selectedTask?.status || 'pending'"></span>
42
- </div>
43
-
44
- <!-- Task Information Grid -->
45
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
46
-
47
- <!-- Task Name -->
48
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
49
- <div class="flex items-center space-x-2 mb-2">
50
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">label</span>
51
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Task Name</span>
52
- </div>
53
- <p class="text-sm font-medium text-gray-900 dark:text-white" x-text="selectedTask?.name || selectedTask?.actor_name || 'N/A'"></p>
54
- </div>
55
-
56
- <!-- Queue -->
57
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
58
- <div class="flex items-center space-x-2 mb-2">
59
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">queue</span>
60
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Queue</span>
61
- </div>
62
- <p class="text-sm font-medium text-gray-900 dark:text-white" x-text="selectedTask?.queue || selectedTask?.queue_name || 'default'"></p>
63
- </div>
64
-
65
- <!-- Duration -->
66
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
67
- <div class="flex items-center space-x-2 mb-2">
68
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">schedule</span>
69
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Duration</span>
70
- </div>
71
- <p class="text-sm font-medium text-gray-900 dark:text-white" x-text="formatDuration(selectedTask?.duration)"></p>
72
- </div>
73
-
74
- <!-- Created At -->
75
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
76
- <div class="flex items-center space-x-2 mb-2">
77
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">access_time</span>
78
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Created</span>
79
- </div>
80
- <p class="text-sm font-medium text-gray-900 dark:text-white" x-text="formatDate(selectedTask?.created_at)"></p>
81
- </div>
82
-
83
- <!-- Updated At -->
84
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
85
- <div class="flex items-center space-x-2 mb-2">
86
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">update</span>
87
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Updated</span>
88
- </div>
89
- <p class="text-sm font-medium text-gray-900 dark:text-white" x-text="formatDate(selectedTask?.updated_at)"></p>
90
- </div>
91
-
92
- <!-- Task ID -->
93
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
94
- <div class="flex items-center space-x-2 mb-2">
95
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">fingerprint</span>
96
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Task ID</span>
97
- </div>
98
- <p class="text-xs font-mono text-gray-900 dark:text-white break-all" x-text="selectedTask?.task_id || selectedTask?.message_id || selectedTask?.id || 'N/A'"></p>
99
- </div>
100
- </div>
101
-
102
- <!-- Arguments (if available) -->
103
- <div x-show="selectedTask?.args || selectedTask?.kwargs" class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4">
104
- <div class="flex items-center space-x-2 mb-3">
105
- <span class="material-icons text-sm text-gray-500 dark:text-gray-400">code</span>
106
- <span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase">Arguments</span>
107
- </div>
108
- <pre class="text-xs text-gray-900 dark:text-white font-mono bg-white dark:bg-gray-800 p-3 rounded border border-gray-200 dark:border-gray-600 overflow-x-auto" x-text="JSON.stringify(selectedTask?.args || selectedTask?.kwargs || {}, null, 2)"></pre>
109
- </div>
110
-
111
- <!-- Error Details (if failed) -->
112
- <div x-show="selectedTask?.status === 'failed' && selectedTask?.error" class="bg-red-50 dark:bg-red-900/20 rounded-lg p-4 border border-red-200 dark:border-red-800">
113
- <div class="flex items-center space-x-2 mb-3">
114
- <span class="material-icons text-sm text-red-600 dark:text-red-400">error</span>
115
- <span class="text-xs font-medium text-red-600 dark:text-red-400 uppercase">Error Details</span>
116
- </div>
117
- <pre class="text-xs text-red-900 dark:text-red-200 font-mono bg-white dark:bg-gray-800 p-3 rounded border border-red-200 dark:border-red-700 overflow-x-auto whitespace-pre-wrap" x-text="selectedTask?.error || 'No error details available'"></pre>
118
- </div>
119
-
120
- <!-- Result (if completed) -->
121
- <div x-show="selectedTask?.status === 'completed' && selectedTask?.result" class="bg-green-50 dark:bg-green-900/20 rounded-lg p-4 border border-green-200 dark:border-green-800">
122
- <div class="flex items-center space-x-2 mb-3">
123
- <span class="material-icons text-sm text-green-600 dark:text-green-400">check_circle</span>
124
- <span class="text-xs font-medium text-green-600 dark:text-green-400 uppercase">Result</span>
125
- </div>
126
- <pre class="text-xs text-green-900 dark:text-green-200 font-mono bg-white dark:bg-gray-800 p-3 rounded border border-green-200 dark:border-green-700 overflow-x-auto" x-text="JSON.stringify(selectedTask?.result || 'Completed successfully', null, 2)"></pre>
127
- </div>
128
- </div>
129
-
130
- <!-- Modal Footer -->
131
- <div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700 flex items-center justify-between">
132
- <div class="flex space-x-3">
133
- <button @click="retryTask(selectedTask)"
134
- x-show="selectedTask?.status === 'failed'"
135
- class="inline-flex items-center px-4 py-2 bg-green-600 hover:bg-green-700 text-white text-sm font-medium rounded-lg transition-colors">
136
- <span class="material-icons text-sm mr-2">refresh</span>
137
- Retry Task
138
- </button>
139
- <button @click="deleteTask(selectedTask)"
140
- class="inline-flex items-center px-4 py-2 bg-red-600 hover:bg-red-700 text-white text-sm font-medium rounded-lg transition-colors">
141
- <span class="material-icons text-sm mr-2">delete</span>
142
- Delete Task
143
- </button>
144
- </div>
145
- <button @click="closeTaskModal()"
146
- class="inline-flex items-center px-4 py-2 bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 text-sm font-medium rounded-lg transition-colors">
147
- Close
148
- </button>
149
- </div>
150
- </div>
151
- </div>
@@ -1,61 +0,0 @@
1
- <!-- Tasks Content -->
2
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
3
- <!-- Header -->
4
- <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
5
- <div class="flex items-center justify-between mb-4">
6
- <div class="flex items-center">
7
- <span class="material-icons text-purple-600 dark:text-purple-400 mr-2">list</span>
8
- <h2 class="text-lg font-semibold text-gray-900 dark:text-white">Task Monitor</h2>
9
- <span class="ml-3 px-2 py-1 text-xs bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 rounded-full"
10
- x-text="counts.tasks + ' tasks'"></span>
11
- </div>
12
-
13
- <div class="flex items-center space-x-2">
14
- <button @click="toggleAutoRefresh()"
15
- class="px-3 py-1 text-sm rounded-lg transition-colors flex items-center"
16
- :class="autoRefresh
17
- ? 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200 hover:bg-green-200 dark:hover:bg-green-800'
18
- : 'bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600'">
19
- <span class="material-icons text-sm mr-1">refresh</span>
20
- <span x-text="'Auto: ' + (autoRefresh ? 'ON' : 'OFF')"></span>
21
- </button>
22
- <button @click="loadTasks()"
23
- class="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors"
24
- :disabled="loading">
25
- <span class="material-icons text-sm" :class="{ 'animate-spin': loading }">refresh</span>
26
- </button>
27
- </div>
28
- </div>
29
-
30
- <!-- Filters -->
31
- {% include 'tasks/widgets/task_filters.html' %}
32
- </div>
33
-
34
- <!-- Content -->
35
- <div class="p-6">
36
- <!-- Loading State -->
37
- <div x-show="loading && tasks.length === 0"
38
- x-cloak
39
- class="flex items-center justify-center py-12">
40
- <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600"></div>
41
- <span class="ml-3 text-gray-600 dark:text-gray-400">Loading tasks...</span>
42
- </div>
43
-
44
- <!-- Empty State -->
45
- <div x-show="!loading && filteredTasks.length === 0"
46
- x-cloak
47
- class="text-center py-12">
48
- <span class="material-icons text-6xl text-gray-400 dark:text-gray-600 mb-4">inbox</span>
49
- <h3 class="text-lg font-medium text-gray-900 dark:text-white mb-2">No tasks found</h3>
50
- <p class="text-gray-500 dark:text-gray-400">Try adjusting your filters or run some tasks.</p>
51
- </div>
52
-
53
- <!-- Task List -->
54
- <div x-show="!loading && filteredTasks.length > 0" x-cloak>
55
- {% include 'tasks/widgets/task_table.html' %}
56
- </div>
57
- </div>
58
-
59
- <!-- Footer -->
60
- {% include 'tasks/widgets/task_footer.html' %}
61
- </div>