django-cfg 1.5.1__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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/dashboard/TRANSACTION_FIX.md +73 -0
- django_cfg/apps/dashboard/serializers/__init__.py +0 -12
- django_cfg/apps/dashboard/serializers/activity.py +1 -1
- django_cfg/apps/dashboard/services/__init__.py +0 -2
- django_cfg/apps/dashboard/services/charts_service.py +4 -3
- django_cfg/apps/dashboard/services/statistics_service.py +11 -2
- django_cfg/apps/dashboard/services/system_health_service.py +64 -106
- django_cfg/apps/dashboard/urls.py +0 -2
- django_cfg/apps/dashboard/views/__init__.py +0 -2
- django_cfg/apps/dashboard/views/commands_views.py +3 -6
- django_cfg/apps/dashboard/views/overview_views.py +14 -13
- django_cfg/apps/knowbase/apps.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +2 -3
- django_cfg/apps/newsletter/admin/newsletter_admin.py +12 -11
- django_cfg/apps/rq/__init__.py +9 -0
- django_cfg/apps/rq/apps.py +80 -0
- django_cfg/apps/rq/management/__init__.py +1 -0
- django_cfg/apps/rq/management/commands/__init__.py +1 -0
- django_cfg/apps/rq/management/commands/rqscheduler.py +31 -0
- django_cfg/apps/rq/management/commands/rqstats.py +33 -0
- django_cfg/apps/rq/management/commands/rqworker.py +31 -0
- django_cfg/apps/rq/management/commands/rqworker_pool.py +27 -0
- django_cfg/apps/rq/serializers/__init__.py +40 -0
- django_cfg/apps/rq/serializers/health.py +60 -0
- django_cfg/apps/rq/serializers/job.py +100 -0
- django_cfg/apps/rq/serializers/queue.py +80 -0
- django_cfg/apps/rq/serializers/schedule.py +178 -0
- django_cfg/apps/rq/serializers/testing.py +139 -0
- django_cfg/apps/rq/serializers/worker.py +58 -0
- django_cfg/apps/rq/services/__init__.py +25 -0
- django_cfg/apps/rq/services/config_helper.py +233 -0
- django_cfg/apps/rq/services/models/README.md +417 -0
- django_cfg/apps/rq/services/models/__init__.py +30 -0
- django_cfg/apps/rq/services/models/event.py +123 -0
- django_cfg/apps/rq/services/models/job.py +99 -0
- django_cfg/apps/rq/services/models/queue.py +92 -0
- django_cfg/apps/rq/services/models/worker.py +104 -0
- django_cfg/apps/rq/services/rq_converters.py +183 -0
- django_cfg/apps/rq/tasks/__init__.py +23 -0
- django_cfg/apps/rq/tasks/demo_tasks.py +284 -0
- django_cfg/apps/rq/urls.py +54 -0
- django_cfg/apps/rq/views/__init__.py +19 -0
- django_cfg/apps/rq/views/jobs.py +882 -0
- django_cfg/apps/rq/views/monitoring.py +248 -0
- django_cfg/apps/rq/views/queues.py +261 -0
- django_cfg/apps/rq/views/schedule.py +400 -0
- django_cfg/apps/rq/views/testing.py +761 -0
- django_cfg/apps/rq/views/workers.py +195 -0
- django_cfg/apps/urls.py +6 -7
- django_cfg/core/base/config_model.py +10 -26
- django_cfg/core/builders/apps_builder.py +4 -11
- django_cfg/core/generation/integration_generators/__init__.py +3 -6
- django_cfg/core/generation/integration_generators/django_rq.py +80 -0
- django_cfg/core/generation/orchestrator.py +9 -19
- django_cfg/core/integration/display/startup.py +6 -20
- django_cfg/mixins/__init__.py +2 -0
- django_cfg/mixins/superadmin_api.py +59 -0
- django_cfg/models/__init__.py +3 -3
- django_cfg/models/django/__init__.py +3 -3
- django_cfg/models/django/django_rq.py +621 -0
- django_cfg/models/django/revolution_legacy.py +1 -1
- django_cfg/modules/base.py +4 -6
- django_cfg/modules/django_admin/config/background_task_config.py +4 -4
- django_cfg/modules/django_admin/utils/html/composition.py +9 -2
- django_cfg/modules/django_unfold/navigation.py +1 -26
- django_cfg/pyproject.toml +4 -4
- django_cfg/registry/core.py +4 -7
- django_cfg/static/frontend/admin.zip +0 -0
- django_cfg/templates/admin/constance/includes/results_list.html +73 -0
- django_cfg/templates/admin/index.html +187 -62
- django_cfg/templatetags/django_cfg.py +61 -1
- {django_cfg-1.5.1.dist-info → django_cfg-1.5.2.dist-info}/METADATA +5 -6
- {django_cfg-1.5.1.dist-info → django_cfg-1.5.2.dist-info}/RECORD +77 -82
- django_cfg/apps/dashboard/permissions.py +0 -48
- django_cfg/apps/dashboard/serializers/django_q2.py +0 -50
- django_cfg/apps/dashboard/services/django_q2_service.py +0 -159
- django_cfg/apps/dashboard/views/django_q2_views.py +0 -79
- django_cfg/apps/tasks/__init__.py +0 -64
- django_cfg/apps/tasks/admin/__init__.py +0 -4
- django_cfg/apps/tasks/admin/config.py +0 -98
- django_cfg/apps/tasks/admin/task_log.py +0 -238
- django_cfg/apps/tasks/apps.py +0 -15
- django_cfg/apps/tasks/filters/__init__.py +0 -10
- django_cfg/apps/tasks/filters/task_log.py +0 -121
- django_cfg/apps/tasks/migrations/0001_initial.py +0 -196
- django_cfg/apps/tasks/migrations/0002_delete_tasklog.py +0 -16
- django_cfg/apps/tasks/migrations/__init__.py +0 -0
- django_cfg/apps/tasks/models/__init__.py +0 -4
- django_cfg/apps/tasks/models/task_log.py +0 -246
- django_cfg/apps/tasks/serializers/__init__.py +0 -28
- django_cfg/apps/tasks/serializers/task_log.py +0 -249
- django_cfg/apps/tasks/services/__init__.py +0 -10
- django_cfg/apps/tasks/services/client/__init__.py +0 -7
- django_cfg/apps/tasks/services/client/client.py +0 -234
- django_cfg/apps/tasks/services/config_helper.py +0 -63
- django_cfg/apps/tasks/services/sync.py +0 -204
- django_cfg/apps/tasks/urls.py +0 -16
- django_cfg/apps/tasks/views/__init__.py +0 -10
- django_cfg/apps/tasks/views/task_log.py +0 -41
- django_cfg/apps/tasks/views/task_log_base.py +0 -41
- django_cfg/apps/tasks/views/task_log_overview.py +0 -100
- django_cfg/apps/tasks/views/task_log_related.py +0 -41
- django_cfg/apps/tasks/views/task_log_stats.py +0 -91
- django_cfg/apps/tasks/views/task_log_timeline.py +0 -81
- django_cfg/core/generation/integration_generators/django_q2.py +0 -133
- django_cfg/core/generation/integration_generators/tasks.py +0 -88
- django_cfg/models/django/django_q2.py +0 -514
- django_cfg/models/tasks/__init__.py +0 -49
- django_cfg/models/tasks/backends.py +0 -122
- django_cfg/models/tasks/config.py +0 -209
- django_cfg/models/tasks/utils.py +0 -162
- django_cfg/modules/django_q2/README.md +0 -140
- django_cfg/modules/django_q2/__init__.py +0 -8
- django_cfg/modules/django_q2/apps.py +0 -107
- django_cfg/modules/django_q2/management/__init__.py +0 -0
- django_cfg/modules/django_q2/management/commands/__init__.py +0 -0
- django_cfg/modules/django_q2/management/commands/sync_django_q_schedules.py +0 -74
- {django_cfg-1.5.1.dist-info → django_cfg-1.5.2.dist-info}/WHEEL +0 -0
- {django_cfg-1.5.1.dist-info → django_cfg-1.5.2.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.5.1.dist-info → django_cfg-1.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Django-Q2 settings generator for django-cfg.
|
|
3
|
-
|
|
4
|
-
Generates django-q2 settings and handles INSTALLED_APPS integration.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
8
|
-
|
|
9
|
-
from django_cfg.modules.django_logging import logger
|
|
10
|
-
|
|
11
|
-
if TYPE_CHECKING:
|
|
12
|
-
from django_cfg.models.django.django_q import DjangoQ2Config
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class DjangoQ2SettingsGenerator:
|
|
16
|
-
"""
|
|
17
|
-
Generates task scheduling settings for django-q2.
|
|
18
|
-
|
|
19
|
-
Automatically:
|
|
20
|
-
- Generates Q_CLUSTER configuration
|
|
21
|
-
- Adds django_q to INSTALLED_APPS if enabled
|
|
22
|
-
- Configures broker, workers, and task settings
|
|
23
|
-
- Provides schedule management via Django ORM
|
|
24
|
-
|
|
25
|
-
Django-Q2 vs django-crontab:
|
|
26
|
-
- No need to run 'crontab add' - schedules in database
|
|
27
|
-
- Built-in admin interface for monitoring
|
|
28
|
-
- Support for both cron and interval scheduling
|
|
29
|
-
- Task retries and hooks
|
|
30
|
-
- Async task support
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self, config: "DjangoQ2Config", parent_config: Optional[Any] = None):
|
|
34
|
-
"""
|
|
35
|
-
Initialize with Django-Q2 configuration.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
config: DjangoQ2Config instance
|
|
39
|
-
parent_config: Optional parent DjangoConfig for accessing redis_url
|
|
40
|
-
"""
|
|
41
|
-
self.config = config
|
|
42
|
-
self.parent_config = parent_config
|
|
43
|
-
|
|
44
|
-
def generate(self) -> Dict[str, Any]:
|
|
45
|
-
"""
|
|
46
|
-
Generate Django-Q2 settings.
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
Dictionary with Q_CLUSTER configuration
|
|
50
|
-
"""
|
|
51
|
-
if not self.config or not self.config.enabled:
|
|
52
|
-
return {}
|
|
53
|
-
|
|
54
|
-
settings = self.config.to_django_settings(parent_config=self.parent_config)
|
|
55
|
-
|
|
56
|
-
# Log configuration
|
|
57
|
-
logger.info(
|
|
58
|
-
f"✓ Configured Django-Q2 task queue "
|
|
59
|
-
f"[broker: {self.config.broker_class}, workers: {self.config.workers}]"
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
enabled_schedules = self.config.get_enabled_schedules()
|
|
63
|
-
if enabled_schedules:
|
|
64
|
-
logger.info(
|
|
65
|
-
f"✓ Found {len(enabled_schedules)} scheduled task(s) "
|
|
66
|
-
f"[use admin or management commands to create schedules]"
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
# Log individual schedules in debug mode
|
|
70
|
-
for schedule in enabled_schedules:
|
|
71
|
-
logger.debug(
|
|
72
|
-
f" - {schedule.name}: {schedule.schedule_type} → "
|
|
73
|
-
f"{schedule.command if schedule.command else schedule.func}"
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
logger.info(
|
|
77
|
-
"📝 To create schedules: python manage.py qcluster "
|
|
78
|
-
"or use Django admin at /admin/django_q/schedule/"
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
return settings
|
|
82
|
-
|
|
83
|
-
def generate_schedule_creation_code(self) -> str:
|
|
84
|
-
"""
|
|
85
|
-
Generate Python code to create schedules programmatically.
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
Python code string for creating schedules
|
|
89
|
-
|
|
90
|
-
Example:
|
|
91
|
-
```python
|
|
92
|
-
code = generator.generate_schedule_creation_code()
|
|
93
|
-
# Use in management command or startup script
|
|
94
|
-
```
|
|
95
|
-
"""
|
|
96
|
-
if not self.config or not self.config.enabled:
|
|
97
|
-
return ""
|
|
98
|
-
|
|
99
|
-
enabled_schedules = self.config.get_enabled_schedules()
|
|
100
|
-
if not enabled_schedules:
|
|
101
|
-
return ""
|
|
102
|
-
|
|
103
|
-
lines = [
|
|
104
|
-
"# Auto-generated Django-Q2 schedule creation",
|
|
105
|
-
"from django_q.models import Schedule",
|
|
106
|
-
"",
|
|
107
|
-
"# Create or update schedules",
|
|
108
|
-
]
|
|
109
|
-
|
|
110
|
-
for schedule in enabled_schedules:
|
|
111
|
-
schedule_dict = schedule.to_django_q_format()
|
|
112
|
-
|
|
113
|
-
lines.append("")
|
|
114
|
-
lines.append(f"# {schedule.name}")
|
|
115
|
-
lines.append("Schedule.objects.update_or_create(")
|
|
116
|
-
lines.append(f" name='{schedule.name}',")
|
|
117
|
-
lines.append(" defaults={")
|
|
118
|
-
|
|
119
|
-
for key, value in schedule_dict.items():
|
|
120
|
-
if key == "name":
|
|
121
|
-
continue
|
|
122
|
-
if isinstance(value, str):
|
|
123
|
-
lines.append(f" '{key}': '{value}',")
|
|
124
|
-
else:
|
|
125
|
-
lines.append(f" '{key}': {value},")
|
|
126
|
-
|
|
127
|
-
lines.append(" }")
|
|
128
|
-
lines.append(")")
|
|
129
|
-
|
|
130
|
-
return "\n".join(lines)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
__all__ = ["DjangoQ2SettingsGenerator"]
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Background tasks generator.
|
|
3
|
-
|
|
4
|
-
Handles ReArq task queue configuration.
|
|
5
|
-
Size: ~100 lines (focused on task processing)
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
from typing import TYPE_CHECKING, Any, Dict
|
|
10
|
-
|
|
11
|
-
if TYPE_CHECKING:
|
|
12
|
-
from ...base.config_model import DjangoConfig
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class TasksSettingsGenerator:
|
|
18
|
-
"""
|
|
19
|
-
Generates background task processing settings.
|
|
20
|
-
|
|
21
|
-
Responsibilities:
|
|
22
|
-
- Configure ReArq task queue
|
|
23
|
-
- Auto-detect if tasks should be enabled
|
|
24
|
-
- Set up task configuration
|
|
25
|
-
|
|
26
|
-
Example:
|
|
27
|
-
```python
|
|
28
|
-
generator = TasksSettingsGenerator(config)
|
|
29
|
-
settings = generator.generate()
|
|
30
|
-
```
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self, config: "DjangoConfig"):
|
|
34
|
-
"""
|
|
35
|
-
Initialize generator with configuration.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
config: DjangoConfig instance
|
|
39
|
-
"""
|
|
40
|
-
self.config = config
|
|
41
|
-
|
|
42
|
-
def generate(self) -> Dict[str, Any]:
|
|
43
|
-
"""
|
|
44
|
-
Generate task processing settings.
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
Dictionary with ReArq configuration
|
|
48
|
-
|
|
49
|
-
Example:
|
|
50
|
-
>>> generator = TasksSettingsGenerator(config)
|
|
51
|
-
>>> settings = generator.generate()
|
|
52
|
-
"""
|
|
53
|
-
# Check if tasks should be enabled
|
|
54
|
-
if not self.config.should_enable_tasks():
|
|
55
|
-
logger.debug("⏭️ Tasks disabled")
|
|
56
|
-
return {}
|
|
57
|
-
|
|
58
|
-
try:
|
|
59
|
-
return self._generate_rearq_settings()
|
|
60
|
-
except ImportError as e:
|
|
61
|
-
logger.warning(f"Failed to import ReArq: {e}")
|
|
62
|
-
return {}
|
|
63
|
-
except Exception as e:
|
|
64
|
-
logger.error(f"Failed to generate ReArq settings: {e}")
|
|
65
|
-
return {}
|
|
66
|
-
|
|
67
|
-
def _generate_rearq_settings(self) -> Dict[str, Any]:
|
|
68
|
-
"""
|
|
69
|
-
Generate ReArq-specific settings.
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
Dictionary with ReArq configuration
|
|
73
|
-
"""
|
|
74
|
-
from django_cfg.models.tasks import TaskConfig
|
|
75
|
-
|
|
76
|
-
# Auto-initialize TaskConfig if needed
|
|
77
|
-
task_config = TaskConfig.auto_initialize_if_needed()
|
|
78
|
-
if task_config is None:
|
|
79
|
-
return {}
|
|
80
|
-
|
|
81
|
-
# Generate settings via standard method
|
|
82
|
-
settings = task_config.to_django_settings()
|
|
83
|
-
|
|
84
|
-
logger.info("✅ ReArq tasks enabled")
|
|
85
|
-
return settings
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
__all__ = ["TasksSettingsGenerator"]
|