django-cfg 1.3.7__py3-none-any.whl → 1.3.9__py3-none-any.whl

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