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,133 +0,0 @@
1
- """
2
- AI Integration Module for Django App Agent Generation.
3
-
4
- This module handles integration with AI agents for intelligent
5
- code generation based on user requirements and project context.
6
- """
7
-
8
- from typing import List, Dict, Any
9
- from pathlib import Path
10
-
11
- from ..base import ServiceDependencies
12
- from ...core.config import AgentConfig
13
- from ...models.responses import GeneratedFile
14
- from ...models.enums import AppFeature, FileType
15
- from ...agents.generation.app_generator import AppGeneratorAgent, FileGenerationRequest
16
- from .context import GenerationContext
17
-
18
-
19
- class AIGenerationManager:
20
- """Manages AI-powered code generation process."""
21
-
22
- def __init__(self, config: AgentConfig):
23
- """Initialize AI generation manager."""
24
- self.config = config
25
-
26
- async def run_ai_generation(
27
- self,
28
- context: GenerationContext,
29
- dependencies: ServiceDependencies
30
- ) -> None:
31
- """Run AI agents for intelligent code generation."""
32
- dependencies.log_operation("Running AI generation agents")
33
-
34
- try:
35
- # Create AI agent
36
- print("🔍 Creating AI agent with config...")
37
- print(f"🔍 Config type: {type(self.config)}")
38
- try:
39
- ai_agent = AppGeneratorAgent(self.config)
40
- print("✅ AI agent created successfully")
41
- except Exception as e:
42
- print(f"❌ Failed to create AI agent: {e}")
43
- print(f"❌ Exception type: {type(e)}")
44
- import traceback
45
- print(f"❌ Traceback: {traceback.format_exc()}")
46
- raise
47
-
48
- # Generate files for each requested feature using AI
49
- generated_files = []
50
- for feature in context.request.features:
51
- try:
52
- # Create request for this feature
53
- file_request = FileGenerationRequest(
54
- app_name=context.request.app_name,
55
- description=context.request.description,
56
- feature=feature,
57
- app_type=context.request.app_type,
58
- complexity=context.request.complexity
59
- )
60
-
61
- # Generate file using AI
62
- ai_response = await ai_agent.generate_file(file_request)
63
-
64
- # Create file path
65
- file_path = context.app_directory / ai_response.filename
66
-
67
- # Create generated file record
68
- generated_file = GeneratedFile(
69
- relative_path=str(file_path.relative_to(context.target_directory)),
70
- absolute_path=file_path,
71
- content=ai_response.content,
72
- line_count=len(ai_response.content.split('\n')),
73
- file_type=self._get_file_type(ai_response.filename),
74
- type_safety_score=8.5, # AI-generated files typically have good type safety
75
- complexity_score=6.0, # AI-generated files can be moderately complex
76
- description=ai_response.description
77
- )
78
-
79
- # Write file to disk
80
- file_path.parent.mkdir(parents=True, exist_ok=True)
81
- file_path.write_text(ai_response.content)
82
-
83
- # Add to context
84
- context.add_generated_file(generated_file)
85
- generated_files.append(ai_response)
86
-
87
- dependencies.log_operation(f"Generated {feature.value} file", filename=ai_response.filename)
88
-
89
- except Exception as e:
90
- dependencies.log_error(f"Failed to generate {feature.value} with AI", e)
91
- # Continue with other features
92
- continue
93
-
94
- # Record AI generation results
95
- context.agent_outputs["generation"] = {
96
- "status": "completed",
97
- "message": f"AI generation completed successfully for {len(generated_files)} features",
98
- "ai_files_count": len(generated_files),
99
- "features_generated": [gf.filename for gf in generated_files],
100
- "recommendations": [f"Generated {gf.filename} for {context.request.app_name}" for gf in generated_files]
101
- }
102
-
103
- except Exception as e:
104
- dependencies.log_error("AI generation failed", e)
105
- context.agent_outputs["generation"] = {
106
- "status": "error",
107
- "message": f"Agent communication failed: {e}",
108
- "recommendations": []
109
- }
110
-
111
- def _get_file_type(self, filename: str) -> FileType:
112
- """Determine file type from filename."""
113
- # Map specific Django files to their types
114
- if filename == "__init__.py":
115
- return FileType.INIT
116
- elif filename == "models.py":
117
- return FileType.MODEL
118
- elif filename == "views.py":
119
- return FileType.VIEW
120
- elif filename == "admin.py":
121
- return FileType.ADMIN
122
- elif filename == "urls.py":
123
- return FileType.URL
124
- elif filename == "forms.py":
125
- return FileType.FORM
126
- elif filename == "tests.py":
127
- return FileType.TEST
128
- elif filename.endswith('.html'):
129
- return FileType.TEMPLATE
130
- elif filename.endswith('.py'):
131
- return FileType.CONFIG # Default for other Python files
132
- else:
133
- return FileType.CONFIG # Default fallback
@@ -1,40 +0,0 @@
1
- """
2
- Generation Context for Django App Agent Module.
3
-
4
- This module contains the GenerationContext class that manages state
5
- and data throughout the application generation process.
6
- """
7
-
8
- from typing import List, Dict, Any
9
- from pathlib import Path
10
-
11
- from pydantic import BaseModel, Field, ConfigDict
12
-
13
- from ...models.requests import AppGenerationRequest
14
- from ...models.responses import GeneratedFile
15
-
16
-
17
- class GenerationContext(BaseModel):
18
- """Context for application generation process."""
19
-
20
- model_config = ConfigDict(extra='forbid', validate_assignment=True)
21
-
22
- request: AppGenerationRequest = Field(description="Original generation request")
23
- target_directory: Path = Field(description="Target directory for generated app")
24
- template_variables: Dict[str, Any] = Field(default_factory=dict, description="Template variables")
25
- generated_files: List[GeneratedFile] = Field(default_factory=list, description="Generated files")
26
- validation_results: Dict[str, Any] = Field(default_factory=dict, description="Validation results")
27
- agent_outputs: Dict[str, Any] = Field(default_factory=dict, description="AI agent outputs")
28
-
29
- @property
30
- def app_directory(self) -> Path:
31
- """Get the application directory path."""
32
- return self.target_directory / self.request.app_name
33
-
34
- def add_generated_file(self, file: GeneratedFile) -> None:
35
- """Add a generated file to the context."""
36
- self.generated_files.append(file)
37
-
38
- def get_files_by_type(self, file_type: str) -> List[GeneratedFile]:
39
- """Get generated files by type."""
40
- return [f for f in self.generated_files if f.file_type == file_type]
@@ -1,202 +0,0 @@
1
- """
2
- Main Application Generator Service for Django App Agent Module.
3
-
4
- This service orchestrates the complete application generation process,
5
- coordinating validation, structure creation, AI generation, and quality validation.
6
- """
7
-
8
- from typing import Dict, Any
9
- from pathlib import Path
10
- from datetime import datetime, timezone
11
- import uuid
12
-
13
- from ..base import BaseService, ServiceDependencies
14
- from ...models.requests import AppGenerationRequest
15
- from ...models.responses import AppGenerationResult, QualityMetrics, ValidationIssue
16
- from ...models.enums import ValidationSeverity
17
- from ...core.config import AgentConfig
18
-
19
- from .context import GenerationContext
20
- from .validation import GenerationValidator
21
- from .structure import StructureGenerator
22
- from .ai_integration import AIGenerationManager
23
-
24
-
25
- class AppGeneratorService(BaseService[AppGenerationRequest, AppGenerationResult]):
26
- """
27
- Main service for generating Django applications with AI assistance.
28
-
29
- This service coordinates the entire generation process:
30
- 1. Validation of requirements and compatibility
31
- 2. Basic structure creation
32
- 3. AI-powered code generation
33
- 4. Quality validation and metrics calculation
34
- """
35
-
36
- def __init__(self, config: AgentConfig):
37
- """Initialize the application generator service."""
38
- super().__init__("app_generator", config)
39
- self.config = config
40
-
41
- # Initialize sub-components
42
- self.validator = GenerationValidator()
43
- self.structure_generator = StructureGenerator()
44
- self.ai_manager = AIGenerationManager(config)
45
-
46
- async def process(
47
- self,
48
- request: AppGenerationRequest,
49
- dependencies: ServiceDependencies
50
- ) -> AppGenerationResult:
51
- """
52
- Process application generation request.
53
-
54
- Args:
55
- request: Application generation request
56
- dependencies: Service dependencies for logging and operations
57
-
58
- Returns:
59
- AppGenerationResult with generation details and metrics
60
- """
61
- start_time = datetime.now(timezone.utc)
62
- generation_id = str(uuid.uuid4())
63
-
64
- try:
65
- dependencies.log_operation(
66
- f"Starting application generation for '{request.app_name}'",
67
- app_name=request.app_name,
68
- app_type=request.app_type.value,
69
- features=[f.value for f in request.features]
70
- )
71
-
72
- # Create generation context
73
- context = await self._create_generation_context(request, dependencies)
74
-
75
- # Validate generation requirements
76
- await self.validator.validate_generation_requirements(context, dependencies)
77
-
78
- # Generate basic app structure
79
- await self.structure_generator.generate_app_structure(context, dependencies)
80
-
81
- # Generate feature files using templates (fallback)
82
- await self.structure_generator.generate_feature_files(context, dependencies)
83
-
84
- # Run AI agents for intelligent code generation
85
- await self.ai_manager.run_ai_generation(context, dependencies)
86
-
87
- # Validate generated code
88
- quality_metrics = await self.validator.validate_generated_code(context, dependencies)
89
-
90
- # Calculate execution time
91
- end_time = datetime.now(timezone.utc)
92
- execution_time = (end_time - start_time).total_seconds()
93
-
94
- # Extract AI dialogue for reporting
95
- ai_dialogue = self._extract_ai_dialogue(context)
96
-
97
- # Create successful result
98
- return AppGenerationResult(
99
- app_name=request.app_name,
100
- generation_id=generation_id,
101
- success=True,
102
- total_execution_time_seconds=execution_time,
103
- files_count=len(context.generated_files),
104
- lines_of_code=sum(len(f.content.splitlines()) for f in context.generated_files),
105
- quality_score=quality_metrics.overall_score,
106
- type_safety_score=quality_metrics.type_safety_score,
107
- pattern_consistency_score=quality_metrics.pattern_consistency,
108
- test_coverage_percentage=quality_metrics.test_coverage,
109
- integration_successful=True,
110
- generated_files=context.generated_files,
111
- patterns_followed=["django_best_practices", "pep8", "type_hints"],
112
- dependencies_resolved=["django", "django_cfg"],
113
- errors=[],
114
- warnings=[],
115
- report_directory=context.target_directory / request.app_name / "@report",
116
- generation_report_path=context.target_directory / request.app_name / "@report" / "generation_report.md"
117
- )
118
-
119
- except Exception as e:
120
- # Calculate execution time even on failure
121
- end_time = datetime.now(timezone.utc)
122
- execution_time = (end_time - start_time).total_seconds()
123
-
124
- # Create error result
125
- error_message = str(e)
126
- if len(error_message) > 500:
127
- error_message = error_message[:497] + "..."
128
-
129
- error_issue = ValidationIssue(
130
- file_path="generation_process",
131
- line_number=1,
132
- severity=ValidationSeverity.ERROR,
133
- message=error_message,
134
- rule_id="generation_error"
135
- )
136
-
137
- return AppGenerationResult(
138
- app_name=request.app_name if 'request' in locals() else "unknown",
139
- generation_id=generation_id,
140
- success=False,
141
- total_execution_time_seconds=execution_time,
142
- files_count=0,
143
- lines_of_code=0,
144
- quality_score=0.0,
145
- type_safety_score=0.0,
146
- pattern_consistency_score=0.0,
147
- test_coverage_percentage=0.0,
148
- integration_successful=False,
149
- generated_files=[],
150
- patterns_followed=[],
151
- dependencies_resolved=[],
152
- errors=[error_issue],
153
- warnings=[],
154
- report_directory=Path("/tmp"),
155
- generation_report_path=Path("/tmp/error.md")
156
- )
157
-
158
- async def _create_generation_context(
159
- self,
160
- request: AppGenerationRequest,
161
- dependencies: ServiceDependencies
162
- ) -> GenerationContext:
163
- """Create generation context from request."""
164
- # Determine target directory
165
- if request.output_directory:
166
- target_directory = Path(request.output_directory)
167
- else:
168
- target_directory = Path.cwd() / "apps"
169
-
170
- # Create template variables
171
- template_variables = {
172
- "app_name": request.app_name,
173
- "description": request.description,
174
- "app_type": request.app_type.value,
175
- "complexity": request.complexity.value,
176
- "features": [f.value for f in request.features],
177
- "timestamp": datetime.now(timezone.utc).isoformat()
178
- }
179
-
180
- return GenerationContext(
181
- request=request,
182
- target_directory=target_directory,
183
- template_variables=template_variables
184
- )
185
-
186
- def _extract_ai_dialogue(self, context: GenerationContext) -> list[Dict[str, Any]]:
187
- """Extract AI dialogue from generation context."""
188
- dialogue = []
189
-
190
- # Extract from agent outputs
191
- generation_output = context.agent_outputs.get("generation", {})
192
- if generation_output:
193
- dialogue.append({
194
- "agent": "generation_agent",
195
- "timestamp": datetime.now(timezone.utc).isoformat(),
196
- "message": generation_output.get("message", ""),
197
- "status": generation_output.get("status", "unknown"),
198
- "files_generated": generation_output.get("ai_files_count", 0),
199
- "recommendations": generation_output.get("recommendations", [])
200
- })
201
-
202
- return dialogue
@@ -1,316 +0,0 @@
1
- """
2
- Structure Generator for Django App Agent Module.
3
-
4
- This module handles creation of basic application structure
5
- and feature-specific files using templates.
6
- """
7
-
8
- from typing import Dict, List
9
- from pathlib import Path
10
-
11
- from ..base import ServiceDependencies
12
- from ...core.exceptions import FileSystemError
13
- from ...models.responses import GeneratedFile
14
- from ...models.enums import AppFeature, FileType
15
- from .context import GenerationContext
16
-
17
-
18
- class StructureGenerator:
19
- """Handles generation of application structure and files."""
20
-
21
- def __init__(self):
22
- """Initialize structure generator with feature file mappings."""
23
- self.feature_files: Dict[AppFeature, List[str]] = {
24
- AppFeature.MODELS: ["models.py"],
25
- AppFeature.VIEWS: ["views.py"],
26
- AppFeature.URLS: ["urls.py"],
27
- AppFeature.ADMIN: ["admin.py"],
28
- AppFeature.FORMS: ["forms.py"],
29
- AppFeature.TESTS: ["tests.py"],
30
- AppFeature.API: ["serializers.py", "viewsets.py"],
31
- AppFeature.SERIALIZERS: ["serializers.py"],
32
- AppFeature.VIEWSETS: ["viewsets.py"],
33
- AppFeature.FILTERS: ["filters.py"],
34
- AppFeature.PAGINATION: ["pagination.py"],
35
- AppFeature.SECURITY: ["security.py"],
36
- AppFeature.AUTHENTICATION: ["authentication.py"],
37
- AppFeature.TASKS: ["tasks.py"],
38
- AppFeature.DOCS: ["docs.py"],
39
- AppFeature.SERVICES: ["services/"],
40
- AppFeature.CFG_CONFIG: ["config.py"],
41
- AppFeature.CFG_MODULES: ["modules/"],
42
- }
43
-
44
- async def generate_app_structure(
45
- self,
46
- context: GenerationContext,
47
- dependencies: ServiceDependencies
48
- ) -> None:
49
- """Generate basic application directory structure."""
50
- try:
51
- # Create app directory
52
- context.app_directory.mkdir(parents=True, exist_ok=True)
53
-
54
- # Create basic structure
55
- basic_dirs = ["migrations", "templates", "static", "tests"]
56
- for dir_name in basic_dirs:
57
- (context.app_directory / dir_name).mkdir(exist_ok=True)
58
-
59
- # Create __init__.py
60
- init_file = context.app_directory / "__init__.py"
61
- init_content = f'"""Django app: {context.request.app_name}"""'
62
-
63
- generated_file = GeneratedFile(
64
- relative_path=str(init_file.relative_to(context.target_directory)),
65
- absolute_path=init_file,
66
- content=init_content,
67
- line_count=len(init_content.split('\n')),
68
- file_type=FileType.INIT,
69
- type_safety_score=8.0,
70
- complexity_score=2.0, # Simple __init__.py file
71
- description="Application initialization file"
72
- )
73
-
74
- init_file.write_text(init_content)
75
- context.add_generated_file(generated_file)
76
-
77
- except Exception as e:
78
- raise FileSystemError(
79
- f"Failed to create app structure: {e}",
80
- file_path=str(context.app_directory),
81
- operation="create_app_structure"
82
- )
83
-
84
- async def generate_feature_files(
85
- self,
86
- context: GenerationContext,
87
- dependencies: ServiceDependencies
88
- ) -> None:
89
- """Generate files for requested features."""
90
- for feature in context.request.features:
91
- await self.generate_feature(feature, context, dependencies)
92
-
93
- async def generate_feature(
94
- self,
95
- feature: AppFeature,
96
- context: GenerationContext,
97
- dependencies: ServiceDependencies
98
- ) -> None:
99
- """Generate files for a specific feature."""
100
- files_to_create = self.feature_files.get(feature, [])
101
-
102
- for file_pattern in files_to_create:
103
- if file_pattern.endswith("/"):
104
- # Directory
105
- dir_path = context.app_directory / file_pattern.rstrip("/")
106
- dir_path.mkdir(parents=True, exist_ok=True)
107
- else:
108
- # File
109
- await self.generate_feature_file(feature, file_pattern, context, dependencies)
110
-
111
- async def generate_feature_file(
112
- self,
113
- feature: AppFeature,
114
- filename: str,
115
- context: GenerationContext,
116
- dependencies: ServiceDependencies
117
- ) -> None:
118
- """Generate a specific feature file."""
119
- file_path = context.app_directory / filename
120
-
121
- # Generate basic template content
122
- content = self.get_template_content(feature, filename, context)
123
-
124
- # Create generated file record
125
- generated_file = GeneratedFile(
126
- relative_path=str(file_path.relative_to(context.target_directory)),
127
- absolute_path=file_path,
128
- content=content,
129
- line_count=len(content.split('\n')),
130
- file_type=self.get_file_type(filename),
131
- type_safety_score=7.0, # Default score for generated files
132
- complexity_score=5.0, # Moderate complexity for feature files
133
- description=f"{feature.value} implementation file"
134
- )
135
-
136
- # Write file
137
- file_path.parent.mkdir(parents=True, exist_ok=True)
138
- file_path.write_text(content)
139
-
140
- context.add_generated_file(generated_file)
141
-
142
- def get_template_content(
143
- self,
144
- feature: AppFeature,
145
- filename: str,
146
- context: GenerationContext
147
- ) -> str:
148
- """Get template content for a feature file."""
149
- app_name = context.request.app_name
150
- description = context.request.description
151
-
152
- templates = {
153
- "models.py": f'''"""
154
- Models for {app_name} application.
155
-
156
- {description}
157
- """
158
-
159
- from django.db import models
160
-
161
-
162
- class {app_name.title().replace('_', '')}Model(models.Model):
163
- """Main model for {app_name} application."""
164
-
165
- name = models.CharField(max_length=100, help_text="Name of the item")
166
- description = models.TextField(blank=True, help_text="Description of the item")
167
- created_at = models.DateTimeField(auto_now_add=True)
168
- updated_at = models.DateTimeField(auto_now=True)
169
-
170
- class Meta:
171
- verbose_name = "{app_name.replace('_', ' ').title()}"
172
- verbose_name_plural = "{app_name.replace('_', ' ').title()}s"
173
- ordering = ['-created_at']
174
-
175
- def __str__(self):
176
- return self.name
177
- ''',
178
- "views.py": f'''"""
179
- Views for {app_name} application.
180
-
181
- {description}
182
- """
183
-
184
- from django.shortcuts import render
185
- from django.views.generic import ListView, DetailView
186
-
187
-
188
- class {app_name.title().replace('_', '')}ListView(ListView):
189
- """List view for {app_name} items."""
190
-
191
- template_name = '{app_name}/list.html'
192
- context_object_name = 'items'
193
- paginate_by = 10
194
-
195
-
196
- class {app_name.title().replace('_', '')}DetailView(DetailView):
197
- """Detail view for {app_name} items."""
198
-
199
- template_name = '{app_name}/detail.html'
200
- context_object_name = 'item'
201
- ''',
202
- "urls.py": f'''"""
203
- URL configuration for {app_name} application.
204
-
205
- {description}
206
- """
207
-
208
- from django.urls import path
209
- from . import views
210
-
211
- app_name = '{app_name}'
212
-
213
- urlpatterns = [
214
- path('', views.{app_name.title().replace('_', '')}ListView.as_view(), name='list'),
215
- path('<int:pk>/', views.{app_name.title().replace('_', '')}DetailView.as_view(), name='detail'),
216
- ]
217
- ''',
218
- "admin.py": f'''"""
219
- Admin configuration for {app_name} application.
220
-
221
- {description}
222
- """
223
-
224
- from django.contrib import admin
225
- from .models import {app_name.title().replace('_', '')}Model
226
-
227
-
228
- @admin.register({app_name.title().replace('_', '')}Model)
229
- class {app_name.title().replace('_', '')}Admin(admin.ModelAdmin):
230
- """Admin interface for {app_name} model."""
231
-
232
- list_display = ['name', 'created_at', 'updated_at']
233
- list_filter = ['created_at', 'updated_at']
234
- search_fields = ['name', 'description']
235
- readonly_fields = ['created_at', 'updated_at']
236
- ''',
237
- "forms.py": f'''"""
238
- Forms for {app_name} application.
239
-
240
- {description}
241
- """
242
-
243
- from django import forms
244
- from .models import {app_name.title().replace('_', '')}Model
245
-
246
-
247
- class {app_name.title().replace('_', '')}Form(forms.ModelForm):
248
- """Form for {app_name} model."""
249
-
250
- class Meta:
251
- model = {app_name.title().replace('_', '')}Model
252
- fields = ['name', 'description']
253
- widgets = {{
254
- 'description': forms.Textarea(attrs={{'rows': 4}}),
255
- }}
256
- ''',
257
- "tests.py": f'''"""
258
- Tests for {app_name} application.
259
-
260
- {description}
261
- """
262
-
263
- from django.test import TestCase
264
- from .models import {app_name.title().replace('_', '')}Model
265
-
266
-
267
- class {app_name.title().replace('_', '')}TestCase(TestCase):
268
- """Test cases for {app_name} application."""
269
-
270
- def test_placeholder(self):
271
- """Placeholder test."""
272
- self.assertTrue(True)
273
- ''',
274
- "apps.py": f'''"""
275
- App configuration for {app_name}.
276
-
277
- {description}
278
- """
279
-
280
- from django.apps import AppConfig
281
-
282
-
283
- class {app_name.title().replace('_', '')}Config(AppConfig):
284
- """Configuration for {app_name} application."""
285
-
286
- default_auto_field = 'django.db.models.BigAutoField'
287
- name = '{app_name}'
288
- verbose_name = '{app_name.replace("_", " ").title()}'
289
- '''
290
- }
291
-
292
- return templates.get(filename, f"# {filename} for {app_name}\n# Generated by Django App Agent\n")
293
-
294
- def get_file_type(self, filename: str) -> FileType:
295
- """Determine file type from filename."""
296
- # Map specific Django files to their types
297
- if filename == "__init__.py":
298
- return FileType.INIT
299
- elif filename == "models.py":
300
- return FileType.MODEL
301
- elif filename == "views.py":
302
- return FileType.VIEW
303
- elif filename == "admin.py":
304
- return FileType.ADMIN
305
- elif filename == "urls.py":
306
- return FileType.URL
307
- elif filename == "forms.py":
308
- return FileType.FORM
309
- elif filename == "tests.py":
310
- return FileType.TEST
311
- elif filename.endswith('.html'):
312
- return FileType.TEMPLATE
313
- elif filename.endswith('.py'):
314
- return FileType.CONFIG # Default for other Python files
315
- else:
316
- return FileType.CONFIG # Default fallback