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