django-cfg 1.3.7__py3-none-any.whl → 1.3.9__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 (251) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +258 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +171 -461
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
  48. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  49. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
  50. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  51. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  52. django_cfg/apps/payments/middleware/api_access.py +32 -6
  53. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
  54. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
  55. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
  56. django_cfg/apps/payments/models/balance.py +12 -0
  57. django_cfg/apps/payments/models/currencies.py +106 -32
  58. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  59. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  60. django_cfg/apps/payments/services/core/payment_service.py +1 -1
  61. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  62. django_cfg/apps/payments/services/providers/base.py +95 -39
  63. django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
  64. django_cfg/apps/payments/services/providers/models/base.py +122 -0
  65. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  66. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  67. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  68. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  69. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  70. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  71. django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
  72. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  73. django_cfg/apps/payments/services/providers/registry.py +4 -32
  74. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  75. django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
  76. django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
  77. django_cfg/apps/payments/tasks/__init__.py +39 -0
  78. django_cfg/apps/payments/tasks/types.py +73 -0
  79. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  80. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  81. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  82. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  83. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  84. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  85. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  86. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  87. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  88. django_cfg/apps/payments/urls_admin.py +1 -1
  89. django_cfg/apps/payments/views/api/currencies.py +5 -5
  90. django_cfg/apps/payments/views/overview/services.py +2 -2
  91. django_cfg/apps/payments/views/serializers/currencies.py +4 -3
  92. django_cfg/apps/support/admin/__init__.py +10 -1
  93. django_cfg/apps/support/admin/support_admin.py +338 -141
  94. django_cfg/apps/tasks/admin/__init__.py +11 -0
  95. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  96. django_cfg/config.py +1 -1
  97. django_cfg/core/config.py +10 -5
  98. django_cfg/core/generation.py +1 -1
  99. django_cfg/management/commands/__init__.py +13 -1
  100. django_cfg/management/commands/app_agent_diagnose.py +470 -0
  101. django_cfg/management/commands/app_agent_generate.py +342 -0
  102. django_cfg/management/commands/app_agent_info.py +308 -0
  103. django_cfg/management/commands/migrate_all.py +9 -3
  104. django_cfg/management/commands/migrator.py +11 -6
  105. django_cfg/management/commands/rundramatiq.py +3 -2
  106. django_cfg/middleware/__init__.py +0 -2
  107. django_cfg/models/api_keys.py +115 -0
  108. django_cfg/modules/django_admin/__init__.py +64 -0
  109. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  110. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  111. django_cfg/modules/django_admin/decorators/display.py +106 -0
  112. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  113. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  114. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  115. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  116. django_cfg/modules/django_admin/models/__init__.py +20 -0
  117. django_cfg/modules/django_admin/models/action_models.py +33 -0
  118. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  119. django_cfg/modules/django_admin/models/base.py +26 -0
  120. django_cfg/modules/django_admin/models/display_models.py +31 -0
  121. django_cfg/modules/django_admin/utils/badges.py +159 -0
  122. django_cfg/modules/django_admin/utils/displays.py +247 -0
  123. django_cfg/modules/django_app_agent/__init__.py +87 -0
  124. django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
  125. django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
  126. django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
  127. django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
  128. django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
  129. django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
  130. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
  131. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
  132. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
  133. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
  134. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
  135. django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
  136. django_cfg/modules/django_app_agent/core/__init__.py +33 -0
  137. django_cfg/modules/django_app_agent/core/config.py +300 -0
  138. django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
  139. django_cfg/modules/django_app_agent/models/__init__.py +71 -0
  140. django_cfg/modules/django_app_agent/models/base.py +283 -0
  141. django_cfg/modules/django_app_agent/models/context.py +496 -0
  142. django_cfg/modules/django_app_agent/models/enums.py +481 -0
  143. django_cfg/modules/django_app_agent/models/requests.py +500 -0
  144. django_cfg/modules/django_app_agent/models/responses.py +585 -0
  145. django_cfg/modules/django_app_agent/pytest.ini +6 -0
  146. django_cfg/modules/django_app_agent/services/__init__.py +42 -0
  147. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
  148. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
  149. django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
  150. django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
  151. django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
  152. django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
  153. django_cfg/modules/django_app_agent/services/base.py +437 -0
  154. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
  155. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
  156. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
  157. django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
  158. django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
  159. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
  160. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
  161. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
  162. django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
  163. django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
  164. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
  165. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
  166. django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
  167. django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
  168. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
  169. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
  170. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
  171. django_cfg/modules/django_app_agent/services/report_service.py +332 -0
  172. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
  173. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
  174. django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
  175. django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
  176. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
  177. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
  178. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
  179. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
  180. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
  181. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
  182. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
  183. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
  184. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
  185. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
  186. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
  187. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
  188. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
  189. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
  190. django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
  191. django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
  192. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
  193. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
  194. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
  195. django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
  196. django_cfg/modules/django_app_agent/ui/cli.py +419 -0
  197. django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
  198. django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
  199. django_cfg/modules/django_app_agent/utils/logging.py +360 -0
  200. django_cfg/modules/django_app_agent/utils/validation.py +417 -0
  201. django_cfg/modules/django_currency/__init__.py +2 -2
  202. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  203. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  204. django_cfg/modules/django_currency/core/converter.py +12 -12
  205. django_cfg/modules/django_currency/database/__init__.py +2 -2
  206. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  207. django_cfg/modules/django_llm/llm/client.py +10 -2
  208. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  209. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  210. django_cfg/modules/django_unfold/dashboard.py +14 -13
  211. django_cfg/modules/django_unfold/models/config.py +1 -1
  212. django_cfg/registry/core.py +3 -0
  213. django_cfg/registry/third_party.py +2 -2
  214. django_cfg/template_archive/django_sample.zip +0 -0
  215. {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
  216. {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/RECORD +223 -117
  217. django_cfg/apps/accounts/admin/activity.py +0 -96
  218. django_cfg/apps/accounts/admin/group.py +0 -17
  219. django_cfg/apps/accounts/admin/otp.py +0 -59
  220. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  221. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  222. django_cfg/apps/accounts/admin/user.py +0 -300
  223. django_cfg/apps/agents/core/agent.py +0 -281
  224. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  225. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  226. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  227. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  228. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  229. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  230. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  231. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  232. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  233. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  234. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  235. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  236. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  237. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  238. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  239. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  240. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  241. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  242. django_cfg/apps/tasks/admin.py +0 -320
  243. django_cfg/middleware/static_nocache.py +0 -55
  244. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  245. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  246. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  247. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  248. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  249. {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
  250. {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
  251. {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,71 @@
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
+ ]
@@ -0,0 +1,283 @@
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