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,478 @@
|
|
1
|
+
# Django Tailwind Layouts
|
2
|
+
|
3
|
+
Universal layouts for use across the entire django-cfg project.
|
4
|
+
|
5
|
+
## 📋 Available Layouts
|
6
|
+
|
7
|
+
### 1. `django_tailwind/base.html`
|
8
|
+
Base layout with minimal markup.
|
9
|
+
|
10
|
+
**Usage:**
|
11
|
+
```django
|
12
|
+
{% extends 'django_tailwind/base.html' %}
|
13
|
+
|
14
|
+
{% block title %}My Page{% endblock %}
|
15
|
+
{% block content %}
|
16
|
+
<h1>Hello World</h1>
|
17
|
+
{% endblock %}
|
18
|
+
```
|
19
|
+
|
20
|
+
**Blocks:**
|
21
|
+
- `title` - page title
|
22
|
+
- `extra_head` - additional tags in head
|
23
|
+
- `header` - header (empty by default)
|
24
|
+
- `content` - main content
|
25
|
+
- `footer` - footer (empty by default)
|
26
|
+
- `extra_js` - additional JS
|
27
|
+
|
28
|
+
---
|
29
|
+
|
30
|
+
### 2. `django_tailwind/app.html`
|
31
|
+
Layout for full-featured applications with header, footer and dark mode.
|
32
|
+
|
33
|
+
**Usage:**
|
34
|
+
```django
|
35
|
+
{% extends 'django_tailwind/app.html' %}
|
36
|
+
|
37
|
+
{% block header_title %}My App{% endblock %}
|
38
|
+
{% block header_icon %}🚀{% endblock %}
|
39
|
+
|
40
|
+
{% block content %}
|
41
|
+
<h1>Dashboard</h1>
|
42
|
+
{% endblock %}
|
43
|
+
```
|
44
|
+
|
45
|
+
**Blocks:**
|
46
|
+
- `header_title` - title in header (default: "Django CFG")
|
47
|
+
- `header_icon` - icon in header (default: 💎)
|
48
|
+
- `header_actions` - buttons in header (default: dark mode toggle)
|
49
|
+
- `header_nav` - navigation under header
|
50
|
+
- `content` - main content
|
51
|
+
- `footer_text` - text in footer
|
52
|
+
|
53
|
+
---
|
54
|
+
|
55
|
+
### 3. `django_tailwind/simple.html`
|
56
|
+
Layout for simple pages (success, error, 404, etc).
|
57
|
+
|
58
|
+
**Usage:**
|
59
|
+
```django
|
60
|
+
{% extends 'django_tailwind/simple.html' %}
|
61
|
+
|
62
|
+
{% block icon %}✅{% endblock %}
|
63
|
+
{% block heading %}Success!{% endblock %}
|
64
|
+
{% block message %}
|
65
|
+
Payment completed successfully
|
66
|
+
{% endblock %}
|
67
|
+
|
68
|
+
{% block actions %}
|
69
|
+
<a href="/dashboard" class="btn-primary">
|
70
|
+
Go to Dashboard
|
71
|
+
</a>
|
72
|
+
{% endblock %}
|
73
|
+
```
|
74
|
+
|
75
|
+
**Blocks:**
|
76
|
+
- `icon` - icon (emoji or SVG)
|
77
|
+
- `heading` - heading
|
78
|
+
- `message` - message
|
79
|
+
- `actions` - action buttons
|
80
|
+
|
81
|
+
---
|
82
|
+
|
83
|
+
## ✨ Features
|
84
|
+
|
85
|
+
### Dark Mode
|
86
|
+
All layouts support dark mode via Alpine.js:
|
87
|
+
- Theme toggle included in all layouts
|
88
|
+
- State persisted in localStorage
|
89
|
+
- Automatic system theme detection
|
90
|
+
- Prevents flash on load (FOUC)
|
91
|
+
- Ready-to-use `theme_toggle.html` component
|
92
|
+
|
93
|
+
**Using the toggle component:**
|
94
|
+
```django
|
95
|
+
<!-- Default variant (with background) -->
|
96
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
97
|
+
|
98
|
+
<!-- Icon only (compact) -->
|
99
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_variant="icon" %}
|
100
|
+
|
101
|
+
<!-- With text label -->
|
102
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_variant="text" %}
|
103
|
+
|
104
|
+
<!-- Custom classes -->
|
105
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_class="my-custom-class" %}
|
106
|
+
```
|
107
|
+
|
108
|
+
### Tailwind CSS
|
109
|
+
All layouts use **django-tailwind** via `{% tailwind_css %}`:
|
110
|
+
- Compilation via django-tailwind app
|
111
|
+
- PurgeCSS in production
|
112
|
+
- Hot reload in development
|
113
|
+
|
114
|
+
### Alpine.js
|
115
|
+
Included in all layouts for interactivity:
|
116
|
+
- Dark mode toggle
|
117
|
+
- Dynamic components
|
118
|
+
- Form validation
|
119
|
+
|
120
|
+
---
|
121
|
+
|
122
|
+
## 📦 Template Tags
|
123
|
+
|
124
|
+
### Library Information
|
125
|
+
|
126
|
+
```django
|
127
|
+
{% load tailwind_info %}
|
128
|
+
|
129
|
+
{# Library name #}
|
130
|
+
{% tailwind_lib_name %} {# Django Tailwind Layouts #}
|
131
|
+
|
132
|
+
{# Version #}
|
133
|
+
{% tailwind_lib_version %} {# 1.0.0 #}
|
134
|
+
|
135
|
+
{# Description #}
|
136
|
+
{% tailwind_lib_description %}
|
137
|
+
|
138
|
+
{# URL #}
|
139
|
+
{% tailwind_lib_url %}
|
140
|
+
|
141
|
+
{# Ready-made HTML for footer #}
|
142
|
+
{% tailwind_powered_by %}
|
143
|
+
|
144
|
+
{# Text for footer #}
|
145
|
+
{% tailwind_footer_text %}
|
146
|
+
```
|
147
|
+
|
148
|
+
---
|
149
|
+
|
150
|
+
## 🎨 Components
|
151
|
+
|
152
|
+
### Navbar (Navigation Bar)
|
153
|
+
|
154
|
+
Universal navbar with support for navigation links and theme toggle.
|
155
|
+
|
156
|
+
**Location:**
|
157
|
+
```
|
158
|
+
django_tailwind/components/navbar.html
|
159
|
+
```
|
160
|
+
|
161
|
+
**Parameters:**
|
162
|
+
- `title` - Navbar title (default: "Django CFG")
|
163
|
+
- `icon` - Icon (emoji or HTML)
|
164
|
+
- `nav_items` - List of navigation items
|
165
|
+
- `show_theme_toggle` - Show dark mode toggle (default: True)
|
166
|
+
- `show_user_menu` - Show user menu dropdown (default: True)
|
167
|
+
- `sticky` - Fixed navbar (default: True)
|
168
|
+
|
169
|
+
**Usage:**
|
170
|
+
|
171
|
+
1. **Simple navbar:**
|
172
|
+
```django
|
173
|
+
{% include 'django_tailwind/components/navbar.html' with title="My App" icon="🚀" %}
|
174
|
+
```
|
175
|
+
|
176
|
+
2. **With navigation links:**
|
177
|
+
```django
|
178
|
+
{# In view pass: #}
|
179
|
+
nav_items = [
|
180
|
+
{'label': 'Dashboard', 'url': '/dashboard/', 'active': True, 'icon': '📊'},
|
181
|
+
{'label': 'Settings', 'url': '/settings/'},
|
182
|
+
]
|
183
|
+
|
184
|
+
{# In template: #}
|
185
|
+
{% include 'django_tailwind/components/navbar.html' with title="Admin" nav_items=nav_items %}
|
186
|
+
```
|
187
|
+
|
188
|
+
3. **Customization via app.html:**
|
189
|
+
```django
|
190
|
+
{% extends 'django_tailwind/app.html' %}
|
191
|
+
|
192
|
+
{% block header %}
|
193
|
+
{% include 'django_tailwind/components/navbar.html' with title="Payment Admin" icon='<span class="material-icons">payment</span>' nav_items=navbar_items %}
|
194
|
+
{% endblock %}
|
195
|
+
```
|
196
|
+
|
197
|
+
---
|
198
|
+
|
199
|
+
### Theme Toggle (Theme Switcher)
|
200
|
+
|
201
|
+
Ready-to-use component for switching between dark/light mode.
|
202
|
+
|
203
|
+
**Location:**
|
204
|
+
```
|
205
|
+
django_tailwind/components/theme_toggle.html
|
206
|
+
```
|
207
|
+
|
208
|
+
**Variants:**
|
209
|
+
|
210
|
+
1. **Default** - with background on hover:
|
211
|
+
```django
|
212
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
213
|
+
```
|
214
|
+
|
215
|
+
2. **Icon** - icon only (compact):
|
216
|
+
```django
|
217
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_variant="icon" %}
|
218
|
+
```
|
219
|
+
|
220
|
+
3. **Text** - with text label:
|
221
|
+
```django
|
222
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_variant="text" %}
|
223
|
+
```
|
224
|
+
|
225
|
+
4. **Floating button** (for simple pages):
|
226
|
+
```django
|
227
|
+
<div class="fixed top-4 right-4 z-50">
|
228
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
229
|
+
</div>
|
230
|
+
```
|
231
|
+
|
232
|
+
---
|
233
|
+
|
234
|
+
### User Menu (User Dropdown)
|
235
|
+
|
236
|
+
Dropdown user menu with avatar, information and links.
|
237
|
+
|
238
|
+
**Location:**
|
239
|
+
```
|
240
|
+
django_tailwind/components/user_menu.html
|
241
|
+
```
|
242
|
+
|
243
|
+
**Features:**
|
244
|
+
- Shows only for authenticated users
|
245
|
+
- Avatar with initials (auto-generated from name or username)
|
246
|
+
- Display name and email
|
247
|
+
- Admin panel link (automatically for staff users)
|
248
|
+
- Optional links: profile, logout
|
249
|
+
- Alpine.js dropdown with animation
|
250
|
+
|
251
|
+
**Parameters:**
|
252
|
+
- `show_admin`: Show admin link (default: auto for staff)
|
253
|
+
- `show_profile`: Show profile link (default: False)
|
254
|
+
- `show_logout`: Show logout link (default: False)
|
255
|
+
- `profile_url`: Profile URL (default: /profile/)
|
256
|
+
- `logout_url`: Logout URL (default: /accounts/logout/)
|
257
|
+
|
258
|
+
**Usage:**
|
259
|
+
|
260
|
+
1. **Default** (admin link for staff only):
|
261
|
+
```django
|
262
|
+
{% include 'django_tailwind/components/user_menu.html' %}
|
263
|
+
```
|
264
|
+
|
265
|
+
2. **With profile and logout:**
|
266
|
+
```django
|
267
|
+
{% include 'django_tailwind/components/user_menu.html' with show_profile=True show_logout=True %}
|
268
|
+
```
|
269
|
+
|
270
|
+
3. **With custom URLs:**
|
271
|
+
```django
|
272
|
+
{% include 'django_tailwind/components/user_menu.html' with
|
273
|
+
show_profile=True
|
274
|
+
show_logout=True
|
275
|
+
profile_url="/dashboard/profile/"
|
276
|
+
logout_url="/auth/logout/" %}
|
277
|
+
```
|
278
|
+
|
279
|
+
4. **In navbar** (already included by default):
|
280
|
+
```django
|
281
|
+
{# User menu automatically included in navbar #}
|
282
|
+
{% include 'django_tailwind/components/navbar.html' with title="My App" %}
|
283
|
+
|
284
|
+
{# Disable user menu #}
|
285
|
+
{% include 'django_tailwind/components/navbar.html' with show_user_menu=False %}
|
286
|
+
|
287
|
+
{# With profile and logout #}
|
288
|
+
{% include 'django_tailwind/components/navbar.html' with
|
289
|
+
show_profile=True
|
290
|
+
show_logout=True %}
|
291
|
+
```
|
292
|
+
|
293
|
+
**Template Tags:**
|
294
|
+
|
295
|
+
User menu uses special templatetags from `tailwind_info`:
|
296
|
+
|
297
|
+
```django
|
298
|
+
{% load tailwind_info %}
|
299
|
+
|
300
|
+
{# Get admin URL from settings or default #}
|
301
|
+
{% get_admin_url as admin_url %}
|
302
|
+
|
303
|
+
{# Get user display name #}
|
304
|
+
{% get_user_display_name as user_name %}
|
305
|
+
|
306
|
+
{# Get initials for avatar #}
|
307
|
+
{% get_user_initials as initials %}
|
308
|
+
```
|
309
|
+
|
310
|
+
---
|
311
|
+
|
312
|
+
## 📦 Usage Examples
|
313
|
+
|
314
|
+
### Example 1: Success Page
|
315
|
+
```django
|
316
|
+
{% extends 'django_tailwind/simple.html' %}
|
317
|
+
|
318
|
+
{% block icon %}✅{% endblock %}
|
319
|
+
{% block heading %}Payment Successful{% endblock %}
|
320
|
+
{% block message %}
|
321
|
+
We received your payment and will process it shortly.
|
322
|
+
{% endblock %}
|
323
|
+
```
|
324
|
+
|
325
|
+
### Example 2: Dashboard with Navigation
|
326
|
+
|
327
|
+
**View (dashboard.py):**
|
328
|
+
```python
|
329
|
+
def dashboard_view(request):
|
330
|
+
nav_items = [
|
331
|
+
{'label': 'Overview', 'url': '/dashboard/', 'active': True},
|
332
|
+
{'label': 'Users', 'url': '/dashboard/users/'},
|
333
|
+
{'label': 'Settings', 'url': '/dashboard/settings/'},
|
334
|
+
]
|
335
|
+
|
336
|
+
context = {
|
337
|
+
'navbar_title': 'Admin Dashboard',
|
338
|
+
'navbar_icon': '📊',
|
339
|
+
'navbar_items': nav_items,
|
340
|
+
}
|
341
|
+
return render(request, 'dashboard.html', context)
|
342
|
+
```
|
343
|
+
|
344
|
+
**Template (dashboard.html):**
|
345
|
+
```django
|
346
|
+
{% extends 'django_tailwind/app.html' %}
|
347
|
+
|
348
|
+
{% block content %}
|
349
|
+
<div class="grid grid-cols-3 gap-6">
|
350
|
+
<!-- Stats cards -->
|
351
|
+
</div>
|
352
|
+
{% endblock %}
|
353
|
+
```
|
354
|
+
|
355
|
+
### Example 3: Custom Layout
|
356
|
+
```django
|
357
|
+
{% extends 'django_tailwind/base.html' %}
|
358
|
+
|
359
|
+
{% block header %}
|
360
|
+
<header class="custom-header">
|
361
|
+
<!-- Your custom header -->
|
362
|
+
</header>
|
363
|
+
{% endblock %}
|
364
|
+
|
365
|
+
{% block content %}
|
366
|
+
<!-- Your content -->
|
367
|
+
{% endblock %}
|
368
|
+
```
|
369
|
+
|
370
|
+
---
|
371
|
+
|
372
|
+
## 🎨 Customization
|
373
|
+
|
374
|
+
### Overriding Styles
|
375
|
+
```django
|
376
|
+
{% extends 'django_tailwind/app.html' %}
|
377
|
+
|
378
|
+
{% block extra_head %}
|
379
|
+
<style>
|
380
|
+
.custom-btn {
|
381
|
+
@apply px-6 py-3 bg-purple-600 text-white rounded-lg;
|
382
|
+
}
|
383
|
+
</style>
|
384
|
+
{% endblock %}
|
385
|
+
```
|
386
|
+
|
387
|
+
### Adding Custom Blocks
|
388
|
+
```django
|
389
|
+
{% extends 'django_tailwind/app.html' %}
|
390
|
+
|
391
|
+
{% block header_actions %}
|
392
|
+
{{ block.super }} <!-- Keep dark mode toggle -->
|
393
|
+
<button class="btn">Notifications</button>
|
394
|
+
{% endblock %}
|
395
|
+
```
|
396
|
+
|
397
|
+
---
|
398
|
+
|
399
|
+
## 🚀 Migrating Existing Templates
|
400
|
+
|
401
|
+
### Before (CDN):
|
402
|
+
```django
|
403
|
+
<!DOCTYPE html>
|
404
|
+
<html>
|
405
|
+
<head>
|
406
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
407
|
+
</head>
|
408
|
+
<body>
|
409
|
+
<h1>Hello</h1>
|
410
|
+
</body>
|
411
|
+
</html>
|
412
|
+
```
|
413
|
+
|
414
|
+
### After (django-tailwind):
|
415
|
+
```django
|
416
|
+
{% extends 'django_tailwind/simple.html' %}
|
417
|
+
|
418
|
+
{% block heading %}Hello{% endblock %}
|
419
|
+
```
|
420
|
+
|
421
|
+
**Benefits:**
|
422
|
+
- ✅ Less code
|
423
|
+
- ✅ Unified style
|
424
|
+
- ✅ Dark mode out of the box
|
425
|
+
- ✅ Production-ready (PurgeCSS)
|
426
|
+
- ✅ Hot reload in dev
|
427
|
+
|
428
|
+
---
|
429
|
+
|
430
|
+
## 📁 File Structure
|
431
|
+
|
432
|
+
```
|
433
|
+
modules/django_tailwind/
|
434
|
+
├── templates/
|
435
|
+
│ └── django_tailwind/
|
436
|
+
│ ├── base.html # Base layout
|
437
|
+
│ ├── app.html # Layout for applications
|
438
|
+
│ ├── simple.html # Layout for simple pages
|
439
|
+
│ └── components/
|
440
|
+
│ ├── navbar.html # Universal navbar
|
441
|
+
│ ├── theme_toggle.html # Dark mode toggle
|
442
|
+
│ └── user_menu.html # User dropdown menu
|
443
|
+
└── templatetags/
|
444
|
+
└── tailwind_info.py # Template tags for library info
|
445
|
+
```
|
446
|
+
|
447
|
+
---
|
448
|
+
|
449
|
+
## 🌙 Dark Mode Implementation
|
450
|
+
|
451
|
+
All layouts use **class-based dark mode** via Alpine.js:
|
452
|
+
|
453
|
+
1. **Initialization** (in `base.html`):
|
454
|
+
- Reads from localStorage or system preference
|
455
|
+
- Applies `.dark` class to `<html>` immediately to prevent flash
|
456
|
+
- Sets up Alpine.js reactive state
|
457
|
+
|
458
|
+
2. **CSS Overrides**:
|
459
|
+
- Ensures `dark:` classes only work with `.dark` class
|
460
|
+
- Prevents conflicts with media query dark mode
|
461
|
+
- Smooth transitions on theme change
|
462
|
+
|
463
|
+
3. **Toggle Component**:
|
464
|
+
- Updates Alpine.js state
|
465
|
+
- Persists to localStorage
|
466
|
+
- Toggles `.dark` class on `<html>`
|
467
|
+
|
468
|
+
**Why class-based?**
|
469
|
+
- Full control over theme switching
|
470
|
+
- No dependency on system preferences (unless user wants it)
|
471
|
+
- Works with compiled Tailwind CSS
|
472
|
+
- Prevents flash of unstyled content (FOUC)
|
473
|
+
|
474
|
+
---
|
475
|
+
|
476
|
+
**Last Updated**: 2025-10-03
|
477
|
+
**Version**: 1.0.0
|
478
|
+
**Author**: Django-CFG Team
|
@@ -0,0 +1,10 @@
|
|
1
|
+
from django.apps import AppConfig
|
2
|
+
|
3
|
+
|
4
|
+
class DjangoTailwindConfig(AppConfig):
|
5
|
+
"""Django Tailwind Layouts app configuration."""
|
6
|
+
|
7
|
+
default_auto_field = 'django.db.models.BigAutoField'
|
8
|
+
name = 'django_cfg.modules.django_tailwind'
|
9
|
+
label = 'django_cfg_tailwind'
|
10
|
+
verbose_name = 'Django Tailwind Layouts'
|
@@ -0,0 +1,5 @@
|
|
1
|
+
{% extends 'django_tailwind/base.html' %}
|
2
|
+
|
3
|
+
{% block header %}
|
4
|
+
{% include 'django_tailwind/components/navbar.html' with title=navbar_title|default:header_title|default:"Django CFG" icon=navbar_icon|default:header_icon|default:"💎" nav_items=navbar_items sticky=navbar_sticky|default:True show_theme_toggle=navbar_show_theme|default:True %}
|
5
|
+
{% endblock %}
|
@@ -0,0 +1,117 @@
|
|
1
|
+
{% load static tailwind_tags %}
|
2
|
+
<!DOCTYPE html>
|
3
|
+
<html lang="en" class="h-full">
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7
|
+
<title>{% block title %}{% block page_title %}Page{% endblock %} - Django CFG{% endblock %}</title>
|
8
|
+
|
9
|
+
<!-- Tailwind CSS (compiled via django-tailwind) -->
|
10
|
+
{% tailwind_css %}
|
11
|
+
|
12
|
+
<!-- Alpine.js for interactivity -->
|
13
|
+
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
14
|
+
|
15
|
+
{% block extra_head %}{% endblock %}
|
16
|
+
|
17
|
+
<style>
|
18
|
+
/* Prevent flash of unstyled content */
|
19
|
+
[x-cloak] { display: none !important; }
|
20
|
+
|
21
|
+
/* Override Tailwind's media-query dark mode with class-based dark mode */
|
22
|
+
/* This ensures dark: classes work when .dark is on <html>, not just media queries */
|
23
|
+
|
24
|
+
/* Force light mode when NOT in dark mode - override media queries */
|
25
|
+
@media (prefers-color-scheme: dark) {
|
26
|
+
html:not(.dark) body,
|
27
|
+
html:not(.dark) .dark\:bg-gray-900,
|
28
|
+
html:not(.dark) .dark\:bg-gray-800,
|
29
|
+
html:not(.dark) .dark\:bg-gray-700,
|
30
|
+
html:not(.dark) .dark\:bg-gray-600 {
|
31
|
+
background-color: inherit !important;
|
32
|
+
}
|
33
|
+
|
34
|
+
html:not(.dark) .dark\:text-gray-100,
|
35
|
+
html:not(.dark) .dark\:text-white,
|
36
|
+
html:not(.dark) .dark\:text-gray-300,
|
37
|
+
html:not(.dark) .dark\:text-gray-400,
|
38
|
+
html:not(.dark) .dark\:text-gray-500 {
|
39
|
+
color: inherit !important;
|
40
|
+
}
|
41
|
+
|
42
|
+
html:not(.dark) .dark\:border-gray-700,
|
43
|
+
html:not(.dark) .dark\:border-gray-600,
|
44
|
+
html:not(.dark) .dark\:border-gray-800 {
|
45
|
+
border-color: inherit !important;
|
46
|
+
}
|
47
|
+
|
48
|
+
html:not(.dark) .dark\:hover\:bg-gray-700:hover,
|
49
|
+
html:not(.dark) .dark\:hover\:bg-gray-800:hover {
|
50
|
+
background-color: inherit !important;
|
51
|
+
}
|
52
|
+
|
53
|
+
html:not(.dark) .dark\:hover\:text-white:hover,
|
54
|
+
html:not(.dark) .dark\:hover\:text-blue-400:hover {
|
55
|
+
color: inherit !important;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
|
60
|
+
<!-- Dark mode initialization (prevents flash) -->
|
61
|
+
<script>
|
62
|
+
(function() {
|
63
|
+
const isDark = localStorage.getItem('darkMode') === 'true' ||
|
64
|
+
(!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
65
|
+
if (isDark) {
|
66
|
+
document.documentElement.classList.add('dark');
|
67
|
+
}
|
68
|
+
})();
|
69
|
+
</script>
|
70
|
+
</head>
|
71
|
+
<body class="h-full bg-gray-50 dark:bg-gray-900"
|
72
|
+
x-data="{ darkMode: localStorage.getItem('darkMode') === 'true' || (!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches){% block alpine_data_extra %}{% endblock %} }"
|
73
|
+
x-init="$watch('darkMode', val => { localStorage.setItem('darkMode', val); document.documentElement.classList.toggle('dark', val); }){% block alpine_init_extra %}{% endblock %}">
|
74
|
+
|
75
|
+
{% block body %}
|
76
|
+
<div class="min-h-full flex flex-col">
|
77
|
+
{% block header %}{% endblock %}
|
78
|
+
|
79
|
+
<!-- Main Content -->
|
80
|
+
<main class="flex-1">
|
81
|
+
{% block main %}
|
82
|
+
<div class="{% block container_class %}max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6{% endblock %}">
|
83
|
+
{% block content %}{% endblock %}
|
84
|
+
</div>
|
85
|
+
{% endblock %}
|
86
|
+
</main>
|
87
|
+
|
88
|
+
{% block footer %}
|
89
|
+
{% load django_cfg %}
|
90
|
+
<footer class="bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 mt-auto">
|
91
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
92
|
+
{% block footer_content %}
|
93
|
+
<div class="text-center">
|
94
|
+
{% block footer_text %}
|
95
|
+
<p class="text-sm text-gray-600 dark:text-gray-400">
|
96
|
+
Powered by
|
97
|
+
<a href="{% lib_site_url %}"
|
98
|
+
class="text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 font-medium transition-colors"
|
99
|
+
target="_blank" rel="noopener noreferrer">
|
100
|
+
{% lib_name %}
|
101
|
+
</a>
|
102
|
+
</p>
|
103
|
+
<p class="mt-2 text-xs text-gray-500 dark:text-gray-500">
|
104
|
+
{% lib_subtitle %}
|
105
|
+
</p>
|
106
|
+
{% endblock %}
|
107
|
+
</div>
|
108
|
+
{% endblock %}
|
109
|
+
</div>
|
110
|
+
</footer>
|
111
|
+
{% endblock %}
|
112
|
+
</div>
|
113
|
+
{% endblock %}
|
114
|
+
|
115
|
+
{% block extra_js %}{% endblock %}
|
116
|
+
</body>
|
117
|
+
</html>
|