django-cfg 1.4.20__py3-none-any.whl → 1.4.23__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 +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +35 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +36 -35
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +12 -13
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.20.dist-info/RECORD +0 -1110
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,20 +4,21 @@ Badge utilities with Material Icons.
|
|
4
4
|
|
5
5
|
import logging
|
6
6
|
from typing import Optional, Union
|
7
|
-
|
8
|
-
from django.utils.safestring import SafeString
|
7
|
+
|
9
8
|
from django.contrib.humanize.templatetags.humanize import intcomma
|
9
|
+
from django.utils.html import escape, format_html
|
10
|
+
from django.utils.safestring import SafeString
|
10
11
|
|
11
|
-
from ..models.badge_models import BadgeConfig, StatusBadgeConfig
|
12
|
-
from ..models.base import BadgeVariant
|
13
12
|
from ..icons import Icons
|
13
|
+
from ..models.badge_models import StatusBadgeConfig
|
14
|
+
from ..models.base import BadgeVariant
|
14
15
|
|
15
16
|
logger = logging.getLogger(__name__)
|
16
17
|
|
17
18
|
|
18
19
|
class StatusBadge:
|
19
20
|
"""Status badge utilities."""
|
20
|
-
|
21
|
+
|
21
22
|
# Status mappings
|
22
23
|
STATUS_MAPPINGS = {
|
23
24
|
'active': BadgeVariant.SUCCESS,
|
@@ -30,7 +31,7 @@ class StatusBadge:
|
|
30
31
|
'cancelled': BadgeVariant.DANGER,
|
31
32
|
'inactive': BadgeVariant.SECONDARY,
|
32
33
|
}
|
33
|
-
|
34
|
+
|
34
35
|
# Variant classes with semantic colors
|
35
36
|
VARIANT_CLASSES = {
|
36
37
|
BadgeVariant.SUCCESS: 'bg-success-100 text-success-800 dark:bg-success-900 dark:text-success-200',
|
@@ -40,24 +41,24 @@ class StatusBadge:
|
|
40
41
|
BadgeVariant.PRIMARY: 'bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-200',
|
41
42
|
BadgeVariant.SECONDARY: 'bg-base-100 text-font-default-light dark:bg-base-800 dark:text-font-default-dark',
|
42
43
|
}
|
43
|
-
|
44
|
+
|
44
45
|
@classmethod
|
45
46
|
def auto(cls, status: str, config: Optional[StatusBadgeConfig] = None) -> SafeString:
|
46
47
|
"""Auto status badge with color mapping."""
|
47
48
|
config = config or StatusBadgeConfig()
|
48
|
-
|
49
|
+
|
49
50
|
if not status:
|
50
51
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
|
51
|
-
|
52
|
+
|
52
53
|
# Determine variant
|
53
54
|
status_lower = status.lower().replace('_', '').replace('-', '')
|
54
55
|
variant = BadgeVariant.INFO
|
55
|
-
|
56
|
+
|
56
57
|
for keyword, mapped_variant in cls.STATUS_MAPPINGS.items():
|
57
58
|
if keyword in status_lower:
|
58
59
|
variant = mapped_variant
|
59
60
|
break
|
60
|
-
|
61
|
+
|
61
62
|
# Use custom mapping if provided
|
62
63
|
if config.custom_mappings and status in config.custom_mappings:
|
63
64
|
variant_str = config.custom_mappings[status]
|
@@ -65,26 +66,26 @@ class StatusBadge:
|
|
65
66
|
variant = BadgeVariant(variant_str)
|
66
67
|
except ValueError:
|
67
68
|
pass
|
68
|
-
|
69
|
+
|
69
70
|
return cls.create(status.replace('_', ' ').title(), variant, config)
|
70
|
-
|
71
|
+
|
71
72
|
@classmethod
|
72
|
-
def create(cls, text: str, variant: Union[BadgeVariant, str] = BadgeVariant.INFO,
|
73
|
+
def create(cls, text: str, variant: Union[BadgeVariant, str] = BadgeVariant.INFO,
|
73
74
|
config: Optional[StatusBadgeConfig] = None, icon: Optional[str] = None) -> SafeString:
|
74
75
|
"""Create custom badge."""
|
75
76
|
config = config or StatusBadgeConfig()
|
76
|
-
|
77
|
+
|
77
78
|
if isinstance(variant, str):
|
78
79
|
try:
|
79
80
|
variant = BadgeVariant(variant)
|
80
81
|
except ValueError:
|
81
82
|
variant = BadgeVariant.INFO
|
82
|
-
|
83
|
+
|
83
84
|
css_classes = cls.VARIANT_CLASSES.get(variant, cls.VARIANT_CLASSES[BadgeVariant.INFO])
|
84
|
-
|
85
|
+
|
85
86
|
if config.css_classes:
|
86
87
|
css_classes += ' ' + ' '.join(config.css_classes)
|
87
|
-
|
88
|
+
|
88
89
|
# Icon with Material Icons integration
|
89
90
|
icon_html = ""
|
90
91
|
if icon or (config.show_icons and config.icon):
|
@@ -104,7 +105,7 @@ class StatusBadge:
|
|
104
105
|
}
|
105
106
|
icon_name = icon_map.get(variant, Icons.INFO)
|
106
107
|
icon_html = format_html('<span class="material-symbols-outlined text-xs mr-1">{}</span>', icon_name)
|
107
|
-
|
108
|
+
|
108
109
|
return format_html(
|
109
110
|
'<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium {}">'
|
110
111
|
'{}{}'
|
@@ -115,12 +116,12 @@ class StatusBadge:
|
|
115
116
|
|
116
117
|
class ProgressBadge:
|
117
118
|
"""Progress badge utilities."""
|
118
|
-
|
119
|
+
|
119
120
|
@classmethod
|
120
121
|
def percentage(cls, percentage: Union[int, float]) -> SafeString:
|
121
122
|
"""Progress badge with percentage."""
|
122
123
|
percentage = max(0, min(100, float(percentage)))
|
123
|
-
|
124
|
+
|
124
125
|
if percentage >= 100:
|
125
126
|
variant = BadgeVariant.SUCCESS
|
126
127
|
elif percentage >= 75:
|
@@ -129,13 +130,13 @@ class ProgressBadge:
|
|
129
130
|
variant = BadgeVariant.WARNING
|
130
131
|
else:
|
131
132
|
variant = BadgeVariant.SECONDARY
|
132
|
-
|
133
|
+
|
133
134
|
return StatusBadge.create(f"{percentage:.0f}%", variant)
|
134
135
|
|
135
136
|
|
136
137
|
class CounterBadge:
|
137
138
|
"""Counter badge utilities."""
|
138
|
-
|
139
|
+
|
139
140
|
@classmethod
|
140
141
|
def simple(cls, count: int, label: str = None) -> SafeString:
|
141
142
|
"""Simple counter badge."""
|
@@ -147,13 +148,13 @@ class CounterBadge:
|
|
147
148
|
variant = BadgeVariant.WARNING
|
148
149
|
else:
|
149
150
|
variant = BadgeVariant.SUCCESS
|
150
|
-
|
151
|
+
|
151
152
|
# Format with humanize for large numbers
|
152
153
|
if count >= 1000:
|
153
154
|
count_text = intcomma(count)
|
154
155
|
else:
|
155
156
|
count_text = str(count)
|
156
|
-
|
157
|
+
|
157
158
|
display_text = f"{count_text} {label}" if label else count_text
|
158
|
-
|
159
|
+
|
159
160
|
return StatusBadge.create(display_text, variant)
|
@@ -3,35 +3,35 @@ Display utilities with humanize integration.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import logging
|
6
|
-
from typing import Optional, List, Union, Any
|
7
|
-
from decimal import Decimal
|
8
6
|
from datetime import datetime
|
7
|
+
from decimal import Decimal
|
8
|
+
from typing import Any, List, Optional, Union
|
9
9
|
|
10
|
-
from django.
|
11
|
-
from django.utils.safestring import SafeString
|
12
|
-
from django.contrib.humanize.templatetags.humanize import naturaltime, intcomma
|
10
|
+
from django.contrib.humanize.templatetags.humanize import naturaltime
|
13
11
|
from django.utils import timezone
|
12
|
+
from django.utils.html import escape, format_html
|
13
|
+
from django.utils.safestring import SafeString
|
14
14
|
|
15
|
-
from ..models.display_models import UserDisplayConfig, MoneyDisplayConfig, DateTimeDisplayConfig
|
16
15
|
from ..icons import Icons
|
16
|
+
from ..models.display_models import DateTimeDisplayConfig, MoneyDisplayConfig, UserDisplayConfig
|
17
17
|
|
18
18
|
logger = logging.getLogger(__name__)
|
19
19
|
|
20
20
|
|
21
21
|
class UserDisplay:
|
22
22
|
"""User display utilities."""
|
23
|
-
|
23
|
+
|
24
24
|
@classmethod
|
25
25
|
def with_avatar(cls, user: Any, config: Optional[UserDisplayConfig] = None) -> List[str]:
|
26
26
|
"""Display user with avatar for @display(header=True)."""
|
27
27
|
config = config or UserDisplayConfig()
|
28
|
-
|
28
|
+
|
29
29
|
if not user:
|
30
30
|
return ["No user", "", "", {}]
|
31
|
-
|
31
|
+
|
32
32
|
name = getattr(user, 'get_full_name', lambda: '')() or getattr(user, 'username', 'Unknown')
|
33
33
|
email = getattr(user, 'email', '') if config.show_email else ''
|
34
|
-
|
34
|
+
|
35
35
|
# Generate initials
|
36
36
|
name_parts = name.split()
|
37
37
|
if len(name_parts) >= 2:
|
@@ -40,43 +40,43 @@ class UserDisplay:
|
|
40
40
|
initials = name[0].upper()
|
41
41
|
else:
|
42
42
|
initials = "U"
|
43
|
-
|
43
|
+
|
44
44
|
avatar_data = {"size": config.avatar_size, "initials": initials, "show": config.show_avatar}
|
45
|
-
|
45
|
+
|
46
46
|
return [name, email, initials, avatar_data]
|
47
|
-
|
47
|
+
|
48
48
|
@classmethod
|
49
49
|
def simple(cls, user: Any, config: Optional[UserDisplayConfig] = None) -> SafeString:
|
50
50
|
"""Simple user display."""
|
51
51
|
config = config or UserDisplayConfig()
|
52
|
-
|
52
|
+
|
53
53
|
if not user:
|
54
54
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">No user</span>')
|
55
|
-
|
55
|
+
|
56
56
|
name = getattr(user, 'get_full_name', lambda: '')() or getattr(user, 'username', 'Unknown')
|
57
57
|
html = format_html('<span class="font-medium">{}</span>', escape(name))
|
58
|
-
|
58
|
+
|
59
59
|
if config.show_email:
|
60
60
|
email = getattr(user, 'email', '')
|
61
61
|
if email:
|
62
62
|
html = format_html('{}<br><span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{}</span>', html, escape(email))
|
63
|
-
|
63
|
+
|
64
64
|
return html
|
65
65
|
|
66
66
|
|
67
67
|
class MoneyDisplay:
|
68
68
|
"""Money display utilities."""
|
69
|
-
|
69
|
+
|
70
70
|
@classmethod
|
71
71
|
def amount(cls, amount: Union[Decimal, float, int], config: Optional[MoneyDisplayConfig] = None) -> SafeString:
|
72
72
|
"""Format money amount with smart formatting."""
|
73
73
|
config = config or MoneyDisplayConfig()
|
74
|
-
|
74
|
+
|
75
75
|
if amount is None:
|
76
76
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
|
77
|
-
|
77
|
+
|
78
78
|
amount = Decimal(str(amount))
|
79
|
-
|
79
|
+
|
80
80
|
# Smart decimal places for rates or auto-adjustment
|
81
81
|
decimal_places = config.decimal_places
|
82
82
|
if config.smart_decimal_places or config.rate_mode:
|
@@ -92,11 +92,11 @@ class MoneyDisplay:
|
|
92
92
|
decimal_places = 4 # 0.1234
|
93
93
|
else:
|
94
94
|
decimal_places = 8 # 0.00001234 (for very small amounts)
|
95
|
-
|
95
|
+
|
96
96
|
# Currency symbols
|
97
97
|
symbols = {'USD': '$', 'EUR': '€', 'GBP': '£', 'JPY': '¥', 'BTC': '₿', 'ETH': 'Ξ'}
|
98
98
|
symbol = symbols.get(config.currency, config.currency) if config.show_currency_symbol else ""
|
99
|
-
|
99
|
+
|
100
100
|
# Format with appropriate decimal places
|
101
101
|
if config.thousand_separator:
|
102
102
|
if decimal_places == 0:
|
@@ -105,7 +105,7 @@ class MoneyDisplay:
|
|
105
105
|
formatted_amount = f"{amount:,.{decimal_places}f}"
|
106
106
|
else:
|
107
107
|
formatted_amount = f"{amount:.{decimal_places}f}"
|
108
|
-
|
108
|
+
|
109
109
|
# Special formatting for rate mode
|
110
110
|
if config.rate_mode:
|
111
111
|
# For rates, show number + small currency label instead of symbol
|
@@ -114,7 +114,7 @@ class MoneyDisplay:
|
|
114
114
|
formatted_amount,
|
115
115
|
config.currency
|
116
116
|
)
|
117
|
-
|
117
|
+
|
118
118
|
# Color coding for regular amounts
|
119
119
|
if amount < 0:
|
120
120
|
color_class = "text-red-600 dark:text-red-400"
|
@@ -122,52 +122,52 @@ class MoneyDisplay:
|
|
122
122
|
color_class = "text-font-default-light dark:text-font-default-dark"
|
123
123
|
else:
|
124
124
|
color_class = "text-green-600 dark:text-green-400"
|
125
|
-
|
125
|
+
|
126
126
|
# Show sign
|
127
127
|
sign = "+" if config.show_sign and amount > 0 else ""
|
128
|
-
|
128
|
+
|
129
129
|
return format_html('<span class="font-mono {}">{}{}{}</span>', color_class, sign, symbol, formatted_amount)
|
130
|
-
|
130
|
+
|
131
131
|
@classmethod
|
132
132
|
def with_breakdown(cls, main_amount: Union[Decimal, float, int], breakdown_items: List[dict] = None,
|
133
133
|
config: Optional[MoneyDisplayConfig] = None) -> SafeString:
|
134
134
|
"""Display with breakdown."""
|
135
135
|
config = config or MoneyDisplayConfig()
|
136
|
-
|
136
|
+
|
137
137
|
html = format_html('<div class="text-right">')
|
138
138
|
html += cls.amount(main_amount, config)
|
139
|
-
|
139
|
+
|
140
140
|
if breakdown_items:
|
141
141
|
for item in breakdown_items:
|
142
142
|
label = item.get('label', 'Item')
|
143
143
|
amount = item.get('amount', 0)
|
144
144
|
color = item.get('color', 'secondary')
|
145
|
-
|
145
|
+
|
146
146
|
color_classes = {
|
147
147
|
'success': 'text-green-600 dark:text-green-400',
|
148
148
|
'warning': 'text-yellow-600 dark:text-yellow-400',
|
149
149
|
'danger': 'text-red-600 dark:text-red-400',
|
150
150
|
'secondary': 'text-font-subtle-light dark:text-font-subtle-dark'
|
151
151
|
}
|
152
|
-
|
152
|
+
|
153
153
|
color_class = color_classes.get(color, 'text-font-subtle-light dark:text-font-subtle-dark')
|
154
154
|
html += format_html('<div class="text-xs {}">{}: {}</div>', color_class, escape(label), cls.amount(amount, config))
|
155
|
-
|
155
|
+
|
156
156
|
html += format_html('</div>')
|
157
157
|
return html
|
158
158
|
|
159
159
|
|
160
160
|
class StatusDisplay:
|
161
161
|
"""Status display utilities."""
|
162
|
-
|
162
|
+
|
163
163
|
@classmethod
|
164
164
|
def auto(cls, status: str) -> SafeString:
|
165
165
|
"""Auto status display with color mapping."""
|
166
166
|
if not status:
|
167
167
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
|
168
|
-
|
168
|
+
|
169
169
|
status_lower = status.lower()
|
170
|
-
|
170
|
+
|
171
171
|
if any(word in status_lower for word in ['active', 'success', 'completed']):
|
172
172
|
variant = 'success'
|
173
173
|
icon_name = Icons.CHECK_CIRCLE
|
@@ -180,19 +180,19 @@ class StatusDisplay:
|
|
180
180
|
else:
|
181
181
|
variant = 'info'
|
182
182
|
icon_name = Icons.INFO
|
183
|
-
|
183
|
+
|
184
184
|
color_classes = {
|
185
185
|
'success': 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
|
186
186
|
'warning': 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
|
187
187
|
'danger': 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200',
|
188
188
|
'info': 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200',
|
189
189
|
}
|
190
|
-
|
190
|
+
|
191
191
|
color_class = color_classes.get(variant, color_classes['info'])
|
192
|
-
|
192
|
+
|
193
193
|
# Render icon with Material Icons
|
194
194
|
icon_html = format_html('<span class="material-symbols-outlined text-xs mr-1">{}</span>', icon_name)
|
195
|
-
|
195
|
+
|
196
196
|
return format_html(
|
197
197
|
'<span class="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium {}">'
|
198
198
|
'{}{}'
|
@@ -203,18 +203,18 @@ class StatusDisplay:
|
|
203
203
|
|
204
204
|
class DateTimeDisplay:
|
205
205
|
"""DateTime display utilities."""
|
206
|
-
|
206
|
+
|
207
207
|
@classmethod
|
208
208
|
def relative(cls, dt: datetime, config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
|
209
209
|
"""Display with relative time."""
|
210
210
|
config = config or DateTimeDisplayConfig()
|
211
|
-
|
211
|
+
|
212
212
|
if not dt:
|
213
213
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
|
214
|
-
|
214
|
+
|
215
215
|
absolute_time = dt.strftime(config.datetime_format)
|
216
216
|
relative_time = naturaltime(dt)
|
217
|
-
|
217
|
+
|
218
218
|
if config.show_relative:
|
219
219
|
return format_html(
|
220
220
|
'<div class="text-xs"><div class="font-medium">{}</div><div class="text-font-subtle-light dark:text-font-subtle-dark">{}</div></div>',
|
@@ -222,25 +222,25 @@ class DateTimeDisplay:
|
|
222
222
|
)
|
223
223
|
else:
|
224
224
|
return format_html('<span class="text-sm">{}</span>', escape(absolute_time))
|
225
|
-
|
225
|
+
|
226
226
|
@classmethod
|
227
227
|
def compact(cls, dt: datetime, config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
|
228
228
|
"""Compact datetime display."""
|
229
229
|
config = config or DateTimeDisplayConfig()
|
230
|
-
|
230
|
+
|
231
231
|
if not dt:
|
232
232
|
return format_html('<span class="text-font-subtle-light dark:text-font-subtle-dark">—</span>')
|
233
|
-
|
233
|
+
|
234
234
|
now = timezone.now()
|
235
235
|
diff = now - dt
|
236
|
-
|
236
|
+
|
237
237
|
if diff.days < 1:
|
238
238
|
display_text = naturaltime(dt)
|
239
239
|
elif diff.days < 7:
|
240
240
|
display_text = dt.strftime('%a %H:%M')
|
241
241
|
else:
|
242
242
|
display_text = dt.strftime('%m/%d/%y')
|
243
|
-
|
243
|
+
|
244
244
|
return format_html(
|
245
245
|
'<span class="text-xs text-font-default-light dark:text-font-default-dark" title="{}">{}</span>',
|
246
246
|
escape(dt.strftime(config.datetime_format)), escape(display_text)
|
@@ -5,7 +5,6 @@ Initializes OpenAPI service with configuration from Django settings.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.apps import AppConfig
|
8
|
-
from django.conf import settings
|
9
8
|
|
10
9
|
|
11
10
|
class DjangoClientConfig(AppConfig):
|
@@ -18,8 +17,8 @@ class DjangoClientConfig(AppConfig):
|
|
18
17
|
def ready(self):
|
19
18
|
"""Initialize OpenAPI service on app startup."""
|
20
19
|
# Import here to avoid AppRegistryNotReady
|
21
|
-
from django_cfg.modules.django_client.core import get_openapi_service
|
22
20
|
from django_cfg.core.state.registry import get_current_config
|
21
|
+
from django_cfg.modules.django_client.core import get_openapi_service
|
23
22
|
|
24
23
|
# Get config from django-cfg
|
25
24
|
django_config = get_current_config()
|
@@ -29,7 +28,26 @@ class DjangoClientConfig(AppConfig):
|
|
29
28
|
config = django_config.openapi_client
|
30
29
|
|
31
30
|
if config and config.enabled:
|
31
|
+
# Add default 'cfg' group if not already present
|
32
|
+
cfg_group_exists = any(g.name == 'cfg' for g in config.groups)
|
33
|
+
if not cfg_group_exists:
|
34
|
+
from django_cfg.apps.urls import get_default_cfg_group
|
35
|
+
cfg_group = get_default_cfg_group()
|
36
|
+
if cfg_group.apps:
|
37
|
+
config.groups.append(cfg_group)
|
38
|
+
|
32
39
|
# Initialize service with config
|
33
40
|
service = get_openapi_service()
|
34
41
|
service.set_config(config)
|
35
|
-
|
42
|
+
|
43
|
+
# Create urlconf modules for each group
|
44
|
+
from django_cfg.modules.django_client.core.groups import GroupManager
|
45
|
+
manager = GroupManager(config)
|
46
|
+
for group in config.groups:
|
47
|
+
if group.apps:
|
48
|
+
manager.create_urlconf_module(group.name)
|
49
|
+
|
50
|
+
# Update urlpatterns after service is configured
|
51
|
+
from django_cfg.modules.django_client import urls
|
52
|
+
urls.urlpatterns.clear()
|
53
|
+
urls.urlpatterns.extend(urls.get_openapi_urls())
|
@@ -8,19 +8,21 @@ No Django dependencies - can be used standalone or with any framework.
|
|
8
8
|
__version__ = "1.0.0"
|
9
9
|
|
10
10
|
# Configuration
|
11
|
+
# Archive
|
12
|
+
from .archive import ArchiveManager
|
11
13
|
from .config import (
|
12
|
-
OpenAPIConfig,
|
13
|
-
OpenAPIGroupConfig,
|
14
14
|
DjangoOpenAPI,
|
15
|
+
OpenAPIConfig,
|
15
16
|
OpenAPIError,
|
17
|
+
OpenAPIGroupConfig,
|
16
18
|
get_openapi_service,
|
17
19
|
)
|
18
20
|
|
19
|
-
#
|
20
|
-
from .
|
21
|
+
# Generators
|
22
|
+
from .generator import PythonGenerator, TypeScriptGenerator
|
21
23
|
|
22
|
-
#
|
23
|
-
from .
|
24
|
+
# Groups
|
25
|
+
from .groups import GroupDetector, GroupManager
|
24
26
|
|
25
27
|
# IR Models
|
26
28
|
from .ir import (
|
@@ -30,10 +32,7 @@ from .ir import (
|
|
30
32
|
)
|
31
33
|
|
32
34
|
# Parsers
|
33
|
-
from .parser import
|
34
|
-
|
35
|
-
# Generators
|
36
|
-
from .generator import PythonGenerator, TypeScriptGenerator
|
35
|
+
from .parser import OpenAPI30Parser, OpenAPI31Parser, parse_openapi
|
37
36
|
|
38
37
|
__all__ = [
|
39
38
|
"__version__",
|
@@ -4,11 +4,11 @@ Simple Archive Manager.
|
|
4
4
|
Lightweight client archiving without complex dependencies.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import shutil
|
8
7
|
import json
|
8
|
+
import shutil
|
9
9
|
from datetime import datetime
|
10
10
|
from pathlib import Path
|
11
|
-
from typing import
|
11
|
+
from typing import Dict, Optional
|
12
12
|
|
13
13
|
|
14
14
|
class ArchiveManager:
|
@@ -5,8 +5,6 @@ Provides intuitive CLI for client generation.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import sys
|
8
|
-
from pathlib import Path
|
9
|
-
from typing import Optional, List
|
10
8
|
|
11
9
|
try:
|
12
10
|
import click
|
@@ -208,7 +206,7 @@ def status(config):
|
|
208
206
|
print(f" TypeScript: {status_info.get('generate_typescript', False)}")
|
209
207
|
|
210
208
|
if status_info.get('group_names'):
|
211
|
-
print(
|
209
|
+
print("\n Configured groups:")
|
212
210
|
for name in status_info['group_names']:
|
213
211
|
print(f" • {name}")
|
214
212
|
|
@@ -4,9 +4,11 @@ Main OpenAPI configuration for django_cfg.
|
|
4
4
|
Replaces django-revolution with integrated django_openapi module.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Dict, Optional, Literal, List
|
8
7
|
from pathlib import Path
|
8
|
+
from typing import List, Literal
|
9
|
+
|
9
10
|
from pydantic import BaseModel, Field, field_validator
|
11
|
+
|
10
12
|
from .group import OpenAPIGroupConfig
|
11
13
|
|
12
14
|
|
@@ -6,8 +6,9 @@ Replaces django-revolution with faster, cleaner implementation.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import logging
|
9
|
-
from typing import Optional, Dict, List
|
10
9
|
from pathlib import Path
|
10
|
+
from typing import Dict, List, Optional
|
11
|
+
|
11
12
|
from .config import OpenAPIConfig
|
12
13
|
from .group import OpenAPIGroupConfig
|
13
14
|
|
@@ -22,10 +22,10 @@ Usage:
|
|
22
22
|
from pathlib import Path
|
23
23
|
from typing import Literal
|
24
24
|
|
25
|
+
from ..ir import IRContext
|
25
26
|
from .base import GeneratedFile
|
26
27
|
from .python import PythonGenerator
|
27
28
|
from .typescript import TypeScriptGenerator
|
28
|
-
from ..ir import IRContext
|
29
29
|
|
30
30
|
__all__ = [
|
31
31
|
"PythonGenerator",
|
@@ -9,7 +9,6 @@ from __future__ import annotations
|
|
9
9
|
|
10
10
|
from abc import ABC, abstractmethod
|
11
11
|
from pathlib import Path
|
12
|
-
from typing import Any
|
13
12
|
|
14
13
|
from ..ir import IRContext, IROperationObject, IRSchemaObject
|
15
14
|
|
@@ -401,9 +400,10 @@ class BaseGenerator(ABC):
|
|
401
400
|
>>> generator.remove_tag_prefix("retrieve", "users")
|
402
401
|
'retrieve' # No prefix to remove
|
403
402
|
"""
|
404
|
-
from django.utils.text import slugify
|
405
403
|
import re
|
406
404
|
|
405
|
+
from django.utils.text import slugify
|
406
|
+
|
407
407
|
# First, strip common app label prefixes from operation_id
|
408
408
|
# This handles cases like "django_cfg_newsletter_campaigns_list" or "cfg_support_tickets_list"
|
409
409
|
# Remove only the cfg/django_cfg prefix, not the entire app name
|
@@ -12,16 +12,16 @@ Coordinates all sub-generators:
|
|
12
12
|
from __future__ import annotations
|
13
13
|
|
14
14
|
import pathlib
|
15
|
+
|
15
16
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
16
17
|
|
17
|
-
from ..base import BaseGenerator, GeneratedFile
|
18
18
|
from ...ir import IROperationObject, IRSchemaObject
|
19
|
-
|
19
|
+
from ..base import BaseGenerator, GeneratedFile
|
20
|
+
from .async_client_gen import AsyncClientGenerator
|
21
|
+
from .files_generator import FilesGenerator
|
20
22
|
from .models_generator import ModelsGenerator
|
21
23
|
from .operations_generator import OperationsGenerator
|
22
|
-
from .async_client_gen import AsyncClientGenerator
|
23
24
|
from .sync_client_gen import SyncClientGenerator
|
24
|
-
from .files_generator import FilesGenerator
|
25
25
|
|
26
26
|
|
27
27
|
class PythonGenerator(BaseGenerator):
|