django-cfg 1.2.7__tar.gz → 1.2.8__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.2.7 → django_cfg-1.2.8}/PKG-INFO +2 -1
- {django_cfg-1.2.7 → django_cfg-1.2.8}/pyproject.toml +7 -4
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/__init__.py +1 -1
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/urls.py +2 -2
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/__init__.py +9 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/actions.py +50 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/base.py +98 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/charts.py +224 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/commands.py +40 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/main.py +191 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/revolution.py +76 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/statistics.py +240 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/system.py +180 -0
- django_cfg-1.2.8/src/django_cfg/modules/django_unfold/callbacks/users.py +65 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/config.py +10 -3
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/tailwind.py +68 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/action_grid.html +49 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/card.html +50 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/data_table.html +67 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/metric_card.html +39 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/modal.html +58 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/progress_bar.html +25 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/section_header.html +26 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/stat_item.html +32 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/stats_grid.html +72 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/status_badge.html +28 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/components/user_avatar.html +27 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/layouts/dashboard_with_tabs.html +7 -7
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/activity_tracker.html +54 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/charts_section.html +89 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/components/django_commands.html +18 -18
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/quick_actions.html +66 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/recent_activity.html +35 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/components/recent_users_table.html +22 -53
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/stats_cards.html +4 -0
- django_cfg-1.2.8/src/django_cfg/templates/admin/snippets/components/system_health.html +22 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/components/system_metrics.html +8 -25
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/tabs/commands_tab.html +1 -1
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/tabs/overview_tab.html +4 -4
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/zones/zones_table.html +12 -33
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templatetags/django_cfg.py +2 -1
- django_cfg-1.2.7/src/django_cfg/modules/django_unfold/callbacks.py +0 -795
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/activity_tracker.html +0 -17
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/charts_section.html +0 -39
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/quick_actions.html +0 -110
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/recent_activity.html +0 -45
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/stats_cards.html +0 -68
- django_cfg-1.2.7/src/django_cfg/templates/admin/snippets/components/system_health.html +0 -72
- {django_cfg-1.2.7 → django_cfg-1.2.8}/.gitignore +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/LICENSE +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/MANIFEST.in +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/requirements-dev.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/requirements-test.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/requirements.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/activity.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/filters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/group.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/inlines.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/otp.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/registration_source.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/resources.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/twilio_response.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/admin/user.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/management/commands/test_otp.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/managers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/managers/user_manager.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0002_add_phone_otp_clean.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0003_twilioresponse.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0004_delete_twilioresponse.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0005_twilioresponse.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/serializers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/serializers/otp.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/serializers/profile.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/serializers/webhook.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/services/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/services/activity_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/services/otp_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/base_email.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/base_email.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/otp_email.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/otp_email.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/welcome_email.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/templates/emails/welcome_email.txt +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/utils/auth_email_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/utils/notifications.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/views/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/views/otp.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/views/profile.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/accounts/views/webhook.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/admin/execution_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/admin/registry_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/admin/toolsets_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/agent.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/dependencies.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/exceptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/core/orchestrator.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/examples/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/examples/simple_example.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/integration/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/integration/middleware.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/integration/registry.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/integration/signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/management/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/management/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/management/commands/create_agent.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/management/commands/orchestrator_status.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/managers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/managers/execution.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/managers/registry.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/managers/toolsets.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/models/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/models/execution.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/models/registry.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/models/toolsets.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/patterns/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/patterns/content_agents.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/toolsets/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/toolsets/cache_toolset.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/toolsets/django_toolset.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/toolsets/file_toolset.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/toolsets/orm_toolset.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/agents/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/commands/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/commands/views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/health/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/health/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/api/health/views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/admin/archive_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/admin/chat_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/admin/document_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/admin/external_data_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/config/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/config/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/config/constance_fields.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/config/constance_settings.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/config/settings.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/examples/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/examples/external_data_usage.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/management/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/management/commands/knowbase_stats.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/management/commands/setup_knowbase.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/archive.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/chat.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/document.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/managers/external_data.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/config.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/creator.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/external_data_mixin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/mixins/service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/archive.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/chat.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/document.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/models/external_data.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/archive_serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/chat_serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/document_serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/external_data_serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/serializers/public_serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/archive_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/chunking_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/exceptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/extraction_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/archive/vectorization_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/chat_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/document_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/async_processor.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/batch_processor.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/batch_result.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/processors.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/embedding/utils.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/prompt_builder.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/services/search_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/signals/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/signals/archive_signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/signals/chat_signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/signals/document_signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/signals/external_data_signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/tasks/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/tasks/archive_tasks.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/tasks/document_processing.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/tasks/external_data_tasks.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/tasks/maintenance.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/utils/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/utils/chunk_settings.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/utils/text_processing.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/utils/validation.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/archive_views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/chat_views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/document_views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/knowbase/views/public_views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/admin/leads_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/admin/resources.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/tests.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/leads/views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin/filters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin/newsletter_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin/resources.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/admin_filters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/management/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/management/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/management/commands/test_newsletter.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/managers/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/managers/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/services/email_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/utils/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/campaigns.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/emails.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/newsletters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/subscriptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/newsletter/views/tracking.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin/filters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin/resources.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin/support_admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/admin_filters.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/managers/message_manager.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/managers/ticket_manager.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/migrations/0001_initial.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/migrations/0002_alter_message_ticket.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/migrations/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/signals.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/templates/support/chat/access_denied.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/templates/support/chat/ticket_chat.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/utils/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/utils/support_email_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/views/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/views/admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/views/api.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/support/views/chat.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/admin.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/serializers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/css/dashboard.css +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/api.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/modals.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/static/tasks/js/theme.js +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/base.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/management_actions.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/status_cards.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps/tasks/views.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/apps.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/commands/create_project.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/commands/info.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/main.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/cli/utils.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/config.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/config.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/environment.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/exceptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/generation.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/integration.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/core/validation.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/auto_generate.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/check_settings.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/clear_constance.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/create_token.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/generate.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/list_urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/migrate_all.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/migrator.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/rundramatiq.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/runserver_ngrok.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/script.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/show_config.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/show_urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/superuser.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/task_clear.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/task_status.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/test_email.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/test_telegram.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/test_twilio.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/tree.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/management/commands/validate_config.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/middleware/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/middleware/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/middleware/public_endpoints.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/middleware/user_activity.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/api.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/cache.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/cfg.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/constance.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/cors.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/database.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/drf.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/email.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/environment.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/jwt.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/limits.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/logging.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/ngrok.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/revolution.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/security.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/services.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/models/tasks.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/base.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_currency/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_currency/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_currency/cache.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_currency/converter.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_currency/service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_email.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_health.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_import_export/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_import_export/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/example.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/cache.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/client.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/costs.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/extractor.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/models_cache.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/llm/tokenizer.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/translator/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/translator/cache.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_llm/translator/translator.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_logger.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_ngrok.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_tasks.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_telegram.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/exceptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/sendgrid_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/simple_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/templates/guide.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/templates/sendgrid_otp_email.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/templates/sendgrid_test_data.json +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_twilio/twilio_service.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/dashboard.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/icons/README.md +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/icons/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/icons/constants.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/icons/generate_icons.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/dashboard.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/dropdown.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/navigation.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models/tabs.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/models.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/system_monitor.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/django_unfold/utils.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/dramatiq_setup.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/modules/logger.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/core.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/exceptions.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/modules.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/services.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/registry/third_party.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/routing/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/routing/callbacks.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/routing/routers.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/change_list.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/includes/default_value.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/includes/fieldset_header.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/includes/results_list.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/includes/setting_row.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/constance/includes/table_headers.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/import_export/change_list_export.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/import_export/change_list_import.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/import_export/change_list_import_export.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/index.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/components/stats_tiles.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/components/user_permissions.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/tabs/app_stats_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/tabs/stats_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/admin/snippets/tabs/users_tab.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templates/emails/base_email.html +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/templatetags/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/urls.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/utils/__init__.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/utils/path_resolution.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/utils/smart_defaults.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/utils/toolkit.py +0 -0
- {django_cfg-1.2.7 → django_cfg-1.2.8}/src/django_cfg/utils/version_check.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: django-cfg
|
3
|
-
Version: 1.2.
|
3
|
+
Version: 1.2.8
|
4
4
|
Summary: 🚀 Next-gen Django configuration: type-safety, AI features, blazing-fast setup, and automated best practices — all in one.
|
5
5
|
Project-URL: Homepage, https://django-cfg.com
|
6
6
|
Project-URL: Documentation, https://django-cfg.com
|
@@ -110,6 +110,7 @@ Requires-Dist: pymdown-extensions<11.0,>=10.16; extra == 'docs'
|
|
110
110
|
Provides-Extra: full
|
111
111
|
Requires-Dist: django<6.0,>=5.2; extra == 'full'
|
112
112
|
Requires-Dist: redis<7.0,>=6.4.0; extra == 'full'
|
113
|
+
Provides-Extra: local
|
113
114
|
Provides-Extra: tasks
|
114
115
|
Requires-Dist: redis<7.0,>=6.4.0; extra == 'tasks'
|
115
116
|
Provides-Extra: test
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "django-cfg"
|
7
|
-
version = "1.2.
|
7
|
+
version = "1.2.8"
|
8
8
|
description = "🚀 Next-gen Django configuration: type-safety, AI features, blazing-fast setup, and automated best practices — all in one."
|
9
9
|
readme = "README.md"
|
10
10
|
license = {text = "MIT"}
|
@@ -121,11 +121,14 @@ dependencies = [
|
|
121
121
|
"django-revolution>=1.0.43,<2.0",
|
122
122
|
]
|
123
123
|
|
124
|
-
# Local development dependencies
|
125
|
-
# django-revolution = {path = "../django-revolution", develop = true}
|
126
|
-
|
127
124
|
[project.optional-dependencies]
|
128
125
|
|
126
|
+
# Local development dependencies group
|
127
|
+
local = [
|
128
|
+
# Uncomment to use local django-revolution development version
|
129
|
+
# "django-revolution @ file://../django-revolution"
|
130
|
+
]
|
131
|
+
|
129
132
|
# Django compatibility - users should install one of these (minimum 5.2)
|
130
133
|
django52 = ["django>=5.2,<6.0"]
|
131
134
|
|
@@ -45,8 +45,8 @@ def get_django_cfg_urlpatterns() -> List[URLPattern]:
|
|
45
45
|
# patterns.append(path('leads/', include('django_cfg.apps.leads.urls')))
|
46
46
|
|
47
47
|
# Tasks app - enabled when knowbase or agents are enabled
|
48
|
-
if base_module.is_tasks_enabled():
|
49
|
-
|
48
|
+
# if base_module.is_tasks_enabled():
|
49
|
+
# patterns.append(path('tasks/', include('django_cfg.apps.tasks.urls')))
|
50
50
|
|
51
51
|
except Exception:
|
52
52
|
# Fallback: include all URLs if config is not available
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"""
|
2
|
+
Quick actions callbacks.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import logging
|
6
|
+
from typing import List
|
7
|
+
|
8
|
+
from ..models.dashboard import QuickAction
|
9
|
+
from ..icons import Icons
|
10
|
+
from .base import get_user_admin_urls
|
11
|
+
|
12
|
+
logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
class ActionsCallbacks:
|
16
|
+
"""Quick actions callbacks."""
|
17
|
+
|
18
|
+
def get_quick_actions(self) -> List[QuickAction]:
|
19
|
+
"""Get quick action buttons as Pydantic models."""
|
20
|
+
# Get user admin URLs dynamically based on AUTH_USER_MODEL
|
21
|
+
user_admin_urls = get_user_admin_urls()
|
22
|
+
|
23
|
+
actions = [
|
24
|
+
QuickAction(
|
25
|
+
title="Add User",
|
26
|
+
description="Create new user account",
|
27
|
+
icon=Icons.PERSON_ADD,
|
28
|
+
link=user_admin_urls["add"],
|
29
|
+
color="primary",
|
30
|
+
category="admin",
|
31
|
+
),
|
32
|
+
QuickAction(
|
33
|
+
title="Support Tickets",
|
34
|
+
description="Manage support tickets",
|
35
|
+
icon=Icons.SUPPORT_AGENT,
|
36
|
+
link="admin:django_cfg_support_ticket_changelist",
|
37
|
+
color="primary",
|
38
|
+
category="support",
|
39
|
+
),
|
40
|
+
QuickAction(
|
41
|
+
title="Health Check",
|
42
|
+
description="System health status",
|
43
|
+
icon=Icons.HEALTH_AND_SAFETY,
|
44
|
+
link="/cfg/health/",
|
45
|
+
color="success",
|
46
|
+
category="system",
|
47
|
+
),
|
48
|
+
]
|
49
|
+
|
50
|
+
return actions
|
@@ -0,0 +1,98 @@
|
|
1
|
+
"""
|
2
|
+
Base utilities and helper functions for callbacks.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import logging
|
6
|
+
from typing import Dict, Any, List
|
7
|
+
from django.contrib.auth import get_user_model
|
8
|
+
from django.core.management import get_commands
|
9
|
+
import importlib
|
10
|
+
|
11
|
+
logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
def get_available_commands():
|
15
|
+
"""Get all available Django management commands."""
|
16
|
+
commands_dict = get_commands()
|
17
|
+
commands_list = []
|
18
|
+
|
19
|
+
for command_name, app_name in commands_dict.items():
|
20
|
+
try:
|
21
|
+
# Try to get command description
|
22
|
+
if app_name == 'django_cfg':
|
23
|
+
module_path = f'django_cfg.management.commands.{command_name}'
|
24
|
+
else:
|
25
|
+
module_path = f'{app_name}.management.commands.{command_name}'
|
26
|
+
|
27
|
+
try:
|
28
|
+
command_module = importlib.import_module(module_path)
|
29
|
+
if hasattr(command_module, 'Command'):
|
30
|
+
command_class = command_module.Command
|
31
|
+
description = getattr(command_class, 'help', f'{command_name} command')
|
32
|
+
else:
|
33
|
+
description = f'{command_name} command'
|
34
|
+
except ImportError:
|
35
|
+
description = f'{command_name} command'
|
36
|
+
|
37
|
+
commands_list.append({
|
38
|
+
'name': command_name,
|
39
|
+
'app': app_name,
|
40
|
+
'description': description,
|
41
|
+
'is_core': app_name.startswith('django.'),
|
42
|
+
'is_custom': app_name == 'django_cfg',
|
43
|
+
})
|
44
|
+
except Exception:
|
45
|
+
# Skip problematic commands
|
46
|
+
continue
|
47
|
+
|
48
|
+
return commands_list
|
49
|
+
|
50
|
+
|
51
|
+
def get_commands_by_category():
|
52
|
+
"""Get commands categorized by type."""
|
53
|
+
commands = get_available_commands()
|
54
|
+
|
55
|
+
categorized = {
|
56
|
+
'django_cfg': [],
|
57
|
+
'django_core': [],
|
58
|
+
'third_party': [],
|
59
|
+
'project': [],
|
60
|
+
}
|
61
|
+
|
62
|
+
for cmd in commands:
|
63
|
+
if cmd['app'] == 'django_cfg':
|
64
|
+
categorized['django_cfg'].append(cmd)
|
65
|
+
elif cmd['app'].startswith('django.'):
|
66
|
+
categorized['django_core'].append(cmd)
|
67
|
+
elif cmd['app'].startswith(('src.', 'api.', 'accounts.')):
|
68
|
+
categorized['project'].append(cmd)
|
69
|
+
else:
|
70
|
+
categorized['third_party'].append(cmd)
|
71
|
+
|
72
|
+
return categorized
|
73
|
+
|
74
|
+
|
75
|
+
def get_user_admin_urls():
|
76
|
+
"""Get admin URLs for user model."""
|
77
|
+
try:
|
78
|
+
User = get_user_model()
|
79
|
+
|
80
|
+
app_label = User._meta.app_label
|
81
|
+
model_name = User._meta.model_name
|
82
|
+
|
83
|
+
return {
|
84
|
+
'changelist': f'admin:{app_label}_{model_name}_changelist',
|
85
|
+
'add': f'admin:{app_label}_{model_name}_add',
|
86
|
+
'change': f'admin:{app_label}_{model_name}_change/{{id}}/',
|
87
|
+
'delete': f'admin:{app_label}_{model_name}_delete/{{id}}/',
|
88
|
+
'view': f'admin:{app_label}_{model_name}_view/{{id}}/',
|
89
|
+
}
|
90
|
+
except Exception:
|
91
|
+
# Universal fallback - return admin index for all actions
|
92
|
+
return {
|
93
|
+
'changelist': 'admin:index',
|
94
|
+
'add': 'admin:index',
|
95
|
+
'change': 'admin:index',
|
96
|
+
'delete': 'admin:index',
|
97
|
+
'view': 'admin:index',
|
98
|
+
}
|
@@ -0,0 +1,224 @@
|
|
1
|
+
"""
|
2
|
+
Charts data callbacks.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import logging
|
6
|
+
import random
|
7
|
+
from typing import Dict, Any, List
|
8
|
+
from datetime import timedelta
|
9
|
+
|
10
|
+
from django.db.models import Count
|
11
|
+
from django.utils import timezone
|
12
|
+
from django.contrib.auth import get_user_model
|
13
|
+
|
14
|
+
from ..models.dashboard import ChartData, ChartDataset
|
15
|
+
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
class ChartsCallbacks:
|
20
|
+
"""Charts data callbacks."""
|
21
|
+
|
22
|
+
def _get_user_model(self):
|
23
|
+
"""Get the user model safely."""
|
24
|
+
return get_user_model()
|
25
|
+
|
26
|
+
def _get_empty_chart_data(self, label: str) -> Dict[str, Any]:
|
27
|
+
"""Get empty chart data structure."""
|
28
|
+
return ChartData(
|
29
|
+
labels=["No Data"],
|
30
|
+
datasets=[
|
31
|
+
ChartDataset(
|
32
|
+
label=label,
|
33
|
+
data=[0],
|
34
|
+
backgroundColor="rgba(156, 163, 175, 0.1)",
|
35
|
+
borderColor="rgb(156, 163, 175)",
|
36
|
+
tension=0.4
|
37
|
+
)
|
38
|
+
]
|
39
|
+
).model_dump()
|
40
|
+
|
41
|
+
def get_user_registration_chart_data(self) -> Dict[str, Any]:
|
42
|
+
"""Get user registration chart data."""
|
43
|
+
try:
|
44
|
+
# Avoid database access during app initialization
|
45
|
+
from django.apps import apps
|
46
|
+
if not apps.ready:
|
47
|
+
return self._get_empty_chart_data("New Users")
|
48
|
+
|
49
|
+
User = self._get_user_model()
|
50
|
+
|
51
|
+
# Get last 7 days of registration data
|
52
|
+
end_date = timezone.now().date()
|
53
|
+
start_date = end_date - timedelta(days=6)
|
54
|
+
|
55
|
+
# Generate date range
|
56
|
+
date_range = []
|
57
|
+
current_date = start_date
|
58
|
+
while current_date <= end_date:
|
59
|
+
date_range.append(current_date)
|
60
|
+
current_date += timedelta(days=1)
|
61
|
+
|
62
|
+
# Get registration counts by date
|
63
|
+
registration_data = (
|
64
|
+
User.objects.filter(date_joined__date__gte=start_date)
|
65
|
+
.extra({'date': "date(date_joined)"})
|
66
|
+
.values('date')
|
67
|
+
.annotate(count=Count('id'))
|
68
|
+
.order_by('date')
|
69
|
+
)
|
70
|
+
|
71
|
+
# Create data dictionary for easy lookup
|
72
|
+
data_dict = {item['date']: item['count'] for item in registration_data}
|
73
|
+
|
74
|
+
# Build chart data
|
75
|
+
labels = [date.strftime("%m/%d") for date in date_range]
|
76
|
+
data_points = [data_dict.get(date, 0) for date in date_range]
|
77
|
+
|
78
|
+
chart_data = ChartData(
|
79
|
+
labels=labels,
|
80
|
+
datasets=[
|
81
|
+
ChartDataset(
|
82
|
+
label="New Users",
|
83
|
+
data=data_points,
|
84
|
+
backgroundColor="rgba(59, 130, 246, 0.1)",
|
85
|
+
borderColor="rgb(59, 130, 246)",
|
86
|
+
tension=0.4
|
87
|
+
)
|
88
|
+
]
|
89
|
+
)
|
90
|
+
|
91
|
+
return chart_data.model_dump()
|
92
|
+
|
93
|
+
except Exception as e:
|
94
|
+
logger.error(f"Error getting user registration chart data: {e}")
|
95
|
+
return self._get_empty_chart_data("New Users")
|
96
|
+
|
97
|
+
def get_user_activity_chart_data(self) -> Dict[str, Any]:
|
98
|
+
"""Get user activity chart data."""
|
99
|
+
try:
|
100
|
+
# Avoid database access during app initialization
|
101
|
+
from django.apps import apps
|
102
|
+
if not apps.ready:
|
103
|
+
return self._get_empty_chart_data("Active Users")
|
104
|
+
|
105
|
+
User = self._get_user_model()
|
106
|
+
|
107
|
+
# Get activity data for last 7 days
|
108
|
+
end_date = timezone.now().date()
|
109
|
+
start_date = end_date - timedelta(days=6)
|
110
|
+
|
111
|
+
# Generate date range
|
112
|
+
date_range = []
|
113
|
+
current_date = start_date
|
114
|
+
while current_date <= end_date:
|
115
|
+
date_range.append(current_date)
|
116
|
+
current_date += timedelta(days=1)
|
117
|
+
|
118
|
+
# Get login activity (users who logged in each day)
|
119
|
+
activity_data = (
|
120
|
+
User.objects.filter(last_login__date__gte=start_date, last_login__isnull=False)
|
121
|
+
.extra({'date': "date(last_login)"})
|
122
|
+
.values('date')
|
123
|
+
.annotate(count=Count('id'))
|
124
|
+
.order_by('date')
|
125
|
+
)
|
126
|
+
|
127
|
+
# Create data dictionary for easy lookup
|
128
|
+
data_dict = {item['date']: item['count'] for item in activity_data}
|
129
|
+
|
130
|
+
# Build chart data
|
131
|
+
labels = [date.strftime("%m/%d") for date in date_range]
|
132
|
+
data_points = [data_dict.get(date, 0) for date in date_range]
|
133
|
+
|
134
|
+
chart_data = ChartData(
|
135
|
+
labels=labels,
|
136
|
+
datasets=[
|
137
|
+
ChartDataset(
|
138
|
+
label="Active Users",
|
139
|
+
data=data_points,
|
140
|
+
backgroundColor="rgba(34, 197, 94, 0.1)",
|
141
|
+
borderColor="rgb(34, 197, 94)",
|
142
|
+
tension=0.4
|
143
|
+
)
|
144
|
+
]
|
145
|
+
)
|
146
|
+
|
147
|
+
return chart_data.model_dump()
|
148
|
+
|
149
|
+
except Exception as e:
|
150
|
+
logger.error(f"Error getting user activity chart data: {e}")
|
151
|
+
return self._get_empty_chart_data("Active Users")
|
152
|
+
|
153
|
+
def get_activity_tracker_data(self) -> List[Dict[str, str]]:
|
154
|
+
"""Get activity tracker data for the last 52 weeks (GitHub-style)."""
|
155
|
+
try:
|
156
|
+
# Avoid database access during app initialization
|
157
|
+
from django.apps import apps
|
158
|
+
if not apps.ready:
|
159
|
+
return self._get_empty_tracker_data()
|
160
|
+
|
161
|
+
User = self._get_user_model()
|
162
|
+
|
163
|
+
# Get data for last 52 weeks (365 days)
|
164
|
+
end_date = timezone.now().date()
|
165
|
+
start_date = end_date - timedelta(days=364) # 52 weeks * 7 days - 1
|
166
|
+
|
167
|
+
# Get activity data by date
|
168
|
+
activity_data = (
|
169
|
+
User.objects.filter(last_login__date__gte=start_date, last_login__isnull=False)
|
170
|
+
.extra({'date': "date(last_login)"})
|
171
|
+
.values('date')
|
172
|
+
.annotate(count=Count('id'))
|
173
|
+
.order_by('date')
|
174
|
+
)
|
175
|
+
|
176
|
+
# Create data dictionary for easy lookup
|
177
|
+
data_dict = {item['date']: item['count'] for item in activity_data}
|
178
|
+
|
179
|
+
# Generate tracker data for each day
|
180
|
+
tracker_data = []
|
181
|
+
current_date = start_date
|
182
|
+
|
183
|
+
while current_date <= end_date:
|
184
|
+
activity_count = data_dict.get(current_date, 0)
|
185
|
+
|
186
|
+
# Determine color based on activity level
|
187
|
+
if activity_count == 0:
|
188
|
+
color = "bg-base-200 dark:bg-base-700"
|
189
|
+
level = "No activity"
|
190
|
+
elif activity_count <= 2:
|
191
|
+
color = "bg-green-200 dark:bg-green-800"
|
192
|
+
level = "Low activity"
|
193
|
+
elif activity_count <= 5:
|
194
|
+
color = "bg-green-400 dark:bg-green-600"
|
195
|
+
level = "Medium activity"
|
196
|
+
elif activity_count <= 10:
|
197
|
+
color = "bg-green-600 dark:bg-green-500"
|
198
|
+
level = "High activity"
|
199
|
+
else:
|
200
|
+
color = "bg-green-800 dark:bg-green-400"
|
201
|
+
level = "Very high activity"
|
202
|
+
|
203
|
+
tracker_data.append({
|
204
|
+
"color": color,
|
205
|
+
"tooltip": f"{current_date.strftime('%Y-%m-%d')}: {activity_count} active users ({level})"
|
206
|
+
})
|
207
|
+
|
208
|
+
current_date += timedelta(days=1)
|
209
|
+
|
210
|
+
return tracker_data
|
211
|
+
|
212
|
+
except Exception as e:
|
213
|
+
logger.error(f"Error getting activity tracker data: {e}")
|
214
|
+
return self._get_empty_tracker_data()
|
215
|
+
|
216
|
+
def _get_empty_tracker_data(self) -> List[Dict[str, str]]:
|
217
|
+
"""Get empty tracker data (365 days of no activity)."""
|
218
|
+
tracker_data = []
|
219
|
+
for i in range(365):
|
220
|
+
tracker_data.append({
|
221
|
+
"color": "bg-base-200 dark:bg-base-700",
|
222
|
+
"tooltip": f"Day {i + 1}: No data available"
|
223
|
+
})
|
224
|
+
return tracker_data
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""
|
2
|
+
Django commands callbacks.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import logging
|
6
|
+
from typing import Dict, Any
|
7
|
+
|
8
|
+
from .base import get_available_commands, get_commands_by_category
|
9
|
+
|
10
|
+
logger = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
|
13
|
+
class CommandsCallbacks:
|
14
|
+
"""Django commands callbacks."""
|
15
|
+
|
16
|
+
def get_django_commands(self) -> Dict[str, Any]:
|
17
|
+
"""Get Django management commands information."""
|
18
|
+
try:
|
19
|
+
commands = get_available_commands()
|
20
|
+
categorized = get_commands_by_category()
|
21
|
+
|
22
|
+
return {
|
23
|
+
"commands": commands,
|
24
|
+
"categorized": categorized,
|
25
|
+
"total_commands": len(commands),
|
26
|
+
"categories": list(categorized.keys()),
|
27
|
+
"core_commands": len([cmd for cmd in commands if cmd['is_core']]),
|
28
|
+
"custom_commands": len([cmd for cmd in commands if cmd['is_custom']]),
|
29
|
+
}
|
30
|
+
except Exception as e:
|
31
|
+
logger.error(f"Error getting Django commands: {e}")
|
32
|
+
# Return safe fallback to prevent dashboard from breaking
|
33
|
+
return {
|
34
|
+
"commands": [],
|
35
|
+
"categorized": {},
|
36
|
+
"total_commands": 0,
|
37
|
+
"categories": [],
|
38
|
+
"core_commands": 0,
|
39
|
+
"custom_commands": 0,
|
40
|
+
}
|
@@ -0,0 +1,191 @@
|
|
1
|
+
"""
|
2
|
+
Main Unfold Dashboard Callbacks
|
3
|
+
|
4
|
+
Combines all callback modules into a single interface.
|
5
|
+
"""
|
6
|
+
|
7
|
+
import logging
|
8
|
+
import json
|
9
|
+
from typing import Dict, Any
|
10
|
+
|
11
|
+
from django.utils import timezone
|
12
|
+
from django.conf import settings
|
13
|
+
|
14
|
+
from ...base import BaseCfgModule
|
15
|
+
from ..models.dashboard import DashboardData
|
16
|
+
|
17
|
+
from .statistics import StatisticsCallbacks
|
18
|
+
from .system import SystemCallbacks
|
19
|
+
from .actions import ActionsCallbacks
|
20
|
+
from .charts import ChartsCallbacks
|
21
|
+
from .commands import CommandsCallbacks
|
22
|
+
from .revolution import RevolutionCallbacks
|
23
|
+
from .users import UsersCallbacks
|
24
|
+
from .base import get_user_admin_urls
|
25
|
+
|
26
|
+
logger = logging.getLogger(__name__)
|
27
|
+
|
28
|
+
|
29
|
+
class UnfoldCallbacks(
|
30
|
+
BaseCfgModule,
|
31
|
+
StatisticsCallbacks,
|
32
|
+
SystemCallbacks,
|
33
|
+
ActionsCallbacks,
|
34
|
+
ChartsCallbacks,
|
35
|
+
CommandsCallbacks,
|
36
|
+
RevolutionCallbacks,
|
37
|
+
UsersCallbacks
|
38
|
+
):
|
39
|
+
"""
|
40
|
+
Main Unfold dashboard callbacks with full system monitoring.
|
41
|
+
|
42
|
+
Combines all callback modules using multiple inheritance for
|
43
|
+
clean separation of concerns while maintaining a single interface.
|
44
|
+
"""
|
45
|
+
|
46
|
+
def main_dashboard_callback(self, request, context: Dict[str, Any]) -> Dict[str, Any]:
|
47
|
+
"""
|
48
|
+
Main dashboard callback function with comprehensive system data.
|
49
|
+
|
50
|
+
Returns all dashboard data as Pydantic models for type safety.
|
51
|
+
"""
|
52
|
+
try:
|
53
|
+
# Get dashboard data using Pydantic models
|
54
|
+
user_stats = self.get_user_statistics()
|
55
|
+
support_stats = self.get_support_statistics()
|
56
|
+
system_health = self.get_system_health()
|
57
|
+
quick_actions = self.get_quick_actions()
|
58
|
+
|
59
|
+
# Combine all stat cards
|
60
|
+
all_stats = user_stats + support_stats
|
61
|
+
|
62
|
+
dashboard_data = DashboardData(
|
63
|
+
stat_cards=all_stats,
|
64
|
+
system_health=system_health,
|
65
|
+
quick_actions=quick_actions,
|
66
|
+
last_updated=timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
|
67
|
+
environment=getattr(settings, "ENVIRONMENT", "development"),
|
68
|
+
)
|
69
|
+
|
70
|
+
# Convert to template context (using to_dict for Unfold compatibility)
|
71
|
+
cards_data = [card.to_dict() for card in dashboard_data.stat_cards]
|
72
|
+
|
73
|
+
context.update({
|
74
|
+
# Statistics cards
|
75
|
+
"cards": cards_data,
|
76
|
+
"user_stats": [card.to_dict() for card in user_stats],
|
77
|
+
"support_stats": [card.to_dict() for card in support_stats],
|
78
|
+
|
79
|
+
# System health (convert to dict for template)
|
80
|
+
"system_health": {
|
81
|
+
item.component + "_status": item.status
|
82
|
+
for item in dashboard_data.system_health
|
83
|
+
},
|
84
|
+
|
85
|
+
# System metrics
|
86
|
+
"system_metrics": self.get_system_metrics(),
|
87
|
+
|
88
|
+
# Quick actions
|
89
|
+
"quick_actions": [
|
90
|
+
action.model_dump() for action in dashboard_data.quick_actions
|
91
|
+
],
|
92
|
+
|
93
|
+
# Additional categorized actions
|
94
|
+
"admin_actions": [
|
95
|
+
action.model_dump()
|
96
|
+
for action in dashboard_data.quick_actions
|
97
|
+
if action.category == "admin"
|
98
|
+
],
|
99
|
+
"support_actions": [
|
100
|
+
action.model_dump()
|
101
|
+
for action in dashboard_data.quick_actions
|
102
|
+
if action.category == "support"
|
103
|
+
],
|
104
|
+
"system_actions": [
|
105
|
+
action.model_dump()
|
106
|
+
for action in dashboard_data.quick_actions
|
107
|
+
if action.category == "system"
|
108
|
+
],
|
109
|
+
|
110
|
+
# Revolution zones
|
111
|
+
"zones_table": {
|
112
|
+
"headers": [
|
113
|
+
{"label": "Zone"},
|
114
|
+
{"label": "Title"},
|
115
|
+
{"label": "Apps"},
|
116
|
+
{"label": "Endpoints"},
|
117
|
+
{"label": "Status"},
|
118
|
+
{"label": "Actions"},
|
119
|
+
],
|
120
|
+
"rows": self.get_revolution_zones_data()[0],
|
121
|
+
},
|
122
|
+
|
123
|
+
# Recent users
|
124
|
+
"recent_users": self.get_recent_users(),
|
125
|
+
"user_admin_urls": get_user_admin_urls(),
|
126
|
+
|
127
|
+
# App statistics
|
128
|
+
"app_statistics": self.get_app_statistics(),
|
129
|
+
|
130
|
+
# Django commands
|
131
|
+
"django_commands": self.get_django_commands(),
|
132
|
+
|
133
|
+
# Charts data - serialize to JSON for JavaScript
|
134
|
+
"charts": {
|
135
|
+
"user_registrations_json": json.dumps(self.get_user_registration_chart_data()),
|
136
|
+
"user_activity_json": json.dumps(self.get_user_activity_chart_data()),
|
137
|
+
"user_registrations": self.get_user_registration_chart_data(),
|
138
|
+
"user_activity": self.get_user_activity_chart_data(),
|
139
|
+
},
|
140
|
+
|
141
|
+
# Activity tracker data
|
142
|
+
"activity_tracker": self.get_activity_tracker_data(),
|
143
|
+
|
144
|
+
|
145
|
+
# Meta information
|
146
|
+
"last_updated": dashboard_data.last_updated,
|
147
|
+
"environment": dashboard_data.environment,
|
148
|
+
"dashboard_title": "Django CFG Dashboard",
|
149
|
+
})
|
150
|
+
|
151
|
+
# Log charts data for debugging
|
152
|
+
charts_data = context.get('charts', {})
|
153
|
+
logger.info(f"Charts data added to context: {list(charts_data.keys())}")
|
154
|
+
if 'user_registrations' in charts_data:
|
155
|
+
reg_data = charts_data['user_registrations']
|
156
|
+
logger.info(f"Registration chart labels: {reg_data.get('labels', [])}")
|
157
|
+
if 'user_activity' in charts_data:
|
158
|
+
act_data = charts_data['user_activity']
|
159
|
+
logger.info(f"Activity chart labels: {act_data.get('labels', [])}")
|
160
|
+
|
161
|
+
# Log recent users data for debugging
|
162
|
+
recent_users_data = context.get('recent_users', [])
|
163
|
+
logger.info(f"Recent users data count: {len(recent_users_data)}")
|
164
|
+
if recent_users_data:
|
165
|
+
logger.info(f"First user: {recent_users_data[0].get('username', 'N/A')}")
|
166
|
+
|
167
|
+
# Log activity tracker data for debugging
|
168
|
+
activity_tracker_data = context.get('activity_tracker', [])
|
169
|
+
logger.info(f"Activity tracker data count: {len(activity_tracker_data)}")
|
170
|
+
|
171
|
+
return context
|
172
|
+
|
173
|
+
except Exception as e:
|
174
|
+
logger.error(f"Dashboard callback error: {e}")
|
175
|
+
# Return minimal safe defaults
|
176
|
+
context.update({
|
177
|
+
"cards": [
|
178
|
+
{
|
179
|
+
"title": "System Error",
|
180
|
+
"value": "N/A",
|
181
|
+
"icon": "error",
|
182
|
+
"color": "danger",
|
183
|
+
"description": "Dashboard data unavailable"
|
184
|
+
}
|
185
|
+
],
|
186
|
+
"system_health": {},
|
187
|
+
"quick_actions": [],
|
188
|
+
"last_updated": timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
|
189
|
+
"error": f"Dashboard error: {str(e)}",
|
190
|
+
})
|
191
|
+
return context
|