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,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