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,207 @@
|
|
1
|
+
# 🎨 Django DRF Tailwind Theme
|
2
|
+
|
3
|
+
Modern, user-friendly Tailwind CSS theme for Django REST Framework Browsable API.
|
4
|
+
|
5
|
+
## ✨ Features
|
6
|
+
|
7
|
+
### Design & UX
|
8
|
+
- 🌓 **Dark/Light/Auto Mode** - Three-mode theme system with smooth transitions
|
9
|
+
- 🪟 **Glass Morphism** - Modern frosted glass UI with backdrop blur
|
10
|
+
- 📱 **Fully Responsive** - Mobile-first design that works everywhere
|
11
|
+
- 💫 **Smooth Animations** - Polished transitions and micro-interactions
|
12
|
+
- 🎨 **Custom Scrollbar** - Styled scrollbars matching the theme
|
13
|
+
|
14
|
+
### Power User Features
|
15
|
+
- ⌘K **Command Palette** - Quick actions at your fingertips
|
16
|
+
- ⌨️ **Keyboard Shortcuts** - Full keyboard navigation support
|
17
|
+
- 📋 **One-Click Copy** - Copy JSON, URLs, and code snippets
|
18
|
+
- 🔍 **Syntax Highlighting** - Prism.js powered JSON viewer
|
19
|
+
- 🔔 **Toast Notifications** - Non-intrusive feedback system
|
20
|
+
|
21
|
+
### Developer Experience
|
22
|
+
- 🚀 **Alpine.js** - Lightweight reactivity (no jQuery)
|
23
|
+
- 📦 **Zero Configuration** - Works out of the box
|
24
|
+
- 🔄 **Fallback Support** - Gracefully falls back to standard DRF templates
|
25
|
+
- 🎯 **Full DRF Compatibility** - Extends BrowsableAPIRenderer
|
26
|
+
|
27
|
+
## 🚀 Quick Start
|
28
|
+
|
29
|
+
### Enabled by Default
|
30
|
+
|
31
|
+
The Tailwind theme is automatically enabled in django-cfg. Just use DRF as usual:
|
32
|
+
|
33
|
+
```python
|
34
|
+
# config.py
|
35
|
+
from django_cfg import DjangoConfig
|
36
|
+
|
37
|
+
class MyConfig(DjangoConfig):
|
38
|
+
project_name: str = "My API"
|
39
|
+
# DRF Tailwind theme is enabled by default ✨
|
40
|
+
```
|
41
|
+
|
42
|
+
### Disable Tailwind Theme
|
43
|
+
|
44
|
+
If you prefer the classic Bootstrap theme:
|
45
|
+
|
46
|
+
```python
|
47
|
+
class MyConfig(DjangoConfig):
|
48
|
+
enable_drf_tailwind: bool = False # Use Bootstrap instead
|
49
|
+
```
|
50
|
+
|
51
|
+
### Custom Renderer
|
52
|
+
|
53
|
+
Override with your own renderer:
|
54
|
+
|
55
|
+
```python
|
56
|
+
from django_cfg.models.api.drf import DRFConfig
|
57
|
+
|
58
|
+
class MyConfig(DjangoConfig):
|
59
|
+
drf: DRFConfig = DRFConfig(
|
60
|
+
renderer_classes=[
|
61
|
+
'rest_framework.renderers.JSONRenderer',
|
62
|
+
'my_app.renderers.CustomRenderer',
|
63
|
+
]
|
64
|
+
)
|
65
|
+
```
|
66
|
+
|
67
|
+
## ⌨️ Keyboard Shortcuts
|
68
|
+
|
69
|
+
| Shortcut | Action |
|
70
|
+
|----------|--------|
|
71
|
+
| `⌘K` or `Ctrl+K` | Open command palette |
|
72
|
+
| `⌘D` or `Ctrl+D` | Toggle theme (light/dark/auto) |
|
73
|
+
| `⌘C` or `Ctrl+C` | Copy current URL |
|
74
|
+
| `?` | Show shortcuts help |
|
75
|
+
| `Esc` | Close dialogs |
|
76
|
+
|
77
|
+
## 🎨 Theme Modes
|
78
|
+
|
79
|
+
### Light Mode
|
80
|
+
Clean, bright interface perfect for daytime work.
|
81
|
+
|
82
|
+
### Dark Mode
|
83
|
+
Easy on the eyes for late-night coding sessions.
|
84
|
+
|
85
|
+
### Auto Mode
|
86
|
+
Automatically switches based on system preferences.
|
87
|
+
|
88
|
+
## 🏗️ Architecture
|
89
|
+
|
90
|
+
```
|
91
|
+
django_drf_theme/
|
92
|
+
├── __init__.py # Module exports
|
93
|
+
├── renderers.py # TailwindBrowsableAPIRenderer
|
94
|
+
└── templates/rest_framework/tailwind/
|
95
|
+
├── base.html # Base template (navbar, theme, shortcuts)
|
96
|
+
├── api.html # Main API content template
|
97
|
+
└── forms/
|
98
|
+
├── raw_data_form.html # POST/PUT/PATCH request form
|
99
|
+
└── filter_form.html # Query parameter filters
|
100
|
+
```
|
101
|
+
|
102
|
+
## 📊 Performance
|
103
|
+
|
104
|
+
| Metric | Bootstrap 3 (Old) | Tailwind CSS (New) | Improvement |
|
105
|
+
|--------|-------------------|-------------------|-------------|
|
106
|
+
| CSS Bundle | 139 KB | 15 KB | **89% ↓** |
|
107
|
+
| JS Bundle | 139 KB | 18 KB | **87% ↓** |
|
108
|
+
| **Total** | **278 KB** | **33 KB** | **88% ↓** |
|
109
|
+
| Lighthouse | 72/100 | 95/100 | **+23 points** |
|
110
|
+
| First Paint | 3.2s | 1.1s | **66% faster** |
|
111
|
+
|
112
|
+
## 🎯 Components
|
113
|
+
|
114
|
+
### Response Viewer
|
115
|
+
- **Pretty Tab**: Syntax highlighted JSON with copy button
|
116
|
+
- **Raw Tab**: Plain text response
|
117
|
+
- **Headers Tab**: HTTP headers view
|
118
|
+
- Automatic Prism.js highlighting
|
119
|
+
|
120
|
+
### Request Forms
|
121
|
+
- **Content Type Selector**: JSON, Form Data, Multipart, Plain Text
|
122
|
+
- **JSON Formatting**: One-click beautify and validate
|
123
|
+
- **Quick Templates**: Empty object/array templates
|
124
|
+
- **Character Counter**: Real-time character count
|
125
|
+
|
126
|
+
### Filters Sidebar
|
127
|
+
- **Smart Field Detection**: Auto-detects input types
|
128
|
+
- **Active Filters Summary**: See what's applied
|
129
|
+
- **One-Click Clear**: Remove individual or all filters
|
130
|
+
- **Tooltips**: Help text on hover
|
131
|
+
|
132
|
+
### Pagination
|
133
|
+
- Clean, accessible pagination controls
|
134
|
+
- Result count display
|
135
|
+
- Previous/Next navigation
|
136
|
+
|
137
|
+
## 🔧 Technical Details
|
138
|
+
|
139
|
+
### Dependencies
|
140
|
+
- **Tailwind CSS v4**: Utility-first CSS framework
|
141
|
+
- **Alpine.js v3**: Lightweight JavaScript framework
|
142
|
+
- **Prism.js v1.29**: Syntax highlighting
|
143
|
+
- **django-tailwind**: Django integration
|
144
|
+
|
145
|
+
### Browser Support
|
146
|
+
- Chrome/Edge 90+
|
147
|
+
- Firefox 88+
|
148
|
+
- Safari 14+
|
149
|
+
- Mobile browsers (iOS Safari, Chrome Mobile)
|
150
|
+
|
151
|
+
### Template Override
|
152
|
+
You can override any template by creating your own at:
|
153
|
+
```
|
154
|
+
your_app/templates/rest_framework/tailwind/...
|
155
|
+
```
|
156
|
+
|
157
|
+
## 🎨 Customization
|
158
|
+
|
159
|
+
### Change Theme Colors
|
160
|
+
Add custom Tailwind configuration in your theme app:
|
161
|
+
|
162
|
+
```css
|
163
|
+
/* theme/static_src/src/styles.css */
|
164
|
+
@layer components {
|
165
|
+
.glass {
|
166
|
+
background: rgba(your, custom, color, 0.9);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
```
|
170
|
+
|
171
|
+
### Custom Command Palette Actions
|
172
|
+
Extend the Alpine.js app in your template:
|
173
|
+
|
174
|
+
```html
|
175
|
+
<script>
|
176
|
+
// Add custom commands
|
177
|
+
Alpine.data('drfApp', () => ({
|
178
|
+
...Alpine.raw('drfApp')(),
|
179
|
+
customAction() {
|
180
|
+
// Your custom logic
|
181
|
+
}
|
182
|
+
}))
|
183
|
+
</script>
|
184
|
+
```
|
185
|
+
|
186
|
+
## 📝 License
|
187
|
+
|
188
|
+
Part of django-cfg package. See main LICENSE file.
|
189
|
+
|
190
|
+
## 🤝 Contributing
|
191
|
+
|
192
|
+
Contributions welcome! Please:
|
193
|
+
1. Follow the existing code style
|
194
|
+
2. Update documentation
|
195
|
+
3. Add tests for new features
|
196
|
+
4. Test on multiple browsers
|
197
|
+
|
198
|
+
## 🔗 Links
|
199
|
+
|
200
|
+
- [Django REST Framework](https://www.django-rest-framework.org/)
|
201
|
+
- [Tailwind CSS](https://tailwindcss.com/)
|
202
|
+
- [Alpine.js](https://alpinejs.dev/)
|
203
|
+
- [Prism.js](https://prismjs.com/)
|
204
|
+
|
205
|
+
---
|
206
|
+
|
207
|
+
Built with ❤️ for django-cfg
|
@@ -0,0 +1,274 @@
|
|
1
|
+
# Django REST Framework + Tailwind CDN: Key Insights & Best Practices
|
2
|
+
|
3
|
+
## 1. Tailwind CDN Limitations
|
4
|
+
|
5
|
+
### Dark Mode Configuration Issue
|
6
|
+
**Problem**: Tailwind CDN does not support `darkMode: 'class'` configuration. It always generates media query-based dark mode.
|
7
|
+
|
8
|
+
**Evidence**:
|
9
|
+
```css
|
10
|
+
/* What Tailwind CDN generates: */
|
11
|
+
@media (prefers-color-scheme: dark){
|
12
|
+
.dark\:bg-gray-900 {
|
13
|
+
background-color: rgb(17 24 39);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
/* What we need for class-based dark mode: */
|
18
|
+
.dark .dark\:bg-gray-900 {
|
19
|
+
background-color: rgb(17 24 39);
|
20
|
+
}
|
21
|
+
```
|
22
|
+
|
23
|
+
**Solution**: Override with custom CSS using `!important`:
|
24
|
+
```css
|
25
|
+
html:not(.dark) .dark\:bg-gray-900 {
|
26
|
+
background-color: rgb(249 250 251) !important; /* Force light mode */
|
27
|
+
}
|
28
|
+
|
29
|
+
html.dark .dark\:bg-gray-900 {
|
30
|
+
background-color: rgb(17 24 39) !important; /* Force dark mode */
|
31
|
+
}
|
32
|
+
```
|
33
|
+
|
34
|
+
## 2. @apply Directive Doesn't Work in Regular Style Tags
|
35
|
+
|
36
|
+
### The Problem
|
37
|
+
**Wrong Approach**:
|
38
|
+
```css
|
39
|
+
<style>
|
40
|
+
.card {
|
41
|
+
@apply bg-white dark:bg-gray-800 rounded-lg border;
|
42
|
+
}
|
43
|
+
</style>
|
44
|
+
```
|
45
|
+
This will **NOT work** with Tailwind CDN because `@apply` is only available during build time with Tailwind CLI.
|
46
|
+
|
47
|
+
**Correct Approach** - Use plain CSS:
|
48
|
+
```css
|
49
|
+
<style>
|
50
|
+
.card {
|
51
|
+
background-color: white;
|
52
|
+
border-radius: 0.5rem;
|
53
|
+
border: 1px solid #e5e7eb;
|
54
|
+
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
|
55
|
+
}
|
56
|
+
.dark .card {
|
57
|
+
background-color: #1f2937;
|
58
|
+
border-color: #374151;
|
59
|
+
}
|
60
|
+
</style>
|
61
|
+
```
|
62
|
+
|
63
|
+
## 3. Default JSON Collapsed State
|
64
|
+
|
65
|
+
**Best Practice**: Set JSON tree to collapsed by default for better UX with large responses.
|
66
|
+
|
67
|
+
```javascript
|
68
|
+
// BAD: Expanded by default
|
69
|
+
data-expanded="true">▼</span>
|
70
|
+
style="display: block;">
|
71
|
+
|
72
|
+
// GOOD: Collapsed by default
|
73
|
+
data-expanded="false">▶</span>
|
74
|
+
style="display: none;">
|
75
|
+
```
|
76
|
+
|
77
|
+
## 4. Simplicity Over Complexity
|
78
|
+
|
79
|
+
### What We Learned
|
80
|
+
- **Gradients**: Users found them "ugly" and distracting
|
81
|
+
- **Animations**: Unnecessary hover effects add visual noise
|
82
|
+
- **Multiple colors**: Keep color palette minimal and consistent
|
83
|
+
|
84
|
+
**Before** (Too complex):
|
85
|
+
```css
|
86
|
+
.badge-get {
|
87
|
+
background: linear-gradient(to right, #3b82f6, #2563eb);
|
88
|
+
box-shadow: 0 4px 6px rgba(59, 130, 246, 0.3);
|
89
|
+
transform: translateY(-1px);
|
90
|
+
}
|
91
|
+
```
|
92
|
+
|
93
|
+
**After** (Simple and clean):
|
94
|
+
```css
|
95
|
+
.badge-get {
|
96
|
+
background-color: #3b82f6;
|
97
|
+
color: white;
|
98
|
+
}
|
99
|
+
```
|
100
|
+
|
101
|
+
## 5. Full-Width Navigation
|
102
|
+
|
103
|
+
**Anti-pattern**: Using container for navigation limits header to content width
|
104
|
+
```html
|
105
|
+
<!-- BAD -->
|
106
|
+
<nav>
|
107
|
+
<div class="container mx-auto px-4">
|
108
|
+
```
|
109
|
+
|
110
|
+
**Best Practice**: Use direct padding for full-width headers
|
111
|
+
```html
|
112
|
+
<!-- GOOD -->
|
113
|
+
<nav>
|
114
|
+
<div class="px-6 py-3">
|
115
|
+
```
|
116
|
+
|
117
|
+
## 6. Base HTML Styling is Critical
|
118
|
+
|
119
|
+
When using utility-first frameworks, you MUST provide base styles for standard HTML elements:
|
120
|
+
|
121
|
+
```css
|
122
|
+
/* Essential base styles */
|
123
|
+
input[type="text"],
|
124
|
+
input[type="email"],
|
125
|
+
input[type="password"],
|
126
|
+
textarea,
|
127
|
+
select {
|
128
|
+
width: 100%;
|
129
|
+
padding: 0.5rem 0.75rem;
|
130
|
+
background-color: white;
|
131
|
+
border: 1px solid #d1d5db;
|
132
|
+
border-radius: 0.5rem;
|
133
|
+
color: #111827;
|
134
|
+
}
|
135
|
+
|
136
|
+
button[type="submit"] {
|
137
|
+
padding: 0.5rem 1rem;
|
138
|
+
background-color: #2563eb;
|
139
|
+
color: white;
|
140
|
+
border-radius: 0.5rem;
|
141
|
+
font-weight: 500;
|
142
|
+
}
|
143
|
+
|
144
|
+
table {
|
145
|
+
width: 100%;
|
146
|
+
border-collapse: collapse;
|
147
|
+
}
|
148
|
+
|
149
|
+
th, td {
|
150
|
+
padding: 0.5rem 1rem;
|
151
|
+
border: 1px solid #e5e7eb;
|
152
|
+
}
|
153
|
+
```
|
154
|
+
|
155
|
+
## 7. User Authentication Display
|
156
|
+
|
157
|
+
**Issue**: DRF's `{% optional_logout %}` templatetag might display email instead of username.
|
158
|
+
|
159
|
+
**Solution**: Create custom logout form:
|
160
|
+
```html
|
161
|
+
<div class="flex items-center space-x-2">
|
162
|
+
<div class="w-8 h-8 rounded-full bg-blue-600 flex items-center justify-center text-white">
|
163
|
+
{{ user.username|first|upper }}
|
164
|
+
</div>
|
165
|
+
<span>{{ user.username }}</span>
|
166
|
+
</div>
|
167
|
+
{% if api_settings.LOGOUT_URL %}
|
168
|
+
<form action="{% url api_settings.LOGOUT_URL %}" method="post">
|
169
|
+
{% csrf_token %}
|
170
|
+
<button type="submit">Logout</button>
|
171
|
+
</form>
|
172
|
+
{% endif %}
|
173
|
+
```
|
174
|
+
|
175
|
+
## 8. Dark Mode Implementation Checklist
|
176
|
+
|
177
|
+
1. **Set initial theme** before rendering:
|
178
|
+
```javascript
|
179
|
+
(function() {
|
180
|
+
const theme = 'light'; // or from localStorage
|
181
|
+
if (theme === 'dark') {
|
182
|
+
document.documentElement.classList.add('dark');
|
183
|
+
}
|
184
|
+
})();
|
185
|
+
```
|
186
|
+
|
187
|
+
2. **Override Tailwind CDN media queries**:
|
188
|
+
```css
|
189
|
+
html:not(.dark) .dark\:bg-gray-900 { background-color: #f9fafb !important; }
|
190
|
+
html.dark .dark\:bg-gray-900 { background-color: rgb(17 24 39) !important; }
|
191
|
+
```
|
192
|
+
|
193
|
+
3. **Provide dark mode for ALL custom styles**:
|
194
|
+
```css
|
195
|
+
.card { background-color: white; }
|
196
|
+
.dark .card { background-color: #1f2937; }
|
197
|
+
```
|
198
|
+
|
199
|
+
## 9. Key Takeaways
|
200
|
+
|
201
|
+
### DO ✅
|
202
|
+
- Use plain CSS instead of `@apply` with Tailwind CDN
|
203
|
+
- Override CDN-generated media queries for class-based dark mode
|
204
|
+
- Keep UI simple and minimal
|
205
|
+
- Collapse JSON trees by default
|
206
|
+
- Style all base HTML elements
|
207
|
+
- Use full-width navigation
|
208
|
+
|
209
|
+
### DON'T ❌
|
210
|
+
- Rely on Tailwind CDN config options (they don't work)
|
211
|
+
- Use complex gradients and animations everywhere
|
212
|
+
- Leave HTML elements unstyled
|
213
|
+
- Use `@apply` in regular `<style>` tags with CDN
|
214
|
+
- Trust that DRF templatetags display what you expect
|
215
|
+
|
216
|
+
## 10. Final Architecture
|
217
|
+
|
218
|
+
```
|
219
|
+
base.html
|
220
|
+
├── Override Tailwind CDN dark mode with custom CSS
|
221
|
+
├── Define all base HTML element styles (input, button, table, etc.)
|
222
|
+
├── Define reusable classes (.card, .badge, .btn-icon)
|
223
|
+
├── Full-width navigation (no container)
|
224
|
+
└── Dark mode switcher with localStorage persistence
|
225
|
+
|
226
|
+
api.html
|
227
|
+
├── Use .card class for all content blocks
|
228
|
+
├── JSON viewer with collapsed default state
|
229
|
+
├── Simple badges without gradients
|
230
|
+
└── Clean, minimal UI
|
231
|
+
```
|
232
|
+
|
233
|
+
## 11. Common Pitfalls
|
234
|
+
|
235
|
+
### Pitfall 1: Expecting Tailwind CDN to behave like CLI version
|
236
|
+
The CDN version is limited and doesn't support:
|
237
|
+
- Configuration options
|
238
|
+
- `@apply` directive in custom CSS
|
239
|
+
- JIT mode features
|
240
|
+
- Custom theme extensions
|
241
|
+
|
242
|
+
### Pitfall 2: Not testing both light and dark modes
|
243
|
+
Always test both modes because:
|
244
|
+
- Media queries can conflict with class-based approach
|
245
|
+
- Default browser dark mode can interfere
|
246
|
+
- Some styles might only show in one mode
|
247
|
+
|
248
|
+
### Pitfall 3: Over-relying on utility classes
|
249
|
+
For complex components, custom CSS classes are cleaner:
|
250
|
+
```html
|
251
|
+
<!-- BAD: Long utility chains -->
|
252
|
+
<div class="px-4 py-2 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow">
|
253
|
+
|
254
|
+
<!-- GOOD: Reusable class -->
|
255
|
+
<div class="card">
|
256
|
+
```
|
257
|
+
|
258
|
+
## 12. Performance Considerations
|
259
|
+
|
260
|
+
1. **Tailwind CDN scans HTML on every page load** - keep HTML clean
|
261
|
+
2. **Use `!important` sparingly** - only for overriding CDN media queries
|
262
|
+
3. **Minimize custom styles** - let Tailwind handle what it can
|
263
|
+
4. **Consider build step** - for production, use Tailwind CLI instead of CDN
|
264
|
+
|
265
|
+
## 13. Testing Strategy
|
266
|
+
|
267
|
+
1. Test with system dark mode ON
|
268
|
+
2. Test with system dark mode OFF
|
269
|
+
3. Test theme switching in both states
|
270
|
+
4. Check all form elements have proper styling
|
271
|
+
5. Verify JSON viewer works with large responses
|
272
|
+
6. Test on different browsers (Chrome, Firefox, Safari)
|
273
|
+
|
274
|
+
This approach works reliably with Tailwind CDN while providing full dark mode support and proper styling for all elements.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"""
|
2
|
+
🎨 Django DRF Tailwind Theme
|
3
|
+
|
4
|
+
Modern, user-friendly Tailwind CSS theme for Django REST Framework Browsable API.
|
5
|
+
|
6
|
+
Features:
|
7
|
+
- 🌓 Dark/Light mode with smooth transitions
|
8
|
+
- 📱 Fully responsive design
|
9
|
+
- ⌨️ Keyboard shortcuts
|
10
|
+
- 🎯 Glass morphism UI
|
11
|
+
- 🚀 Alpine.js powered interactivity
|
12
|
+
- 💫 Smooth animations
|
13
|
+
- 📋 One-click copy for JSON/URLs
|
14
|
+
- 🔍 Advanced JSON tree viewer
|
15
|
+
"""
|
16
|
+
|
17
|
+
from .renderers import TailwindBrowsableAPIRenderer
|
18
|
+
|
19
|
+
__all__ = [
|
20
|
+
"TailwindBrowsableAPIRenderer",
|
21
|
+
]
|
22
|
+
|
23
|
+
__version__ = "1.0.0"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"""Django DRF Tailwind Theme app configuration."""
|
2
|
+
|
3
|
+
from django.apps import AppConfig
|
4
|
+
|
5
|
+
|
6
|
+
class DjangoDRFThemeConfig(AppConfig):
|
7
|
+
"""App configuration for Django DRF Tailwind Theme."""
|
8
|
+
|
9
|
+
name = "django_cfg.modules.django_drf_theme"
|
10
|
+
verbose_name = "Django DRF Tailwind Theme"
|
11
|
+
default_auto_field = "django.db.models.BigAutoField"
|
12
|
+
|
13
|
+
def ready(self):
|
14
|
+
"""Initialize the app when Django starts."""
|
15
|
+
pass
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"""
|
2
|
+
Modern Tailwind-styled renderer for Django REST Framework.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from rest_framework.renderers import BrowsableAPIRenderer
|
6
|
+
|
7
|
+
|
8
|
+
class TailwindBrowsableAPIRenderer(BrowsableAPIRenderer):
|
9
|
+
"""
|
10
|
+
🎨 Tailwind CSS Browsable API Renderer
|
11
|
+
|
12
|
+
Modern, user-friendly renderer with:
|
13
|
+
- Dark/Light mode support
|
14
|
+
- Glass morphism design
|
15
|
+
- Keyboard shortcuts (? to see all)
|
16
|
+
- Responsive mobile-first layout
|
17
|
+
- Advanced JSON viewer with syntax highlighting
|
18
|
+
- One-click copy for JSON/URLs
|
19
|
+
- Smooth animations and transitions
|
20
|
+
|
21
|
+
Extends BrowsableAPIRenderer to preserve all DRF functionality.
|
22
|
+
"""
|
23
|
+
|
24
|
+
template = 'rest_framework/tailwind/api.html'
|
25
|
+
|
26
|
+
def get_context(self, data, accepted_media_type, renderer_context):
|
27
|
+
"""Extend context with Tailwind-specific variables."""
|
28
|
+
context = super().get_context(
|
29
|
+
data, accepted_media_type, renderer_context
|
30
|
+
)
|
31
|
+
|
32
|
+
request = renderer_context.get('request')
|
33
|
+
if request:
|
34
|
+
# Theme from cookie or system preference
|
35
|
+
theme = request.COOKIES.get('theme', 'auto')
|
36
|
+
|
37
|
+
# Determine HTML class based on theme
|
38
|
+
if theme == 'dark':
|
39
|
+
html_class = 'dark'
|
40
|
+
elif theme == 'light':
|
41
|
+
html_class = ''
|
42
|
+
else: # auto
|
43
|
+
html_class = '' # Will use system preference via JS
|
44
|
+
|
45
|
+
context.update({
|
46
|
+
'theme': theme,
|
47
|
+
'html_class': html_class,
|
48
|
+
'tailwind_version': 4,
|
49
|
+
'enable_dark_mode': True,
|
50
|
+
'enable_shortcuts': True,
|
51
|
+
'enable_animations': True,
|
52
|
+
})
|
53
|
+
|
54
|
+
return context
|
55
|
+
|
56
|
+
def get_template_names(self):
|
57
|
+
"""Return only Tailwind template (no fallback)."""
|
58
|
+
return [self.template]
|