django-cfg 1.3.9__py3-none-any.whl → 1.3.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/payments/admin/networks_admin.py +12 -1
- django_cfg/apps/payments/admin/payments_admin.py +13 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
- django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
- django_cfg/apps/payments/config/__init__.py +14 -15
- django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
- django_cfg/apps/payments/config/helpers.py +8 -13
- django_cfg/apps/payments/migrations/0001_initial.py +33 -46
- django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
- django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
- django_cfg/apps/payments/models/payments.py +94 -0
- django_cfg/apps/payments/services/core/base.py +4 -4
- django_cfg/apps/payments/services/core/payment_service.py +265 -38
- django_cfg/apps/payments/services/providers/base.py +209 -3
- django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
- django_cfg/apps/payments/services/providers/models/base.py +25 -2
- django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
- django_cfg/apps/payments/services/providers/registry.py +5 -5
- django_cfg/apps/payments/services/types/requests.py +19 -7
- django_cfg/apps/payments/signals/payment_signals.py +31 -2
- django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
- django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
- django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
- django_cfg/apps/payments/urls.py +3 -2
- django_cfg/apps/payments/views/api/currencies.py +3 -0
- django_cfg/apps/payments/views/serializers/currencies.py +18 -5
- django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
- django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
- django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
- django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
- django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
- django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
- django_cfg/apps/tasks/tasks/__init__.py +10 -0
- django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
- django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
- django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
- django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
- django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
- django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
- django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
- django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
- django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
- django_cfg/apps/tasks/urls.py +2 -2
- django_cfg/apps/tasks/urls_admin.py +2 -2
- django_cfg/apps/tasks/utils/__init__.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +356 -0
- django_cfg/apps/tasks/views/__init__.py +16 -0
- django_cfg/apps/tasks/views/api.py +569 -0
- django_cfg/apps/tasks/views/dashboard.py +58 -0
- django_cfg/core/integration/__init__.py +21 -0
- django_cfg/management/commands/rundramatiq_simulator.py +430 -0
- django_cfg/models/constance.py +0 -11
- django_cfg/models/payments.py +137 -3
- django_cfg/modules/django_tasks.py +54 -21
- django_cfg/registry/core.py +4 -9
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -2
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/RECORD +84 -152
- django_cfg/apps/payments/config/constance/__init__.py +0 -22
- django_cfg/apps/payments/config/constance/config_service.py +0 -123
- django_cfg/apps/payments/config/constance/fields.py +0 -69
- django_cfg/apps/payments/config/constance/settings.py +0 -160
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
- django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
- django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
- django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
- django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
- django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
- django_cfg/apps/tasks/templates/tasks/base.html +0 -96
- django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
- django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
- django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
- django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
- django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
- django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
- django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
- django_cfg/apps/tasks/views.py +0 -461
- django_cfg/management/commands/app_agent_diagnose.py +0 -470
- django_cfg/management/commands/app_agent_generate.py +0 -342
- django_cfg/management/commands/app_agent_info.py +0 -308
- django_cfg/management/commands/auto_generate.py +0 -486
- django_cfg/modules/django_app_agent/__init__.py +0 -87
- django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
- django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
- django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
- django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
- django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
- django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
- django_cfg/modules/django_app_agent/core/__init__.py +0 -33
- django_cfg/modules/django_app_agent/core/config.py +0 -300
- django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
- django_cfg/modules/django_app_agent/models/__init__.py +0 -71
- django_cfg/modules/django_app_agent/models/base.py +0 -283
- django_cfg/modules/django_app_agent/models/context.py +0 -496
- django_cfg/modules/django_app_agent/models/enums.py +0 -481
- django_cfg/modules/django_app_agent/models/requests.py +0 -500
- django_cfg/modules/django_app_agent/models/responses.py +0 -585
- django_cfg/modules/django_app_agent/pytest.ini +0 -6
- django_cfg/modules/django_app_agent/services/__init__.py +0 -42
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
- django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
- django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
- django_cfg/modules/django_app_agent/services/base.py +0 -437
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
- django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
- django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
- django_cfg/modules/django_app_agent/services/report_service.py +0 -332
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
- django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
- django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
- django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
- django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
- django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
- django_cfg/modules/django_app_agent/ui/cli.py +0 -419
- django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
- django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
- django_cfg/modules/django_app_agent/utils/logging.py +0 -360
- django_cfg/modules/django_app_agent/utils/validation.py +0 -417
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.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
|