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.
Files changed (188) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/inlines.py +11 -5
  3. django_cfg/apps/payments/admin/networks_admin.py +12 -1
  4. django_cfg/apps/payments/admin/payments_admin.py +13 -0
  5. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
  6. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  7. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  8. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  9. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  10. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  11. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  12. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  13. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
  14. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  15. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
  16. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  17. django_cfg/apps/payments/config/__init__.py +14 -15
  18. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  19. django_cfg/apps/payments/config/helpers.py +8 -13
  20. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  21. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  22. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  23. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  24. django_cfg/apps/payments/models/payments.py +94 -0
  25. django_cfg/apps/payments/services/core/base.py +4 -4
  26. django_cfg/apps/payments/services/core/payment_service.py +265 -38
  27. django_cfg/apps/payments/services/providers/base.py +209 -3
  28. django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
  29. django_cfg/apps/payments/services/providers/models/base.py +25 -2
  30. django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
  31. django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
  32. django_cfg/apps/payments/services/providers/registry.py +5 -5
  33. django_cfg/apps/payments/services/types/requests.py +19 -7
  34. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  35. django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
  36. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  37. django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
  38. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  39. django_cfg/apps/payments/urls.py +3 -2
  40. django_cfg/apps/payments/views/api/currencies.py +3 -0
  41. django_cfg/apps/payments/views/serializers/currencies.py +18 -5
  42. django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
  43. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  44. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  45. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  46. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  47. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  48. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  49. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  50. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  51. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  52. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  53. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  54. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  55. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  56. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  57. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  58. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  59. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  60. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  61. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  62. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  63. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  64. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  65. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  66. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  67. django_cfg/apps/tasks/urls.py +2 -2
  68. django_cfg/apps/tasks/urls_admin.py +2 -2
  69. django_cfg/apps/tasks/utils/__init__.py +1 -0
  70. django_cfg/apps/tasks/utils/simulator.py +356 -0
  71. django_cfg/apps/tasks/views/__init__.py +16 -0
  72. django_cfg/apps/tasks/views/api.py +569 -0
  73. django_cfg/apps/tasks/views/dashboard.py +58 -0
  74. django_cfg/core/integration/__init__.py +21 -0
  75. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  76. django_cfg/models/constance.py +0 -11
  77. django_cfg/models/payments.py +137 -3
  78. django_cfg/modules/django_tasks.py +54 -21
  79. django_cfg/registry/core.py +4 -9
  80. django_cfg/template_archive/django_sample.zip +0 -0
  81. {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/METADATA +2 -2
  82. {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/RECORD +85 -153
  83. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  84. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  85. django_cfg/apps/payments/config/constance/fields.py +0 -69
  86. django_cfg/apps/payments/config/constance/settings.py +0 -160
  87. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
  88. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
  89. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
  90. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  91. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  92. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  93. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  94. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  95. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  96. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  97. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  98. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  99. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  100. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  101. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  102. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  103. django_cfg/apps/tasks/views.py +0 -461
  104. django_cfg/management/commands/app_agent_diagnose.py +0 -470
  105. django_cfg/management/commands/app_agent_generate.py +0 -342
  106. django_cfg/management/commands/app_agent_info.py +0 -308
  107. django_cfg/management/commands/auto_generate.py +0 -486
  108. django_cfg/modules/django_app_agent/__init__.py +0 -87
  109. django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
  110. django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
  111. django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
  112. django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
  113. django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
  114. django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
  115. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
  116. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
  117. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
  118. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
  119. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
  120. django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
  121. django_cfg/modules/django_app_agent/core/__init__.py +0 -33
  122. django_cfg/modules/django_app_agent/core/config.py +0 -300
  123. django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
  124. django_cfg/modules/django_app_agent/models/__init__.py +0 -71
  125. django_cfg/modules/django_app_agent/models/base.py +0 -283
  126. django_cfg/modules/django_app_agent/models/context.py +0 -496
  127. django_cfg/modules/django_app_agent/models/enums.py +0 -481
  128. django_cfg/modules/django_app_agent/models/requests.py +0 -500
  129. django_cfg/modules/django_app_agent/models/responses.py +0 -585
  130. django_cfg/modules/django_app_agent/pytest.ini +0 -6
  131. django_cfg/modules/django_app_agent/services/__init__.py +0 -42
  132. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
  133. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
  134. django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
  135. django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
  136. django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
  137. django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
  138. django_cfg/modules/django_app_agent/services/base.py +0 -437
  139. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
  140. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
  141. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
  142. django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
  143. django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
  144. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
  145. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
  146. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
  147. django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
  148. django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
  149. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
  150. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
  151. django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
  152. django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
  153. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
  154. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
  155. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
  156. django_cfg/modules/django_app_agent/services/report_service.py +0 -332
  157. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
  158. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
  159. django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
  160. django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
  161. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
  162. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
  163. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
  164. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
  165. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
  166. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
  167. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
  168. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
  169. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
  170. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
  171. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
  172. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
  173. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
  174. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
  175. django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
  176. django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
  177. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
  178. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
  179. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
  180. django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
  181. django_cfg/modules/django_app_agent/ui/cli.py +0 -419
  182. django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
  183. django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
  184. django_cfg/modules/django_app_agent/utils/logging.py +0 -360
  185. django_cfg/modules/django_app_agent/utils/validation.py +0 -417
  186. {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/WHEEL +0 -0
  187. {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/entry_points.txt +0 -0
  188. {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