django-cfg 1.3.9__py3-none-any.whl → 1.3.11__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 (187) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/payments/admin/networks_admin.py +12 -1
  3. django_cfg/apps/payments/admin/payments_admin.py +13 -0
  4. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
  5. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  6. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  7. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  8. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  9. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  10. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  11. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  12. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
  13. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  14. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
  15. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  16. django_cfg/apps/payments/config/__init__.py +14 -15
  17. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  18. django_cfg/apps/payments/config/helpers.py +8 -13
  19. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  20. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  21. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  22. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  23. django_cfg/apps/payments/models/payments.py +94 -0
  24. django_cfg/apps/payments/services/core/base.py +4 -4
  25. django_cfg/apps/payments/services/core/payment_service.py +265 -38
  26. django_cfg/apps/payments/services/providers/base.py +209 -3
  27. django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
  28. django_cfg/apps/payments/services/providers/models/base.py +25 -2
  29. django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
  30. django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
  31. django_cfg/apps/payments/services/providers/registry.py +5 -5
  32. django_cfg/apps/payments/services/types/requests.py +19 -7
  33. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  34. django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
  35. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  36. django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
  37. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  38. django_cfg/apps/payments/urls.py +3 -2
  39. django_cfg/apps/payments/views/api/currencies.py +3 -0
  40. django_cfg/apps/payments/views/serializers/currencies.py +18 -5
  41. django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
  42. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  43. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  44. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  45. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  46. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  47. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  48. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  49. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  50. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  51. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  52. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  53. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  54. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  55. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  56. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  57. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  58. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  59. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  60. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  61. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  62. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  63. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  64. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  65. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  66. django_cfg/apps/tasks/urls.py +2 -2
  67. django_cfg/apps/tasks/urls_admin.py +2 -2
  68. django_cfg/apps/tasks/utils/__init__.py +1 -0
  69. django_cfg/apps/tasks/utils/simulator.py +356 -0
  70. django_cfg/apps/tasks/views/__init__.py +16 -0
  71. django_cfg/apps/tasks/views/api.py +569 -0
  72. django_cfg/apps/tasks/views/dashboard.py +58 -0
  73. django_cfg/core/integration/__init__.py +21 -0
  74. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  75. django_cfg/models/constance.py +0 -11
  76. django_cfg/models/payments.py +137 -3
  77. django_cfg/modules/django_tasks.py +54 -21
  78. django_cfg/registry/core.py +4 -9
  79. django_cfg/template_archive/django_sample.zip +0 -0
  80. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -2
  81. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/RECORD +84 -152
  82. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  83. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  84. django_cfg/apps/payments/config/constance/fields.py +0 -69
  85. django_cfg/apps/payments/config/constance/settings.py +0 -160
  86. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
  87. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
  88. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
  89. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  90. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  91. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  92. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  93. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  94. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  95. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  96. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  97. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  98. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  99. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  100. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  101. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  102. django_cfg/apps/tasks/views.py +0 -461
  103. django_cfg/management/commands/app_agent_diagnose.py +0 -470
  104. django_cfg/management/commands/app_agent_generate.py +0 -342
  105. django_cfg/management/commands/app_agent_info.py +0 -308
  106. django_cfg/management/commands/auto_generate.py +0 -486
  107. django_cfg/modules/django_app_agent/__init__.py +0 -87
  108. django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
  109. django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
  110. django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
  111. django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
  112. django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
  113. django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
  114. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
  115. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
  116. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
  117. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
  118. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
  119. django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
  120. django_cfg/modules/django_app_agent/core/__init__.py +0 -33
  121. django_cfg/modules/django_app_agent/core/config.py +0 -300
  122. django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
  123. django_cfg/modules/django_app_agent/models/__init__.py +0 -71
  124. django_cfg/modules/django_app_agent/models/base.py +0 -283
  125. django_cfg/modules/django_app_agent/models/context.py +0 -496
  126. django_cfg/modules/django_app_agent/models/enums.py +0 -481
  127. django_cfg/modules/django_app_agent/models/requests.py +0 -500
  128. django_cfg/modules/django_app_agent/models/responses.py +0 -585
  129. django_cfg/modules/django_app_agent/pytest.ini +0 -6
  130. django_cfg/modules/django_app_agent/services/__init__.py +0 -42
  131. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
  132. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
  133. django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
  134. django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
  135. django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
  136. django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
  137. django_cfg/modules/django_app_agent/services/base.py +0 -437
  138. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
  139. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
  140. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
  141. django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
  142. django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
  143. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
  144. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
  145. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
  146. django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
  147. django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
  148. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
  149. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
  150. django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
  151. django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
  152. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
  153. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
  154. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
  155. django_cfg/modules/django_app_agent/services/report_service.py +0 -332
  156. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
  157. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
  158. django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
  159. django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
  160. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
  161. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
  162. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
  163. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
  164. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
  165. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
  166. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
  167. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
  168. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
  169. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
  170. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
  171. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
  172. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
  173. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
  174. django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
  175. django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
  176. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
  177. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
  178. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
  179. django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
  180. django_cfg/modules/django_app_agent/ui/cli.py +0 -419
  181. django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
  182. django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
  183. django_cfg/modules/django_app_agent/utils/logging.py +0 -360
  184. django_cfg/modules/django_app_agent/utils/validation.py +0 -417
  185. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  186. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  187. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/licenses/LICENSE +0 -0
@@ -1,71 +0,0 @@
1
- """
2
- Pydantic 2 models for Django App Agent Module.
3
-
4
- This module contains all data models using Pydantic 2 with:
5
- - 100% type safety (no Any types)
6
- - Comprehensive validation
7
- - Structured data throughout
8
- - Clear separation of concerns
9
- """
10
-
11
- from .base import BaseAgentModel, TimestampedModel
12
- from .enums import (
13
- AppFeature,
14
- AppComplexity,
15
- AppType,
16
- QuestionType,
17
- ImpactLevel,
18
- GenerationStage,
19
- ValidationSeverity,
20
- )
21
- from .requests import (
22
- AppGenerationRequest,
23
- QuestioningRequest,
24
- DiagnosticRequest,
25
- )
26
- from .responses import (
27
- AppGenerationResult,
28
- QuestioningResult,
29
- DiagnosticResult,
30
- GeneratedFile,
31
- QualityMetrics,
32
- )
33
- from .context import (
34
- ProjectContext,
35
- DjangoAppInfo,
36
- ArchitecturalPattern,
37
- InfrastructureContext,
38
- )
39
-
40
- __all__ = [
41
- # Base models
42
- "BaseAgentModel",
43
- "TimestampedModel",
44
-
45
- # Enums
46
- "AppFeature",
47
- "AppComplexity",
48
- "AppType",
49
- "QuestionType",
50
- "ImpactLevel",
51
- "GenerationStage",
52
- "ValidationSeverity",
53
-
54
- # Request models
55
- "AppGenerationRequest",
56
- "QuestioningRequest",
57
- "DiagnosticRequest",
58
-
59
- # Response models
60
- "AppGenerationResult",
61
- "QuestioningResult",
62
- "DiagnosticResult",
63
- "GeneratedFile",
64
- "QualityMetrics",
65
-
66
- # Context models
67
- "ProjectContext",
68
- "DjangoAppInfo",
69
- "ArchitecturalPattern",
70
- "InfrastructureContext",
71
- ]
@@ -1,283 +0,0 @@
1
- """
2
- Base Pydantic 2 models for Django App Agent Module.
3
-
4
- This module provides base classes and common patterns for all models:
5
- - Strict validation configuration
6
- - Timestamp handling
7
- - Common field patterns
8
- - Serialization utilities
9
- """
10
-
11
- from typing import Any, Dict, Optional, ClassVar
12
- from datetime import datetime, timezone
13
- from pydantic import BaseModel, Field, ConfigDict, field_validator
14
- from uuid import uuid4
15
-
16
-
17
- class BaseAgentModel(BaseModel):
18
- """Base model for all Django App Agent data structures.
19
-
20
- Provides:
21
- - Strict validation (no extra fields, assignment validation)
22
- - Consistent configuration across all models
23
- - Common utility methods
24
- - Proper JSON serialization
25
- """
26
-
27
- model_config = ConfigDict(
28
- # Strict validation - no extra fields allowed
29
- extra='forbid',
30
- # Validate on assignment (not just initialization)
31
- validate_assignment=True,
32
- # Strip whitespace from strings
33
- str_strip_whitespace=True,
34
- # Use enum values in serialization
35
- use_enum_values=True,
36
- # Validate default values
37
- validate_default=True,
38
- # Allow arbitrary types for complex objects
39
- arbitrary_types_allowed=False,
40
- # Frozen models are immutable (can be overridden)
41
- frozen=False,
42
- )
43
-
44
- def model_dump_safe(self) -> Dict[str, Any]:
45
- """Safe model dump that handles all edge cases.
46
-
47
- Returns:
48
- Dictionary representation safe for JSON serialization
49
- """
50
- return self.model_dump(
51
- mode='json',
52
- exclude_none=False,
53
- by_alias=True
54
- )
55
-
56
- def model_dump_minimal(self) -> Dict[str, Any]:
57
- """Minimal model dump excluding None values and defaults.
58
-
59
- Returns:
60
- Minimal dictionary representation
61
- """
62
- return self.model_dump(
63
- mode='json',
64
- exclude_none=True,
65
- exclude_defaults=True,
66
- by_alias=True
67
- )
68
-
69
- @classmethod
70
- def model_validate_safe(cls, data: Any) -> "BaseAgentModel":
71
- """Safe model validation with better error handling.
72
-
73
- Args:
74
- data: Data to validate
75
-
76
- Returns:
77
- Validated model instance
78
-
79
- Raises:
80
- ValidationError: With enhanced error context
81
- """
82
- from ..core.exceptions import ValidationError
83
-
84
- try:
85
- return cls.model_validate(data)
86
- except Exception as e:
87
- raise ValidationError(
88
- f"Failed to validate {cls.__name__}: {e}",
89
- validation_type="model_validation",
90
- field_name=cls.__name__,
91
- field_value=str(data)[:200], # Truncate for logging
92
- cause=e
93
- )
94
-
95
-
96
- class TimestampedModel(BaseAgentModel):
97
- """Base model with automatic timestamp handling.
98
-
99
- Provides:
100
- - Automatic created_at timestamp
101
- - Optional updated_at timestamp
102
- - UTC timezone handling
103
- """
104
-
105
- created_at: datetime = Field(
106
- default_factory=lambda: datetime.now(timezone.utc),
107
- description="Creation timestamp in UTC"
108
- )
109
- updated_at: Optional[datetime] = Field(
110
- default=None,
111
- description="Last update timestamp in UTC"
112
- )
113
-
114
- def mark_updated(self) -> None:
115
- """Mark the model as updated with current timestamp."""
116
- self.updated_at = datetime.now(timezone.utc)
117
-
118
- @field_validator('created_at', 'updated_at')
119
- @classmethod
120
- def validate_timezone(cls, v: Optional[datetime]) -> Optional[datetime]:
121
- """Ensure timestamps are timezone-aware (UTC)."""
122
- if v is None:
123
- return v
124
-
125
- if v.tzinfo is None:
126
- # Assume UTC if no timezone info
127
- return v.replace(tzinfo=timezone.utc)
128
-
129
- # Convert to UTC if different timezone
130
- return v.astimezone(timezone.utc)
131
-
132
-
133
- class IdentifiableModel(TimestampedModel):
134
- """Base model with unique identifier.
135
-
136
- Provides:
137
- - Automatic UUID generation
138
- - Unique identification across system
139
- - Correlation tracking
140
- """
141
-
142
- id: str = Field(
143
- default_factory=lambda: str(uuid4()),
144
- description="Unique identifier"
145
- )
146
-
147
- @field_validator('id')
148
- @classmethod
149
- def validate_id_format(cls, v: str) -> str:
150
- """Validate ID format (UUID or custom format)."""
151
- if not v or len(v.strip()) == 0:
152
- raise ValueError("ID cannot be empty")
153
-
154
- # Allow UUID format or custom format
155
- return v.strip()
156
-
157
-
158
- class ConfigurableModel(BaseAgentModel):
159
- """Base model for configuration objects.
160
-
161
- Provides:
162
- - Validation of configuration values
163
- - Environment variable integration
164
- - Default value handling
165
- """
166
-
167
- # Class variable to track required fields
168
- _required_fields: ClassVar[set[str]] = set()
169
-
170
- @classmethod
171
- def get_required_fields(cls) -> set[str]:
172
- """Get set of required field names."""
173
- return cls._required_fields.copy()
174
-
175
- def validate_required_fields(self) -> list[str]:
176
- """Validate that all required fields have values.
177
-
178
- Returns:
179
- List of missing required fields
180
- """
181
- missing_fields = []
182
-
183
- for field_name in self.get_required_fields():
184
- if hasattr(self, field_name):
185
- value = getattr(self, field_name)
186
- if value is None or (isinstance(value, str) and not value.strip()):
187
- missing_fields.append(field_name)
188
- else:
189
- missing_fields.append(field_name)
190
-
191
- return missing_fields
192
-
193
-
194
- class ValidationMixin:
195
- """Mixin providing common validation utilities."""
196
-
197
- @staticmethod
198
- def validate_non_empty_string(v: str, field_name: str = "field") -> str:
199
- """Validate that string is not empty after stripping."""
200
- if not isinstance(v, str):
201
- raise ValueError(f"{field_name} must be a string")
202
-
203
- stripped = v.strip()
204
- if not stripped:
205
- raise ValueError(f"{field_name} cannot be empty")
206
-
207
- return stripped
208
-
209
- @staticmethod
210
- def validate_positive_number(v: float, field_name: str = "field") -> float:
211
- """Validate that number is positive."""
212
- if not isinstance(v, (int, float)):
213
- raise ValueError(f"{field_name} must be a number")
214
-
215
- if v <= 0:
216
- raise ValueError(f"{field_name} must be positive")
217
-
218
- return float(v)
219
-
220
- @staticmethod
221
- def validate_percentage(v: float, field_name: str = "field") -> float:
222
- """Validate that number is a valid percentage (0-100)."""
223
- if not isinstance(v, (int, float)):
224
- raise ValueError(f"{field_name} must be a number")
225
-
226
- if not 0 <= v <= 100:
227
- raise ValueError(f"{field_name} must be between 0 and 100")
228
-
229
- return float(v)
230
-
231
- @staticmethod
232
- def validate_score(v: float, field_name: str = "field", max_score: float = 10.0) -> float:
233
- """Validate that number is a valid score (0-max_score)."""
234
- if not isinstance(v, (int, float)):
235
- raise ValueError(f"{field_name} must be a number")
236
-
237
- if not 0 <= v <= max_score:
238
- raise ValueError(f"{field_name} must be between 0 and {max_score}")
239
-
240
- return float(v)
241
-
242
-
243
- class ErrorModel(BaseAgentModel):
244
- """Base model for error information."""
245
-
246
- error_type: str = Field(description="Type of error")
247
- message: str = Field(description="Human-readable error message")
248
- code: Optional[str] = Field(default=None, description="Machine-readable error code")
249
- details: Dict[str, Any] = Field(default_factory=dict, description="Additional error details")
250
- timestamp: datetime = Field(
251
- default_factory=lambda: datetime.now(timezone.utc),
252
- description="Error timestamp"
253
- )
254
-
255
- @field_validator('error_type', 'message')
256
- @classmethod
257
- def validate_required_strings(cls, v: str) -> str:
258
- """Validate required string fields."""
259
- return ValidationMixin.validate_non_empty_string(v)
260
-
261
-
262
- class MetricsModel(BaseAgentModel, ValidationMixin):
263
- """Base model for metrics and measurements."""
264
-
265
- def validate_all_scores(self) -> list[str]:
266
- """Validate all score fields in the model.
267
-
268
- Returns:
269
- List of validation errors
270
- """
271
- errors = []
272
-
273
- # Get all fields that end with '_score'
274
- for field_name, field_info in self.model_fields.items():
275
- if field_name.endswith('_score'):
276
- try:
277
- value = getattr(self, field_name)
278
- if value is not None:
279
- self.validate_score(value, field_name)
280
- except ValueError as e:
281
- errors.append(str(e))
282
-
283
- return errors