django-cfg 1.3.9__py3-none-any.whl → 1.3.13__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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/inlines.py +11 -5
- django_cfg/apps/payments/admin/networks_admin.py +12 -1
- django_cfg/apps/payments/admin/payments_admin.py +13 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
- django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
- django_cfg/apps/payments/config/__init__.py +14 -15
- django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
- django_cfg/apps/payments/config/helpers.py +8 -13
- django_cfg/apps/payments/migrations/0001_initial.py +33 -46
- django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
- django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
- django_cfg/apps/payments/models/payments.py +94 -0
- django_cfg/apps/payments/services/core/base.py +4 -4
- django_cfg/apps/payments/services/core/payment_service.py +265 -38
- django_cfg/apps/payments/services/providers/base.py +209 -3
- django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
- django_cfg/apps/payments/services/providers/models/base.py +25 -2
- django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
- django_cfg/apps/payments/services/providers/registry.py +5 -5
- django_cfg/apps/payments/services/types/requests.py +19 -7
- django_cfg/apps/payments/signals/payment_signals.py +31 -2
- django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
- django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
- django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
- django_cfg/apps/payments/urls.py +3 -2
- django_cfg/apps/payments/views/api/currencies.py +3 -0
- django_cfg/apps/payments/views/serializers/currencies.py +18 -5
- django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
- django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
- django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
- django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
- django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
- django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
- django_cfg/apps/tasks/tasks/__init__.py +10 -0
- django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
- django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
- django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
- django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
- django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
- django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
- django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
- django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
- django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
- django_cfg/apps/tasks/urls.py +2 -2
- django_cfg/apps/tasks/urls_admin.py +2 -2
- django_cfg/apps/tasks/utils/__init__.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +356 -0
- django_cfg/apps/tasks/views/__init__.py +16 -0
- django_cfg/apps/tasks/views/api.py +569 -0
- django_cfg/apps/tasks/views/dashboard.py +58 -0
- django_cfg/core/integration/__init__.py +21 -0
- django_cfg/management/commands/rundramatiq_simulator.py +430 -0
- django_cfg/models/constance.py +0 -11
- django_cfg/models/payments.py +137 -3
- django_cfg/modules/django_tasks.py +54 -21
- django_cfg/registry/core.py +4 -9
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/METADATA +2 -2
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/RECORD +85 -153
- django_cfg/apps/payments/config/constance/__init__.py +0 -22
- django_cfg/apps/payments/config/constance/config_service.py +0 -123
- django_cfg/apps/payments/config/constance/fields.py +0 -69
- django_cfg/apps/payments/config/constance/settings.py +0 -160
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
- django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
- django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
- django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
- django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
- django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
- django_cfg/apps/tasks/templates/tasks/base.html +0 -96
- django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
- django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
- django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
- django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
- django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
- django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
- django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
- django_cfg/apps/tasks/views.py +0 -461
- django_cfg/management/commands/app_agent_diagnose.py +0 -470
- django_cfg/management/commands/app_agent_generate.py +0 -342
- django_cfg/management/commands/app_agent_info.py +0 -308
- django_cfg/management/commands/auto_generate.py +0 -486
- django_cfg/modules/django_app_agent/__init__.py +0 -87
- django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
- django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
- django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
- django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
- django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
- django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
- django_cfg/modules/django_app_agent/core/__init__.py +0 -33
- django_cfg/modules/django_app_agent/core/config.py +0 -300
- django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
- django_cfg/modules/django_app_agent/models/__init__.py +0 -71
- django_cfg/modules/django_app_agent/models/base.py +0 -283
- django_cfg/modules/django_app_agent/models/context.py +0 -496
- django_cfg/modules/django_app_agent/models/enums.py +0 -481
- django_cfg/modules/django_app_agent/models/requests.py +0 -500
- django_cfg/modules/django_app_agent/models/responses.py +0 -585
- django_cfg/modules/django_app_agent/pytest.ini +0 -6
- django_cfg/modules/django_app_agent/services/__init__.py +0 -42
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
- django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
- django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
- django_cfg/modules/django_app_agent/services/base.py +0 -437
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
- django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
- django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
- django_cfg/modules/django_app_agent/services/report_service.py +0 -332
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
- django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
- django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
- django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
- django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
- django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
- django_cfg/modules/django_app_agent/ui/cli.py +0 -419
- django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
- django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
- django_cfg/modules/django_app_agent/utils/logging.py +0 -360
- django_cfg/modules/django_app_agent/utils/validation.py +0 -417
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/licenses/LICENSE +0 -0
@@ -1,360 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Structured logging utilities for Django App Agent Module.
|
3
|
-
|
4
|
-
This module provides comprehensive logging functionality with:
|
5
|
-
- Structured JSON logging
|
6
|
-
- Context-aware log entries
|
7
|
-
- Performance tracking
|
8
|
-
- Agent operation logging
|
9
|
-
- Integration with Django logging
|
10
|
-
"""
|
11
|
-
|
12
|
-
import logging
|
13
|
-
import json
|
14
|
-
import time
|
15
|
-
import uuid
|
16
|
-
from typing import Any, Dict, Optional, Callable, TypeVar, ParamSpec
|
17
|
-
from functools import wraps
|
18
|
-
from pathlib import Path
|
19
|
-
from datetime import datetime, timezone
|
20
|
-
from contextlib import contextmanager
|
21
|
-
from contextvars import ContextVar
|
22
|
-
|
23
|
-
from pydantic import BaseModel, Field, ConfigDict
|
24
|
-
|
25
|
-
from ..core.config import LogLevel
|
26
|
-
|
27
|
-
# Type variables for decorators
|
28
|
-
P = ParamSpec('P')
|
29
|
-
T = TypeVar('T')
|
30
|
-
|
31
|
-
# Context variables for structured logging
|
32
|
-
correlation_id_var: ContextVar[Optional[str]] = ContextVar('correlation_id', default=None)
|
33
|
-
operation_context_var: ContextVar[Optional[str]] = ContextVar('operation_context', default=None)
|
34
|
-
|
35
|
-
|
36
|
-
class LogEntry(BaseModel):
|
37
|
-
"""Structured log entry model."""
|
38
|
-
|
39
|
-
model_config = ConfigDict(
|
40
|
-
extra='forbid',
|
41
|
-
validate_assignment=True
|
42
|
-
)
|
43
|
-
|
44
|
-
timestamp: str = Field(description="ISO timestamp")
|
45
|
-
level: str = Field(description="Log level")
|
46
|
-
message: str = Field(description="Log message")
|
47
|
-
module: str = Field(description="Module name")
|
48
|
-
operation: Optional[str] = Field(default=None, description="Current operation")
|
49
|
-
correlation_id: Optional[str] = Field(default=None, description="Correlation ID")
|
50
|
-
component: str = Field(description="Component that generated the log")
|
51
|
-
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
52
|
-
|
53
|
-
@classmethod
|
54
|
-
def create(
|
55
|
-
cls,
|
56
|
-
level: str,
|
57
|
-
message: str,
|
58
|
-
component: str,
|
59
|
-
*,
|
60
|
-
operation: Optional[str] = None,
|
61
|
-
correlation_id: Optional[str] = None,
|
62
|
-
**metadata: Any
|
63
|
-
) -> "LogEntry":
|
64
|
-
"""Create a structured log entry."""
|
65
|
-
return cls(
|
66
|
-
timestamp=datetime.now(timezone.utc).isoformat(),
|
67
|
-
level=level,
|
68
|
-
message=message,
|
69
|
-
module="django_app_agent",
|
70
|
-
operation=operation or operation_context_var.get(),
|
71
|
-
correlation_id=correlation_id or correlation_id_var.get(),
|
72
|
-
component=component,
|
73
|
-
metadata=metadata
|
74
|
-
)
|
75
|
-
|
76
|
-
|
77
|
-
class StructuredFormatter(logging.Formatter):
|
78
|
-
"""Custom formatter for structured JSON logging."""
|
79
|
-
|
80
|
-
def format(self, record: logging.LogRecord) -> str:
|
81
|
-
"""Format log record as structured JSON."""
|
82
|
-
# Extract structured data if present
|
83
|
-
if hasattr(record, 'structured_data'):
|
84
|
-
log_entry = record.structured_data
|
85
|
-
else:
|
86
|
-
# Create structured entry from standard log record
|
87
|
-
log_entry = LogEntry.create(
|
88
|
-
level=record.levelname,
|
89
|
-
message=record.getMessage(),
|
90
|
-
component=record.name,
|
91
|
-
filename=getattr(record, 'filename', ''),
|
92
|
-
lineno=getattr(record, 'lineno', 0),
|
93
|
-
funcName=getattr(record, 'funcName', '')
|
94
|
-
)
|
95
|
-
|
96
|
-
return json.dumps(log_entry.model_dump(), ensure_ascii=False)
|
97
|
-
|
98
|
-
|
99
|
-
class StructuredLogger:
|
100
|
-
"""Structured logger for Django App Agent operations."""
|
101
|
-
|
102
|
-
def __init__(self, component: str, logger: Optional[logging.Logger] = None):
|
103
|
-
"""Initialize structured logger.
|
104
|
-
|
105
|
-
Args:
|
106
|
-
component: Component name for logging context
|
107
|
-
logger: Optional logger instance (creates one if not provided)
|
108
|
-
"""
|
109
|
-
self.component = component
|
110
|
-
self.logger = logger or logging.getLogger(f"django_app_agent.{component}")
|
111
|
-
|
112
|
-
def _log(
|
113
|
-
self,
|
114
|
-
level: str,
|
115
|
-
message: str,
|
116
|
-
*,
|
117
|
-
operation: Optional[str] = None,
|
118
|
-
correlation_id: Optional[str] = None,
|
119
|
-
**metadata: Any
|
120
|
-
) -> None:
|
121
|
-
"""Internal logging method."""
|
122
|
-
log_entry = LogEntry.create(
|
123
|
-
level=level,
|
124
|
-
message=message,
|
125
|
-
component=self.component,
|
126
|
-
operation=operation,
|
127
|
-
correlation_id=correlation_id,
|
128
|
-
**metadata
|
129
|
-
)
|
130
|
-
|
131
|
-
# Get numeric log level
|
132
|
-
numeric_level = getattr(logging, level)
|
133
|
-
|
134
|
-
# Create log record with structured data
|
135
|
-
record = self.logger.makeRecord(
|
136
|
-
name=self.logger.name,
|
137
|
-
level=numeric_level,
|
138
|
-
fn="",
|
139
|
-
lno=0,
|
140
|
-
msg=message,
|
141
|
-
args=(),
|
142
|
-
exc_info=None
|
143
|
-
)
|
144
|
-
record.structured_data = log_entry
|
145
|
-
|
146
|
-
self.logger.handle(record)
|
147
|
-
|
148
|
-
def debug(self, message: str, **metadata: Any) -> None:
|
149
|
-
"""Log debug message."""
|
150
|
-
self._log("DEBUG", message, **metadata)
|
151
|
-
|
152
|
-
def info(self, message: str, **metadata: Any) -> None:
|
153
|
-
"""Log info message."""
|
154
|
-
self._log("INFO", message, **metadata)
|
155
|
-
|
156
|
-
def warning(self, message: str, **metadata: Any) -> None:
|
157
|
-
"""Log warning message."""
|
158
|
-
self._log("WARNING", message, **metadata)
|
159
|
-
|
160
|
-
def error(self, message: str, **metadata: Any) -> None:
|
161
|
-
"""Log error message."""
|
162
|
-
self._log("ERROR", message, **metadata)
|
163
|
-
|
164
|
-
def critical(self, message: str, **metadata: Any) -> None:
|
165
|
-
"""Log critical message."""
|
166
|
-
self._log("CRITICAL", message, **metadata)
|
167
|
-
|
168
|
-
@contextmanager
|
169
|
-
def operation_context(self, operation: str, correlation_id: Optional[str] = None):
|
170
|
-
"""Context manager for operation logging."""
|
171
|
-
if correlation_id is None:
|
172
|
-
correlation_id = str(uuid.uuid4())
|
173
|
-
|
174
|
-
# Set context variables
|
175
|
-
correlation_token = correlation_id_var.set(correlation_id)
|
176
|
-
operation_token = operation_context_var.set(operation)
|
177
|
-
|
178
|
-
self.info(
|
179
|
-
f"Starting operation: {operation}",
|
180
|
-
operation=operation,
|
181
|
-
correlation_id=correlation_id
|
182
|
-
)
|
183
|
-
|
184
|
-
start_time = time.time()
|
185
|
-
|
186
|
-
try:
|
187
|
-
yield correlation_id
|
188
|
-
except Exception as e:
|
189
|
-
self.error(
|
190
|
-
f"Operation failed: {operation}",
|
191
|
-
operation=operation,
|
192
|
-
correlation_id=correlation_id,
|
193
|
-
error=str(e),
|
194
|
-
error_type=type(e).__name__
|
195
|
-
)
|
196
|
-
raise
|
197
|
-
finally:
|
198
|
-
execution_time = time.time() - start_time
|
199
|
-
self.info(
|
200
|
-
f"Completed operation: {operation}",
|
201
|
-
operation=operation,
|
202
|
-
correlation_id=correlation_id,
|
203
|
-
execution_time_seconds=execution_time
|
204
|
-
)
|
205
|
-
|
206
|
-
# Reset context variables
|
207
|
-
correlation_id_var.reset(correlation_token)
|
208
|
-
operation_context_var.reset(operation_token)
|
209
|
-
|
210
|
-
|
211
|
-
def setup_logging(
|
212
|
-
level: LogLevel = LogLevel.INFO,
|
213
|
-
log_file: Optional[Path] = None,
|
214
|
-
enable_structured: bool = True
|
215
|
-
) -> None:
|
216
|
-
"""Set up logging configuration for Django App Agent Module.
|
217
|
-
|
218
|
-
Args:
|
219
|
-
level: Logging level
|
220
|
-
log_file: Optional log file path
|
221
|
-
enable_structured: Whether to use structured JSON logging
|
222
|
-
"""
|
223
|
-
# Get root logger for the module
|
224
|
-
logger = logging.getLogger("django_app_agent")
|
225
|
-
logger.setLevel(getattr(logging, level.value))
|
226
|
-
|
227
|
-
# Clear existing handlers
|
228
|
-
logger.handlers.clear()
|
229
|
-
|
230
|
-
# Console handler
|
231
|
-
console_handler = logging.StreamHandler()
|
232
|
-
console_handler.setLevel(getattr(logging, level.value))
|
233
|
-
|
234
|
-
if enable_structured:
|
235
|
-
console_handler.setFormatter(StructuredFormatter())
|
236
|
-
else:
|
237
|
-
console_handler.setFormatter(
|
238
|
-
logging.Formatter(
|
239
|
-
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
240
|
-
)
|
241
|
-
)
|
242
|
-
|
243
|
-
logger.addHandler(console_handler)
|
244
|
-
|
245
|
-
# File handler if specified
|
246
|
-
if log_file:
|
247
|
-
log_file.parent.mkdir(parents=True, exist_ok=True)
|
248
|
-
file_handler = logging.FileHandler(log_file)
|
249
|
-
file_handler.setLevel(getattr(logging, level.value))
|
250
|
-
file_handler.setFormatter(StructuredFormatter())
|
251
|
-
logger.addHandler(file_handler)
|
252
|
-
|
253
|
-
# Prevent propagation to avoid duplicate logs
|
254
|
-
logger.propagate = False
|
255
|
-
|
256
|
-
|
257
|
-
def get_logger(component: str) -> StructuredLogger:
|
258
|
-
"""Get a structured logger for a component.
|
259
|
-
|
260
|
-
Args:
|
261
|
-
component: Component name
|
262
|
-
|
263
|
-
Returns:
|
264
|
-
Structured logger instance
|
265
|
-
"""
|
266
|
-
return StructuredLogger(component)
|
267
|
-
|
268
|
-
|
269
|
-
def log_execution_time(operation: str) -> Callable[[Callable[P, T]], Callable[P, T]]:
|
270
|
-
"""Decorator to log execution time of functions.
|
271
|
-
|
272
|
-
Args:
|
273
|
-
operation: Operation name for logging
|
274
|
-
|
275
|
-
Returns:
|
276
|
-
Decorated function
|
277
|
-
"""
|
278
|
-
def decorator(func: Callable[P, T]) -> Callable[P, T]:
|
279
|
-
@wraps(func)
|
280
|
-
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
281
|
-
logger = get_logger(func.__module__ or "unknown")
|
282
|
-
|
283
|
-
with logger.operation_context(operation):
|
284
|
-
start_time = time.time()
|
285
|
-
try:
|
286
|
-
result = func(*args, **kwargs)
|
287
|
-
execution_time = time.time() - start_time
|
288
|
-
logger.info(
|
289
|
-
f"Function {func.__name__} completed",
|
290
|
-
function_name=func.__name__,
|
291
|
-
execution_time_seconds=execution_time
|
292
|
-
)
|
293
|
-
return result
|
294
|
-
except Exception as e:
|
295
|
-
execution_time = time.time() - start_time
|
296
|
-
logger.error(
|
297
|
-
f"Function {func.__name__} failed",
|
298
|
-
function_name=func.__name__,
|
299
|
-
execution_time_seconds=execution_time,
|
300
|
-
error=str(e),
|
301
|
-
error_type=type(e).__name__
|
302
|
-
)
|
303
|
-
raise
|
304
|
-
|
305
|
-
return wrapper
|
306
|
-
return decorator
|
307
|
-
|
308
|
-
|
309
|
-
def log_agent_operation(
|
310
|
-
agent_name: str,
|
311
|
-
operation: str
|
312
|
-
) -> Callable[[Callable[P, T]], Callable[P, T]]:
|
313
|
-
"""Decorator to log AI agent operations.
|
314
|
-
|
315
|
-
Args:
|
316
|
-
agent_name: Name of the AI agent
|
317
|
-
operation: Operation being performed
|
318
|
-
|
319
|
-
Returns:
|
320
|
-
Decorated function
|
321
|
-
"""
|
322
|
-
def decorator(func: Callable[P, T]) -> Callable[P, T]:
|
323
|
-
@wraps(func)
|
324
|
-
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
325
|
-
logger = get_logger(f"agents.{agent_name}")
|
326
|
-
|
327
|
-
with logger.operation_context(f"{agent_name}.{operation}"):
|
328
|
-
logger.info(
|
329
|
-
f"Agent {agent_name} starting {operation}",
|
330
|
-
agent_name=agent_name,
|
331
|
-
operation=operation
|
332
|
-
)
|
333
|
-
|
334
|
-
start_time = time.time()
|
335
|
-
try:
|
336
|
-
result = func(*args, **kwargs)
|
337
|
-
execution_time = time.time() - start_time
|
338
|
-
logger.info(
|
339
|
-
f"Agent {agent_name} completed {operation}",
|
340
|
-
agent_name=agent_name,
|
341
|
-
operation=operation,
|
342
|
-
execution_time_seconds=execution_time,
|
343
|
-
success=True
|
344
|
-
)
|
345
|
-
return result
|
346
|
-
except Exception as e:
|
347
|
-
execution_time = time.time() - start_time
|
348
|
-
logger.error(
|
349
|
-
f"Agent {agent_name} failed {operation}",
|
350
|
-
agent_name=agent_name,
|
351
|
-
operation=operation,
|
352
|
-
execution_time_seconds=execution_time,
|
353
|
-
success=False,
|
354
|
-
error=str(e),
|
355
|
-
error_type=type(e).__name__
|
356
|
-
)
|
357
|
-
raise
|
358
|
-
|
359
|
-
return wrapper
|
360
|
-
return decorator
|