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,247 @@
1
+ """
2
+ Display utilities with humanize integration.
3
+ """
4
+
5
+ import logging
6
+ from typing import Optional, List, Union, Any
7
+ from decimal import Decimal
8
+ from datetime import datetime
9
+
10
+ from django.utils.html import format_html, escape
11
+ from django.utils.safestring import SafeString
12
+ from django.contrib.humanize.templatetags.humanize import naturaltime, intcomma
13
+ from django.utils import timezone
14
+
15
+ from ..models.display_models import UserDisplayConfig, MoneyDisplayConfig, DateTimeDisplayConfig
16
+ from ..icons import Icons
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class UserDisplay:
22
+ """User display utilities."""
23
+
24
+ @classmethod
25
+ def with_avatar(cls, user: Any, config: Optional[UserDisplayConfig] = None) -> List[str]:
26
+ """Display user with avatar for @display(header=True)."""
27
+ config = config or UserDisplayConfig()
28
+
29
+ if not user:
30
+ return ["No user", "", "", {}]
31
+
32
+ name = getattr(user, 'get_full_name', lambda: '')() or getattr(user, 'username', 'Unknown')
33
+ email = getattr(user, 'email', '') if config.show_email else ''
34
+
35
+ # Generate initials
36
+ name_parts = name.split()
37
+ if len(name_parts) >= 2:
38
+ initials = f"{name_parts[0][0]}{name_parts[1][0]}".upper()
39
+ elif name:
40
+ initials = name[0].upper()
41
+ else:
42
+ initials = "U"
43
+
44
+ avatar_data = {"size": config.avatar_size, "initials": initials, "show": config.show_avatar}
45
+
46
+ return [name, email, initials, avatar_data]
47
+
48
+ @classmethod
49
+ def simple(cls, user: Any, config: Optional[UserDisplayConfig] = None) -> SafeString:
50
+ """Simple user display."""
51
+ config = config or UserDisplayConfig()
52
+
53
+ if not user:
54
+ return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">No user</span>')
55
+
56
+ name = getattr(user, 'get_full_name', lambda: '')() or getattr(user, 'username', 'Unknown')
57
+ html = format_html('<span class="font-medium">{}</span>', escape(name))
58
+
59
+ if config.show_email:
60
+ email = getattr(user, 'email', '')
61
+ if email:
62
+ html = format_html('{}<br><span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{}</span>', html, escape(email))
63
+
64
+ return html
65
+
66
+
67
+ class MoneyDisplay:
68
+ """Money display utilities."""
69
+
70
+ @classmethod
71
+ def amount(cls, amount: Union[Decimal, float, int], config: Optional[MoneyDisplayConfig] = None) -> SafeString:
72
+ """Format money amount with smart formatting."""
73
+ config = config or MoneyDisplayConfig()
74
+
75
+ if amount is None:
76
+ return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
77
+
78
+ amount = Decimal(str(amount))
79
+
80
+ # Smart decimal places for rates or auto-adjustment
81
+ decimal_places = config.decimal_places
82
+ if config.smart_decimal_places or config.rate_mode:
83
+ if amount >= 1000:
84
+ decimal_places = 0 # 1,234 (whole numbers for large amounts)
85
+ elif amount >= 100:
86
+ decimal_places = 1 # 123.4
87
+ elif amount >= 10:
88
+ decimal_places = 2 # 12.34
89
+ elif amount >= 1:
90
+ decimal_places = 3 # 1.234
91
+ elif amount >= 0.01:
92
+ decimal_places = 4 # 0.1234
93
+ else:
94
+ decimal_places = 8 # 0.00001234 (for very small amounts)
95
+
96
+ # Currency symbols
97
+ symbols = {'USD': '$', 'EUR': '€', 'GBP': '£', 'JPY': '¥', 'BTC': '₿', 'ETH': 'Ξ'}
98
+ symbol = symbols.get(config.currency, config.currency) if config.show_currency_symbol else ""
99
+
100
+ # Format with appropriate decimal places
101
+ if config.thousand_separator:
102
+ if decimal_places == 0:
103
+ formatted_amount = f"{amount:,.0f}"
104
+ else:
105
+ formatted_amount = f"{amount:,.{decimal_places}f}"
106
+ else:
107
+ formatted_amount = f"{amount:.{decimal_places}f}"
108
+
109
+ # Special formatting for rate mode
110
+ if config.rate_mode:
111
+ # For rates, show number + small currency label instead of symbol
112
+ return format_html(
113
+ '<span class="font-mono text-sm">{} <span class="text-font-subtle-light dark:text-font-subtle-dark text-xs">{}</span></span>',
114
+ formatted_amount,
115
+ config.currency
116
+ )
117
+
118
+ # Color coding for regular amounts
119
+ if amount < 0:
120
+ color_class = "text-red-600 dark:text-red-400"
121
+ elif amount == 0:
122
+ color_class = "text-font-default-light dark:text-font-default-dark"
123
+ else:
124
+ color_class = "text-green-600 dark:text-green-400"
125
+
126
+ # Show sign
127
+ sign = "+" if config.show_sign and amount > 0 else ""
128
+
129
+ return format_html('<span class="font-mono {}">{}{}{}</span>', color_class, sign, symbol, formatted_amount)
130
+
131
+ @classmethod
132
+ def with_breakdown(cls, main_amount: Union[Decimal, float, int], breakdown_items: List[dict] = None,
133
+ config: Optional[MoneyDisplayConfig] = None) -> SafeString:
134
+ """Display with breakdown."""
135
+ config = config or MoneyDisplayConfig()
136
+
137
+ html = format_html('<div class="text-right">')
138
+ html += cls.amount(main_amount, config)
139
+
140
+ if breakdown_items:
141
+ for item in breakdown_items:
142
+ label = item.get('label', 'Item')
143
+ amount = item.get('amount', 0)
144
+ color = item.get('color', 'secondary')
145
+
146
+ color_classes = {
147
+ 'success': 'text-green-600 dark:text-green-400',
148
+ 'warning': 'text-yellow-600 dark:text-yellow-400',
149
+ 'danger': 'text-red-600 dark:text-red-400',
150
+ 'secondary': 'text-font-subtle-light dark:text-font-subtle-dark'
151
+ }
152
+
153
+ color_class = color_classes.get(color, 'text-font-subtle-light dark:text-font-subtle-dark')
154
+ html += format_html('<div class="text-xs {}">{}: {}</div>', color_class, escape(label), cls.amount(amount, config))
155
+
156
+ html += format_html('</div>')
157
+ return html
158
+
159
+
160
+ class StatusDisplay:
161
+ """Status display utilities."""
162
+
163
+ @classmethod
164
+ def auto(cls, status: str) -> SafeString:
165
+ """Auto status display with color mapping."""
166
+ if not status:
167
+ return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
168
+
169
+ status_lower = status.lower()
170
+
171
+ if any(word in status_lower for word in ['active', 'success', 'completed']):
172
+ variant = 'success'
173
+ icon_name = Icons.CHECK_CIRCLE
174
+ elif any(word in status_lower for word in ['pending', 'processing']):
175
+ variant = 'warning'
176
+ icon_name = Icons.WARNING
177
+ elif any(word in status_lower for word in ['failed', 'error', 'cancelled']):
178
+ variant = 'danger'
179
+ icon_name = Icons.ERROR
180
+ else:
181
+ variant = 'info'
182
+ icon_name = Icons.INFO
183
+
184
+ color_classes = {
185
+ 'success': 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
186
+ 'warning': 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
187
+ 'danger': 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200',
188
+ 'info': 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200',
189
+ }
190
+
191
+ color_class = color_classes.get(variant, color_classes['info'])
192
+
193
+ # Render icon with Material Icons
194
+ icon_html = format_html('<span class="material-symbols-outlined text-xs mr-1">{}</span>', icon_name)
195
+
196
+ return format_html(
197
+ '<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium {}">'
198
+ '{}{}'
199
+ '</span>',
200
+ color_class, icon_html, escape(status.replace('_', ' ').title())
201
+ )
202
+
203
+
204
+ class DateTimeDisplay:
205
+ """DateTime display utilities."""
206
+
207
+ @classmethod
208
+ def relative(cls, dt: datetime, config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
209
+ """Display with relative time."""
210
+ config = config or DateTimeDisplayConfig()
211
+
212
+ if not dt:
213
+ return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
214
+
215
+ absolute_time = dt.strftime(config.datetime_format)
216
+ relative_time = naturaltime(dt)
217
+
218
+ if config.show_relative:
219
+ return format_html(
220
+ '<div class="text-xs"><div class="font-medium">{}</div><div class="text-font-subtle-light dark:text-font-subtle-dark">{}</div></div>',
221
+ escape(absolute_time), escape(relative_time)
222
+ )
223
+ else:
224
+ return format_html('<span class="text-sm">{}</span>', escape(absolute_time))
225
+
226
+ @classmethod
227
+ def compact(cls, dt: datetime, config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
228
+ """Compact datetime display."""
229
+ config = config or DateTimeDisplayConfig()
230
+
231
+ if not dt:
232
+ return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
233
+
234
+ now = timezone.now()
235
+ diff = now - dt
236
+
237
+ if diff.days < 1:
238
+ display_text = naturaltime(dt)
239
+ elif diff.days < 7:
240
+ display_text = dt.strftime('%a %H:%M')
241
+ else:
242
+ display_text = dt.strftime('%m/%d/%y')
243
+
244
+ return format_html(
245
+ '<span class="text-xs text-font-default-light dark:text-font-default-dark" title="{}">{}</span>',
246
+ escape(dt.strftime(config.datetime_format)), escape(display_text)
247
+ )
@@ -0,0 +1,87 @@
1
+ """
2
+ Django App Agent Module - AI-Powered Django Application Generator.
3
+
4
+ This module provides intelligent Django application generation using AI agents
5
+ with infrastructure-aware code generation and intelligent questioning systems.
6
+
7
+ Key Features:
8
+ - AI-powered code generation with Pydantic AI
9
+ - Infrastructure-aware pattern recognition
10
+ - Intelligent questioning for requirement gathering
11
+ - Type-safe everything with Pydantic 2
12
+ - Rich CLI interface with progress tracking
13
+ - Multi-agent orchestration for complex workflows
14
+
15
+ Usage:
16
+ from django_cfg.modules.django_app_agent import AppGeneratorService
17
+
18
+ service = AppGeneratorService()
19
+ result = await service.generate_app(request)
20
+ """
21
+
22
+ from typing import TYPE_CHECKING
23
+
24
+ # Version information
25
+ __version__ = "0.4.0"
26
+ __author__ = "Django-CFG Team"
27
+ __email__ = "team@django-cfg.dev"
28
+
29
+ # Module metadata
30
+ __title__ = "Django App Agent"
31
+ __description__ = "AI-Powered Django Application Generator"
32
+ __url__ = "https://github.com/django-cfg/django-cfg"
33
+ __license__ = "MIT"
34
+
35
+ # Public API exports (lazy loading for performance)
36
+ if TYPE_CHECKING:
37
+ from .services.app_generator import AppGeneratorService
38
+ from .services.questioning_service import QuestioningService
39
+ from .services.diagnostic_service import DiagnosticService
40
+ from .models.requests import AppGenerationRequest
41
+ from .models.responses import AppGenerationResult
42
+ from .core.exceptions import (
43
+ DjangoAppAgentError,
44
+ GenerationError,
45
+ ValidationError,
46
+ ConfigurationError
47
+ )
48
+
49
+ __all__ = [
50
+ # Services
51
+ "AppGeneratorService",
52
+ "QuestioningService",
53
+ "DiagnosticService",
54
+
55
+ # Models
56
+ "AppGenerationRequest",
57
+ "AppGenerationResult",
58
+
59
+ # Exceptions
60
+ "DjangoAppAgentError",
61
+ "GenerationError",
62
+ "ValidationError",
63
+ "ConfigurationError",
64
+
65
+ # Metadata
66
+ "__version__",
67
+ "__author__",
68
+ "__title__",
69
+ "__description__",
70
+ ]
71
+
72
+
73
+ def get_version() -> str:
74
+ """Get the current version of Django App Agent Module."""
75
+ return __version__
76
+
77
+
78
+ def get_info() -> dict[str, str]:
79
+ """Get module information."""
80
+ return {
81
+ "title": __title__,
82
+ "version": __version__,
83
+ "description": __description__,
84
+ "author": __author__,
85
+ "url": __url__,
86
+ "license": __license__,
87
+ }
@@ -0,0 +1,40 @@
1
+ """
2
+ AI Agents for Django App Agent Module.
3
+
4
+ This module contains specialized AI agents for:
5
+ - Code generation and analysis
6
+ - Intelligent questioning
7
+ - Quality validation
8
+ - Diagnostic problem solving
9
+ - Orchestration and coordination
10
+ """
11
+
12
+ from .base import DjangoAgent, AgentExecutor, AgentContext
13
+ from .interfaces import AgentRegistry, AgentClientFactory
14
+
15
+ # TODO: Import specialized agents when they are implemented
16
+ # from .generation import AppGeneratorAgent
17
+ # from .analysis import CodeAnalysisAgent, ProjectAnalysisAgent
18
+ # from .validation import QualityValidationAgent, SecurityValidationAgent
19
+ # from .dialogue import DialogueAgent, QuestioningAgent
20
+ # from .diagnostic import DiagnosticAgent, ProblemSolverAgent
21
+
22
+ __all__ = [
23
+ # Base classes
24
+ "DjangoAgent",
25
+ "AgentExecutor",
26
+ "AgentContext",
27
+ "AgentRegistry",
28
+ "AgentClientFactory",
29
+
30
+ # TODO: Add specialized agents when implemented
31
+ # "AppGeneratorAgent",
32
+ # "CodeAnalysisAgent",
33
+ # "ProjectAnalysisAgent",
34
+ # "QualityValidationAgent",
35
+ # "SecurityValidationAgent",
36
+ # "DialogueAgent",
37
+ # "QuestioningAgent",
38
+ # "DiagnosticAgent",
39
+ # "ProblemSolverAgent",
40
+ ]
@@ -0,0 +1,24 @@
1
+ """
2
+ Base classes for Django App Agent AI agents.
3
+
4
+ This module provides foundational classes for all AI agents:
5
+ - DjangoAgent: Base class with django-cfg integration
6
+ - AgentContext: Context management for agent execution
7
+ - AgentExecutor: Execution management and orchestration
8
+ """
9
+
10
+ from .agent import DjangoAgent, SimpleTextAgent, create_simple_agent
11
+ from .context import AgentContext, AgentDependencies, create_agent_dependencies
12
+ from .executor import AgentExecutor, ExecutionResult, ExecutionStatus
13
+
14
+ __all__ = [
15
+ "DjangoAgent",
16
+ "SimpleTextAgent",
17
+ "create_simple_agent",
18
+ "AgentContext",
19
+ "AgentDependencies",
20
+ "create_agent_dependencies",
21
+ "AgentExecutor",
22
+ "ExecutionResult",
23
+ "ExecutionStatus",
24
+ ]