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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/__init__.py +24 -8
- django_cfg/apps/accounts/admin/activity_admin.py +146 -0
- django_cfg/apps/accounts/admin/filters.py +98 -22
- django_cfg/apps/accounts/admin/group_admin.py +86 -0
- django_cfg/apps/accounts/admin/inlines.py +42 -13
- django_cfg/apps/accounts/admin/otp_admin.py +115 -0
- django_cfg/apps/accounts/admin/registration_admin.py +173 -0
- django_cfg/apps/accounts/admin/resources.py +123 -19
- django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
- django_cfg/apps/accounts/admin/user_admin.py +362 -0
- django_cfg/apps/agents/admin/__init__.py +17 -4
- django_cfg/apps/agents/admin/execution_admin.py +204 -183
- django_cfg/apps/agents/admin/registry_admin.py +230 -255
- django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
- django_cfg/apps/agents/core/__init__.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +221 -0
- django_cfg/apps/agents/core/exceptions.py +14 -0
- django_cfg/apps/agents/core/orchestrator.py +18 -3
- django_cfg/apps/knowbase/admin/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
- django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
- django_cfg/apps/knowbase/admin/document_admin.py +269 -262
- django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
- django_cfg/apps/knowbase/config/settings.py +21 -4
- django_cfg/apps/knowbase/views/chat_views.py +3 -0
- django_cfg/apps/leads/admin/__init__.py +3 -1
- django_cfg/apps/leads/admin/leads_admin.py +235 -35
- django_cfg/apps/maintenance/admin/__init__.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
- django_cfg/apps/maintenance/admin/log_admin.py +143 -61
- django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
- django_cfg/apps/maintenance/admin/site_admin.py +213 -352
- django_cfg/apps/newsletter/admin/__init__.py +29 -2
- django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
- django_cfg/apps/payments/admin/__init__.py +18 -27
- django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
- django_cfg/apps/payments/admin/balance_admin.py +166 -632
- django_cfg/apps/payments/admin/currencies_admin.py +235 -607
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
- django_cfg/apps/payments/admin/filters.py +83 -3
- django_cfg/apps/payments/admin/networks_admin.py +258 -0
- django_cfg/apps/payments/admin/payments_admin.py +171 -461
- django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
- django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
- django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
- django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
- django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
- django_cfg/apps/payments/middleware/api_access.py +32 -6
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
- django_cfg/apps/payments/models/balance.py +12 -0
- django_cfg/apps/payments/models/currencies.py +106 -32
- django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
- django_cfg/apps/payments/services/core/currency_service.py +35 -28
- django_cfg/apps/payments/services/core/payment_service.py +1 -1
- django_cfg/apps/payments/services/providers/__init__.py +3 -0
- django_cfg/apps/payments/services/providers/base.py +95 -39
- django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
- django_cfg/apps/payments/services/providers/models/base.py +122 -0
- django_cfg/apps/payments/services/providers/models/providers.py +87 -0
- django_cfg/apps/payments/services/providers/models/universal.py +48 -0
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
- django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
- django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
- django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
- django_cfg/apps/payments/services/providers/registry.py +4 -32
- django_cfg/apps/payments/services/providers/sync_service.py +277 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
- django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
- django_cfg/apps/payments/tasks/__init__.py +39 -0
- django_cfg/apps/payments/tasks/types.py +73 -0
- django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
- django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
- django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
- django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
- django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
- django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
- django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
- django_cfg/apps/payments/urls_admin.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +5 -5
- django_cfg/apps/payments/views/overview/services.py +2 -2
- django_cfg/apps/payments/views/serializers/currencies.py +4 -3
- django_cfg/apps/support/admin/__init__.py +10 -1
- django_cfg/apps/support/admin/support_admin.py +338 -141
- django_cfg/apps/tasks/admin/__init__.py +11 -0
- django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +10 -5
- django_cfg/core/generation.py +1 -1
- django_cfg/management/commands/__init__.py +13 -1
- django_cfg/management/commands/app_agent_diagnose.py +470 -0
- django_cfg/management/commands/app_agent_generate.py +342 -0
- django_cfg/management/commands/app_agent_info.py +308 -0
- django_cfg/management/commands/migrate_all.py +9 -3
- django_cfg/management/commands/migrator.py +11 -6
- django_cfg/management/commands/rundramatiq.py +3 -2
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/models/api_keys.py +115 -0
- django_cfg/modules/django_admin/__init__.py +64 -0
- django_cfg/modules/django_admin/decorators/__init__.py +13 -0
- django_cfg/modules/django_admin/decorators/actions.py +106 -0
- django_cfg/modules/django_admin/decorators/display.py +106 -0
- django_cfg/modules/django_admin/mixins/__init__.py +14 -0
- django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
- django_cfg/modules/django_admin/models/__init__.py +20 -0
- django_cfg/modules/django_admin/models/action_models.py +33 -0
- django_cfg/modules/django_admin/models/badge_models.py +20 -0
- django_cfg/modules/django_admin/models/base.py +26 -0
- django_cfg/modules/django_admin/models/display_models.py +31 -0
- django_cfg/modules/django_admin/utils/badges.py +159 -0
- django_cfg/modules/django_admin/utils/displays.py +247 -0
- django_cfg/modules/django_app_agent/__init__.py +87 -0
- django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
- django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
- django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
- django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
- django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
- django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
- django_cfg/modules/django_app_agent/core/__init__.py +33 -0
- django_cfg/modules/django_app_agent/core/config.py +300 -0
- django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
- django_cfg/modules/django_app_agent/models/__init__.py +71 -0
- django_cfg/modules/django_app_agent/models/base.py +283 -0
- django_cfg/modules/django_app_agent/models/context.py +496 -0
- django_cfg/modules/django_app_agent/models/enums.py +481 -0
- django_cfg/modules/django_app_agent/models/requests.py +500 -0
- django_cfg/modules/django_app_agent/models/responses.py +585 -0
- django_cfg/modules/django_app_agent/pytest.ini +6 -0
- django_cfg/modules/django_app_agent/services/__init__.py +42 -0
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
- django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
- django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
- django_cfg/modules/django_app_agent/services/base.py +437 -0
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
- django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
- django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
- django_cfg/modules/django_app_agent/services/report_service.py +332 -0
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
- django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
- django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
- django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
- django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
- django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
- django_cfg/modules/django_app_agent/ui/cli.py +419 -0
- django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
- django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
- django_cfg/modules/django_app_agent/utils/logging.py +360 -0
- django_cfg/modules/django_app_agent/utils/validation.py +417 -0
- django_cfg/modules/django_currency/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
- django_cfg/modules/django_currency/core/converter.py +12 -12
- django_cfg/modules/django_currency/database/__init__.py +2 -2
- django_cfg/modules/django_currency/database/database_loader.py +93 -42
- django_cfg/modules/django_llm/llm/client.py +10 -2
- django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
- django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
- django_cfg/modules/django_unfold/dashboard.py +14 -13
- django_cfg/modules/django_unfold/models/config.py +1 -1
- django_cfg/registry/core.py +3 -0
- django_cfg/registry/third_party.py +2 -2
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/RECORD +223 -117
- django_cfg/apps/accounts/admin/activity.py +0 -96
- django_cfg/apps/accounts/admin/group.py +0 -17
- django_cfg/apps/accounts/admin/otp.py +0 -59
- django_cfg/apps/accounts/admin/registration_source.py +0 -97
- django_cfg/apps/accounts/admin/twilio_response.py +0 -227
- django_cfg/apps/accounts/admin/user.py +0 -300
- django_cfg/apps/agents/core/agent.py +0 -281
- django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
- django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
- django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
- django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
- django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
- django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
- django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
- django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
- django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
- django_cfg/apps/tasks/admin.py +0 -320
- django_cfg/middleware/static_nocache.py +0 -55
- django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
- /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
- {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
|
+
]
|