django-cfg 1.1.48__tar.gz → 1.1.50__tar.gz
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-1.1.48 → django_cfg-1.1.50}/LICENSE +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/PKG-INFO +4 -4
- {django_cfg-1.1.48 → django_cfg-1.1.50}/README.md +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/pyproject.toml +3 -3
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/__init__.py +3 -3
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/serializers/otp.py +2 -2
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/services/otp_service.py +51 -2
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/utils/notifications.py +98 -17
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/views/otp.py +8 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/archive/django_sample.zip +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/README.md +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/commands/create_project.py +2 -2
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/commands/info.py +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/test_email.py +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/llm/client.py +2 -2
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/README.md +1 -1
- {django_cfg-1.1.48 → django_cfg-1.1.50}/.gitignore +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/MANIFEST.in +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/requirements-dev.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/requirements-test.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/requirements.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/activity.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/filters.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/group.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/inlines.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/otp.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/registration_source.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/user.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/management/commands/test_otp.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/managers/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/managers/user_manager.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/migrations/0002_add_phone_otp_clean.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/migrations/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/serializers/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/serializers/profile.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/services/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/services/activity_service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/signals.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/base_email.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/base_email.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/otp_email.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/otp_email.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/welcome_email.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/welcome_email.txt +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/views/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/views/profile.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/commands/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/commands/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/commands/views.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/health/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/health/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/api/health/views.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/admin.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/migrations/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/serializers.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/signals.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/tests.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/views.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/admin.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/admin_filters.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/management/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/management/commands/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/management/commands/test_newsletter.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/managers/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/managers/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/migrations/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/serializers.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/services/email_service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/signals.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/utils/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/campaigns.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/emails.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/newsletters.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/subscriptions.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/tracking.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/admin.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/admin_filters.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/managers/message_manager.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/managers/ticket_manager.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/migrations/0002_alter_message_ticket.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/migrations/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/serializers.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/signals.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/templates/support/chat/access_denied.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/templates/support/chat/ticket_chat.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/utils/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/utils/support_email_service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/views/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/views/admin.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/views/api.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/support/views/chat.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/admin.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/tasks/views.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/commands/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/main.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/cli/utils.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/core/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/core/config.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/core/environment.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/core/generation.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/core/validation.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/examples/README_NGROK.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/examples/README_NGROK_ENV.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/examples/ngrok_env_example.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/examples/ngrok_example.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/exceptions.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/integration.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/check_settings.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/create_token.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/generate.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/migrator.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/rundramatiq.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/runserver_ngrok.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/script.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/show_config.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/show_urls.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/superuser.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/task_clear.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/task_status.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/test_telegram.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/test_twilio.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/tree.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/management/commands/validate_config.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/middleware/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/middleware/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/middleware/user_activity.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/cache.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/constance.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/database.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/drf.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/jwt.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/limits.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/ngrok.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/revolution.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/services.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/tasks.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/models/unfold.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/base.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_currency/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_currency/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_currency/cache.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_currency/converter.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_currency/service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_email.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/README.md +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/example.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/llm/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/llm/cache.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/llm/models_cache.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/translator/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/translator/cache.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_llm/translator/translator.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_logger.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_ngrok.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_tasks.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_telegram.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/exceptions.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/django_twilio/simple_service.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/logger.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/callbacks.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/dashboard.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/models.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/system_monitor.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/modules/unfold/tailwind.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/routers.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/index.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/layouts/dashboard_with_tabs.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/activity_tracker.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/charts_section.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/django_commands.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/quick_actions.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/recent_activity.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/recent_users_table.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/stats_cards.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/stats_tiles.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/system_health.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/system_metrics.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/components/user_permissions.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/tabs/app_stats_tab.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/tabs/commands_tab.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/tabs/overview_tab.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/tabs/stats_tab.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/tabs/users_tab.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/admin/snippets/zones/zones_table.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/templates/emails/base_email.html +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/utils/__init__.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/utils/path_resolution.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/utils/smart_defaults.py +0 -0
- {django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/version_check.py +0 -0
@@ -1,14 +1,14 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: django-cfg
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.50
|
4
4
|
Summary: 🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience
|
5
5
|
Project-URL: Homepage, https://github.com/markolofsen/django-cfg
|
6
6
|
Project-URL: Documentation, https://django-cfg.readthedocs.io
|
7
7
|
Project-URL: Repository, https://github.com/markolofsen/django-cfg.git
|
8
8
|
Project-URL: Issues, https://github.com/markolofsen/django-cfg/issues
|
9
9
|
Project-URL: Changelog, https://github.com/markolofsen/django-cfg/blob/main/CHANGELOG.md
|
10
|
-
Author-email:
|
11
|
-
Maintainer-email:
|
10
|
+
Author-email: ReformsAI Team <dev@reforms.ai>
|
11
|
+
Maintainer-email: ReformsAI Team <dev@reforms.ai>
|
12
12
|
License: MIT
|
13
13
|
License-File: LICENSE
|
14
14
|
Keywords: configuration,developer-experience,django,pydantic,settings,type-safety
|
@@ -1090,6 +1090,6 @@ MIT License - see [LICENSE](LICENSE) file for details.
|
|
1090
1090
|
|
1091
1091
|
---
|
1092
1092
|
|
1093
|
-
**Made with ❤️ by the
|
1093
|
+
**Made with ❤️ by the ReformsAI Team**
|
1094
1094
|
|
1095
1095
|
*Django-CFG: Because configuration should be simple, safe, and powerful.*
|
@@ -4,15 +4,15 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "django-cfg"
|
7
|
-
version = "1.1.
|
7
|
+
version = "1.1.50"
|
8
8
|
description = "🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience"
|
9
9
|
readme = "README.md"
|
10
10
|
license = {text = "MIT"}
|
11
11
|
authors = [
|
12
|
-
{name = "
|
12
|
+
{name = "ReformsAI Team", email = "dev@reforms.ai"},
|
13
13
|
]
|
14
14
|
maintainers = [
|
15
|
-
{name = "
|
15
|
+
{name = "ReformsAI Team", email = "dev@reforms.ai"},
|
16
16
|
]
|
17
17
|
keywords = [
|
18
18
|
"django",
|
@@ -38,9 +38,9 @@ default_app_config = "django_cfg.apps.DjangoCfgConfig"
|
|
38
38
|
from typing import TYPE_CHECKING
|
39
39
|
|
40
40
|
# Version information
|
41
|
-
__version__ = "1.1.
|
42
|
-
__author__ = "
|
43
|
-
__email__ = "info@
|
41
|
+
__version__ = "1.1.50"
|
42
|
+
__author__ = "ReformsAI Team"
|
43
|
+
__email__ = "info@reforms.ai"
|
44
44
|
__license__ = "MIT"
|
45
45
|
|
46
46
|
# Core exports - only import when needed to avoid circular imports
|
@@ -26,7 +26,7 @@ class OTPRequestSerializer(serializers.Serializer):
|
|
26
26
|
source_url = serializers.URLField(
|
27
27
|
required=False,
|
28
28
|
allow_blank=True,
|
29
|
-
help_text="Source URL for tracking registration (e.g., https://
|
29
|
+
help_text="Source URL for tracking registration (e.g., https://reforms.ai)",
|
30
30
|
)
|
31
31
|
|
32
32
|
def validate_identifier(self, value):
|
@@ -76,7 +76,7 @@ class OTPVerifySerializer(serializers.Serializer):
|
|
76
76
|
source_url = serializers.URLField(
|
77
77
|
required=False,
|
78
78
|
allow_blank=True,
|
79
|
-
help_text="Source URL for tracking login (e.g., https://
|
79
|
+
help_text="Source URL for tracking login (e.g., https://reforms.ai)",
|
80
80
|
)
|
81
81
|
|
82
82
|
def validate_identifier(self, value):
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/services/otp_service.py
RENAMED
@@ -28,6 +28,53 @@ class OTPService:
|
|
28
28
|
phone_pattern = r'^\+[1-9]\d{6,14}$' # E.164 format: minimum 7 digits, maximum 15
|
29
29
|
return bool(re.match(phone_pattern, clean_phone))
|
30
30
|
|
31
|
+
@staticmethod
|
32
|
+
def _get_temp_email_domain(source_url: Optional[str] = None) -> str:
|
33
|
+
"""
|
34
|
+
Get domain for temporary email addresses.
|
35
|
+
|
36
|
+
Priority:
|
37
|
+
1. Extract domain from source_url
|
38
|
+
2. Use config.site_url domain
|
39
|
+
3. Fallback to 'temp.local'
|
40
|
+
"""
|
41
|
+
try:
|
42
|
+
from django_cfg.core.config import get_current_config
|
43
|
+
from urllib.parse import urlparse
|
44
|
+
|
45
|
+
config = get_current_config()
|
46
|
+
|
47
|
+
# Try to extract domain from source_url
|
48
|
+
if source_url:
|
49
|
+
try:
|
50
|
+
parsed = urlparse(source_url)
|
51
|
+
if parsed.netloc:
|
52
|
+
# Remove www. prefix if present
|
53
|
+
domain = parsed.netloc
|
54
|
+
if domain.startswith("www."):
|
55
|
+
domain = domain[4:]
|
56
|
+
return domain
|
57
|
+
except:
|
58
|
+
pass
|
59
|
+
|
60
|
+
# Try to use config.site_url domain
|
61
|
+
if config and config.site_url:
|
62
|
+
try:
|
63
|
+
parsed = urlparse(config.site_url)
|
64
|
+
if parsed.netloc:
|
65
|
+
domain = parsed.netloc
|
66
|
+
if domain.startswith("www."):
|
67
|
+
domain = domain[4:]
|
68
|
+
return domain
|
69
|
+
except:
|
70
|
+
pass
|
71
|
+
|
72
|
+
# Fallback to temp.local
|
73
|
+
return "temp.local"
|
74
|
+
|
75
|
+
except Exception:
|
76
|
+
return "temp.local"
|
77
|
+
|
31
78
|
@staticmethod
|
32
79
|
def _determine_channel(identifier: str) -> str:
|
33
80
|
"""Determine if identifier is email or phone."""
|
@@ -114,8 +161,10 @@ class OTPService:
|
|
114
161
|
user = CustomUser.objects.get(phone=cleaned_identifier)
|
115
162
|
created = False
|
116
163
|
except CustomUser.DoesNotExist:
|
117
|
-
# Create user with temp email based on phone
|
118
|
-
|
164
|
+
# Create user with temp email based on phone and domain
|
165
|
+
phone_clean = cleaned_identifier.replace('+', '').replace(' ', '')
|
166
|
+
domain = OTPService._get_temp_email_domain(source_url)
|
167
|
+
temp_email = f"phone_{phone_clean}@{domain}"
|
119
168
|
user, created = CustomUser.objects.register_user(
|
120
169
|
temp_email, source_url=source_url
|
121
170
|
)
|
@@ -7,7 +7,7 @@ from django.utils import timezone
|
|
7
7
|
from django.contrib.auth import get_user_model
|
8
8
|
from django_cfg.modules.django_telegram import DjangoTelegram
|
9
9
|
from django_cfg.modules.django_email import DjangoEmailService
|
10
|
-
from django_cfg.modules.django_twilio import SimpleTwilioService
|
10
|
+
from django_cfg.modules.django_twilio import SimpleTwilioService, send_whatsapp
|
11
11
|
from django_cfg.core.config import get_current_config
|
12
12
|
|
13
13
|
# Get config once
|
@@ -15,6 +15,44 @@ config = get_current_config()
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
17
17
|
|
18
|
+
class WhatsAppMessageBuilder:
|
19
|
+
"""Builder for WhatsApp OTP messages"""
|
20
|
+
|
21
|
+
def __init__(self, app_name: str, otp_code: str):
|
22
|
+
self.app_name = app_name
|
23
|
+
self.otp_code = otp_code
|
24
|
+
self.lines = []
|
25
|
+
|
26
|
+
def add_greeting(self):
|
27
|
+
"""Add greeting line"""
|
28
|
+
self.lines.append(f"Your {self.app_name} verification code:")
|
29
|
+
return self
|
30
|
+
|
31
|
+
def add_code(self):
|
32
|
+
"""Add OTP code line"""
|
33
|
+
self.lines.append(f"*{self.otp_code}*")
|
34
|
+
return self
|
35
|
+
|
36
|
+
def add_expiry(self):
|
37
|
+
"""Add expiry information"""
|
38
|
+
self.lines.append("Expires in 10 minutes")
|
39
|
+
return self
|
40
|
+
|
41
|
+
def add_url(self, url: str):
|
42
|
+
"""Add verification URL"""
|
43
|
+
self.lines.append(f"Verify: {url}")
|
44
|
+
return self
|
45
|
+
|
46
|
+
def add_security_note(self):
|
47
|
+
"""Add security note"""
|
48
|
+
self.lines.append("Keep this code secure")
|
49
|
+
return self
|
50
|
+
|
51
|
+
def build(self) -> str:
|
52
|
+
"""Build the final message"""
|
53
|
+
return "\n".join(self.lines)
|
54
|
+
|
55
|
+
|
18
56
|
class AccountNotifications:
|
19
57
|
"""Centralized account notification system"""
|
20
58
|
|
@@ -217,8 +255,7 @@ class AccountNotifications:
|
|
217
255
|
"""Send OTP notification via email"""
|
218
256
|
if send_email:
|
219
257
|
try:
|
220
|
-
|
221
|
-
otp_link = OTPService._get_otp_url(otp_code)
|
258
|
+
otp_link = config.get_otp_url(otp_code) if config else f"#otp-{otp_code}"
|
222
259
|
success = AccountNotifications._send_email(
|
223
260
|
user=user,
|
224
261
|
subject=f"Your OTP code: {otp_code}",
|
@@ -254,23 +291,33 @@ class AccountNotifications:
|
|
254
291
|
|
255
292
|
@staticmethod
|
256
293
|
def send_phone_otp_notification(user, otp_code, phone_number, is_new_user=False, source_url=None):
|
257
|
-
"""Send OTP notification via
|
294
|
+
"""Send OTP notification via WhatsApp to client and system notification to Telegram"""
|
258
295
|
try:
|
259
|
-
#
|
260
|
-
from django_cfg.modules.django_twilio import send_sms
|
261
|
-
|
262
|
-
# Format SMS message for client
|
296
|
+
# Build WhatsApp message using builder
|
263
297
|
app_name = config.project_name if config else "App"
|
264
|
-
|
298
|
+
builder = WhatsAppMessageBuilder(app_name, otp_code)
|
299
|
+
|
300
|
+
# Build message with proper formatting
|
301
|
+
builder.add_greeting().add_code().add_expiry()
|
302
|
+
|
303
|
+
# Add URL if available
|
304
|
+
otp_url = config.get_otp_url(otp_code) if config else None
|
305
|
+
if otp_url:
|
306
|
+
builder.add_url(otp_url)
|
307
|
+
|
308
|
+
builder.add_security_note()
|
309
|
+
whatsapp_message = builder.build()
|
265
310
|
|
266
|
-
# Send
|
267
|
-
result =
|
311
|
+
# Send WhatsApp message to client using our OTP code
|
312
|
+
result = send_whatsapp(
|
268
313
|
to=phone_number,
|
269
|
-
body=
|
314
|
+
body=whatsapp_message
|
270
315
|
)
|
271
316
|
|
272
|
-
|
273
|
-
|
317
|
+
success = bool(result)
|
318
|
+
|
319
|
+
if success:
|
320
|
+
logger.info(f"OTP sent via WhatsApp to client {phone_number}")
|
274
321
|
|
275
322
|
# Send SYSTEM notification to Telegram (for admins) - WITHOUT OTP code for security
|
276
323
|
try:
|
@@ -279,7 +326,8 @@ class AccountNotifications:
|
|
279
326
|
"user_type": "New User" if is_new_user else "Existing User",
|
280
327
|
"source_url": source_url or "Direct",
|
281
328
|
"timestamp": timezone.now().strftime("%Y-%m-%d %H:%M:%S UTC"),
|
282
|
-
"user_id": user.id if user else "Unknown"
|
329
|
+
"user_id": user.id if user else "Unknown",
|
330
|
+
"delivery_method": "WhatsApp (with SMS fallback)"
|
283
331
|
}
|
284
332
|
|
285
333
|
if is_new_user:
|
@@ -291,10 +339,43 @@ class AccountNotifications:
|
|
291
339
|
except Exception as e:
|
292
340
|
logger.error(f"Failed to send phone OTP system notification: {e}")
|
293
341
|
else:
|
294
|
-
logger.error(f"Failed to send OTP
|
342
|
+
logger.error(f"Failed to send OTP via WhatsApp to client {phone_number}")
|
343
|
+
|
344
|
+
# Send error notification to Telegram
|
345
|
+
try:
|
346
|
+
error_data = {
|
347
|
+
"phone": phone_number,
|
348
|
+
"error_message": "WhatsApp message delivery failed",
|
349
|
+
"user_type": "New User" if is_new_user else "Existing User",
|
350
|
+
"source_url": source_url or "Direct",
|
351
|
+
"timestamp": timezone.now().strftime("%Y-%m-%d %H:%M:%S UTC"),
|
352
|
+
"user_id": user.id if user else "Unknown"
|
353
|
+
}
|
354
|
+
|
355
|
+
DjangoTelegram.send_error("🚫📱 WhatsApp OTP Delivery Failed", error_data)
|
356
|
+
logger.info(f"WhatsApp OTP error notification sent to Telegram for {phone_number}")
|
357
|
+
except Exception as e:
|
358
|
+
logger.error(f"Failed to send WhatsApp OTP error notification to Telegram: {e}")
|
295
359
|
|
296
360
|
except Exception as e:
|
297
|
-
logger.error(f"Failed to send OTP
|
361
|
+
logger.error(f"Failed to send OTP via WhatsApp to client {phone_number}: {e}")
|
362
|
+
|
363
|
+
# Send error notification to Telegram for unexpected errors
|
364
|
+
try:
|
365
|
+
error_data = {
|
366
|
+
"phone": phone_number,
|
367
|
+
"error_message": str(e),
|
368
|
+
"error_type": "Unexpected Error",
|
369
|
+
"user_type": "New User" if is_new_user else "Existing User",
|
370
|
+
"source_url": source_url or "Direct",
|
371
|
+
"timestamp": timezone.now().strftime("%Y-%m-%d %H:%M:%S UTC"),
|
372
|
+
"user_id": user.id if user else "Unknown"
|
373
|
+
}
|
374
|
+
|
375
|
+
DjangoTelegram.send_error("🚨📱 WhatsApp OTP System Error", error_data)
|
376
|
+
logger.info(f"WhatsApp OTP system error notification sent to Telegram for {phone_number}")
|
377
|
+
except Exception as telegram_error:
|
378
|
+
logger.error(f"Failed to send WhatsApp OTP system error notification to Telegram: {telegram_error}")
|
298
379
|
|
299
380
|
@staticmethod
|
300
381
|
def send_otp_verification_success(user, source_url=None, send_telegram=True):
|
@@ -83,6 +83,14 @@ class OTPViewSet(viewsets.GenericViewSet):
|
|
83
83
|
{"error": "Failed to create user account"},
|
84
84
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
85
85
|
)
|
86
|
+
elif error_type in ["email_send_failed", "phone_send_failed"]:
|
87
|
+
# Handle delivery failures
|
88
|
+
channel_name = "phone number" if error_type == "phone_send_failed" else "email address"
|
89
|
+
logger.error(f"Failed to send OTP to {channel_name}: {identifier}")
|
90
|
+
return Response(
|
91
|
+
{"error": f"Failed to send OTP to your {channel_name}. Please try again."},
|
92
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
93
|
+
)
|
86
94
|
else:
|
87
95
|
logger.error(f"Unknown error type: {error_type} for {identifier}")
|
88
96
|
return Response(
|
Binary file
|
@@ -505,7 +505,7 @@ print(f"Django installed: {deps['django']}")
|
|
505
505
|
|
506
506
|
## 📚 Documentation
|
507
507
|
|
508
|
-
- **Django CFG**: https://django-cfg.
|
508
|
+
- **Django CFG**: https://django-cfg.reforms.ai
|
509
509
|
- **GitHub**: https://github.com/unrealos/django-cfg
|
510
510
|
- **PyPI**: https://pypi.org/project/django-cfg/
|
511
511
|
- **Examples**: https://github.com/unrealos/django-cfg/tree/main/examples
|
@@ -219,7 +219,7 @@ docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
|
|
219
219
|
|
220
220
|
- **Admin Interface**: `http://localhost:8000/admin/`
|
221
221
|
- **API Documentation**: `http://localhost:8000/api/schema/swagger-ui/`
|
222
|
-
- **Django CFG Docs**: [django-cfg.
|
222
|
+
- **Django CFG Docs**: [django-cfg.reforms.ai](https://django-cfg.reforms.ai)
|
223
223
|
|
224
224
|
## 🛠️ Development
|
225
225
|
|
@@ -579,7 +579,7 @@ def create_project(project_name: str, path: str, no_deps: bool, use_pip: bool, f
|
|
579
579
|
click.echo(" ⚡ Background task processing")
|
580
580
|
click.echo(" 🐳 Docker deployment ready")
|
581
581
|
|
582
|
-
# click.echo(f"\n📚 Documentation: https://django-cfg.
|
582
|
+
# click.echo(f"\n📚 Documentation: https://django-cfg.reforms.ai")
|
583
583
|
|
584
584
|
# Beautiful thank you message
|
585
585
|
show_thank_you_message()
|
@@ -119,7 +119,7 @@ def info(verbose: bool):
|
|
119
119
|
click.echo(" # Install optional dependencies")
|
120
120
|
click.echo(" pip install twilio sendgrid django-unfold")
|
121
121
|
click.echo()
|
122
|
-
click.echo("📚 Documentation: https://django-cfg.
|
122
|
+
click.echo("📚 Documentation: https://django-cfg.reforms.ai")
|
123
123
|
click.echo("🐙 GitHub: https://github.com/unrealos/django-cfg")
|
124
124
|
|
125
125
|
# Warnings for missing critical dependencies
|
@@ -71,7 +71,7 @@ class Command(BaseCommand):
|
|
71
71
|
'main_text': message,
|
72
72
|
'project_name': 'Django CFG Sample',
|
73
73
|
'site_url': 'http://localhost:8000',
|
74
|
-
'logo_url': 'https://
|
74
|
+
'logo_url': 'https://reforms.ai/favicon.png',
|
75
75
|
'button_text': 'Visit Website',
|
76
76
|
'button_url': 'http://localhost:8000',
|
77
77
|
'secondary_text': 'This is a test email sent from django-cfg management command.',
|
@@ -127,8 +127,8 @@ class LLMClient:
|
|
127
127
|
|
128
128
|
config = base_configs[self.provider].copy()
|
129
129
|
|
130
|
-
site_url = getattr(self.django_config, 'site_url', 'https://
|
131
|
-
project_name = getattr(self.django_config, 'project_name', '
|
130
|
+
site_url = getattr(self.django_config, 'site_url', 'https://reforms.ai')
|
131
|
+
project_name = getattr(self.django_config, 'project_name', 'ReformsAI LLM Client')
|
132
132
|
|
133
133
|
# Get headers from django config if available
|
134
134
|
if self.django_config:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/admin/registration_source.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/management/commands/test_otp.py
RENAMED
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/managers/user_manager.py
RENAMED
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/migrations/0001_initial.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/serializers/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/services/activity_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/base_email.txt
RENAMED
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/otp_email.html
RENAMED
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/accounts/templates/emails/otp_email.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/leads/migrations/0001_initial.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/management/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/migrations/0001_initial.py
RENAMED
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/migrations/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/services/email_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.48 → django_cfg-1.1.50}/src/django_cfg/apps/newsletter/views/subscriptions.py
RENAMED
File without changes
|