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,124 @@
|
|
1
|
+
{% comment %}
|
2
|
+
Universal Navbar Component
|
3
|
+
|
4
|
+
Parameters:
|
5
|
+
- title: Navbar title (default: "Django CFG")
|
6
|
+
- icon: Emoji or HTML icon (default: "💎")
|
7
|
+
- nav_items: List of navigation items (optional)
|
8
|
+
Example: [
|
9
|
+
{'label': 'Dashboard', 'url': '/dashboard/', 'active': True},
|
10
|
+
{'label': 'Settings', 'url': '/settings/'},
|
11
|
+
]
|
12
|
+
- show_theme_toggle: Show dark mode toggle (default: True)
|
13
|
+
- show_user_menu: Show user menu dropdown (default: True)
|
14
|
+
- sticky: Make navbar sticky (default: True)
|
15
|
+
- full_width: Make navbar full width (default: False, uses max-w-7xl)
|
16
|
+
- extra_actions: Additional action buttons (optional, block content)
|
17
|
+
|
18
|
+
User menu parameters:
|
19
|
+
- show_profile: Show profile link in user menu (default: False)
|
20
|
+
- show_logout: Show logout link in user menu (default: False)
|
21
|
+
- profile_url: Custom profile URL (default: /profile/)
|
22
|
+
- logout_url: Custom logout URL (default: /accounts/logout/)
|
23
|
+
|
24
|
+
Usage:
|
25
|
+
|
26
|
+
Basic:
|
27
|
+
{% include 'django_tailwind/components/navbar.html' with title="My App" icon="🚀" %}
|
28
|
+
|
29
|
+
Full width navbar:
|
30
|
+
{% include 'django_tailwind/components/navbar.html' with title="Dashboard" full_width=True %}
|
31
|
+
|
32
|
+
With navigation items:
|
33
|
+
{% include 'django_tailwind/components/navbar.html' with title="Dashboard" nav_items=menu_items %}
|
34
|
+
|
35
|
+
With user menu options:
|
36
|
+
{% include 'django_tailwind/components/navbar.html' with show_profile=True show_logout=True %}
|
37
|
+
|
38
|
+
In template context:
|
39
|
+
menu_items = [
|
40
|
+
{'label': 'Home', 'url': '/', 'active': True},
|
41
|
+
{'label': 'About', 'url': '/about/'},
|
42
|
+
]
|
43
|
+
|
44
|
+
Custom navbar (extending):
|
45
|
+
{% with title="My App" icon="🚀" %}
|
46
|
+
{% include 'django_tailwind/components/navbar.html' %}
|
47
|
+
{% endwith %}
|
48
|
+
{% endcomment %}
|
49
|
+
|
50
|
+
<header class="bg-white dark:bg-gray-800 shadow-sm border-b border-gray-200 dark:border-gray-700 {% if sticky|default:True %}sticky top-0 z-50{% endif %}">
|
51
|
+
<div class="{% if full_width %}w-full{% else %}max-w-7xl mx-auto{% endif %} px-4 sm:px-6 lg:px-8">
|
52
|
+
<!-- Main navbar row -->
|
53
|
+
<div class="flex justify-between h-16">
|
54
|
+
<!-- Left: Logo, Title & Navigation -->
|
55
|
+
<div class="flex items-center space-x-6">
|
56
|
+
<div class="flex items-center space-x-3">
|
57
|
+
{% if icon %}
|
58
|
+
<span class="text-2xl">{{ icon }}</span>
|
59
|
+
{% endif %}
|
60
|
+
<h1 class="text-xl font-semibold text-gray-900 dark:text-white">
|
61
|
+
{{ title|default:"Django CFG" }}
|
62
|
+
</h1>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<!-- Navigation items (horizontal links) -->
|
66
|
+
{% if nav_items %}
|
67
|
+
<nav class="hidden md:flex items-center space-x-1">
|
68
|
+
{% for item in nav_items %}
|
69
|
+
<a href="{{ item.url }}"
|
70
|
+
class="px-3 py-2 rounded-md text-sm font-medium transition-colors
|
71
|
+
{% if item.active %}
|
72
|
+
bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white
|
73
|
+
{% else %}
|
74
|
+
text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-white
|
75
|
+
{% endif %}">
|
76
|
+
{% if item.icon %}<span class="mr-1">{{ item.icon }}</span>{% endif %}
|
77
|
+
{{ item.label }}
|
78
|
+
</a>
|
79
|
+
{% endfor %}
|
80
|
+
</nav>
|
81
|
+
{% endif %}
|
82
|
+
</div>
|
83
|
+
|
84
|
+
<!-- Right: Actions -->
|
85
|
+
<div class="flex items-center space-x-4">
|
86
|
+
|
87
|
+
<!-- Extra actions slot -->
|
88
|
+
{% if extra_actions %}
|
89
|
+
{{ extra_actions }}
|
90
|
+
{% endif %}
|
91
|
+
|
92
|
+
<!-- Dark Mode Toggle -->
|
93
|
+
{% if show_theme_toggle|default:True %}
|
94
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
95
|
+
{% endif %}
|
96
|
+
|
97
|
+
<!-- User Menu -->
|
98
|
+
{% if show_user_menu|default:True %}
|
99
|
+
{% include 'django_tailwind/components/user_menu.html' with show_profile=show_profile show_logout=show_logout profile_url=profile_url logout_url=logout_url %}
|
100
|
+
{% endif %}
|
101
|
+
</div>
|
102
|
+
</div>
|
103
|
+
|
104
|
+
<!-- Mobile navigation (dropdown) -->
|
105
|
+
{% if nav_items %}
|
106
|
+
<div class="md:hidden pb-3 pt-2 border-t border-gray-200 dark:border-gray-700">
|
107
|
+
<nav class="flex flex-col space-y-1">
|
108
|
+
{% for item in nav_items %}
|
109
|
+
<a href="{{ item.url }}"
|
110
|
+
class="px-3 py-2 rounded-md text-sm font-medium transition-colors
|
111
|
+
{% if item.active %}
|
112
|
+
bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white
|
113
|
+
{% else %}
|
114
|
+
text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-white
|
115
|
+
{% endif %}">
|
116
|
+
{% if item.icon %}<span class="mr-2">{{ item.icon }}</span>{% endif %}
|
117
|
+
{{ item.label }}
|
118
|
+
</a>
|
119
|
+
{% endfor %}
|
120
|
+
</nav>
|
121
|
+
</div>
|
122
|
+
{% endif %}
|
123
|
+
</div>
|
124
|
+
</header>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
{% comment %}
|
2
|
+
Theme Toggle Component
|
3
|
+
|
4
|
+
Usage:
|
5
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
6
|
+
|
7
|
+
With custom classes:
|
8
|
+
{% include 'django_tailwind/components/theme_toggle.html' with button_class="custom-class" %}
|
9
|
+
|
10
|
+
Variants:
|
11
|
+
- button_variant: "default" (default), "icon", "text"
|
12
|
+
- button_class: additional CSS classes
|
13
|
+
{% endcomment %}
|
14
|
+
|
15
|
+
{% if button_variant == "text" %}
|
16
|
+
<!-- Text variant with label -->
|
17
|
+
<button @click="darkMode = !darkMode"
|
18
|
+
class="inline-flex items-center space-x-2 px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors {{ button_class }}">
|
19
|
+
<svg x-show="!darkMode" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
20
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
|
21
|
+
</svg>
|
22
|
+
<svg x-show="darkMode" x-cloak class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
23
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/>
|
24
|
+
</svg>
|
25
|
+
<span x-show="!darkMode">Dark Mode</span>
|
26
|
+
<span x-show="darkMode" x-cloak>Light Mode</span>
|
27
|
+
</button>
|
28
|
+
|
29
|
+
{% elif button_variant == "icon" %}
|
30
|
+
<!-- Icon only variant (compact) -->
|
31
|
+
<button @click="darkMode = !darkMode"
|
32
|
+
class="p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors {{ button_class }}"
|
33
|
+
aria-label="Toggle dark mode">
|
34
|
+
<svg x-show="!darkMode" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
35
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
|
36
|
+
</svg>
|
37
|
+
<svg x-show="darkMode" x-cloak class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
38
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/>
|
39
|
+
</svg>
|
40
|
+
</button>
|
41
|
+
|
42
|
+
{% else %}
|
43
|
+
<!-- Default variant (with background) -->
|
44
|
+
<button @click="darkMode = !darkMode"
|
45
|
+
class="p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors {{ button_class }}"
|
46
|
+
aria-label="Toggle dark mode">
|
47
|
+
<svg x-show="!darkMode" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
48
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
|
49
|
+
</svg>
|
50
|
+
<svg x-show="darkMode" x-cloak class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
51
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/>
|
52
|
+
</svg>
|
53
|
+
</button>
|
54
|
+
{% endif %}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
{% comment %}
|
2
|
+
User Menu Component with Dropdown
|
3
|
+
|
4
|
+
Shows user avatar, name, and dropdown menu with:
|
5
|
+
- Admin panel link (for staff)
|
6
|
+
- Profile link (optional)
|
7
|
+
- Logout link (optional)
|
8
|
+
|
9
|
+
Parameters:
|
10
|
+
- show_admin: Show admin link (default: auto-detect if user.is_staff)
|
11
|
+
- show_profile: Show profile link (default: False)
|
12
|
+
- show_logout: Show logout link (default: False)
|
13
|
+
- profile_url: Custom profile URL
|
14
|
+
- logout_url: Custom logout URL
|
15
|
+
|
16
|
+
Usage:
|
17
|
+
{% include 'django_tailwind/components/user_menu.html' %}
|
18
|
+
|
19
|
+
With parameters:
|
20
|
+
{% include 'django_tailwind/components/user_menu.html' with show_profile=True show_logout=True %}
|
21
|
+
{% endcomment %}
|
22
|
+
|
23
|
+
{% load tailwind_info %}
|
24
|
+
|
25
|
+
{% if request.user.is_authenticated %}
|
26
|
+
<!-- User Menu Dropdown -->
|
27
|
+
<div class="relative" x-data="{ userMenuOpen: false }" @click.away="userMenuOpen = false">
|
28
|
+
<!-- User Avatar Button -->
|
29
|
+
<button @click="userMenuOpen = !userMenuOpen"
|
30
|
+
class="flex items-center space-x-2 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500">
|
31
|
+
<!-- Avatar -->
|
32
|
+
<div class="w-8 h-8 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center text-white text-sm font-semibold">
|
33
|
+
{% get_user_initials as user_initials %}
|
34
|
+
{{ user_initials }}
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<!-- User Name (hidden on mobile) -->
|
38
|
+
<span class="hidden md:block text-sm font-medium text-gray-700 dark:text-gray-300">
|
39
|
+
{% get_user_display_name as user_name %}
|
40
|
+
{{ user_name }}
|
41
|
+
</span>
|
42
|
+
|
43
|
+
<!-- Dropdown Arrow -->
|
44
|
+
<svg class="w-4 h-4 text-gray-500 dark:text-gray-400 transition-transform"
|
45
|
+
:class="{ 'rotate-180': userMenuOpen }"
|
46
|
+
fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
47
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
|
48
|
+
</svg>
|
49
|
+
</button>
|
50
|
+
|
51
|
+
<!-- Dropdown Menu -->
|
52
|
+
<div x-show="userMenuOpen"
|
53
|
+
x-cloak
|
54
|
+
x-transition:enter="transition ease-out duration-200"
|
55
|
+
x-transition:enter-start="opacity-0 scale-95"
|
56
|
+
x-transition:enter-end="opacity-100 scale-100"
|
57
|
+
x-transition:leave="transition ease-in duration-150"
|
58
|
+
x-transition:leave-start="opacity-100 scale-100"
|
59
|
+
x-transition:leave-end="opacity-0 scale-95"
|
60
|
+
class="absolute right-0 mt-2 w-56 rounded-lg shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 divide-y divide-gray-100 dark:divide-gray-700 z-50">
|
61
|
+
|
62
|
+
<!-- User Info Section -->
|
63
|
+
<div class="px-4 py-3">
|
64
|
+
<p class="text-sm font-medium text-gray-900 dark:text-white">
|
65
|
+
{{ user_name }}
|
66
|
+
</p>
|
67
|
+
{% if request.user.email %}
|
68
|
+
<p class="text-xs text-gray-500 dark:text-gray-400 truncate">
|
69
|
+
{{ request.user.email }}
|
70
|
+
</p>
|
71
|
+
{% endif %}
|
72
|
+
</div>
|
73
|
+
|
74
|
+
<!-- Menu Items -->
|
75
|
+
<div class="py-1">
|
76
|
+
{% get_admin_url as admin_url %}
|
77
|
+
|
78
|
+
<!-- Admin Panel Link (for staff only) -->
|
79
|
+
{% if show_admin|default:request.user.is_staff %}
|
80
|
+
<a href="{{ admin_url }}"
|
81
|
+
class="flex items-center px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
82
|
+
<svg class="w-5 h-5 mr-3 text-gray-500 dark:text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
83
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
|
84
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
85
|
+
</svg>
|
86
|
+
Admin Panel
|
87
|
+
</a>
|
88
|
+
{% endif %}
|
89
|
+
|
90
|
+
<!-- Profile Link (optional) -->
|
91
|
+
{% if show_profile %}
|
92
|
+
<a href="{{ profile_url|default:'/profile/' }}"
|
93
|
+
class="flex items-center px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
94
|
+
<svg class="w-5 h-5 mr-3 text-gray-500 dark:text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
95
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
96
|
+
</svg>
|
97
|
+
Profile
|
98
|
+
</a>
|
99
|
+
{% endif %}
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<!-- Logout Section -->
|
103
|
+
{% if show_logout %}
|
104
|
+
<div class="py-1">
|
105
|
+
<a href="{{ logout_url|default:'/accounts/logout/' }}"
|
106
|
+
class="flex items-center px-4 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
107
|
+
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
108
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/>
|
109
|
+
</svg>
|
110
|
+
Logout
|
111
|
+
</a>
|
112
|
+
</div>
|
113
|
+
{% endif %}
|
114
|
+
</div>
|
115
|
+
</div>
|
116
|
+
{% endif %}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
{% extends 'django_tailwind/base.html' %}
|
2
|
+
|
3
|
+
{% block container_class %}{% endblock %}
|
4
|
+
|
5
|
+
{% block main %}
|
6
|
+
<!-- Floating Dark Mode Toggle -->
|
7
|
+
<div class="fixed top-4 right-4 z-50">
|
8
|
+
{% include 'django_tailwind/components/theme_toggle.html' %}
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="min-h-screen flex items-center justify-center px-4 py-12">
|
12
|
+
<div class="w-full max-w-md">
|
13
|
+
{% block content %}
|
14
|
+
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-lg p-8 text-center">
|
15
|
+
{% block simple_icon %}
|
16
|
+
<div class="text-6xl mb-4">
|
17
|
+
{% block icon %}ℹ️{% endblock %}
|
18
|
+
</div>
|
19
|
+
{% endblock %}
|
20
|
+
|
21
|
+
{% block simple_title %}
|
22
|
+
<h1 class="text-2xl font-bold text-gray-900 dark:text-white mb-4">
|
23
|
+
{% block heading %}Title{% endblock %}
|
24
|
+
</h1>
|
25
|
+
{% endblock %}
|
26
|
+
|
27
|
+
{% block simple_message %}
|
28
|
+
<p class="text-gray-600 dark:text-gray-400 mb-6">
|
29
|
+
{% block message %}Message goes here{% endblock %}
|
30
|
+
</p>
|
31
|
+
{% endblock %}
|
32
|
+
|
33
|
+
{% block simple_actions %}
|
34
|
+
<div class="flex flex-col sm:flex-row gap-3 justify-center">
|
35
|
+
{% block actions %}
|
36
|
+
<a href="/"
|
37
|
+
class="inline-flex items-center justify-center px-6 py-3 border border-transparent rounded-lg shadow-sm text-base font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors">
|
38
|
+
Go Home
|
39
|
+
</a>
|
40
|
+
{% endblock %}
|
41
|
+
</div>
|
42
|
+
{% endblock %}
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
{% endblock %}
|
@@ -0,0 +1 @@
|
|
1
|
+
"""Django Tailwind templatetags package."""
|
@@ -0,0 +1,185 @@
|
|
1
|
+
"""
|
2
|
+
Django Tailwind Layouts templatetags.
|
3
|
+
|
4
|
+
Template tags for universal Tailwind layouts with dark mode support.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from django import template
|
8
|
+
from django.utils.safestring import mark_safe
|
9
|
+
|
10
|
+
register = template.Library()
|
11
|
+
|
12
|
+
|
13
|
+
# Library metadata
|
14
|
+
LIBRARY_INFO = {
|
15
|
+
'name': 'Django Tailwind Layouts',
|
16
|
+
'version': '1.0.0',
|
17
|
+
'description': 'Universal Tailwind CSS layouts with dark mode for Django applications',
|
18
|
+
'url': 'https://github.com/yourusername/django-cfg',
|
19
|
+
'author': 'Django-CFG Team',
|
20
|
+
'license': 'MIT',
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
@register.simple_tag
|
25
|
+
def tailwind_lib_name():
|
26
|
+
"""Get library name."""
|
27
|
+
return LIBRARY_INFO['name']
|
28
|
+
|
29
|
+
|
30
|
+
@register.simple_tag
|
31
|
+
def tailwind_lib_version():
|
32
|
+
"""Get library version."""
|
33
|
+
return LIBRARY_INFO['version']
|
34
|
+
|
35
|
+
|
36
|
+
@register.simple_tag
|
37
|
+
def tailwind_lib_description():
|
38
|
+
"""Get library description."""
|
39
|
+
return LIBRARY_INFO['description']
|
40
|
+
|
41
|
+
|
42
|
+
@register.simple_tag
|
43
|
+
def tailwind_lib_url():
|
44
|
+
"""Get library URL."""
|
45
|
+
return LIBRARY_INFO['url']
|
46
|
+
|
47
|
+
|
48
|
+
@register.simple_tag
|
49
|
+
def tailwind_lib_author():
|
50
|
+
"""Get library author."""
|
51
|
+
return LIBRARY_INFO['author']
|
52
|
+
|
53
|
+
|
54
|
+
@register.simple_tag
|
55
|
+
def tailwind_lib_info():
|
56
|
+
"""
|
57
|
+
Get complete library info as dictionary.
|
58
|
+
|
59
|
+
Usage in template:
|
60
|
+
{% load tailwind_info %}
|
61
|
+
{% tailwind_lib_info as lib %}
|
62
|
+
<p>{{ lib.name }} v{{ lib.version }}</p>
|
63
|
+
"""
|
64
|
+
return LIBRARY_INFO
|
65
|
+
|
66
|
+
|
67
|
+
@register.simple_tag
|
68
|
+
def tailwind_powered_by():
|
69
|
+
"""
|
70
|
+
Generate "Powered by" HTML snippet.
|
71
|
+
|
72
|
+
Usage:
|
73
|
+
{% load tailwind_info %}
|
74
|
+
{% tailwind_powered_by %}
|
75
|
+
"""
|
76
|
+
return mark_safe(
|
77
|
+
f'Powered by <a href="{LIBRARY_INFO["url"]}" '
|
78
|
+
f'class="font-medium text-gray-900 dark:text-white hover:text-blue-600 dark:hover:text-blue-400 transition-colors" '
|
79
|
+
f'target="_blank">{LIBRARY_INFO["name"]}</a> v{LIBRARY_INFO["version"]}'
|
80
|
+
)
|
81
|
+
|
82
|
+
|
83
|
+
@register.simple_tag
|
84
|
+
def tailwind_footer_text():
|
85
|
+
"""
|
86
|
+
Generate footer text with library info.
|
87
|
+
|
88
|
+
Usage:
|
89
|
+
{% load tailwind_info %}
|
90
|
+
{% tailwind_footer_text %}
|
91
|
+
"""
|
92
|
+
return mark_safe(
|
93
|
+
f'<span class="text-gray-600 dark:text-gray-400">{LIBRARY_INFO["name"]}</span> '
|
94
|
+
f'<span class="text-gray-400 dark:text-gray-600">v{LIBRARY_INFO["version"]}</span>'
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
@register.filter
|
99
|
+
def add_class(field, css_class):
|
100
|
+
"""
|
101
|
+
Add CSS class to form field.
|
102
|
+
|
103
|
+
Usage:
|
104
|
+
{{ form.field|add_class:"custom-class" }}
|
105
|
+
"""
|
106
|
+
return field.as_widget(attrs={"class": css_class})
|
107
|
+
|
108
|
+
|
109
|
+
@register.simple_tag(takes_context=True)
|
110
|
+
def get_admin_url(context):
|
111
|
+
"""
|
112
|
+
Get admin URL from settings or default.
|
113
|
+
|
114
|
+
Usage:
|
115
|
+
{% load tailwind_info %}
|
116
|
+
{% get_admin_url as admin_url %}
|
117
|
+
<a href="{{ admin_url }}">Admin</a>
|
118
|
+
"""
|
119
|
+
from django.conf import settings
|
120
|
+
from django.urls import reverse
|
121
|
+
|
122
|
+
# Try to get custom admin URL from settings
|
123
|
+
admin_url = getattr(settings, 'ADMIN_URL', None)
|
124
|
+
|
125
|
+
if not admin_url:
|
126
|
+
try:
|
127
|
+
admin_url = reverse('admin:index')
|
128
|
+
except Exception:
|
129
|
+
admin_url = '/admin/'
|
130
|
+
|
131
|
+
return admin_url
|
132
|
+
|
133
|
+
|
134
|
+
@register.simple_tag(takes_context=True)
|
135
|
+
def get_user_display_name(context):
|
136
|
+
"""
|
137
|
+
Get user display name (full name or username).
|
138
|
+
|
139
|
+
Usage:
|
140
|
+
{% load tailwind_info %}
|
141
|
+
{% get_user_display_name as user_name %}
|
142
|
+
"""
|
143
|
+
request = context.get('request')
|
144
|
+
if not request or not request.user.is_authenticated:
|
145
|
+
return 'Guest'
|
146
|
+
|
147
|
+
user = request.user
|
148
|
+
|
149
|
+
# Try full name first
|
150
|
+
full_name = user.get_full_name() if hasattr(user, 'get_full_name') else ''
|
151
|
+
if full_name:
|
152
|
+
return full_name
|
153
|
+
|
154
|
+
# Fallback to username
|
155
|
+
return user.username if hasattr(user, 'username') else 'User'
|
156
|
+
|
157
|
+
|
158
|
+
@register.simple_tag(takes_context=True)
|
159
|
+
def get_user_initials(context):
|
160
|
+
"""
|
161
|
+
Get user initials for avatar.
|
162
|
+
|
163
|
+
Usage:
|
164
|
+
{% load tailwind_info %}
|
165
|
+
{% get_user_initials as initials %}
|
166
|
+
"""
|
167
|
+
request = context.get('request')
|
168
|
+
if not request or not request.user.is_authenticated:
|
169
|
+
return '?'
|
170
|
+
|
171
|
+
user = request.user
|
172
|
+
|
173
|
+
# Try to get initials from full name
|
174
|
+
if hasattr(user, 'get_full_name'):
|
175
|
+
full_name = user.get_full_name()
|
176
|
+
if full_name:
|
177
|
+
parts = full_name.split()
|
178
|
+
if len(parts) >= 2:
|
179
|
+
return f"{parts[0][0]}{parts[1][0]}".upper()
|
180
|
+
elif len(parts) == 1:
|
181
|
+
return parts[0][:2].upper()
|
182
|
+
|
183
|
+
# Fallback to username
|
184
|
+
username = user.username if hasattr(user, 'username') else 'U'
|
185
|
+
return username[:2].upper()
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"""
|
2
|
+
Django-CFG Task Service Module.
|
3
|
+
|
4
|
+
Simplified task service for Dramatiq integration with essential functionality.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .service import DjangoTasks
|
8
|
+
from .factory import (
|
9
|
+
get_task_service,
|
10
|
+
reset_task_service,
|
11
|
+
is_task_system_available,
|
12
|
+
get_task_health,
|
13
|
+
initialize_task_system,
|
14
|
+
)
|
15
|
+
from .settings import (
|
16
|
+
generate_dramatiq_settings_from_config,
|
17
|
+
extend_constance_config_with_tasks,
|
18
|
+
)
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"DjangoTasks",
|
22
|
+
"get_task_service",
|
23
|
+
"reset_task_service",
|
24
|
+
"is_task_system_available",
|
25
|
+
"get_task_health",
|
26
|
+
"generate_dramatiq_settings_from_config",
|
27
|
+
"extend_constance_config_with_tasks",
|
28
|
+
"initialize_task_system",
|
29
|
+
]
|