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,500 +0,0 @@
1
- """
2
- Request models for Django App Agent Module.
3
-
4
- This module defines all request models with:
5
- - Complete Pydantic 2 validation
6
- - Type-safe field definitions
7
- - Business logic validation
8
- - Clear documentation
9
- """
10
-
11
- from typing import List, Optional, Dict, Any, Set
12
- from pathlib import Path
13
- from pydantic import Field, field_validator, model_validator
14
-
15
- from .base import BaseAgentModel, ValidationMixin
16
- from .enums import AppFeature, AppComplexity, AppType, QuestionType, ImpactLevel
17
- from ..utils.validation import validate_app_name, validate_description
18
-
19
-
20
- class AppGenerationRequest(BaseAgentModel, ValidationMixin):
21
- """Request for generating a Django application."""
22
-
23
- # Core application details
24
- app_name: str = Field(
25
- description="Name of the Django application to generate",
26
- min_length=2,
27
- max_length=50,
28
- pattern=r'^[a-z][a-z0-9_]*$'
29
- )
30
-
31
- description: str = Field(
32
- description="Detailed description of the application purpose and functionality",
33
- min_length=10,
34
- max_length=500
35
- )
36
-
37
- # Application configuration
38
- app_type: AppType = Field(
39
- default=AppType.DJANGO_CFG,
40
- description="Type of Django application to generate"
41
- )
42
-
43
- features: List[AppFeature] = Field(
44
- default_factory=list,
45
- description="List of features to include in the generated application"
46
- )
47
-
48
- complexity: AppComplexity = Field(
49
- default=AppComplexity.MODERATE,
50
- description="Complexity level of the application"
51
- )
52
-
53
- # Generation options
54
- enable_questioning: bool = Field(
55
- default=True,
56
- description="Whether to enable intelligent questioning system"
57
- )
58
-
59
- max_questions: int = Field(
60
- default=20,
61
- ge=0,
62
- le=50,
63
- description="Maximum number of questions to ask during generation"
64
- )
65
-
66
- questioning_timeout_minutes: int = Field(
67
- default=15,
68
- ge=1,
69
- le=60,
70
- description="Timeout for questioning session in minutes"
71
- )
72
-
73
- # Quality requirements
74
- quality_threshold: float = Field(
75
- default=8.0,
76
- ge=0.0,
77
- le=10.0,
78
- description="Minimum quality score required for generated code"
79
- )
80
-
81
- # Integration options
82
- target_apps: List[str] = Field(
83
- default_factory=list,
84
- description="Existing apps to analyze for integration patterns"
85
- )
86
-
87
- exclude_patterns: List[str] = Field(
88
- default_factory=list,
89
- description="Patterns to exclude from generation"
90
- )
91
-
92
- # Output configuration
93
- output_directory: Optional[Path] = Field(
94
- default=None,
95
- description="Custom output directory for generated files"
96
- )
97
-
98
- # Advanced options
99
- custom_requirements: Dict[str, Any] = Field(
100
- default_factory=dict,
101
- description="Custom requirements and constraints"
102
- )
103
-
104
- # UI options
105
- rich_interface: bool = Field(
106
- default=True,
107
- description="Enable Rich CLI interface with progress bars"
108
- )
109
-
110
- verbose_output: bool = Field(
111
- default=False,
112
- description="Enable verbose output during generation"
113
- )
114
-
115
- @field_validator('app_name')
116
- @classmethod
117
- def validate_app_name_field(cls, v: str) -> str:
118
- """Validate application name using utility function."""
119
- return validate_app_name(v, check_reserved=True)
120
-
121
- @field_validator('description')
122
- @classmethod
123
- def validate_description_field(cls, v: str) -> str:
124
- """Validate application description."""
125
- return validate_description(v, min_length=10, max_length=500)
126
-
127
- @field_validator('features')
128
- @classmethod
129
- def validate_features_list(cls, v: List[AppFeature]) -> List[AppFeature]:
130
- """Validate and deduplicate features list."""
131
- if not v:
132
- return []
133
-
134
- # Convert strings to enums if needed
135
- enum_features = []
136
- for feature in v:
137
- if isinstance(feature, str):
138
- enum_features.append(AppFeature(feature))
139
- else:
140
- enum_features.append(feature)
141
-
142
- # Remove duplicates while preserving order
143
- seen = set()
144
- unique_features = []
145
- for feature in enum_features:
146
- if feature not in seen:
147
- seen.add(feature)
148
- unique_features.append(feature)
149
-
150
- return unique_features
151
-
152
- @field_validator('complexity')
153
- @classmethod
154
- def validate_complexity_enum(cls, v) -> AppComplexity:
155
- """Ensure complexity is proper enum."""
156
- if isinstance(v, str):
157
- return AppComplexity(v)
158
- return v
159
-
160
- @field_validator('app_type')
161
- @classmethod
162
- def validate_app_type_enum(cls, v) -> AppType:
163
- """Ensure app_type is proper enum."""
164
- if isinstance(v, str):
165
- return AppType(v)
166
- return v
167
-
168
- @field_validator('target_apps')
169
- @classmethod
170
- def validate_target_apps(cls, v: List[str]) -> List[str]:
171
- """Validate target apps list."""
172
- if not v:
173
- return []
174
-
175
- validated_apps = []
176
- for app_name in v:
177
- try:
178
- validated_name = validate_app_name(app_name, check_reserved=False)
179
- validated_apps.append(validated_name)
180
- except Exception:
181
- # Skip invalid app names
182
- continue
183
-
184
- return validated_apps
185
-
186
- @model_validator(mode='after')
187
- def validate_consistency(self) -> 'AppGenerationRequest':
188
- """Validate consistency between fields."""
189
- # Note: Pydantic 2 handles enum conversion automatically,
190
- # so we don't need to manually convert them here
191
-
192
- # Auto-populate features based on complexity if not specified
193
- if not self.features:
194
- self.features = list(self.complexity.get_recommended_features())
195
-
196
- # Validate feature dependencies
197
- all_features = set(self.features)
198
- for feature in self.features:
199
- dependencies = feature.get_dependencies()
200
- missing_deps = dependencies - all_features
201
- if missing_deps:
202
- # Add missing dependencies
203
- self.features.extend(list(missing_deps))
204
-
205
- # Adjust max_questions based on complexity
206
- if self.max_questions > self.complexity.get_max_questions():
207
- self.max_questions = self.complexity.get_max_questions()
208
-
209
- # Validate app type supports all requested features
210
- unsupported_features = []
211
- for feature in self.features:
212
- if not self.app_type.supports_feature(feature):
213
- unsupported_features.append(feature)
214
-
215
- if unsupported_features:
216
- raise ValueError(
217
- f"App type {self.app_type} does not support features: {unsupported_features}"
218
- )
219
-
220
- return self
221
-
222
- def get_estimated_time_minutes(self) -> int:
223
- """Get estimated generation time in minutes."""
224
- base_time = self.complexity.get_estimated_time_minutes()
225
-
226
- # Add time for additional features
227
- feature_multiplier = len(self.features) / len(self.complexity.get_recommended_features())
228
- adjusted_time = int(base_time * max(1.0, feature_multiplier))
229
-
230
- # Add questioning time if enabled
231
- if self.enable_questioning:
232
- adjusted_time += min(self.questioning_timeout_minutes, 10)
233
-
234
- return adjusted_time
235
-
236
- def get_feature_set(self) -> Set[AppFeature]:
237
- """Get set of features for easy lookup."""
238
- return set(self.features)
239
-
240
- def has_feature(self, feature: AppFeature) -> bool:
241
- """Check if a specific feature is requested."""
242
- return feature in self.get_feature_set()
243
-
244
-
245
- class QuestioningRequest(BaseAgentModel):
246
- """Request for conducting an intelligent questioning session."""
247
-
248
- user_intent: str = Field(
249
- description="User's stated intent or goal for the application",
250
- min_length=5,
251
- max_length=200
252
- )
253
-
254
- project_path: Path = Field(
255
- description="Path to the Django project for context analysis"
256
- )
257
-
258
- app_generation_request: AppGenerationRequest = Field(
259
- description="Associated app generation request"
260
- )
261
-
262
- max_questions: int = Field(
263
- default=20,
264
- ge=1,
265
- le=50,
266
- description="Maximum number of questions to ask"
267
- )
268
-
269
- timeout_minutes: int = Field(
270
- default=15,
271
- ge=1,
272
- le=60,
273
- description="Maximum time for questioning session"
274
- )
275
-
276
- focus_areas: List[str] = Field(
277
- default_factory=list,
278
- description="Specific areas to focus questions on"
279
- )
280
-
281
- skip_basic_questions: bool = Field(
282
- default=False,
283
- description="Skip basic questions and focus on advanced topics"
284
- )
285
-
286
- @field_validator('project_path')
287
- @classmethod
288
- def validate_project_path(cls, v: Path) -> Path:
289
- """Validate that project path exists and is a directory."""
290
- from ..utils.validation import validate_file_path
291
-
292
- return validate_file_path(
293
- v,
294
- must_exist=True,
295
- must_be_dir=True
296
- )
297
-
298
-
299
- class DiagnosticRequest(BaseAgentModel):
300
- """Request for diagnosing problems in Django applications."""
301
-
302
- project_path: Path = Field(
303
- description="Path to the Django project to diagnose"
304
- )
305
-
306
- app_name: Optional[str] = Field(
307
- default=None,
308
- description="Specific app to focus diagnosis on"
309
- )
310
-
311
- problem_description: str = Field(
312
- description="Description of the problem or issue",
313
- min_length=10,
314
- max_length=1000
315
- )
316
-
317
- error_messages: List[str] = Field(
318
- default_factory=list,
319
- description="Any error messages encountered"
320
- )
321
-
322
- symptoms: List[str] = Field(
323
- default_factory=list,
324
- description="Observed symptoms of the problem"
325
- )
326
-
327
- recent_changes: List[str] = Field(
328
- default_factory=list,
329
- description="Recent changes that might be related"
330
- )
331
-
332
- urgency_level: ImpactLevel = Field(
333
- default=ImpactLevel.MEDIUM,
334
- description="Urgency level of the problem"
335
- )
336
-
337
- include_suggestions: bool = Field(
338
- default=True,
339
- description="Whether to include solution suggestions"
340
- )
341
-
342
- max_suggestions: int = Field(
343
- default=5,
344
- ge=1,
345
- le=20,
346
- description="Maximum number of solution suggestions"
347
- )
348
-
349
- @field_validator('project_path')
350
- @classmethod
351
- def validate_project_path(cls, v: Path) -> Path:
352
- """Validate that project path exists."""
353
- from ..utils.validation import validate_file_path
354
-
355
- return validate_file_path(
356
- v,
357
- must_exist=True,
358
- must_be_dir=True
359
- )
360
-
361
- @field_validator('app_name')
362
- @classmethod
363
- def validate_app_name_field(cls, v: Optional[str]) -> Optional[str]:
364
- """Validate app name if provided."""
365
- if v is None:
366
- return v
367
-
368
- return validate_app_name(v, check_reserved=False)
369
-
370
- @field_validator('problem_description')
371
- @classmethod
372
- def validate_problem_description(cls, v: str) -> str:
373
- """Validate problem description."""
374
- return validate_description(v, min_length=10, max_length=1000)
375
-
376
-
377
- class ContextualQuestion(BaseAgentModel):
378
- """A contextual question generated by the intelligent questioning system."""
379
-
380
- id: str = Field(description="Unique question identifier")
381
-
382
- text: str = Field(
383
- description="The question text to display to the user",
384
- min_length=10,
385
- max_length=500
386
- )
387
-
388
- question_type: QuestionType = Field(
389
- description="Type of question (yes/no, multiple choice, etc.)"
390
- )
391
-
392
- impact_level: ImpactLevel = Field(
393
- description="Impact level of this question on the final result"
394
- )
395
-
396
- context_evidence: List[str] = Field(
397
- default_factory=list,
398
- description="Evidence from codebase that prompted this question"
399
- )
400
-
401
- options: Optional[List[str]] = Field(
402
- default=None,
403
- description="Available options for multiple choice questions"
404
- )
405
-
406
- default_answer: Optional[str] = Field(
407
- default=None,
408
- description="Default answer if user skips"
409
- )
410
-
411
- architectural_implications: List[str] = Field(
412
- default_factory=list,
413
- description="How the answer affects architectural decisions"
414
- )
415
-
416
- @field_validator('question_type')
417
- @classmethod
418
- def validate_question_type_enum(cls, v) -> QuestionType:
419
- """Ensure question_type is proper enum."""
420
- if isinstance(v, str):
421
- return QuestionType(v)
422
- return v
423
-
424
- @field_validator('impact_level')
425
- @classmethod
426
- def validate_impact_level_enum(cls, v) -> ImpactLevel:
427
- """Ensure impact_level is proper enum."""
428
- if isinstance(v, str):
429
- return ImpactLevel(v)
430
- return v
431
-
432
- @model_validator(mode='after')
433
- def validate_question_consistency(self) -> 'ContextualQuestion':
434
- """Validate question consistency."""
435
- # Note: Pydantic 2 handles enum conversion automatically
436
-
437
- # Questions requiring options must have them
438
- if self.question_type.requires_options() and not self.options:
439
- raise ValueError(f"Question type {self.question_type} requires options")
440
-
441
- # Validate default answer is in options if provided
442
- if self.default_answer and self.options:
443
- if self.default_answer not in self.options:
444
- raise ValueError("Default answer must be one of the provided options")
445
-
446
- return self
447
-
448
-
449
- class QuestionResponse(BaseAgentModel):
450
- """Response to a contextual question."""
451
-
452
- question_id: str = Field(description="ID of the question being answered")
453
-
454
- answer: str = Field(
455
- description="User's answer to the question",
456
- min_length=1,
457
- max_length=1000
458
- )
459
-
460
- confidence: float = Field(
461
- default=1.0,
462
- ge=0.0,
463
- le=1.0,
464
- description="User's confidence in their answer (0-1)"
465
- )
466
-
467
- notes: Optional[str] = Field(
468
- default=None,
469
- max_length=500,
470
- description="Additional notes or context from user"
471
- )
472
-
473
-
474
- class TemplateRequest(BaseAgentModel):
475
- """Request for template rendering."""
476
-
477
- template_name: str = Field(
478
- description="Name of the template to render",
479
- min_length=1,
480
- max_length=100
481
- )
482
-
483
- app_type: AppType = Field(
484
- description="Type of Django application"
485
- )
486
-
487
- features: List[AppFeature] = Field(
488
- default_factory=list,
489
- description="List of features to include in template"
490
- )
491
-
492
- variables: Dict[str, Any] = Field(
493
- default_factory=dict,
494
- description="Template variables for rendering"
495
- )
496
-
497
- custom_templates: Dict[str, str] = Field(
498
- default_factory=dict,
499
- description="Custom template overrides"
500
- )