django-cfg 1.3.13__py3-none-any.whl → 1.4.3__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/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- 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/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- 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/examples/vehicle_model_example.py +199 -0
- 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_currency/examples/__init__.py +3 -0
- django_cfg/modules/django_currency/examples/example_database_usage.py +144 -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_ipc_client/README.md +346 -0
- django_cfg/modules/django_ipc_client/__init__.py +51 -0
- django_cfg/modules/django_ipc_client/client.py +540 -0
- django_cfg/modules/django_ipc_client/config.py +207 -0
- django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_ipc_client/exceptions.py +201 -0
- 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/examples/component_class_example.html +156 -0
- 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.3.dist-info/METADATA +533 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -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.3.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -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]
|
@@ -0,0 +1,375 @@
|
|
1
|
+
{% extends "rest_framework/tailwind/base.html" %}
|
2
|
+
{% load rest_framework %}
|
3
|
+
|
4
|
+
{% block content %}
|
5
|
+
<div class="grid grid-cols-1 xl:grid-cols-3 gap-6">
|
6
|
+
|
7
|
+
{# Main Content Column #}
|
8
|
+
<div class="xl:col-span-2 space-y-6">
|
9
|
+
|
10
|
+
{# Endpoint Info Card #}
|
11
|
+
{% if description %}
|
12
|
+
<div class="card p-6">
|
13
|
+
<div class="flex items-start justify-between mb-4">
|
14
|
+
<div class="flex-1">
|
15
|
+
<h1 class="text-2xl font-bold mb-2 text-gray-900 dark:text-white">
|
16
|
+
{{ name }}
|
17
|
+
</h1>
|
18
|
+
<div class="prose prose-gray dark:prose-invert max-w-none text-gray-700 dark:text-gray-300">
|
19
|
+
{{ description }}
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
{# Copy endpoint button #}
|
24
|
+
<button @click="navigator.clipboard.writeText('{{ request.build_absolute_uri }}').then(() => showToast('URL copied!', 'success')).catch(() => showToast('Failed to copy', 'error'))"
|
25
|
+
class="btn-icon ml-4"
|
26
|
+
title="Copy URL">
|
27
|
+
<svg class="w-5 h-5 text-gray-600 dark:text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
28
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
|
29
|
+
</svg>
|
30
|
+
</button>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
{# Endpoint URL with copy functionality #}
|
34
|
+
<div class="mt-4 p-4 bg-gray-100 dark:bg-gray-900 rounded-lg">
|
35
|
+
<div class="flex items-center justify-between">
|
36
|
+
<code class="text-sm font-mono flex-1 overflow-x-auto text-gray-900 dark:text-gray-100">{{ request.get_full_path }}</code>
|
37
|
+
<button @click="navigator.clipboard.writeText('{{ request.build_absolute_uri }}').then(() => showToast('Endpoint URL copied!', 'success')).catch(() => showToast('Failed to copy', 'error'))"
|
38
|
+
class="btn-icon ml-2">
|
39
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
40
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
|
41
|
+
</svg>
|
42
|
+
</button>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
{% endif %}
|
47
|
+
|
48
|
+
{# Response Viewer with Tabs #}
|
49
|
+
<div class="card overflow-hidden"
|
50
|
+
x-data="{ activeTab: 'pretty', expanded: {}, copySuccess: false }">
|
51
|
+
|
52
|
+
{# Tabs Header #}
|
53
|
+
<div class="flex items-center justify-between border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
|
54
|
+
<div class="flex">
|
55
|
+
<button @click="activeTab = 'pretty'"
|
56
|
+
:class="activeTab === 'pretty' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
|
57
|
+
class="px-6 py-3 font-medium text-sm transition-all">
|
58
|
+
<div class="flex items-center space-x-2">
|
59
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
60
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"/>
|
61
|
+
</svg>
|
62
|
+
<span>Response</span>
|
63
|
+
</div>
|
64
|
+
</button>
|
65
|
+
|
66
|
+
<button @click="activeTab = 'raw'"
|
67
|
+
:class="activeTab === 'raw' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
|
68
|
+
class="px-6 py-3 font-medium text-sm transition-all">
|
69
|
+
<div class="flex items-center space-x-2">
|
70
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
71
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
|
72
|
+
</svg>
|
73
|
+
<span>Raw</span>
|
74
|
+
</div>
|
75
|
+
</button>
|
76
|
+
|
77
|
+
{% if display_edit_forms %}
|
78
|
+
<button @click="activeTab = 'headers'"
|
79
|
+
:class="activeTab === 'headers' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
|
80
|
+
class="px-6 py-3 font-medium text-sm transition-all">
|
81
|
+
<div class="flex items-center space-x-2">
|
82
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
83
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
84
|
+
</svg>
|
85
|
+
<span>Headers</span>
|
86
|
+
</div>
|
87
|
+
</button>
|
88
|
+
{% endif %}
|
89
|
+
</div>
|
90
|
+
|
91
|
+
{# Response Status Badge #}
|
92
|
+
{% if response.status_code %}
|
93
|
+
<div class="px-4 py-2">
|
94
|
+
<span class="badge
|
95
|
+
{% if response.status_code < 300 %}status-success
|
96
|
+
{% elif response.status_code < 400 %}status-info
|
97
|
+
{% elif response.status_code < 500 %}status-warning
|
98
|
+
{% else %}status-error{% endif %}">
|
99
|
+
{{ response.status_code }} {{ response.status_text }}
|
100
|
+
</span>
|
101
|
+
</div>
|
102
|
+
{% endif %}
|
103
|
+
</div>
|
104
|
+
|
105
|
+
{# Response Content #}
|
106
|
+
<div class="p-6">
|
107
|
+
{# Pretty JSON View #}
|
108
|
+
<div x-show="activeTab === 'pretty'" class="space-y-4">
|
109
|
+
{% if content %}
|
110
|
+
<div class="relative"
|
111
|
+
x-data="{
|
112
|
+
jsonData: null,
|
113
|
+
init() {
|
114
|
+
try {
|
115
|
+
this.jsonData = JSON.parse(`{{ content|escapejs }}`);
|
116
|
+
} catch(e) {
|
117
|
+
console.error('Failed to parse JSON:', e);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}">
|
121
|
+
{# Toolbar #}
|
122
|
+
<div class="flex items-center justify-between mb-3">
|
123
|
+
<div class="flex items-center space-x-2">
|
124
|
+
<button @click="$event.target.closest('[x-data]').querySelectorAll('.json-toggle').forEach(el => el.dataset.expanded = 'true'); $event.target.closest('[x-data]').querySelectorAll('.json-content').forEach(el => el.style.display = 'block')"
|
125
|
+
class="px-3 py-1.5 text-xs rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 transition-all">
|
126
|
+
Expand All
|
127
|
+
</button>
|
128
|
+
<button @click="$event.target.closest('[x-data]').querySelectorAll('.json-toggle').forEach(el => el.dataset.expanded = 'false'); $event.target.closest('[x-data]').querySelectorAll('.json-content').forEach(el => el.style.display = 'none')"
|
129
|
+
class="px-3 py-1.5 text-xs rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 transition-all">
|
130
|
+
Collapse All
|
131
|
+
</button>
|
132
|
+
</div>
|
133
|
+
|
134
|
+
{# Copy button #}
|
135
|
+
<button @click="navigator.clipboard.writeText(JSON.stringify(jsonData, null, 2)).then(() => { copySuccess = true; showToast('JSON copied!', 'success'); setTimeout(() => copySuccess = false, 2000) }).catch(() => showToast('Failed to copy', 'error'))"
|
136
|
+
class="px-3 py-1.5 rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 text-sm font-medium transition-all">
|
137
|
+
<div class="flex items-center space-x-1.5">
|
138
|
+
<svg x-show="!copySuccess" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
139
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
|
140
|
+
</svg>
|
141
|
+
<svg x-show="copySuccess" class="w-4 h-4 text-green-500" fill="currentColor" viewBox="0 0 20 20">
|
142
|
+
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
|
143
|
+
</svg>
|
144
|
+
<span x-text="copySuccess ? 'Copied!' : 'Copy'"></span>
|
145
|
+
</div>
|
146
|
+
</button>
|
147
|
+
</div>
|
148
|
+
|
149
|
+
{# Interactive JSON Tree #}
|
150
|
+
<div class="bg-gray-50 dark:bg-gray-900 rounded-lg p-6 overflow-x-auto border border-gray-200 dark:border-gray-700 font-mono text-sm"
|
151
|
+
x-html="renderJSON(jsonData, 0)">
|
152
|
+
</div>
|
153
|
+
</div>
|
154
|
+
{% else %}
|
155
|
+
<div class="text-center py-12 text-gray-500 dark:text-gray-400">
|
156
|
+
<svg class="w-16 h-16 mx-auto mb-4 opacity-50" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
157
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"/>
|
158
|
+
</svg>
|
159
|
+
<p class="font-medium">No response data</p>
|
160
|
+
</div>
|
161
|
+
{% endif %}
|
162
|
+
</div>
|
163
|
+
|
164
|
+
{# Raw View #}
|
165
|
+
<div x-show="activeTab === 'raw'">
|
166
|
+
<pre class="bg-gray-50 dark:bg-gray-900 rounded-lg p-6 overflow-x-auto border border-gray-200 dark:border-gray-700 text-sm font-mono text-gray-800 dark:text-gray-300">{{ content }}</pre>
|
167
|
+
</div>
|
168
|
+
|
169
|
+
{# Headers View #}
|
170
|
+
{% if display_edit_forms %}
|
171
|
+
<div x-show="activeTab === 'headers'">
|
172
|
+
<div class="space-y-2">
|
173
|
+
{% for key, val in response.items %}
|
174
|
+
<div class="flex items-start border-b border-gray-200 dark:border-gray-700 pb-2">
|
175
|
+
<span class="font-mono text-sm text-blue-600 dark:text-blue-400 w-1/3">{{ key }}:</span>
|
176
|
+
<span class="font-mono text-sm text-gray-700 dark:text-gray-300 flex-1">{{ val }}</span>
|
177
|
+
</div>
|
178
|
+
{% endfor %}
|
179
|
+
</div>
|
180
|
+
</div>
|
181
|
+
{% endif %}
|
182
|
+
</div>
|
183
|
+
</div>
|
184
|
+
|
185
|
+
{# Request Forms #}
|
186
|
+
{% if display_edit_forms %}
|
187
|
+
<div class="card overflow-hidden">
|
188
|
+
<div class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 px-6 py-4">
|
189
|
+
<h2 class="text-lg font-bold flex items-center text-gray-900 dark:text-white">
|
190
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
191
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/>
|
192
|
+
</svg>
|
193
|
+
Make a Request
|
194
|
+
</h2>
|
195
|
+
</div>
|
196
|
+
|
197
|
+
<div class="p-6">
|
198
|
+
{# Request method tabs #}
|
199
|
+
<div x-data="{ method: '{{ request.method|default:'GET' }}' }" class="space-y-6">
|
200
|
+
|
201
|
+
{# Method selector #}
|
202
|
+
<div class="flex flex-wrap gap-2">
|
203
|
+
{% for method in allowed_methods %}
|
204
|
+
{% if method != "OPTIONS" %}
|
205
|
+
<button @click="method = '{{ method }}'"
|
206
|
+
:class="method === '{{ method }}' ? 'ring-2 ring-offset-1' : 'opacity-60'"
|
207
|
+
class="badge px-4 py-2
|
208
|
+
{% if method == 'GET' %}badge-get ring-blue-500
|
209
|
+
{% elif method == 'POST' %}badge-post ring-green-500
|
210
|
+
{% elif method == 'PUT' %}badge-put ring-orange-500
|
211
|
+
{% elif method == 'PATCH' %}badge-patch ring-purple-500
|
212
|
+
{% elif method == 'DELETE' %}badge-delete ring-red-500
|
213
|
+
{% else %}bg-gray-500 text-white ring-gray-500{% endif %}">
|
214
|
+
{{ method }}
|
215
|
+
</button>
|
216
|
+
{% endif %}
|
217
|
+
{% endfor %}
|
218
|
+
</div>
|
219
|
+
|
220
|
+
{# Forms for each method #}
|
221
|
+
{% for method in allowed_methods %}
|
222
|
+
{% if method != "OPTIONS" %}
|
223
|
+
<div x-show="method === '{{ method }}'" x-transition>
|
224
|
+
{% with form=raw_data_put_or_patch_form %}
|
225
|
+
{% if method == "PUT" or method == "PATCH" %}
|
226
|
+
{% include "rest_framework/tailwind/forms/raw_data_form.html" %}
|
227
|
+
{% endif %}
|
228
|
+
{% endwith %}
|
229
|
+
|
230
|
+
{% with form=raw_data_post_form %}
|
231
|
+
{% if method == "POST" %}
|
232
|
+
{% include "rest_framework/tailwind/forms/raw_data_form.html" %}
|
233
|
+
{% endif %}
|
234
|
+
{% endwith %}
|
235
|
+
|
236
|
+
{% if method == "DELETE" %}
|
237
|
+
<form method="POST" action="{{ request.get_full_path }}" class="space-y-4">
|
238
|
+
{% csrf_token %}
|
239
|
+
<input type="hidden" name="_method" value="DELETE">
|
240
|
+
<div class="p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg">
|
241
|
+
<p class="text-red-800 dark:text-red-300 font-medium mb-4">
|
242
|
+
Are you sure you want to delete this resource?
|
243
|
+
</p>
|
244
|
+
<button type="submit"
|
245
|
+
class="px-6 py-2.5 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-all shadow-sm hover:shadow-md">
|
246
|
+
Confirm Delete
|
247
|
+
</button>
|
248
|
+
</div>
|
249
|
+
</form>
|
250
|
+
{% endif %}
|
251
|
+
|
252
|
+
{% if method == "GET" %}
|
253
|
+
<div class="p-4 bg-gray-50 dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg">
|
254
|
+
<p class="text-gray-700 dark:text-gray-300">
|
255
|
+
Use the filters sidebar or query parameters to customize your GET request.
|
256
|
+
</p>
|
257
|
+
</div>
|
258
|
+
{% endif %}
|
259
|
+
</div>
|
260
|
+
{% endif %}
|
261
|
+
{% endfor %}
|
262
|
+
</div>
|
263
|
+
</div>
|
264
|
+
</div>
|
265
|
+
{% endif %}
|
266
|
+
|
267
|
+
{# Pagination #}
|
268
|
+
{% if paginator %}
|
269
|
+
<div class="flex items-center justify-between card p-4">
|
270
|
+
<div class="text-sm text-gray-600 dark:text-gray-400">
|
271
|
+
Showing {{ paginator.start_index }} - {{ paginator.end_index }} of {{ paginator.count }} results
|
272
|
+
</div>
|
273
|
+
|
274
|
+
<div class="flex items-center space-x-2">
|
275
|
+
{% if page.has_previous %}
|
276
|
+
<a href="?page={{ page.previous_page_number }}"
|
277
|
+
class="px-4 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-600">
|
278
|
+
Previous
|
279
|
+
</a>
|
280
|
+
{% endif %}
|
281
|
+
|
282
|
+
<span class="px-4 py-2 bg-blue-600 text-white rounded-lg font-medium">
|
283
|
+
{{ page.number }}
|
284
|
+
</span>
|
285
|
+
|
286
|
+
{% if page.has_next %}
|
287
|
+
<a href="?page={{ page.next_page_number }}"
|
288
|
+
class="px-4 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-600">
|
289
|
+
Next
|
290
|
+
</a>
|
291
|
+
{% endif %}
|
292
|
+
</div>
|
293
|
+
</div>
|
294
|
+
{% endif %}
|
295
|
+
|
296
|
+
</div>
|
297
|
+
|
298
|
+
{# Sidebar with Info & Filters #}
|
299
|
+
<div class="xl:col-span-1 space-y-6">
|
300
|
+
|
301
|
+
{# API Info Card #}
|
302
|
+
<div class="card p-6 sticky top-24">
|
303
|
+
<h3 class="text-lg font-bold mb-4 flex items-center text-gray-900 dark:text-white">
|
304
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
305
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
306
|
+
</svg>
|
307
|
+
API Info
|
308
|
+
</h3>
|
309
|
+
|
310
|
+
<div class="space-y-3 text-sm">
|
311
|
+
{# Allowed methods #}
|
312
|
+
<div>
|
313
|
+
<span class="text-gray-500 dark:text-gray-400 font-medium block mb-2">Allowed Methods</span>
|
314
|
+
<div class="flex flex-wrap gap-2">
|
315
|
+
{% for method in allowed_methods %}
|
316
|
+
<span class="badge px-2 py-0.5 text-xs
|
317
|
+
{% if method == 'GET' %}badge-get
|
318
|
+
{% elif method == 'POST' %}badge-post
|
319
|
+
{% elif method == 'PUT' %}badge-put
|
320
|
+
{% elif method == 'PATCH' %}badge-patch
|
321
|
+
{% elif method == 'DELETE' %}badge-delete
|
322
|
+
{% else %}bg-gradient-to-r from-gray-500 to-gray-600 text-white{% endif %}">
|
323
|
+
{{ method }}
|
324
|
+
</span>
|
325
|
+
{% endfor %}
|
326
|
+
</div>
|
327
|
+
</div>
|
328
|
+
|
329
|
+
{# Content type #}
|
330
|
+
{% if available_formats %}
|
331
|
+
<div>
|
332
|
+
<span class="text-gray-500 dark:text-gray-400 font-medium block mb-2">Response Formats</span>
|
333
|
+
<div class="flex flex-wrap gap-1.5">
|
334
|
+
{% for format in available_formats %}
|
335
|
+
<a href="{% add_query_param request api_settings.URL_FORMAT_OVERRIDE format %}"
|
336
|
+
class="px-2 py-1 rounded text-xs font-mono bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600">
|
337
|
+
{{ format }}
|
338
|
+
</a>
|
339
|
+
{% endfor %}
|
340
|
+
</div>
|
341
|
+
</div>
|
342
|
+
{% endif %}
|
343
|
+
|
344
|
+
{# Version info if available #}
|
345
|
+
{% if api_version %}
|
346
|
+
<div>
|
347
|
+
<span class="text-gray-500 dark:text-gray-400 font-medium">API Version</span>
|
348
|
+
<p class="font-mono text-blue-600 dark:text-blue-400">{{ api_version }}</p>
|
349
|
+
</div>
|
350
|
+
{% endif %}
|
351
|
+
</div>
|
352
|
+
</div>
|
353
|
+
|
354
|
+
{# Filters #}
|
355
|
+
{% if filter_form %}
|
356
|
+
<div class="card overflow-hidden">
|
357
|
+
<div class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 px-6 py-4">
|
358
|
+
<h3 class="text-lg font-bold flex items-center text-gray-900 dark:text-white">
|
359
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
360
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"/>
|
361
|
+
</svg>
|
362
|
+
Filters
|
363
|
+
</h3>
|
364
|
+
</div>
|
365
|
+
|
366
|
+
<div class="p-6">
|
367
|
+
{% include "rest_framework/tailwind/forms/filter_form.html" %}
|
368
|
+
</div>
|
369
|
+
</div>
|
370
|
+
{% endif %}
|
371
|
+
|
372
|
+
</div>
|
373
|
+
</div>
|
374
|
+
|
375
|
+
{% endblock %}
|