django-cfg 1.3.13__py3-none-any.whl → 1.4.0__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/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
- django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
- django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
- django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.0.dist-info/METADATA +920 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
{% load unfold %}
|
2
|
+
|
3
|
+
<!-- Overview Section -->
|
4
|
+
<div class="space-y-10 flex flex-col gap-8">
|
5
|
+
<!-- Hero Section with Key Metrics -->
|
6
|
+
<div>
|
7
|
+
<div class="flex items-center justify-between mb-6">
|
8
|
+
<div>
|
9
|
+
<h1 class="text-2xl font-bold theme-text">{{ title|default:"System Overview" }}</h1>
|
10
|
+
<p class="text-gray-600 dark:text-gray-300 mt-2">
|
11
|
+
Real-time monitoring and key performance indicators
|
12
|
+
</p>
|
13
|
+
</div>
|
14
|
+
<div class="flex items-center space-x-2 text-sm text-gray-500 dark:text-gray-400">
|
15
|
+
<span class="material-icons text-green-500">fiber_manual_record</span>
|
16
|
+
<span>Live data</span>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<!-- Key Statistics Cards -->
|
21
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
22
|
+
{% for key, value in data.stats.items %}
|
23
|
+
<div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
|
24
|
+
<div class="flex items-center justify-between">
|
25
|
+
<div>
|
26
|
+
<p class="text-sm text-gray-600 dark:text-gray-400 uppercase">{{ key }}</p>
|
27
|
+
<p class="text-3xl font-bold theme-text mt-2">{{ value }}</p>
|
28
|
+
</div>
|
29
|
+
<span class="material-icons text-blue-500 text-4xl">{{ icon|default:"analytics" }}</span>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
{% endfor %}
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<!-- System Health & Quick Actions -->
|
37
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
|
38
|
+
<div class="theme-card rounded-lg shadow-sm border theme-border">
|
39
|
+
<div class="p-6 border-b theme-border">
|
40
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
41
|
+
<span class="material-icons text-green-500 mr-2">favorite</span>
|
42
|
+
System Health
|
43
|
+
</h3>
|
44
|
+
</div>
|
45
|
+
<div class="p-6">
|
46
|
+
<div class="space-y-4">
|
47
|
+
{% for key, value in data.system_health.items %}
|
48
|
+
<div class="flex items-center justify-between">
|
49
|
+
<span class="text-gray-700 dark:text-gray-300">{{ key|title }}</span>
|
50
|
+
<span class="font-mono text-sm theme-text">{{ value }}</span>
|
51
|
+
</div>
|
52
|
+
{% endfor %}
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<!-- Quick Actions Card -->
|
58
|
+
<div class="theme-card rounded-lg border theme-border shadow-sm">
|
59
|
+
<div class="p-6">
|
60
|
+
{% include 'admin/snippets/components/quick_actions.html' %}
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<!-- Charts & Recent Activity -->
|
66
|
+
<div class="space-y-8">
|
67
|
+
<!-- Charts Section -->
|
68
|
+
{% include 'admin/snippets/components/charts_section.html' %}
|
69
|
+
|
70
|
+
<!-- Recent Activity Stream -->
|
71
|
+
<div class="theme-card rounded-lg shadow-sm border theme-border">
|
72
|
+
<div class="p-6 border-b theme-border">
|
73
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
74
|
+
<span class="material-icons text-blue-600 mr-2">timeline</span>
|
75
|
+
Recent Activity
|
76
|
+
</h3>
|
77
|
+
</div>
|
78
|
+
<div class="p-6">
|
79
|
+
{% include 'admin/snippets/components/recent_activity_improved.html' %}
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
|
84
|
+
<!-- Secondary Metrics Row -->
|
85
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
86
|
+
<!-- System Metrics -->
|
87
|
+
<div class="theme-card rounded-lg border theme-border shadow-sm">
|
88
|
+
<div class="p-6 border-b theme-border">
|
89
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
90
|
+
<span class="material-icons text-blue-500 mr-2">memory</span>
|
91
|
+
System Metrics
|
92
|
+
</h3>
|
93
|
+
</div>
|
94
|
+
<div class="p-6">
|
95
|
+
{% include 'admin/snippets/components/system_metrics.html' %}
|
96
|
+
</div>
|
97
|
+
</div>
|
98
|
+
|
99
|
+
<!-- Activity Tracker -->
|
100
|
+
<div class="theme-card rounded-lg border theme-border shadow-sm">
|
101
|
+
<div class="p-6 border-b theme-border">
|
102
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
103
|
+
<span class="material-icons text-blue-600 mr-2">track_changes</span>
|
104
|
+
Activity Tracker
|
105
|
+
</h3>
|
106
|
+
</div>
|
107
|
+
<div class="p-6">
|
108
|
+
{% include 'admin/snippets/components/activity_tracker.html' %}
|
109
|
+
</div>
|
110
|
+
</div>
|
111
|
+
</div>
|
112
|
+
</div>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
{% load unfold %}
|
2
|
+
|
3
|
+
<!-- Statistics Section -->
|
4
|
+
<div class="space-y-8">
|
5
|
+
<div class="flex items-center justify-between mb-6">
|
6
|
+
<div>
|
7
|
+
<h1 class="text-2xl font-bold theme-text">{{ title|default:"Statistics" }}</h1>
|
8
|
+
<p class="text-gray-600 dark:text-gray-300 mt-2">
|
9
|
+
Detailed metrics for each application module
|
10
|
+
</p>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<!-- App Statistics -->
|
15
|
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
16
|
+
{% for app in data.app_stats %}
|
17
|
+
<div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
|
18
|
+
<div class="flex items-center justify-between mb-4">
|
19
|
+
<h3 class="font-semibold theme-text">{{ app.name }}</h3>
|
20
|
+
<span class="material-icons text-blue-500">{{ app.icon|default:"apps" }}</span>
|
21
|
+
</div>
|
22
|
+
<div class="space-y-2">
|
23
|
+
<div class="flex justify-between text-sm">
|
24
|
+
<span class="text-gray-600 dark:text-gray-400">Label:</span>
|
25
|
+
<span class="theme-text">{{ app.label }}</span>
|
26
|
+
</div>
|
27
|
+
<div class="flex justify-between text-sm">
|
28
|
+
<span class="text-gray-600 dark:text-gray-400">Models:</span>
|
29
|
+
<span class="theme-text font-mono">{{ app.models_count }}</span>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
{% endfor %}
|
34
|
+
</div>
|
35
|
+
</div>
|
@@ -0,0 +1,99 @@
|
|
1
|
+
{% load unfold %}
|
2
|
+
|
3
|
+
<!-- System Management Section -->
|
4
|
+
<div class="space-y-8">
|
5
|
+
<div class="flex items-center justify-between mb-6">
|
6
|
+
<div>
|
7
|
+
<h1 class="text-2xl font-bold theme-text">{{ title|default:"System Management" }}</h1>
|
8
|
+
<p class="text-gray-600 dark:text-gray-300 mt-2">
|
9
|
+
System health checks and configuration overview
|
10
|
+
</p>
|
11
|
+
</div>
|
12
|
+
<div class="flex items-center space-x-2">
|
13
|
+
{% if data.health.status == 'healthy' %}
|
14
|
+
<span class="material-icons text-green-500">check_circle</span>
|
15
|
+
<span class="text-sm text-green-600 dark:text-green-400 font-medium">Healthy</span>
|
16
|
+
{% else %}
|
17
|
+
<span class="material-icons text-red-500">error</span>
|
18
|
+
<span class="text-sm text-red-600 dark:text-red-400 font-medium">Issues Detected</span>
|
19
|
+
{% endif %}
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<!-- Health Checks Grid -->
|
24
|
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
25
|
+
{% for check_name, check_status in data.health.checks.items %}
|
26
|
+
<div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
|
27
|
+
<div class="flex items-center justify-between">
|
28
|
+
<div>
|
29
|
+
<p class="text-sm text-gray-600 dark:text-gray-400 uppercase">{{ check_name|title }}</p>
|
30
|
+
<p class="text-lg font-semibold theme-text mt-2">
|
31
|
+
{% if check_status %}
|
32
|
+
<span class="text-green-600 dark:text-green-400">Operational</span>
|
33
|
+
{% else %}
|
34
|
+
<span class="text-red-600 dark:text-red-400">Failed</span>
|
35
|
+
{% endif %}
|
36
|
+
</p>
|
37
|
+
</div>
|
38
|
+
{% if check_status %}
|
39
|
+
<span class="material-icons text-green-500 text-3xl">check_circle</span>
|
40
|
+
{% else %}
|
41
|
+
<span class="material-icons text-red-500 text-3xl">cancel</span>
|
42
|
+
{% endif %}
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
{% endfor %}
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<!-- Configuration & Services -->
|
49
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
50
|
+
<!-- Configuration Card -->
|
51
|
+
<div class="theme-card rounded-lg shadow-sm border theme-border">
|
52
|
+
<div class="p-6 border-b theme-border">
|
53
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
54
|
+
<span class="material-icons text-blue-500 mr-2">settings</span>
|
55
|
+
Configuration
|
56
|
+
</h3>
|
57
|
+
</div>
|
58
|
+
<div class="p-6">
|
59
|
+
<div class="space-y-4">
|
60
|
+
{% for key, value in data.configuration.items %}
|
61
|
+
<div class="flex items-center justify-between">
|
62
|
+
<span class="text-gray-700 dark:text-gray-300">{{ key|title }}</span>
|
63
|
+
<span class="font-mono text-sm theme-text">{{ value }}</span>
|
64
|
+
</div>
|
65
|
+
{% endfor %}
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
|
70
|
+
<!-- Services Status Card -->
|
71
|
+
<div class="theme-card rounded-lg shadow-sm border theme-border">
|
72
|
+
<div class="p-6 border-b theme-border">
|
73
|
+
<h3 class="text-lg font-semibold theme-text flex items-center">
|
74
|
+
<span class="material-icons text-purple-500 mr-2">cloud</span>
|
75
|
+
Services
|
76
|
+
</h3>
|
77
|
+
</div>
|
78
|
+
<div class="p-6">
|
79
|
+
{% if data.services %}
|
80
|
+
<div class="space-y-3">
|
81
|
+
{% for service_name, service_status in data.services.items %}
|
82
|
+
<div class="flex items-center justify-between text-sm">
|
83
|
+
<span class="theme-text">{{ service_name }}</span>
|
84
|
+
<div class="status-indicator">
|
85
|
+
<span class="status-dot {% if service_status %}success{% else %}error{% endif %}"></span>
|
86
|
+
<span class="text-gray-600 dark:text-gray-400">
|
87
|
+
{% if service_status %}Active{% else %}Inactive{% endif %}
|
88
|
+
</span>
|
89
|
+
</div>
|
90
|
+
</div>
|
91
|
+
{% endfor %}
|
92
|
+
</div>
|
93
|
+
{% else %}
|
94
|
+
<p class="text-gray-500 dark:text-gray-400 text-sm">No external services configured</p>
|
95
|
+
{% endif %}
|
96
|
+
</div>
|
97
|
+
</div>
|
98
|
+
</div>
|
99
|
+
</div>
|
@@ -0,0 +1,322 @@
|
|
1
|
+
# Chart.js Integration Guide
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
This guide documents the Chart.js integration in the Django CFG dashboard, including key insights, best practices, and solutions to common issues.
|
6
|
+
|
7
|
+
## Architecture
|
8
|
+
|
9
|
+
### Data Flow
|
10
|
+
|
11
|
+
```
|
12
|
+
Python (callbacks/charts.py)
|
13
|
+
→ Pydantic Models (ChartData, ChartDataset)
|
14
|
+
→ JSON Serialization (.model_dump())
|
15
|
+
→ Django Template (|safe filter)
|
16
|
+
→ JavaScript (Chart.js)
|
17
|
+
```
|
18
|
+
|
19
|
+
### File Structure
|
20
|
+
|
21
|
+
- **Backend**: `/django_cfg/modules/django_unfold/callbacks/charts.py` - Chart data generation
|
22
|
+
- **Models**: `/django_cfg/modules/django_unfold/models/charts.py` - Pydantic data models
|
23
|
+
- **Template**: `/django_cfg/templates/admin/snippets/components/charts_section.html` - Chart rendering
|
24
|
+
|
25
|
+
## Key Implementation Details
|
26
|
+
|
27
|
+
### 1. Container Height - CRITICAL
|
28
|
+
|
29
|
+
**❌ WRONG - Infinite Height Growth:**
|
30
|
+
```html
|
31
|
+
<canvas id="myChart" height="300"></canvas>
|
32
|
+
```
|
33
|
+
|
34
|
+
**✅ CORRECT - Fixed Container:**
|
35
|
+
```html
|
36
|
+
<div class="relative h-[300px]">
|
37
|
+
<canvas id="myChart"></canvas>
|
38
|
+
</div>
|
39
|
+
```
|
40
|
+
|
41
|
+
**Why:** Chart.js with `responsive: true` + `maintainAspectRatio: false` needs a fixed-height parent container. Without it, the canvas grows infinitely as Chart.js tries to maintain responsiveness.
|
42
|
+
|
43
|
+
### 2. Data Format
|
44
|
+
|
45
|
+
Chart.js expects this structure:
|
46
|
+
|
47
|
+
```javascript
|
48
|
+
{
|
49
|
+
type: 'line', // or 'bar', 'pie', etc.
|
50
|
+
data: {
|
51
|
+
labels: ['Day 1', 'Day 2', ...],
|
52
|
+
datasets: [{
|
53
|
+
label: 'Dataset Name',
|
54
|
+
data: [10, 20, 30, ...],
|
55
|
+
backgroundColor: 'rgba(59, 130, 246, 0.1)',
|
56
|
+
borderColor: 'rgb(59, 130, 246)',
|
57
|
+
tension: 0.4 // for line charts
|
58
|
+
}]
|
59
|
+
},
|
60
|
+
options: { ... }
|
61
|
+
}
|
62
|
+
```
|
63
|
+
|
64
|
+
**Our Implementation:**
|
65
|
+
```javascript
|
66
|
+
new Chart(ctx, {
|
67
|
+
type: 'line',
|
68
|
+
data: chartData, // chartData = {labels: [...], datasets: [...]}
|
69
|
+
options: { ... }
|
70
|
+
});
|
71
|
+
```
|
72
|
+
|
73
|
+
### 3. Python to JavaScript Bridge
|
74
|
+
|
75
|
+
**Backend (charts.py):**
|
76
|
+
```python
|
77
|
+
from .models.charts import ChartData, ChartDataset
|
78
|
+
|
79
|
+
def get_user_registration_chart_data(self) -> Dict[str, Any]:
|
80
|
+
chart_data = ChartData(
|
81
|
+
labels=["09/26", "09/27", ...],
|
82
|
+
datasets=[
|
83
|
+
ChartDataset(
|
84
|
+
label="New Users",
|
85
|
+
data=[2, 5, 3, ...],
|
86
|
+
backgroundColor="rgba(59, 130, 246, 0.1)",
|
87
|
+
borderColor="rgb(59, 130, 246)",
|
88
|
+
tension=0.4
|
89
|
+
)
|
90
|
+
]
|
91
|
+
)
|
92
|
+
return chart_data.model_dump() # Converts Pydantic to dict
|
93
|
+
```
|
94
|
+
|
95
|
+
**Template:**
|
96
|
+
```html
|
97
|
+
<!-- Serialize to JSON for JavaScript -->
|
98
|
+
"charts": {
|
99
|
+
"user_registrations_json": json.dumps(self.get_user_registration_chart_data()),
|
100
|
+
"user_registrations": self.get_user_registration_chart_data(),
|
101
|
+
}
|
102
|
+
```
|
103
|
+
|
104
|
+
**HTML/JavaScript:**
|
105
|
+
```html
|
106
|
+
<script>
|
107
|
+
const chartData = {{ charts.user_registrations_json|safe }};
|
108
|
+
new Chart(ctx, {
|
109
|
+
type: 'line',
|
110
|
+
data: chartData,
|
111
|
+
options: { ... }
|
112
|
+
});
|
113
|
+
</script>
|
114
|
+
```
|
115
|
+
|
116
|
+
### 4. Chart.js Configuration Best Practices
|
117
|
+
|
118
|
+
```javascript
|
119
|
+
{
|
120
|
+
type: 'line', // or 'bar'
|
121
|
+
data: chartData,
|
122
|
+
options: {
|
123
|
+
responsive: true, // Chart resizes with container
|
124
|
+
maintainAspectRatio: false, // Don't maintain aspect ratio
|
125
|
+
plugins: {
|
126
|
+
legend: {
|
127
|
+
display: true,
|
128
|
+
position: 'top'
|
129
|
+
}
|
130
|
+
},
|
131
|
+
scales: {
|
132
|
+
y: {
|
133
|
+
beginAtZero: true, // Start Y axis at 0
|
134
|
+
ticks: {
|
135
|
+
precision: 0 // Show integers only (no decimals)
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
```
|
142
|
+
|
143
|
+
## Common Issues & Solutions
|
144
|
+
|
145
|
+
### Issue 1: Charts Not Displaying
|
146
|
+
|
147
|
+
**Symptoms:** Canvas element exists but no chart visible
|
148
|
+
|
149
|
+
**Debug Checklist:**
|
150
|
+
```javascript
|
151
|
+
console.log('Chart.js loaded:', typeof Chart !== 'undefined');
|
152
|
+
console.log('Canvas element:', document.getElementById('myChart'));
|
153
|
+
console.log('Chart data:', chartData);
|
154
|
+
console.log('Data has labels:', 'labels' in chartData);
|
155
|
+
console.log('Data has datasets:', 'datasets' in chartData);
|
156
|
+
```
|
157
|
+
|
158
|
+
**Common Causes:**
|
159
|
+
1. Chart.js library not loaded
|
160
|
+
2. Canvas ID mismatch
|
161
|
+
3. Data format incorrect
|
162
|
+
4. DOMContentLoaded not fired yet
|
163
|
+
|
164
|
+
### Issue 2: Infinite Height Growth
|
165
|
+
|
166
|
+
**Symptoms:** Chart keeps expanding vertically, page becomes very tall
|
167
|
+
|
168
|
+
**Solution:** Wrap canvas in fixed-height container (see section 1 above)
|
169
|
+
|
170
|
+
### Issue 3: Data Not Updating
|
171
|
+
|
172
|
+
**Symptoms:** Chart shows old data after refresh
|
173
|
+
|
174
|
+
**Solution:** Ensure Chart.js recreates instead of updates:
|
175
|
+
```javascript
|
176
|
+
// Destroy existing chart first
|
177
|
+
if (window.myChart) {
|
178
|
+
window.myChart.destroy();
|
179
|
+
}
|
180
|
+
window.myChart = new Chart(ctx, config);
|
181
|
+
```
|
182
|
+
|
183
|
+
### Issue 4: Dark Mode Colors
|
184
|
+
|
185
|
+
**Best Practices:**
|
186
|
+
```python
|
187
|
+
ChartDataset(
|
188
|
+
backgroundColor="rgba(59, 130, 246, 0.1)", # Light with transparency
|
189
|
+
borderColor="rgb(59, 130, 246)", # Solid color
|
190
|
+
# Use theme-aware colors that work in both light/dark modes
|
191
|
+
)
|
192
|
+
```
|
193
|
+
|
194
|
+
## Template Integration
|
195
|
+
|
196
|
+
### Complete Working Example
|
197
|
+
|
198
|
+
```html
|
199
|
+
{% if charts.user_registrations %}
|
200
|
+
<div class="relative h-[300px]">
|
201
|
+
<canvas id="userRegistrationsChart"></canvas>
|
202
|
+
</div>
|
203
|
+
<script>
|
204
|
+
document.addEventListener('DOMContentLoaded', function() {
|
205
|
+
const ctx = document.getElementById('userRegistrationsChart');
|
206
|
+
const chartData = {{ charts.user_registrations_json|safe }};
|
207
|
+
|
208
|
+
if (ctx && typeof Chart !== 'undefined') {
|
209
|
+
try {
|
210
|
+
new Chart(ctx, {
|
211
|
+
type: 'line',
|
212
|
+
data: chartData,
|
213
|
+
options: {
|
214
|
+
responsive: true,
|
215
|
+
maintainAspectRatio: false,
|
216
|
+
plugins: {
|
217
|
+
legend: {
|
218
|
+
display: true,
|
219
|
+
position: 'top'
|
220
|
+
}
|
221
|
+
},
|
222
|
+
scales: {
|
223
|
+
y: {
|
224
|
+
beginAtZero: true,
|
225
|
+
ticks: {
|
226
|
+
precision: 0
|
227
|
+
}
|
228
|
+
}
|
229
|
+
}
|
230
|
+
}
|
231
|
+
});
|
232
|
+
} catch (error) {
|
233
|
+
console.error('Error creating chart:', error);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
});
|
237
|
+
</script>
|
238
|
+
{% else %}
|
239
|
+
<div class="h-[300px] flex items-center justify-center">
|
240
|
+
<p class="text-gray-500">No chart data available</p>
|
241
|
+
</div>
|
242
|
+
{% endif %}
|
243
|
+
```
|
244
|
+
|
245
|
+
## Testing Chart Integration
|
246
|
+
|
247
|
+
### 1. Verify Chart.js Load
|
248
|
+
|
249
|
+
```javascript
|
250
|
+
console.log('Chart.js version:', Chart.version); // Should show: 4.4.0
|
251
|
+
```
|
252
|
+
|
253
|
+
### 2. Check Data Structure
|
254
|
+
|
255
|
+
```python
|
256
|
+
# In callbacks/charts.py
|
257
|
+
chart_data = self.get_user_registration_chart_data()
|
258
|
+
print(f"Labels: {chart_data['labels']}")
|
259
|
+
print(f"Dataset count: {len(chart_data['datasets'])}")
|
260
|
+
print(f"Data points: {chart_data['datasets'][0]['data']}")
|
261
|
+
```
|
262
|
+
|
263
|
+
### 3. Template Debugging
|
264
|
+
|
265
|
+
```html
|
266
|
+
<!-- Add temporary debug output -->
|
267
|
+
<pre>{{ charts.user_registrations|pprint }}</pre>
|
268
|
+
```
|
269
|
+
|
270
|
+
## Performance Considerations
|
271
|
+
|
272
|
+
1. **Limit Data Points**: Keep chart data to reasonable size (e.g., 7-90 days max)
|
273
|
+
2. **Lazy Loading**: Load charts only when tab/section is visible
|
274
|
+
3. **Caching**: Cache chart data in backend if queries are expensive
|
275
|
+
4. **Animation**: Disable animations for large datasets:
|
276
|
+
```javascript
|
277
|
+
options: {
|
278
|
+
animation: false // or { duration: 0 }
|
279
|
+
}
|
280
|
+
```
|
281
|
+
|
282
|
+
## Future Enhancements
|
283
|
+
|
284
|
+
### 1. Interactive Features
|
285
|
+
- Click to drill down
|
286
|
+
- Hover tooltips with detailed info
|
287
|
+
- Date range picker integration
|
288
|
+
|
289
|
+
### 2. Additional Chart Types
|
290
|
+
- Pie/Doughnut for distribution
|
291
|
+
- Mixed charts (line + bar)
|
292
|
+
- Area charts for cumulative data
|
293
|
+
|
294
|
+
### 3. Export Functionality
|
295
|
+
- Download as PNG/SVG
|
296
|
+
- Export data as CSV
|
297
|
+
- Share chart snapshots
|
298
|
+
|
299
|
+
## Troubleshooting Reference
|
300
|
+
|
301
|
+
| Symptom | Likely Cause | Solution |
|
302
|
+
|---------|--------------|----------|
|
303
|
+
| Chart not visible | No fixed-height container | Add `h-[300px]` to parent div |
|
304
|
+
| Infinite scrolling | Canvas height attribute set | Remove `height="300"` from canvas |
|
305
|
+
| No data | Backend not providing data | Check callback method |
|
306
|
+
| Wrong data | Cache issue | Clear browser cache |
|
307
|
+
| Colors don't match theme | Hardcoded colors | Use CSS variables or theme-aware colors |
|
308
|
+
| Chart flickers | Multiple DOMContentLoaded listeners | Ensure single initialization |
|
309
|
+
|
310
|
+
## References
|
311
|
+
|
312
|
+
- [Chart.js Documentation](https://www.chartjs.org/docs/latest/)
|
313
|
+
- [Chart.js Examples](https://www.chartjs.org/docs/latest/samples/)
|
314
|
+
- [Tailwind CSS Height Utilities](https://tailwindcss.com/docs/height)
|
315
|
+
- Pydantic Models: `/django_cfg/modules/django_unfold/models/charts.py`
|
316
|
+
- Chart Callbacks: `/django_cfg/modules/django_unfold/callbacks/charts.py`
|
317
|
+
|
318
|
+
---
|
319
|
+
|
320
|
+
**Last Updated:** 2025-10-03
|
321
|
+
**Chart.js Version:** 4.4.0
|
322
|
+
**Django Version:** 5.x
|