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,211 +0,0 @@
1
- """
2
- Views for {{ app_name }} application.
3
-
4
- {{ description }}
5
- """
6
-
7
- from django.shortcuts import render, get_object_or_404, redirect
8
- from django.http import HttpResponse, JsonResponse, Http404
9
- from django.views.generic import (
10
- ListView, DetailView, CreateView, UpdateView, DeleteView, TemplateView
11
- )
12
- from django.contrib import messages
13
- from django.urls import reverse_lazy
14
- {% if features.authentication %}
15
- from django.contrib.auth.decorators import login_required
16
- from django.contrib.auth.mixins import LoginRequiredMixin
17
- {% endif %}
18
- {% if features.permissions %}
19
- from django.contrib.auth.mixins import PermissionRequiredMixin
20
- {% endif %}
21
- {% if features.forms %}
22
- from .forms import {{ app_name|pascal_case }}Form
23
- {% endif %}
24
- from .models import {{ app_name|pascal_case }}Model
25
-
26
-
27
- {% if features.function_based_views %}
28
- {% if features.authentication %}
29
- @login_required
30
- {% endif %}
31
- def {{ app_name }}_index(request):
32
- """Index view for {{ app_name }}."""
33
- items = {{ app_name|pascal_case }}Model.objects.all()
34
- {% if features.status_tracking %}
35
- items = items.filter(status='published')
36
- {% endif %}
37
-
38
- context = {
39
- 'items': items,
40
- 'app_name': '{{ app_name|title_case }}',
41
- 'description': '{{ description }}'
42
- }
43
- return render(request, '{{ app_name }}/index.html', context)
44
-
45
-
46
- {% if features.authentication %}
47
- @login_required
48
- {% endif %}
49
- def {{ app_name }}_detail(request, pk):
50
- """Detail view for {{ app_name }}."""
51
- item = get_object_or_404({{ app_name|pascal_case }}Model, pk=pk)
52
-
53
- {% if features.status_tracking and features.authentication %}
54
- # Only show published items to non-owners
55
- if item.status != 'published' and item.owner != request.user:
56
- raise Http404("Item not found")
57
- {% endif %}
58
-
59
- context = {
60
- 'item': item,
61
- 'app_name': '{{ app_name|title_case }}'
62
- }
63
- return render(request, '{{ app_name }}/detail.html', context)
64
- {% endif %}
65
-
66
-
67
- {% if features.class_based_views %}
68
- class {{ app_name|pascal_case }}ListView(
69
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
70
- ListView
71
- ):
72
- """List view for {{ app_name }} items."""
73
-
74
- model = {{ app_name|pascal_case }}Model
75
- template_name = '{{ app_name }}/list.html'
76
- context_object_name = 'items'
77
- paginate_by = 20
78
-
79
- {% if features.status_tracking %}
80
- def get_queryset(self):
81
- """Filter published items."""
82
- queryset = super().get_queryset()
83
- {% if features.authentication %}
84
- if self.request.user.is_authenticated:
85
- return queryset # Show all to authenticated users
86
- {% endif %}
87
- return queryset.filter(status='published')
88
- {% endif %}
89
-
90
- def get_context_data(self, **kwargs):
91
- context = super().get_context_data(**kwargs)
92
- context['app_name'] = '{{ app_name|title_case }}'
93
- return context
94
-
95
-
96
- class {{ app_name|pascal_case }}DetailView(
97
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
98
- DetailView
99
- ):
100
- """Detail view for {{ app_name }} items."""
101
-
102
- model = {{ app_name|pascal_case }}Model
103
- template_name = '{{ app_name }}/detail.html'
104
- context_object_name = 'item'
105
-
106
-
107
- {% if features.crud_views %}
108
- class {{ app_name|pascal_case }}CreateView(
109
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
110
- {%- if features.permissions %}PermissionRequiredMixin, {% endif -%}
111
- CreateView
112
- ):
113
- """Create view for {{ app_name }} items."""
114
-
115
- model = {{ app_name|pascal_case }}Model
116
- {% if features.forms %}
117
- form_class = {{ app_name|pascal_case }}Form
118
- {% else %}
119
- fields = ['name', 'description'{% if features.status_tracking %}, 'status'{% endif %}]
120
- {% endif %}
121
- template_name = '{{ app_name }}/form.html'
122
- success_url = reverse_lazy('{{ app_name }}:list')
123
- {% if features.permissions %}
124
- permission_required = '{{ app_name }}.add_{{ app_name|snake_case }}model'
125
- {% endif %}
126
-
127
- {% if features.user_relations %}
128
- def form_valid(self, form):
129
- form.instance.owner = self.request.user
130
- messages.success(self.request, f'{{ app_name|title_case }} created successfully!')
131
- return super().form_valid(form)
132
- {% endif %}
133
-
134
-
135
- class {{ app_name|pascal_case }}UpdateView(
136
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
137
- {%- if features.permissions %}PermissionRequiredMixin, {% endif -%}
138
- UpdateView
139
- ):
140
- """Update view for {{ app_name }} items."""
141
-
142
- model = {{ app_name|pascal_case }}Model
143
- {% if features.forms %}
144
- form_class = {{ app_name|pascal_case }}Form
145
- {% else %}
146
- fields = ['name', 'description'{% if features.status_tracking %}, 'status'{% endif %}]
147
- {% endif %}
148
- template_name = '{{ app_name }}/form.html'
149
- {% if features.permissions %}
150
- permission_required = '{{ app_name }}.change_{{ app_name|snake_case }}model'
151
- {% endif %}
152
-
153
- def form_valid(self, form):
154
- messages.success(self.request, f'{{ app_name|title_case }} updated successfully!')
155
- return super().form_valid(form)
156
-
157
-
158
- class {{ app_name|pascal_case }}DeleteView(
159
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
160
- {%- if features.permissions %}PermissionRequiredMixin, {% endif -%}
161
- DeleteView
162
- ):
163
- """Delete view for {{ app_name }} items."""
164
-
165
- model = {{ app_name|pascal_case }}Model
166
- template_name = '{{ app_name }}/confirm_delete.html'
167
- success_url = reverse_lazy('{{ app_name }}:list')
168
- {% if features.permissions %}
169
- permission_required = '{{ app_name }}.delete_{{ app_name|snake_case }}model'
170
- {% endif %}
171
-
172
- def delete(self, request, *args, **kwargs):
173
- messages.success(request, f'{{ app_name|title_case }} deleted successfully!')
174
- return super().delete(request, *args, **kwargs)
175
- {% endif %}
176
- {% endif %}
177
-
178
-
179
- {% if features.api_views %}
180
- class {{ app_name|pascal_case }}APIView(
181
- {%- if features.authentication %}LoginRequiredMixin, {% endif -%}
182
- TemplateView
183
- ):
184
- """API view for {{ app_name }}."""
185
-
186
- def get(self, request, *args, **kwargs):
187
- """Get {{ app_name }} data as JSON."""
188
- items = {{ app_name|pascal_case }}Model.objects.all()
189
- {% if features.status_tracking %}
190
- items = items.filter(status='published')
191
- {% endif %}
192
-
193
- data = [
194
- {
195
- 'id': item.pk,
196
- 'name': item.name,
197
- 'description': item.description,
198
- {% if features.status_tracking %}
199
- 'status': item.status,
200
- {% endif %}
201
- 'created_at': item.created_at.isoformat(),
202
- }
203
- for item in items[:50] # Limit to 50 items
204
- ]
205
-
206
- return JsonResponse({
207
- 'success': True,
208
- 'data': data,
209
- 'count': len(data)
210
- })
211
- {% endif %}
@@ -1,200 +0,0 @@
1
- """
2
- Variable Processor for Template Manager.
3
-
4
- This module handles processing and enrichment of template variables
5
- based on app features and context.
6
- """
7
-
8
- from typing import Dict, Any, List, Set
9
- import re
10
-
11
- from pydantic import BaseModel, Field
12
-
13
- from ...models.enums import AppType, AppFeature
14
- from ...models.requests import TemplateRequest
15
- from ..base import ServiceDependencies
16
-
17
-
18
- class VariableProcessor(BaseModel):
19
- """Processes and enriches template variables."""
20
-
21
- def __init__(self, **data):
22
- """Initialize variable processor."""
23
- super().__init__(**data)
24
-
25
- async def process_variables(
26
- self,
27
- request: TemplateRequest,
28
- dependencies: ServiceDependencies
29
- ) -> Dict[str, Any]:
30
- """Process and enrich template variables."""
31
- # Start with provided variables
32
- variables = dict(request.variables)
33
-
34
- # Add standard variables
35
- variables.update(self._get_standard_variables(request))
36
-
37
- # Add feature-based variables
38
- variables.update(self._get_feature_variables(request))
39
-
40
- # Add computed variables
41
- variables.update(self._get_computed_variables(request, variables))
42
-
43
- dependencies.log_operation(
44
- "Variables processed",
45
- total_variables=len(variables),
46
- standard_vars=len(self._get_standard_variables(request)),
47
- feature_vars=len(self._get_feature_variables(request))
48
- )
49
-
50
- return variables
51
-
52
- def _get_standard_variables(self, request: TemplateRequest) -> Dict[str, Any]:
53
- """Get standard template variables."""
54
- app_name = request.variables.get('app_name', 'myapp')
55
- description = request.variables.get('description', f'Django application: {app_name}')
56
-
57
- return {
58
- 'app_name': app_name,
59
- 'description': description,
60
- 'app_type': request.app_type if isinstance(request.app_type, str) else request.app_type.value,
61
- 'features': {(f.value if hasattr(f, 'value') else f): True for f in request.features},
62
-
63
- # Name variations
64
- 'app_name_snake': self._to_snake_case(app_name),
65
- 'app_name_camel': self._to_camel_case(app_name),
66
- 'app_name_pascal': self._to_pascal_case(app_name),
67
- 'app_name_kebab': self._to_kebab_case(app_name),
68
- 'app_name_title': self._to_title_case(app_name),
69
-
70
- # Pluralization
71
- 'app_name_plural': self._pluralize(app_name),
72
- 'app_name_singular': self._singularize(app_name),
73
- }
74
-
75
- def _get_feature_variables(self, request: TemplateRequest) -> Dict[str, Any]:
76
- """Get feature-specific variables."""
77
- features_dict = {}
78
-
79
- # Create feature flags
80
- for feature in AppFeature:
81
- features_dict[feature.value] = feature in request.features
82
-
83
- # Add feature groups
84
- features_dict.update({
85
- 'has_authentication': any(f in request.features for f in [
86
- AppFeature.AUTHENTICATION, AppFeature.SECURITY
87
- ]),
88
- 'has_api': any(f in request.features for f in [
89
- AppFeature.API, AppFeature.SERIALIZERS, AppFeature.VIEWSETS
90
- ]),
91
- 'has_admin': AppFeature.ADMIN in request.features,
92
- 'has_forms': AppFeature.FORMS in request.features,
93
- 'has_tests': AppFeature.TESTS in request.features,
94
- 'has_models': AppFeature.MODELS in request.features,
95
- 'has_views': AppFeature.VIEWS in request.features,
96
- 'has_urls': AppFeature.URLS in request.features,
97
-
98
- # Advanced features
99
- 'has_advanced_features': any(f in request.features for f in [
100
- AppFeature.SERIALIZERS, AppFeature.VIEWSETS, AppFeature.FILTERS,
101
- AppFeature.PAGINATION, AppFeature.SECURITY, AppFeature.TASKS
102
- ]),
103
-
104
- # Django-CFG specific
105
- 'is_django_cfg': request.app_type == AppType.DJANGO_CFG,
106
- 'has_cfg_features': any(f in request.features for f in [
107
- AppFeature.CFG_CONFIG, AppFeature.CFG_MODULES
108
- ]),
109
- })
110
-
111
- return {'features': features_dict}
112
-
113
- def _get_computed_variables(
114
- self,
115
- request: TemplateRequest,
116
- existing_vars: Dict[str, Any]
117
- ) -> Dict[str, Any]:
118
- """Get computed variables based on existing variables."""
119
- app_name = existing_vars.get('app_name', 'myapp')
120
-
121
- computed = {
122
- # Model class names
123
- 'model_class': f"{self._to_pascal_case(app_name)}Model",
124
- 'admin_class': f"{self._to_pascal_case(app_name)}Admin",
125
- 'form_class': f"{self._to_pascal_case(app_name)}Form",
126
- 'serializer_class': f"{self._to_pascal_case(app_name)}Serializer",
127
-
128
- # View class names
129
- 'list_view_class': f"{self._to_pascal_case(app_name)}ListView",
130
- 'detail_view_class': f"{self._to_pascal_case(app_name)}DetailView",
131
- 'create_view_class': f"{self._to_pascal_case(app_name)}CreateView",
132
- 'update_view_class': f"{self._to_pascal_case(app_name)}UpdateView",
133
- 'delete_view_class': f"{self._to_pascal_case(app_name)}DeleteView",
134
-
135
- # URL patterns
136
- 'url_namespace': app_name,
137
- 'url_prefix': self._to_kebab_case(app_name),
138
-
139
- # Template paths
140
- 'template_dir': app_name,
141
- 'list_template': f"{app_name}/list.html",
142
- 'detail_template': f"{app_name}/detail.html",
143
- 'form_template': f"{app_name}/form.html",
144
-
145
- # Database table name
146
- 'db_table': f"{app_name}_{self._to_snake_case(app_name)}model",
147
-
148
- # Permissions
149
- 'add_permission': f"{app_name}.add_{self._to_snake_case(app_name)}model",
150
- 'change_permission': f"{app_name}.change_{self._to_snake_case(app_name)}model",
151
- 'delete_permission': f"{app_name}.delete_{self._to_snake_case(app_name)}model",
152
- 'view_permission': f"{app_name}.view_{self._to_snake_case(app_name)}model",
153
- }
154
-
155
- return computed
156
-
157
- # String transformation utilities
158
- def _to_snake_case(self, text: str) -> str:
159
- """Convert text to snake_case."""
160
- s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', text)
161
- s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1)
162
- return s2.lower().replace(' ', '_').replace('-', '_')
163
-
164
- def _to_camel_case(self, text: str) -> str:
165
- """Convert text to camelCase."""
166
- components = re.split(r'[_\s-]+', text.lower())
167
- return components[0] + ''.join(word.capitalize() for word in components[1:])
168
-
169
- def _to_pascal_case(self, text: str) -> str:
170
- """Convert text to PascalCase."""
171
- components = re.split(r'[_\s-]+', text.lower())
172
- return ''.join(word.capitalize() for word in components)
173
-
174
- def _to_kebab_case(self, text: str) -> str:
175
- """Convert text to kebab-case."""
176
- return self._to_snake_case(text).replace('_', '-')
177
-
178
- def _to_title_case(self, text: str) -> str:
179
- """Convert text to Title Case."""
180
- return text.replace('_', ' ').replace('-', ' ').title()
181
-
182
- def _pluralize(self, text: str) -> str:
183
- """Simple pluralization."""
184
- if text.endswith('y'):
185
- return text[:-1] + 'ies'
186
- elif text.endswith(('s', 'sh', 'ch', 'x', 'z')):
187
- return text + 'es'
188
- else:
189
- return text + 's'
190
-
191
- def _singularize(self, text: str) -> str:
192
- """Simple singularization."""
193
- if text.endswith('ies'):
194
- return text[:-3] + 'y'
195
- elif text.endswith('es') and not text.endswith(('ses', 'ches', 'xes', 'zes')):
196
- return text[:-2]
197
- elif text.endswith('s') and not text.endswith('ss'):
198
- return text[:-1]
199
- else:
200
- return text
@@ -1,25 +0,0 @@
1
- """
2
- Validation Service for Django App Agent Module.
3
-
4
- This package provides comprehensive code validation including
5
- syntax checking, Django best practices, security analysis,
6
- and quality metrics calculation.
7
- """
8
-
9
- from .main import ValidationService
10
- from .models import ValidationRequest, ValidationResult, ValidationIssue
11
- from .syntax_validator import SyntaxValidator
12
- from .django_validator import DjangoValidator
13
- from .security_validator import SecurityValidator
14
- from .quality_validator import QualityValidator
15
-
16
- __all__ = [
17
- "ValidationService",
18
- "ValidationRequest",
19
- "ValidationResult",
20
- "ValidationIssue",
21
- "SyntaxValidator",
22
- "DjangoValidator",
23
- "SecurityValidator",
24
- "QualityValidator",
25
- ]