django-cfg 1.1.77__tar.gz → 1.1.79__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.77 → django_cfg-1.1.79}/PKG-INFO +1 -1
- {django_cfg-1.1.77 → django_cfg-1.1.79}/pyproject.toml +1 -1
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/__init__.py +1 -1
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/constance.py +60 -3
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/drf.py +4 -2
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/client.py +29 -18
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/models.py +16 -1
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/change_list.html +113 -0
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/includes/default_value.html +24 -0
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/includes/fieldset_header.html +15 -0
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/includes/results_list.html +16 -0
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/includes/setting_row.html +50 -0
- django_cfg-1.1.79/src/django_cfg/templates/admin/constance/includes/table_headers.html +10 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/.gitignore +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/LICENSE +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/MANIFEST.in +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/requirements-dev.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/requirements-test.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/requirements.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/activity.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/filters.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/group.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/inlines.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/otp.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/registration_source.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/resources.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/twilio_response.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/user.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/management/commands/test_otp.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/managers/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/managers/user_manager.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/0002_add_phone_otp_clean.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/0003_twilioresponse.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/0004_delete_twilioresponse.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/0005_twilioresponse.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/migrations/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/serializers/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/serializers/otp.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/serializers/profile.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/serializers/webhook.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/services/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/services/activity_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/services/otp_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/signals.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/base_email.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/base_email.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/otp_email.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/otp_email.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/welcome_email.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/welcome_email.txt +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/utils/notifications.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/views/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/views/otp.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/views/profile.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/views/webhook.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/commands/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/commands/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/commands/views.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/health/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/health/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/api/health/views.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/admin/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/admin/leads_admin.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/admin/resources.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/migrations/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/serializers.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/signals.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/tests.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/leads/views.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/admin/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/admin/filters.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/admin/newsletter_admin.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/admin/resources.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/management/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/management/commands/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/management/commands/test_newsletter.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/managers/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/managers/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/migrations/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/serializers.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/services/email_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/signals.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/utils/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/campaigns.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/emails.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/newsletters.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/subscriptions.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/newsletter/views/tracking.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/admin/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/admin/filters.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/admin/resources.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/admin/support_admin.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/managers/message_manager.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/managers/ticket_manager.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/migrations/0001_initial.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/migrations/0002_alter_message_ticket.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/migrations/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/serializers.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/signals.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/templates/support/chat/access_denied.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/templates/support/chat/ticket_chat.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/utils/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/utils/support_email_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/views/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/views/admin.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/views/api.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/support/views/chat.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/admin.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/serializers.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/css/dashboard.css +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/api.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/modals.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/static/tasks/js/theme.js +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/base.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/management_actions.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/status_cards.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/tasks/views.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/archive/django_sample.zip +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/commands/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/commands/create_project.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/commands/info.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/main.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/cli/utils.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/core/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/core/config.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/core/environment.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/core/generation.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/core/validation.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/exceptions.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/integration.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/check_settings.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/clear_constance.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/create_token.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/generate.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/list_urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/migrate_all.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/migrator.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/rundramatiq.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/runserver_ngrok.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/script.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/show_config.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/show_urls.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/superuser.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/task_clear.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/task_status.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/test_email.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/test_telegram.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/test_twilio.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/tree.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/management/commands/validate_config.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/middleware/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/middleware/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/middleware/public_endpoints.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/middleware/user_activity.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/cache.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/database.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/jwt.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/limits.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/ngrok.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/revolution.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/services.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/tasks.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/models/unfold.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/base.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_currency/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_currency/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_currency/cache.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_currency/converter.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_currency/service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_email.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/example.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/cache.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/costs.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/extractor.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/models_cache.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/llm/tokenizer.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/translator/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/translator/cache.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_llm/translator/translator.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_logger.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_ngrok.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_tasks.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_telegram.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/README.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/exceptions.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/sendgrid_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/simple_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/templates/guide.md +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/templates/sendgrid_otp_email.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/templates/sendgrid_test_data.json +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/django_twilio/twilio_service.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/dramatiq_setup.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/logger.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/callbacks.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/dashboard.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/models.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/system_monitor.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/modules/unfold/tailwind.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/pyproject.toml +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/routers.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/index.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/layouts/dashboard_with_tabs.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/activity_tracker.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/charts_section.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/django_commands.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/quick_actions.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/recent_activity.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/recent_users_table.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/stats_cards.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/stats_tiles.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/system_health.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/system_metrics.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/components/user_permissions.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/tabs/app_stats_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/tabs/commands_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/tabs/overview_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/tabs/stats_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/tabs/users_tab.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/admin/snippets/zones/zones_table.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/templates/emails/base_email.html +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/utils/__init__.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/utils/path_resolution.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/utils/smart_defaults.py +0 -0
- {django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/version_check.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: django-cfg
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.79
|
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
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "django-cfg"
|
7
|
-
version = "1.1.
|
7
|
+
version = "1.1.79"
|
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"}
|
@@ -38,7 +38,7 @@ default_app_config = "django_cfg.apps.DjangoCfgConfig"
|
|
38
38
|
from typing import TYPE_CHECKING
|
39
39
|
|
40
40
|
# Version information
|
41
|
-
__version__ = "1.1.
|
41
|
+
__version__ = "1.1.79"
|
42
42
|
__author__ = "Unrealos Team"
|
43
43
|
__email__ = "info@unrealos.com"
|
44
44
|
__license__ = "MIT"
|
@@ -39,7 +39,7 @@ class ConstanceField(BaseModel):
|
|
39
39
|
max_length=500,
|
40
40
|
)
|
41
41
|
|
42
|
-
field_type: Literal["str", "int", "float", "bool", "choice"] = Field(
|
42
|
+
field_type: Literal["str", "int", "float", "bool", "choice", "longtext", "description"] = Field(
|
43
43
|
default="str",
|
44
44
|
description="Field type for form rendering and validation",
|
45
45
|
)
|
@@ -77,6 +77,8 @@ class ConstanceField(BaseModel):
|
|
77
77
|
"float": float,
|
78
78
|
"bool": int, # Use int for boolean (0/1)
|
79
79
|
"choice": str, # Choices are typically strings
|
80
|
+
"longtext": str, # Long text fields are strings
|
81
|
+
"description": str, # Description fields are strings
|
80
82
|
}
|
81
83
|
|
82
84
|
field_python_type = type_mapping.get(self.field_type, str)
|
@@ -107,6 +109,20 @@ class ConstanceField(BaseModel):
|
|
107
109
|
"django.forms.FloatField",
|
108
110
|
{"widget": "unfold.widgets.UnfoldAdminTextInputWidget"},
|
109
111
|
],
|
112
|
+
"longtext": [
|
113
|
+
"django.forms.CharField",
|
114
|
+
{
|
115
|
+
"widget": "unfold.widgets.UnfoldAdminTextareaWidget",
|
116
|
+
"attrs": {"rows": 4, "cols": 80, "class": "max-w-4xl"},
|
117
|
+
},
|
118
|
+
],
|
119
|
+
"description": [
|
120
|
+
"django.forms.CharField",
|
121
|
+
{
|
122
|
+
"widget": "unfold.widgets.UnfoldAdminTextareaWidget",
|
123
|
+
"attrs": {"rows": 3, "cols": 60, "class": "max-w-3xl"},
|
124
|
+
},
|
125
|
+
],
|
110
126
|
# Boolean fields will use default Unfold configuration from UNFOLD_CONSTANCE_ADDITIONAL_FIELDS
|
111
127
|
}
|
112
128
|
|
@@ -173,15 +189,56 @@ class ConstanceConfig(BaseModel):
|
|
173
189
|
return {group: tuple(fields) for group, fields in fieldsets.items()}
|
174
190
|
|
175
191
|
def get_additional_fields_dict(self) -> Dict[str, List[Any]]:
|
176
|
-
"""Generate CONSTANCE_ADDITIONAL_FIELDS dictionary."""
|
192
|
+
"""Generate CONSTANCE_ADDITIONAL_FIELDS dictionary with enhanced widgets."""
|
177
193
|
from unfold.contrib.constance.settings import UNFOLD_CONSTANCE_ADDITIONAL_FIELDS
|
178
194
|
|
179
195
|
additional_fields = dict(UNFOLD_CONSTANCE_ADDITIONAL_FIELDS)
|
180
196
|
|
181
|
-
# Add custom field configurations
|
197
|
+
# Add custom field configurations for better text handling
|
198
|
+
additional_fields.update({
|
199
|
+
"text": [
|
200
|
+
"django.forms.CharField",
|
201
|
+
{
|
202
|
+
"widget": "unfold.widgets.UnfoldAdminTextInputWidget",
|
203
|
+
"attrs": {"class": "max-w-2xl"},
|
204
|
+
},
|
205
|
+
],
|
206
|
+
"longtext": [
|
207
|
+
"django.forms.CharField",
|
208
|
+
{
|
209
|
+
"widget": "unfold.widgets.UnfoldAdminTextareaWidget",
|
210
|
+
"attrs": {"rows": 4, "cols": 80, "class": "max-w-4xl"},
|
211
|
+
},
|
212
|
+
],
|
213
|
+
"description": [
|
214
|
+
"django.forms.CharField",
|
215
|
+
{
|
216
|
+
"widget": "unfold.widgets.UnfoldAdminTextareaWidget",
|
217
|
+
"attrs": {"rows": 3, "cols": 60, "class": "max-w-3xl"},
|
218
|
+
},
|
219
|
+
],
|
220
|
+
})
|
221
|
+
|
222
|
+
# Override specific fields with custom widgets
|
182
223
|
for field in self.fields:
|
183
224
|
if field.field_type == "choice" and field.choices:
|
184
225
|
additional_fields[field.name] = field.to_constance_field_config()
|
226
|
+
elif field.field_type in ["longtext", "description"]:
|
227
|
+
# Use field-specific configuration to override Unfold defaults
|
228
|
+
additional_fields[field.name] = field.to_constance_field_config()
|
229
|
+
|
230
|
+
# CRITICAL FIX: Override fields that should use textarea based on field_type
|
231
|
+
# This ensures longtext and description fields use textarea regardless of their Python type
|
232
|
+
for field in self.fields:
|
233
|
+
if field.field_type in ["longtext", "description"]:
|
234
|
+
# Force textarea widget for these field types, overriding any type-based defaults
|
235
|
+
additional_fields[field.name] = [
|
236
|
+
"django.forms.CharField",
|
237
|
+
{
|
238
|
+
"widget": "unfold.widgets.UnfoldAdminTextareaWidget",
|
239
|
+
"attrs": field.to_constance_field_config()[1]["attrs"],
|
240
|
+
},
|
241
|
+
]
|
185
242
|
|
186
243
|
return additional_fields
|
187
244
|
|
@@ -103,7 +103,8 @@ class SpectacularConfig(BaseModel):
|
|
103
103
|
# Schema Settings
|
104
104
|
schema_path_prefix: str = Field(default="/api", description="Schema path prefix")
|
105
105
|
serve_include_schema: bool = Field(default=False, description="Include schema in UI")
|
106
|
-
component_split_request: bool = Field(default=
|
106
|
+
component_split_request: bool = Field(default=False, description="Split request components")
|
107
|
+
component_no_read_only_required: bool = Field(default=True, description="No read-only required")
|
107
108
|
sort_operations: bool = Field(default=False, description="Sort operations")
|
108
109
|
|
109
110
|
# UI Settings
|
@@ -139,7 +140,8 @@ class SpectacularConfig(BaseModel):
|
|
139
140
|
"VERSION": self.version,
|
140
141
|
"SERVE_INCLUDE_SCHEMA": self.serve_include_schema,
|
141
142
|
"SCHEMA_PATH_PREFIX": self.schema_path_prefix,
|
142
|
-
|
143
|
+
'COMPONENT_SPLIT_REQUEST': self.component_split_request,
|
144
|
+
'COMPONENT_NO_READ_ONLY_REQUIRED': self.component_no_read_only_required,
|
143
145
|
"SORT_OPERATIONS": self.sort_operations,
|
144
146
|
# UI Settings
|
145
147
|
"SWAGGER_UI_SETTINGS": self.swagger_ui_settings.to_dict(),
|
@@ -223,7 +223,7 @@ class LLMClient:
|
|
223
223
|
temperature: Optional[float] = None,
|
224
224
|
response_format: Optional[str] = None,
|
225
225
|
**kwargs
|
226
|
-
) ->
|
226
|
+
) -> ChatCompletionResponse:
|
227
227
|
"""
|
228
228
|
Send chat completion request.
|
229
229
|
|
@@ -260,7 +260,8 @@ class LLMClient:
|
|
260
260
|
if cached_response:
|
261
261
|
logger.debug("Cache hit for chat completion")
|
262
262
|
self.stats['cache_hits'] += 1
|
263
|
-
|
263
|
+
# Convert cached dict back to Pydantic model
|
264
|
+
return ChatCompletionResponse(**cached_response)
|
264
265
|
|
265
266
|
self.stats['cache_misses'] += 1
|
266
267
|
self.stats['total_requests'] += 1
|
@@ -307,23 +308,33 @@ class LLMClient:
|
|
307
308
|
if response_format == "json" and content:
|
308
309
|
extracted_json = self.extractor.extract_json_from_response(content)
|
309
310
|
|
310
|
-
# Create response object
|
311
|
-
completion_response =
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
311
|
+
# Create Pydantic response object
|
312
|
+
completion_response = ChatCompletionResponse(
|
313
|
+
id=response.id,
|
314
|
+
model=response.model,
|
315
|
+
created=datetime.fromtimestamp(response.created).isoformat(),
|
316
|
+
choices=[
|
317
|
+
ChatChoice(
|
318
|
+
index=choice.index,
|
319
|
+
message=choice.message.model_dump() if hasattr(choice.message, 'model_dump') else choice.message,
|
320
|
+
finish_reason=choice.finish_reason
|
321
|
+
) for choice in response.choices
|
322
|
+
] if response.choices else [],
|
323
|
+
usage=TokenUsage(
|
324
|
+
prompt_tokens=response.usage.prompt_tokens if response.usage else 0,
|
325
|
+
completion_tokens=response.usage.completion_tokens if response.usage else 0,
|
326
|
+
total_tokens=response.usage.total_tokens if response.usage else tokens_used
|
327
|
+
) if response.usage else TokenUsage(total_tokens=tokens_used),
|
328
|
+
finish_reason=response.choices[0].finish_reason if response.choices else None,
|
329
|
+
content=content,
|
330
|
+
tokens_used=tokens_used,
|
331
|
+
cost_usd=cost_usd,
|
332
|
+
processing_time=processing_time,
|
333
|
+
extracted_json=extracted_json
|
334
|
+
)
|
324
335
|
|
325
|
-
# Cache the response
|
326
|
-
self.cache.set_response(request_hash, completion_response, model)
|
336
|
+
# Cache the response (serialize to dict for caching)
|
337
|
+
self.cache.set_response(request_hash, completion_response.model_dump(), model)
|
327
338
|
|
328
339
|
# Update stats
|
329
340
|
self.stats['successful_requests'] += 1
|
@@ -2,8 +2,9 @@
|
|
2
2
|
Pydantic models for LLM client responses.
|
3
3
|
"""
|
4
4
|
|
5
|
+
import math
|
5
6
|
from typing import List, Optional, Dict, Any, Union
|
6
|
-
from pydantic import BaseModel, Field
|
7
|
+
from pydantic import BaseModel, Field, validator
|
7
8
|
from datetime import datetime
|
8
9
|
|
9
10
|
|
@@ -34,6 +35,20 @@ class ChatCompletionResponse(BaseModel):
|
|
34
35
|
cost_usd: float = Field(default=0.0, description="Cost in USD")
|
35
36
|
processing_time: float = Field(default=0.0, description="Processing time in seconds")
|
36
37
|
extracted_json: Optional[Dict[str, Any]] = Field(default=None, description="Extracted JSON if any")
|
38
|
+
|
39
|
+
@validator('cost_usd')
|
40
|
+
def validate_cost_usd(cls, v):
|
41
|
+
"""Validate cost_usd to prevent NaN values."""
|
42
|
+
if v is None or math.isnan(v) or math.isinf(v):
|
43
|
+
return 0.0
|
44
|
+
return v
|
45
|
+
|
46
|
+
@validator('processing_time')
|
47
|
+
def validate_processing_time(cls, v):
|
48
|
+
"""Validate processing_time to prevent NaN values."""
|
49
|
+
if v is None or math.isnan(v) or math.isinf(v):
|
50
|
+
return 0.0
|
51
|
+
return v
|
37
52
|
|
38
53
|
|
39
54
|
class EmbeddingResponse(BaseModel):
|
@@ -0,0 +1,113 @@
|
|
1
|
+
{% extends "admin/base_site.html" %}
|
2
|
+
|
3
|
+
{% load admin_list static i18n %}
|
4
|
+
|
5
|
+
{% block extrahead %}
|
6
|
+
{% url 'admin:jsi18n' as jsi18nurl %}
|
7
|
+
<script type="text/javascript" src="{{ jsi18nurl|default:'../../jsi18n/' }}"></script>
|
8
|
+
{{ block.super }}
|
9
|
+
{{ media.js }}
|
10
|
+
<script type="text/javascript" src="{% static 'admin/js/constance.js' %}"></script>
|
11
|
+
|
12
|
+
<!-- Enhanced Constance UI Styles -->
|
13
|
+
<style>
|
14
|
+
/* Smooth transitions for all interactive elements */
|
15
|
+
.constance-expandable {
|
16
|
+
transition: all 0.2s ease-in-out;
|
17
|
+
}
|
18
|
+
|
19
|
+
/* Better hover states */
|
20
|
+
.constance tr:hover {
|
21
|
+
background-color: rgba(0, 0, 0, 0.02);
|
22
|
+
}
|
23
|
+
|
24
|
+
.dark .constance tr:hover {
|
25
|
+
background-color: rgba(255, 255, 255, 0.02);
|
26
|
+
}
|
27
|
+
|
28
|
+
/* Improved focus states for accessibility */
|
29
|
+
.constance a:focus,
|
30
|
+
.constance button:focus {
|
31
|
+
outline: 2px solid rgb(59, 130, 246);
|
32
|
+
outline-offset: 2px;
|
33
|
+
border-radius: 4px;
|
34
|
+
}
|
35
|
+
|
36
|
+
/* Better spacing for long text */
|
37
|
+
.constance .break-words {
|
38
|
+
word-break: break-word;
|
39
|
+
overflow-wrap: break-word;
|
40
|
+
hyphens: auto;
|
41
|
+
}
|
42
|
+
|
43
|
+
/* Smooth animations for expand/collapse */
|
44
|
+
.constance [x-show] {
|
45
|
+
transition: opacity 0.2s ease-in-out;
|
46
|
+
}
|
47
|
+
|
48
|
+
/* Icon rotation animation */
|
49
|
+
.constance .material-symbols-outlined {
|
50
|
+
transition: transform 0.3s ease-in-out;
|
51
|
+
}
|
52
|
+
</style>
|
53
|
+
{% endblock %}
|
54
|
+
|
55
|
+
{% block content %}
|
56
|
+
<div id="content-main" class="constance">
|
57
|
+
<div id="changelist" class="flex flex-col gap-8 w-full">
|
58
|
+
<form id="changelist-form" action="" method="post" enctype="multipart/form-data" novalidate class="flex flex-col gap-8 w-full">
|
59
|
+
{% csrf_token %}
|
60
|
+
|
61
|
+
{% include "unfold/helpers/form_errors.html" with errors=form.non_field_errors %}
|
62
|
+
|
63
|
+
{% for field in form.hidden_fields %}
|
64
|
+
{{ field }}
|
65
|
+
{% endfor %}
|
66
|
+
|
67
|
+
<!-- Collapse/Expand All Controls -->
|
68
|
+
<div class="flex justify-between items-center mb-4" x-data="{ allExpanded: true }">
|
69
|
+
<div class="text-sm text-base-600 dark:text-base-400">
|
70
|
+
{% trans "Configuration Settings" %}
|
71
|
+
</div>
|
72
|
+
<div class="flex gap-2">
|
73
|
+
<button type="button"
|
74
|
+
@click="allExpanded = false; $dispatch('collapse-all')"
|
75
|
+
class="px-3 py-1 text-xs bg-base-100 hover:bg-base-200 dark:bg-base-800 dark:hover:bg-base-700 border border-base-300 dark:border-base-600 rounded transition-colors">
|
76
|
+
{% trans "Collapse All" %}
|
77
|
+
</button>
|
78
|
+
<button type="button"
|
79
|
+
@click="allExpanded = true; $dispatch('expand-all')"
|
80
|
+
class="px-3 py-1 text-xs bg-base-100 hover:bg-base-200 dark:bg-base-800 dark:hover:bg-base-700 border border-base-300 dark:border-base-600 rounded transition-colors">
|
81
|
+
{% trans "Expand All" %}
|
82
|
+
</button>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
|
86
|
+
<div class="border border-base-200 rounded-default overflow-x-auto simplebar-horizontal-scrollbar-top dark:border-base-800" data-simplebar data-simplebar-auto-hide="false">
|
87
|
+
<table class="w-full border-collapse">
|
88
|
+
{% if fieldsets %}
|
89
|
+
{% for fieldset in fieldsets %}
|
90
|
+
{% with config_values=fieldset.config_values %}
|
91
|
+
{% include "admin/constance/includes/results_list.html" %}
|
92
|
+
{% endwith %}
|
93
|
+
{% endfor %}
|
94
|
+
{% else %}
|
95
|
+
{% include "admin/constance/includes/results_list.html" %}
|
96
|
+
{% endif %}
|
97
|
+
|
98
|
+
<tfoot>
|
99
|
+
<tr>
|
100
|
+
<td class="border-t border-base-200 px-3 py-2 dark:border-base-800" colspan="100%">
|
101
|
+
<div class="flex justify-end">
|
102
|
+
{% trans "Save" as title %}
|
103
|
+
{% include "unfold/helpers/submit.html" with title=title %}
|
104
|
+
</div>
|
105
|
+
</td>
|
106
|
+
</tr>
|
107
|
+
</tfoot>
|
108
|
+
</table>
|
109
|
+
</div>
|
110
|
+
</form>
|
111
|
+
</div>
|
112
|
+
</div>
|
113
|
+
{% endblock %}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
{% load i18n %}
|
2
|
+
|
3
|
+
{% if item.default %}
|
4
|
+
{% if item.default|length > 80 %}
|
5
|
+
<!-- Long default value with smart truncation -->
|
6
|
+
<div x-data="{ expanded: false }" class="constance-expandable">
|
7
|
+
<div x-show="!expanded" @click="expanded = true" class="cursor-pointer hover:bg-base-50 dark:hover:bg-base-800 p-1 rounded transition-colors">
|
8
|
+
{% include "unfold/helpers/label.html" with text=item.default|truncatechars:60 %}
|
9
|
+
<br><small class="text-base-400 dark:text-base-500 text-xs">{% trans "Click to expand" %}</small>
|
10
|
+
</div>
|
11
|
+
<div x-show="expanded" @click="expanded = false" class="cursor-pointer">
|
12
|
+
<div class="max-w-xs break-words whitespace-pre-wrap text-xs bg-base-100 dark:bg-base-800 p-2 rounded border border-base-200 dark:border-base-700 shadow-sm">
|
13
|
+
{{ item.default }}
|
14
|
+
</div>
|
15
|
+
<small class="text-base-400 dark:text-base-500 text-xs">{% trans "Click to collapse" %}</small>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
{% else %}
|
19
|
+
<!-- Short default value - normal display -->
|
20
|
+
{% include "unfold/helpers/label.html" with text=item.default %}
|
21
|
+
{% endif %}
|
22
|
+
{% else %}
|
23
|
+
<span class="text-base-400 dark:text-base-500">-</span>
|
24
|
+
{% endif %}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
{% load i18n %}
|
2
|
+
|
3
|
+
{% if fieldset.title %}
|
4
|
+
<tr x-on:click="rowsOpen = !rowsOpen" class="cursor-pointer hover:bg-base-25 dark:hover:bg-base-900 transition-colors">
|
5
|
+
<th class="bg-base-50 border-t border-base-200 font-semibold px-3 py-2 text-left text-font-important-light dark:text-font-important-dark dark:border-base-800 dark:bg-white/[.04] {% if forloop.first %}border-t-0{% endif %}" colspan="100%">
|
6
|
+
<div class="flex items-center justify-between">
|
7
|
+
<span>{{ fieldset.title }}</span>
|
8
|
+
|
9
|
+
<span class="material-symbols-outlined select-none transition-transform duration-300 ease-in-out" title="{% trans "Toggle" %}" x-bind:class="rowsOpen ? 'rotate-180' : ''">
|
10
|
+
expand_more
|
11
|
+
</span>
|
12
|
+
</div>
|
13
|
+
</th>
|
14
|
+
</tr>
|
15
|
+
{% endif %}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{% load admin_list static i18n %}
|
2
|
+
|
3
|
+
<tbody x-data="{ rowsOpen: {% if forloop.first %}true{% else %}false{% endif %} }"
|
4
|
+
@collapse-all.window="rowsOpen = false"
|
5
|
+
@expand-all.window="rowsOpen = true">
|
6
|
+
<!-- Fieldset Header -->
|
7
|
+
{% include "admin/constance/includes/fieldset_header.html" %}
|
8
|
+
|
9
|
+
<!-- Table Headers -->
|
10
|
+
{% include "admin/constance/includes/table_headers.html" %}
|
11
|
+
|
12
|
+
<!-- Setting Rows -->
|
13
|
+
{% for item in config_values %}
|
14
|
+
{% include "admin/constance/includes/setting_row.html" %}
|
15
|
+
{% endfor %}
|
16
|
+
</tbody>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
{% load i18n %}
|
2
|
+
|
3
|
+
<tr class="border-t border-base-200 h-[55px] *:px-3 *:py-2 *:align-middle dark:border-base-800 hover:bg-base-25 dark:hover:bg-base-900 transition-colors" x-show="rowsOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform -translate-y-1" x-transition:enter-end="opacity-100 transform translate-y-0">
|
4
|
+
<!-- Name/Description Column -->
|
5
|
+
<td class="font-normal text-left align-top">
|
6
|
+
<div class="text-sm text-font-default-light dark:text-font-default-dark">
|
7
|
+
{{ item.help_text|linebreaksbr }}
|
8
|
+
</div>
|
9
|
+
</td>
|
10
|
+
|
11
|
+
<!-- Value Column -->
|
12
|
+
<td class="{% if item.form_field.errors %}group errors{% endif %} align-top">
|
13
|
+
{{ item.form_field }}
|
14
|
+
{% include "unfold/helpers/form_errors.html" with errors=item.form_field.errors %}
|
15
|
+
</td>
|
16
|
+
|
17
|
+
<!-- Default Value Column -->
|
18
|
+
<td class="align-top">
|
19
|
+
{% include "admin/constance/includes/default_value.html" %}
|
20
|
+
</td>
|
21
|
+
|
22
|
+
<!-- Code Column -->
|
23
|
+
<td class="align-top">
|
24
|
+
<a class="item-name item-anchor" href="#{{ item.name|slugify }}" tabindex="-1" id="{{ item.name|slugify }}" title="Link to this setting">
|
25
|
+
{% include "unfold/helpers/label.html" with text=item.name type="info" %}
|
26
|
+
</a>
|
27
|
+
</td>
|
28
|
+
|
29
|
+
<!-- Modified Column -->
|
30
|
+
<td class="align-top text-center">
|
31
|
+
{% include "unfold/helpers/boolean.html" with value=item.modified %}
|
32
|
+
</td>
|
33
|
+
|
34
|
+
<!-- Reset Column -->
|
35
|
+
<td class="w-px align-top text-center">
|
36
|
+
{% if not item.is_file %}
|
37
|
+
<a href="#"
|
38
|
+
tabindex="-1"
|
39
|
+
class="flex items-center gap-1 reset-link whitespace-nowrap hover:bg-base-100 dark:hover:bg-base-800 p-1 rounded transition-colors"
|
40
|
+
data-default="{% spaceless %}{% if item.is_checkbox %}{% if item.raw_default %} true {% else %} false {% endif %}{% elif item.is_date %}{{ item.raw_default|date:"U" }}{% elif item.is_datetime %}{{ item.raw_default|date:"U" }}{% else %}{{ item.default }}{% endif %}{% endspaceless %}"
|
41
|
+
data-field-type="{% spaceless %}{% if item.is_checkbox %}checkbox{% elif item.is_datetime %}datetime{% elif item.is_date %}date{% endif %}{% endspaceless %}"
|
42
|
+
data-field-id="{{ item.form_field.auto_id }}"
|
43
|
+
title="{% trans "Reset to default" %}">
|
44
|
+
<span class="material-symbols-outlined text-base-400 hover:text-base-700 dark:text-base-500 dark:hover:text-base-200 transition-colors">
|
45
|
+
refresh
|
46
|
+
</span>
|
47
|
+
</a>
|
48
|
+
{% endif %}
|
49
|
+
</td>
|
50
|
+
</tr>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
{% load i18n %}
|
2
|
+
|
3
|
+
<tr class="{% if fieldset.title %}border-t{% endif %} border-base-200 dark:border-base-800 *:font-semibold *:px-3 *:py-2 *:text-left *:text-font-important-light dark:*:text-font-important-dark" x-show="rowsOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform -translate-y-2" x-transition:enter-end="opacity-100 transform translate-y-0">
|
4
|
+
<th class="w-1/4">{% trans "Name" %}</th>
|
5
|
+
<th class="w-1/3">{% trans "Value" %}</th>
|
6
|
+
<th class="w-1/5">{% trans "Default" %}</th>
|
7
|
+
<th class="w-1/6">{% trans "Code" %}</th>
|
8
|
+
<th class="w-16">{% trans "Modified" %}</th>
|
9
|
+
<th class="w-12"></th>
|
10
|
+
</tr>
|
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.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/registration_source.py
RENAMED
File without changes
|
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/admin/twilio_response.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/management/commands/test_otp.py
RENAMED
File without changes
|
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/managers/user_manager.py
RENAMED
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/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
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/serializers/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/services/activity_service.py
RENAMED
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/services/otp_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/base_email.txt
RENAMED
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/src/django_cfg/apps/accounts/templates/emails/otp_email.html
RENAMED
File without changes
|
{django_cfg-1.1.77 → django_cfg-1.1.79}/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
|