django-cfg 1.4.116__py3-none-any.whl → 1.5.14__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-cfg might be problematic. Click here for more details.
- django_cfg/__init__.py +6 -1
- django_cfg/apps/api/commands/serializers.py +152 -0
- django_cfg/apps/api/commands/views.py +32 -0
- django_cfg/apps/{accounts → business/accounts}/admin/inlines.py +2 -2
- django_cfg/apps/{accounts → business/accounts}/admin/user_admin.py +2 -2
- django_cfg/apps/{accounts → business/accounts}/apps.py +2 -2
- django_cfg/apps/{accounts → business/accounts}/management/commands/otp_test.py +5 -2
- django_cfg/apps/{accounts → business/accounts}/managers/user_manager.py +2 -2
- django_cfg/apps/{accounts → business/accounts}/migrations/0001_initial.py +4 -4
- django_cfg/apps/{agents → business/agents}/__init__.py +1 -1
- django_cfg/apps/{agents → business/agents}/apps.py +1 -1
- django_cfg/apps/business/agents/management/commands/create_agent.py +177 -0
- django_cfg/apps/{agents/management/commands/create_agent.py → business/agents/management/commands/load_agent_templates.py} +6 -167
- django_cfg/apps/{agents → business/agents}/management/commands/orchestrator_status.py +7 -5
- django_cfg/apps/{knowbase → business/knowbase}/__init__.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/apps.py +3 -3
- django_cfg/apps/business/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/{knowbase → business/knowbase}/examples/external_data_usage.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/management/commands/knowbase_stats.py +4 -2
- django_cfg/apps/{knowbase → business/knowbase}/management/commands/setup_knowbase.py +4 -2
- django_cfg/apps/{knowbase → business/knowbase}/mixins/examples/vehicle_model_example.py +2 -2
- django_cfg/apps/{knowbase → business/knowbase}/mixins/service.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/models/external_data.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/services/archive/vectorization_service.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/services/embedding/async_processor.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/services/embedding/batch_processor.py +2 -2
- django_cfg/apps/{knowbase → business/knowbase}/services/embedding/processors.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/services/embedding/utils.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/tasks/document_processing.py +1 -1
- django_cfg/apps/{knowbase → business/knowbase}/utils/chunk_settings.py +6 -5
- django_cfg/apps/{knowbase → business/knowbase}/views/archive_views.py +2 -2
- django_cfg/apps/{leads → business/leads}/apps.py +2 -2
- django_cfg/apps/{newsletter → business/newsletter}/admin/newsletter_admin.py +12 -11
- django_cfg/apps/{newsletter → business/newsletter}/apps.py +2 -2
- django_cfg/apps/{newsletter → business/newsletter}/management/commands/test_newsletter.py +7 -4
- django_cfg/apps/{payments → business/payments}/__init__.py +2 -2
- django_cfg/apps/{payments → business/payments}/admin/balance_admin.py +26 -36
- django_cfg/apps/{payments → business/payments}/admin/payment_admin.py +65 -85
- django_cfg/apps/{payments → business/payments}/admin/withdrawal_admin.py +65 -100
- django_cfg/apps/{payments → business/payments}/apps.py +1 -1
- django_cfg/apps/{payments → business/payments}/management/commands/check_payment_status.py +8 -6
- django_cfg/apps/{payments → business/payments}/management/commands/create_payment.py +7 -5
- django_cfg/apps/{payments → business/payments}/management/commands/sync_currencies.py +6 -4
- django_cfg/apps/{payments → business/payments}/urls.py +1 -1
- django_cfg/apps/{support → business/support}/apps.py +1 -1
- django_cfg/apps/{support → business/support}/managers/message_manager.py +1 -1
- django_cfg/apps/{support → business/support}/managers/ticket_manager.py +1 -1
- django_cfg/apps/{centrifugo → integrations/centrifugo}/__init__.py +2 -2
- django_cfg/apps/integrations/centrifugo/_cfg/README_DEPENDENCIES.md +260 -0
- django_cfg/apps/integrations/centrifugo/_cfg/__init__.py +25 -0
- django_cfg/apps/integrations/centrifugo/_cfg/check_deps.py +34 -0
- django_cfg/apps/integrations/centrifugo/_cfg/dependencies.py +309 -0
- django_cfg/apps/{centrifugo → integrations/centrifugo}/admin/centrifugo_log.py +33 -71
- django_cfg/apps/integrations/centrifugo/apps.py +100 -0
- django_cfg/apps/{centrifugo → integrations/centrifugo}/management/commands/generate_centrifugo_clients.py +9 -9
- django_cfg/apps/{centrifugo → integrations/centrifugo}/serializers/__init__.py +4 -3
- django_cfg/apps/integrations/centrifugo/serializers/publishes.py +38 -0
- django_cfg/apps/{centrifugo → integrations/centrifugo}/serializers/stats.py +2 -2
- django_cfg/apps/{centrifugo → integrations/centrifugo}/services/client/client.py +2 -2
- django_cfg/apps/{centrifugo → integrations/centrifugo}/services/client/config.py +1 -1
- django_cfg/apps/{centrifugo → integrations/centrifugo}/views/monitoring.py +28 -43
- django_cfg/apps/integrations/grpc/__init__.py +9 -0
- django_cfg/apps/integrations/grpc/_cfg/README_DEPENDENCIES.md +307 -0
- django_cfg/apps/integrations/grpc/_cfg/__init__.py +25 -0
- django_cfg/apps/integrations/grpc/_cfg/check_deps.py +34 -0
- django_cfg/apps/integrations/grpc/_cfg/dependencies.py +484 -0
- django_cfg/apps/integrations/grpc/admin/__init__.py +17 -0
- django_cfg/apps/integrations/grpc/admin/config.py +261 -0
- django_cfg/apps/integrations/grpc/admin/grpc_api_key.py +129 -0
- django_cfg/apps/integrations/grpc/admin/grpc_request_log.py +261 -0
- django_cfg/apps/integrations/grpc/admin/grpc_server_status.py +236 -0
- django_cfg/apps/integrations/grpc/apps.py +108 -0
- django_cfg/apps/integrations/grpc/auth/__init__.py +17 -0
- django_cfg/apps/integrations/grpc/auth/api_key_auth.py +320 -0
- django_cfg/apps/integrations/grpc/interceptors/__init__.py +19 -0
- django_cfg/apps/integrations/grpc/interceptors/errors.py +241 -0
- django_cfg/apps/integrations/grpc/interceptors/logging.py +267 -0
- django_cfg/apps/integrations/grpc/interceptors/metrics.py +307 -0
- django_cfg/apps/integrations/grpc/interceptors/request_logger.py +535 -0
- django_cfg/apps/integrations/grpc/management/__init__.py +1 -0
- django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +130 -0
- django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +518 -0
- django_cfg/apps/integrations/grpc/management/commands/test_grpc_integration.py +75 -0
- django_cfg/apps/integrations/grpc/managers/__init__.py +14 -0
- django_cfg/apps/integrations/grpc/managers/grpc_api_key.py +192 -0
- django_cfg/apps/integrations/grpc/managers/grpc_request_log.py +310 -0
- django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +296 -0
- django_cfg/apps/integrations/grpc/migrations/0001_initial.py +69 -0
- django_cfg/apps/integrations/grpc/migrations/0002_rename_django_cfg__service_4c4a8e_idx_django_cfg__service_584308_idx_and_more.py +38 -0
- django_cfg/apps/integrations/grpc/migrations/0003_grpcserverstatus.py +119 -0
- django_cfg/apps/integrations/grpc/migrations/0004_grpcserverstatus_registered_services.py +22 -0
- django_cfg/apps/integrations/grpc/migrations/0005_grpcapikey.py +143 -0
- django_cfg/apps/integrations/grpc/migrations/0006_grpcrequestlog_api_key_and_more.py +34 -0
- django_cfg/apps/integrations/grpc/models/__init__.py +13 -0
- django_cfg/apps/integrations/grpc/models/grpc_api_key.py +198 -0
- django_cfg/apps/integrations/grpc/models/grpc_request_log.py +230 -0
- django_cfg/apps/integrations/grpc/models/grpc_server_status.py +305 -0
- django_cfg/apps/integrations/grpc/serializers/__init__.py +83 -0
- django_cfg/apps/integrations/grpc/serializers/api_keys.py +63 -0
- django_cfg/apps/integrations/grpc/serializers/charts.py +216 -0
- django_cfg/apps/integrations/grpc/serializers/config.py +120 -0
- django_cfg/apps/integrations/grpc/serializers/health.py +18 -0
- django_cfg/apps/integrations/grpc/serializers/proto_files.py +74 -0
- django_cfg/apps/integrations/grpc/serializers/requests.py +24 -0
- django_cfg/apps/integrations/grpc/serializers/service_registry.py +260 -0
- django_cfg/apps/integrations/grpc/serializers/services.py +32 -0
- django_cfg/apps/integrations/grpc/serializers/stats.py +60 -0
- django_cfg/apps/integrations/grpc/serializers/testing.py +113 -0
- django_cfg/apps/integrations/grpc/services/__init__.py +41 -0
- django_cfg/apps/integrations/grpc/services/base.py +375 -0
- django_cfg/apps/integrations/grpc/services/chart_generator.py +475 -0
- django_cfg/apps/integrations/grpc/services/config_helper.py +146 -0
- django_cfg/apps/integrations/grpc/services/discovery.py +571 -0
- django_cfg/apps/integrations/grpc/services/grpc_client.py +590 -0
- django_cfg/apps/integrations/grpc/services/monitoring_service.py +397 -0
- django_cfg/apps/integrations/grpc/services/proto_files_manager.py +268 -0
- django_cfg/apps/integrations/grpc/services/service_registry.py +330 -0
- django_cfg/apps/integrations/grpc/services/testing_service.py +321 -0
- django_cfg/apps/integrations/grpc/testing/__init__.py +12 -0
- django_cfg/apps/integrations/grpc/testing/examples.py +263 -0
- django_cfg/apps/integrations/grpc/urls.py +47 -0
- django_cfg/apps/integrations/grpc/utils/__init__.py +9 -0
- django_cfg/apps/integrations/grpc/utils/integration_test.py +334 -0
- django_cfg/apps/integrations/grpc/utils/proto_gen.py +463 -0
- django_cfg/apps/integrations/grpc/utils/streaming_logger.py +177 -0
- django_cfg/apps/integrations/grpc/views/__init__.py +19 -0
- django_cfg/apps/integrations/grpc/views/api_keys.py +255 -0
- django_cfg/apps/integrations/grpc/views/charts.py +224 -0
- django_cfg/apps/integrations/grpc/views/config.py +193 -0
- django_cfg/apps/integrations/grpc/views/monitoring.py +360 -0
- django_cfg/apps/integrations/grpc/views/proto_files.py +214 -0
- django_cfg/apps/integrations/grpc/views/services.py +298 -0
- django_cfg/apps/integrations/grpc/views/testing.py +308 -0
- django_cfg/apps/integrations/rq/__init__.py +9 -0
- django_cfg/apps/integrations/rq/_cfg/__init__.py +28 -0
- django_cfg/apps/integrations/rq/_cfg/dependencies.py +313 -0
- django_cfg/apps/integrations/rq/apps.py +157 -0
- django_cfg/apps/integrations/rq/management/__init__.py +1 -0
- django_cfg/apps/integrations/rq/management/commands/__init__.py +1 -0
- django_cfg/apps/integrations/rq/management/commands/rqscheduler.py +31 -0
- django_cfg/apps/integrations/rq/management/commands/rqstats.py +33 -0
- django_cfg/apps/integrations/rq/management/commands/rqworker.py +31 -0
- django_cfg/apps/integrations/rq/management/commands/rqworker_pool.py +27 -0
- django_cfg/apps/integrations/rq/serializers/__init__.py +40 -0
- django_cfg/apps/integrations/rq/serializers/health.py +60 -0
- django_cfg/apps/integrations/rq/serializers/job.py +100 -0
- django_cfg/apps/integrations/rq/serializers/queue.py +80 -0
- django_cfg/apps/integrations/rq/serializers/schedule.py +178 -0
- django_cfg/apps/integrations/rq/serializers/testing.py +139 -0
- django_cfg/apps/integrations/rq/serializers/worker.py +58 -0
- django_cfg/apps/integrations/rq/services/__init__.py +25 -0
- django_cfg/apps/integrations/rq/services/config_helper.py +233 -0
- django_cfg/apps/integrations/rq/services/models/README.md +417 -0
- django_cfg/apps/integrations/rq/services/models/__init__.py +30 -0
- django_cfg/apps/integrations/rq/services/models/event.py +123 -0
- django_cfg/apps/integrations/rq/services/models/job.py +99 -0
- django_cfg/apps/integrations/rq/services/models/queue.py +92 -0
- django_cfg/apps/integrations/rq/services/models/worker.py +104 -0
- django_cfg/apps/integrations/rq/services/rq_converters.py +183 -0
- django_cfg/apps/integrations/rq/tasks/__init__.py +23 -0
- django_cfg/apps/integrations/rq/tasks/demo_tasks.py +284 -0
- django_cfg/apps/integrations/rq/urls.py +54 -0
- django_cfg/apps/integrations/rq/views/__init__.py +19 -0
- django_cfg/apps/integrations/rq/views/jobs.py +892 -0
- django_cfg/apps/integrations/rq/views/monitoring.py +248 -0
- django_cfg/apps/integrations/rq/views/queues.py +261 -0
- django_cfg/apps/integrations/rq/views/schedule.py +404 -0
- django_cfg/apps/integrations/rq/views/testing.py +761 -0
- django_cfg/apps/integrations/rq/views/workers.py +195 -0
- django_cfg/apps/system/__init__.py +0 -0
- django_cfg/apps/system/dashboard/TRANSACTION_FIX.md +73 -0
- django_cfg/apps/{dashboard → system/dashboard}/__init__.py +1 -1
- django_cfg/apps/{dashboard → system/dashboard}/apps.py +1 -1
- django_cfg/apps/{dashboard → system/dashboard}/serializers/__init__.py +4 -11
- django_cfg/apps/{dashboard → system/dashboard}/serializers/activity.py +1 -1
- django_cfg/apps/{dashboard → system/dashboard}/serializers/commands.py +25 -1
- django_cfg/apps/system/dashboard/serializers/config.py +245 -0
- django_cfg/apps/{dashboard → system/dashboard}/services/__init__.py +2 -2
- django_cfg/apps/{dashboard → system/dashboard}/services/charts_service.py +4 -3
- django_cfg/apps/{dashboard → system/dashboard}/services/commands_service.py +12 -1
- django_cfg/apps/system/dashboard/services/config_service.py +393 -0
- django_cfg/apps/{dashboard → system/dashboard}/services/statistics_service.py +11 -2
- django_cfg/apps/{dashboard → system/dashboard}/services/system_health_service.py +64 -106
- django_cfg/apps/{dashboard → system/dashboard}/urls.py +3 -2
- django_cfg/apps/{dashboard → system/dashboard}/views/__init__.py +2 -2
- django_cfg/apps/{dashboard → system/dashboard}/views/commands_views.py +3 -6
- django_cfg/apps/system/dashboard/views/config_views.py +69 -0
- django_cfg/apps/{dashboard → system/dashboard}/views/overview_views.py +14 -13
- django_cfg/apps/{frontend → system/frontend}/__init__.py +1 -1
- django_cfg/apps/{frontend → system/frontend}/apps.py +1 -1
- django_cfg/apps/{frontend → system/frontend}/setup.py +5 -5
- django_cfg/apps/{frontend → system/frontend}/views.py +18 -3
- django_cfg/apps/system/maintenance/__init__.py +56 -0
- django_cfg/apps/{maintenance → system/maintenance}/admin/api_key_admin.py +10 -12
- django_cfg/apps/{maintenance → system/maintenance}/admin/scheduled_admin.py +3 -3
- django_cfg/apps/{maintenance → system/maintenance}/admin/site_admin.py +10 -9
- django_cfg/apps/{maintenance → system/maintenance}/apps.py +1 -1
- django_cfg/apps/system/maintenance/management/__init__.py +0 -0
- django_cfg/apps/system/maintenance/management/commands/__init__.py +0 -0
- django_cfg/apps/{maintenance → system/maintenance}/management/commands/maintenance.py +5 -2
- django_cfg/apps/{maintenance → system/maintenance}/management/commands/process_scheduled_maintenance.py +4 -2
- django_cfg/apps/{maintenance → system/maintenance}/management/commands/sync_cloudflare.py +5 -2
- django_cfg/apps/system/maintenance/migrations/__init__.py +0 -0
- django_cfg/apps/{maintenance → system/maintenance}/models/__init__.py +4 -4
- django_cfg/apps/system/maintenance/services/__init__.py +42 -0
- django_cfg/apps/urls.py +54 -115
- django_cfg/config.py +36 -0
- django_cfg/core/base/config_model.py +27 -28
- django_cfg/core/builders/apps_builder.py +19 -21
- django_cfg/core/constants.py +1 -0
- django_cfg/core/debug/README.md +116 -0
- django_cfg/core/debug/__init__.py +7 -0
- django_cfg/core/debug/example_config.py +63 -0
- django_cfg/core/debug/warnings_helper.py +121 -0
- django_cfg/core/generation/integration_generators/__init__.py +3 -6
- django_cfg/core/generation/integration_generators/django_rq.py +80 -0
- django_cfg/core/generation/integration_generators/grpc_generator.py +316 -0
- django_cfg/core/generation/orchestrator.py +15 -15
- django_cfg/core/integration/display/__init__.py +2 -0
- django_cfg/core/integration/display/base.py +51 -0
- django_cfg/core/integration/display/grpc_display.py +144 -0
- django_cfg/core/integration/display/startup.py +24 -58
- django_cfg/management/commands/check_endpoints.py +2 -2
- django_cfg/management/commands/check_settings.py +3 -10
- django_cfg/management/commands/clear_constance.py +3 -10
- django_cfg/management/commands/create_token.py +4 -11
- django_cfg/management/commands/list_urls.py +4 -10
- django_cfg/management/commands/migrate_all.py +18 -12
- django_cfg/management/commands/migrator.py +4 -11
- django_cfg/management/commands/script.py +4 -10
- django_cfg/management/commands/show_config.py +8 -16
- django_cfg/management/commands/show_urls.py +5 -11
- django_cfg/management/commands/superuser.py +4 -11
- django_cfg/management/commands/tree.py +5 -10
- django_cfg/management/utils/README.md +402 -0
- django_cfg/management/utils/__init__.py +29 -0
- django_cfg/management/utils/mixins.py +176 -0
- django_cfg/middleware/authentication.py +1 -1
- django_cfg/middleware/pagination.py +53 -54
- django_cfg/mixins/__init__.py +2 -0
- django_cfg/mixins/superadmin_api.py +59 -0
- django_cfg/models/__init__.py +3 -3
- django_cfg/models/api/grpc/__init__.py +53 -0
- django_cfg/models/api/grpc/config.py +446 -0
- django_cfg/models/django/__init__.py +3 -3
- django_cfg/models/django/constance.py +1 -1
- django_cfg/models/django/django_rq.py +632 -0
- django_cfg/models/django/revolution_legacy.py +8 -8
- django_cfg/models/ngrok/config.py +7 -6
- django_cfg/modules/base.py +19 -6
- django_cfg/modules/django_admin/__init__.py +2 -0
- django_cfg/modules/django_admin/apps.py +19 -0
- django_cfg/modules/django_admin/base/pydantic_admin.py +23 -12
- django_cfg/modules/django_admin/config/__init__.py +2 -0
- django_cfg/modules/django_admin/config/admin_config.py +7 -0
- django_cfg/modules/django_admin/config/background_task_config.py +4 -4
- django_cfg/modules/django_admin/config/field_config.py +24 -0
- django_cfg/modules/django_admin/templates/django_admin/widgets/encrypted_field.html +80 -0
- django_cfg/modules/django_admin/templates/django_admin/widgets/encrypted_password.html +62 -0
- django_cfg/modules/django_admin/utils/__init__.py +41 -3
- django_cfg/modules/django_admin/utils/badges/__init__.py +13 -0
- django_cfg/modules/django_admin/utils/{badges.py → badges/status_badges.py} +3 -3
- django_cfg/modules/django_admin/utils/displays/__init__.py +13 -0
- django_cfg/modules/django_admin/utils/{displays.py → displays/data_displays.py} +2 -2
- django_cfg/modules/django_admin/utils/html/__init__.py +26 -0
- django_cfg/modules/django_admin/utils/html/badges.py +55 -0
- django_cfg/modules/django_admin/utils/html/base.py +167 -0
- django_cfg/modules/django_admin/utils/html/code.py +87 -0
- django_cfg/modules/django_admin/utils/html/composition.py +205 -0
- django_cfg/modules/django_admin/utils/html/formatting.py +231 -0
- django_cfg/modules/django_admin/utils/html/keyvalue.py +219 -0
- django_cfg/modules/django_admin/utils/html/markdown_integration.py +108 -0
- django_cfg/modules/django_admin/utils/html/progress.py +127 -0
- django_cfg/modules/django_admin/utils/html_builder.py +55 -408
- django_cfg/modules/django_admin/utils/markdown/__init__.py +21 -0
- django_cfg/modules/django_admin/widgets/__init__.py +3 -0
- django_cfg/modules/django_admin/widgets/encrypted_field_widget.py +66 -0
- django_cfg/modules/django_admin/widgets/registry.py +42 -0
- django_cfg/modules/django_client/core/generator/python/files_generator.py +5 -13
- django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +16 -4
- django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +2 -3
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +6 -5
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +13 -4
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +12 -8
- django_cfg/modules/django_client/core/parser/base.py +135 -2
- django_cfg/modules/django_client/management/commands/generate_client.py +5 -2
- django_cfg/modules/django_client/management/commands/validate_openapi.py +5 -2
- django_cfg/modules/django_currency/examples/example_database_usage.py +1 -1
- django_cfg/modules/django_email/management/commands/test_email.py +4 -10
- django_cfg/modules/django_logging/__init__.py +2 -0
- django_cfg/modules/django_logging/django_logger.py +78 -8
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +16 -13
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -11
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +4 -11
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_unfold/navigation.py +15 -24
- django_cfg/modules/nextjs_admin/views.py +1 -1
- django_cfg/pyproject.toml +10 -10
- django_cfg/registry/core.py +4 -7
- django_cfg/registry/modules.py +4 -1
- django_cfg/requirements.txt +52 -0
- django_cfg/static/frontend/admin.zip +0 -0
- django_cfg/templates/admin/constance/includes/results_list.html +73 -0
- django_cfg/templates/admin/index.html +187 -62
- django_cfg/templatetags/django_cfg.py +61 -1
- {django_cfg-1.4.116.dist-info → django_cfg-1.5.14.dist-info}/METADATA +106 -60
- django_cfg-1.5.14.dist-info/RECORD +1182 -0
- django_cfg/apps/centrifugo/apps.py +0 -31
- django_cfg/apps/centrifugo/serializers/publishes.py +0 -18
- django_cfg/apps/dashboard/permissions.py +0 -48
- django_cfg/apps/dashboard/serializers/django_q2.py +0 -50
- django_cfg/apps/dashboard/services/django_q2_service.py +0 -159
- django_cfg/apps/dashboard/views/django_q2_views.py +0 -79
- django_cfg/apps/knowbase/examples/__init__.py +0 -3
- django_cfg/apps/maintenance/__init__.py +0 -56
- django_cfg/apps/maintenance/services/__init__.py +0 -42
- django_cfg/apps/tasks/__init__.py +0 -64
- django_cfg/apps/tasks/admin/__init__.py +0 -4
- django_cfg/apps/tasks/admin/config.py +0 -98
- django_cfg/apps/tasks/admin/task_log.py +0 -265
- django_cfg/apps/tasks/apps.py +0 -15
- django_cfg/apps/tasks/filters/__init__.py +0 -10
- django_cfg/apps/tasks/filters/task_log.py +0 -121
- django_cfg/apps/tasks/migrations/0001_initial.py +0 -196
- django_cfg/apps/tasks/migrations/0002_delete_tasklog.py +0 -16
- django_cfg/apps/tasks/models/__init__.py +0 -4
- django_cfg/apps/tasks/models/task_log.py +0 -246
- django_cfg/apps/tasks/serializers/__init__.py +0 -28
- django_cfg/apps/tasks/serializers/task_log.py +0 -249
- django_cfg/apps/tasks/services/__init__.py +0 -10
- django_cfg/apps/tasks/services/client/__init__.py +0 -7
- django_cfg/apps/tasks/services/client/client.py +0 -234
- django_cfg/apps/tasks/services/config_helper.py +0 -63
- django_cfg/apps/tasks/services/sync.py +0 -204
- django_cfg/apps/tasks/urls.py +0 -16
- django_cfg/apps/tasks/views/__init__.py +0 -10
- django_cfg/apps/tasks/views/task_log.py +0 -41
- django_cfg/apps/tasks/views/task_log_base.py +0 -41
- django_cfg/apps/tasks/views/task_log_overview.py +0 -100
- django_cfg/apps/tasks/views/task_log_related.py +0 -41
- django_cfg/apps/tasks/views/task_log_stats.py +0 -91
- django_cfg/apps/tasks/views/task_log_timeline.py +0 -81
- django_cfg/core/generation/integration_generators/django_q2.py +0 -133
- django_cfg/core/generation/integration_generators/tasks.py +0 -88
- django_cfg/models/django/django_q2.py +0 -496
- django_cfg/models/tasks/__init__.py +0 -49
- django_cfg/models/tasks/backends.py +0 -122
- django_cfg/models/tasks/config.py +0 -209
- django_cfg/models/tasks/utils.py +0 -162
- django_cfg/modules/django_admin/utils/CODE_BLOCK_DOCS.md +0 -396
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +0 -276
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +0 -504
- django_cfg-1.4.116.dist-info/RECORD +0 -1068
- /django_cfg/apps/{accounts/migrations → business}/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/README.md +0 -0
- /django_cfg/apps/{accounts → business/accounts}/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/__models.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/activity_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/filters.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/group_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/otp_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/registration_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/resources.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/admin/twilio_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/managers/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0002_add_phone_otp_clean.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0003_twilioresponse.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0004_delete_twilioresponse.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0005_twilioresponse.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/migrations/0007_twilioresponse.py +0 -0
- /django_cfg/apps/{knowbase/management → business/accounts/migrations}/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/activity.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/auth.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/base.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/choices.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/integrations.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/registration.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/models/user.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/serializers/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/serializers/otp.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/serializers/profile.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/serializers/webhook.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/services/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/services/activity_service.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/services/otp_service.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/signals.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/base_email.html +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/base_email.txt +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/otp_email.html +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/otp_email.txt +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/welcome_email.html +0 -0
- /django_cfg/apps/{accounts → business/accounts}/templates/emails/welcome_email.txt +0 -0
- /django_cfg/apps/{accounts → business/accounts}/urls.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/urls_admin.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/utils/notifications.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/views/__init__.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/views/otp.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/views/profile.py +0 -0
- /django_cfg/apps/{accounts → business/accounts}/views/webhook.py +0 -0
- /django_cfg/apps/{agents → business/agents}/README.md +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/execution_actions.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/execution_admin.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/registry_actions.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/registry_admin.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/toolsets_actions.py +0 -0
- /django_cfg/apps/{agents → business/agents}/admin/toolsets_admin.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/dependencies.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/django_agent.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/exceptions.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/models.py +0 -0
- /django_cfg/apps/{agents → business/agents}/core/orchestrator.py +0 -0
- /django_cfg/apps/{agents → business/agents}/examples/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/examples/simple_example.py +0 -0
- /django_cfg/apps/{agents → business/agents}/integration/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/integration/middleware.py +0 -0
- /django_cfg/apps/{agents → business/agents}/integration/registry.py +0 -0
- /django_cfg/apps/{agents → business/agents}/integration/signals.py +0 -0
- /django_cfg/apps/{agents → business/agents}/management/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/management/commands/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/managers/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/managers/execution.py +0 -0
- /django_cfg/apps/{agents → business/agents}/managers/registry.py +0 -0
- /django_cfg/apps/{agents → business/agents}/managers/toolsets.py +0 -0
- /django_cfg/apps/{agents → business/agents}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{agents → business/agents}/migrations/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/models/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/models/execution.py +0 -0
- /django_cfg/apps/{agents → business/agents}/models/registry.py +0 -0
- /django_cfg/apps/{agents → business/agents}/models/toolsets.py +0 -0
- /django_cfg/apps/{agents → business/agents}/patterns/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/patterns/content_agents.py +0 -0
- /django_cfg/apps/{agents → business/agents}/toolsets/__init__.py +0 -0
- /django_cfg/apps/{agents → business/agents}/toolsets/cache_toolset.py +0 -0
- /django_cfg/apps/{agents → business/agents}/toolsets/django_toolset.py +0 -0
- /django_cfg/apps/{agents → business/agents}/toolsets/file_toolset.py +0 -0
- /django_cfg/apps/{agents → business/agents}/toolsets/orm_toolset.py +0 -0
- /django_cfg/apps/{agents → business/agents}/urls.py +0 -0
- /django_cfg/apps/{agents → business/agents}/urls_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/README.md +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/archive_actions.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/archive_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/chat_actions.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/chat_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/document_actions.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/document_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/external_data_actions.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/admin/external_data_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/config/README.md +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/config/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/config/constance_fields.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/config/constance_settings.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/config/settings.py +0 -0
- /django_cfg/apps/{knowbase/management/commands → business/knowbase/management}/__init__.py +0 -0
- /django_cfg/apps/{leads → business/knowbase/management/commands}/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/archive.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/base.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/chat.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/document.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/managers/external_data.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/migrations/0003_alter_documentarchive_archive_type.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/migrations/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/config/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/config/defaults.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/config/meta_config.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/config.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/creator.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/external_data_mixin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/generators/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/generators/content_generator.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/generators/field_analyzer.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/mixins/generators/metadata_generator.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/models/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/models/archive.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/models/base.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/models/chat.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/models/document.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/archive_serializers.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/chat_serializers.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/document_serializers.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/external_data_serializers.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/serializers/public_serializers.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/analyzers/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/analyzers/complexity_analyzer.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/analyzers/purpose_detector.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/analyzers/quality_analyzer.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/analyzers/tag_generator.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/archive_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/base.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/json_chunker.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/markdown_chunker.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/python_chunker.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking/text_chunker.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/chunking_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/context/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/context/builders.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/context/models.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/exceptions.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/archive/extraction_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/base.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/chat_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/document_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/embedding/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/embedding/batch_result.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/embedding/models.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/prompt_builder.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/services/search_service.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/signals/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/signals/archive_signals.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/signals/chat_signals.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/signals/document_signals.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/signals/external_data_signals.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/tasks/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/tasks/archive_tasks.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/tasks/external_data_tasks.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/tasks/maintenance.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/urls.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/urls_admin.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/urls_system.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/utils/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/utils/text_processing.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/utils/validation.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/views/__init__.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/views/base.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/views/chat_views.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/views/document_views.py +0 -0
- /django_cfg/apps/{knowbase → business/knowbase}/views/public_views.py +0 -0
- /django_cfg/apps/{leads → business/leads}/README.md +0 -0
- /django_cfg/apps/{leads/migrations → business/leads}/__init__.py +0 -0
- /django_cfg/apps/{leads → business/leads}/admin/__init__.py +0 -0
- /django_cfg/apps/{leads → business/leads}/admin/actions.py +0 -0
- /django_cfg/apps/{leads → business/leads}/admin/leads_admin.py +0 -0
- /django_cfg/apps/{leads → business/leads}/admin/resources.py +0 -0
- /django_cfg/apps/{leads → business/leads}/admin.py +0 -0
- /django_cfg/apps/{leads → business/leads}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{maintenance/management → business/leads/migrations}/__init__.py +0 -0
- /django_cfg/apps/{leads → business/leads}/models.py +0 -0
- /django_cfg/apps/{leads → business/leads}/serializers.py +0 -0
- /django_cfg/apps/{leads → business/leads}/signals.py +0 -0
- /django_cfg/apps/{leads → business/leads}/tests.py +0 -0
- /django_cfg/apps/{leads → business/leads}/urls.py +0 -0
- /django_cfg/apps/{leads → business/leads}/urls_admin.py +0 -0
- /django_cfg/apps/{leads → business/leads}/views.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/README.md +0 -0
- /django_cfg/apps/{maintenance/management/commands → business/newsletter}/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin/actions.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin/filters.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin/resources.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/admin_filters.py +0 -0
- /django_cfg/apps/{maintenance/migrations → business/newsletter/management}/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter/management/commands}/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/managers/README.md +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/managers/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{newsletter/management → business/newsletter/migrations}/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/models.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/serializers.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/services/email_service.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/signals.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/urls.py +0 -0
- /django_cfg/apps/{maintenance → business/newsletter}/urls_admin.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/utils/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/__init__.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/campaigns.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/emails.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/newsletters.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/subscriptions.py +0 -0
- /django_cfg/apps/{newsletter → business/newsletter}/views/tracking.py +0 -0
- /django_cfg/apps/{payments → business/payments}/CONFIGURATION.md +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/actions.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/balance_actions.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/currency_admin.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/filters.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/payment_actions.py +0 -0
- /django_cfg/apps/{payments → business/payments}/admin/withdrawal_actions.py +0 -0
- /django_cfg/apps/{payments → business/payments}/api/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/api/serializers.py +0 -0
- /django_cfg/apps/{payments → business/payments}/api/urls.py +0 -0
- /django_cfg/apps/{payments → business/payments}/api/views.py +0 -0
- /django_cfg/apps/{payments → business/payments}/config.py +0 -0
- /django_cfg/apps/{payments → business/payments}/management/README.md +0 -0
- /django_cfg/apps/{newsletter/management/commands → business/payments/management}/__init__.py +0 -0
- /django_cfg/apps/{newsletter/migrations → business/payments/management/commands}/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{payments/management → business/payments/migrations}/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/balance.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/base.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/currency.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/managers/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/managers/balance_managers.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/managers/payment_managers.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/payment.py +0 -0
- /django_cfg/apps/{payments → business/payments}/models/withdrawal.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/balance_service.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/payment_service.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/models.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/nowpayments/__init__.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/nowpayments/config.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/nowpayments/parser.py +0 -0
- /django_cfg/apps/{payments → business/payments}/services/providers/nowpayments/provider.py +0 -0
- /django_cfg/apps/{payments/management/commands → business/support}/__init__.py +0 -0
- /django_cfg/apps/{support → business/support}/admin/__init__.py +0 -0
- /django_cfg/apps/{support → business/support}/admin/actions.py +0 -0
- /django_cfg/apps/{support → business/support}/admin/filters.py +0 -0
- /django_cfg/apps/{support → business/support}/admin/resources.py +0 -0
- /django_cfg/apps/{support → business/support}/admin/support_admin.py +0 -0
- /django_cfg/apps/{support → business/support}/admin.py +0 -0
- /django_cfg/apps/{support → business/support}/admin_filters.py +0 -0
- /django_cfg/apps/{support → business/support}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{support → business/support}/migrations/0002_alter_message_ticket.py +0 -0
- /django_cfg/apps/{payments → business/support}/migrations/__init__.py +0 -0
- /django_cfg/apps/{support → business/support}/models.py +0 -0
- /django_cfg/apps/{support → business/support}/serializers.py +0 -0
- /django_cfg/apps/{support → business/support}/signals.py +0 -0
- /django_cfg/apps/{support → business/support}/templates/support/chat/access_denied.html +0 -0
- /django_cfg/apps/{support → business/support}/templates/support/chat/ticket_chat.html +0 -0
- /django_cfg/apps/{support → business/support}/urls.py +0 -0
- /django_cfg/apps/{newsletter → business/support}/urls_admin.py +0 -0
- /django_cfg/apps/{support → business/support/utils}/__init__.py +0 -0
- /django_cfg/apps/{support → business/support}/utils/support_email_service.py +0 -0
- /django_cfg/apps/{support → business/support}/views/__init__.py +0 -0
- /django_cfg/apps/{support → business/support}/views/admin.py +0 -0
- /django_cfg/apps/{support → business/support}/views/api.py +0 -0
- /django_cfg/apps/{support → business/support}/views/chat.py +0 -0
- /django_cfg/apps/{support/migrations → integrations}/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/admin/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/admin/config.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/IMPLEMENTATION_SUMMARY.md +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/README.md +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/USAGE.md +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/discovery.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/generator.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/README.md.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/client.go.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/go.mod.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/rpc_client.go.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/rpc_client.go.j2.old +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/go_thin/templates/types.go.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/generator.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/README.md.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/__init__.py.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/client.py.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/models.py.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/requirements.txt.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/python_thin/templates/rpc_client.py.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/generator.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/README.md.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/client.ts.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/index.ts.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/package.json.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/rpc-client.ts.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/tsconfig.json.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/generators/typescript_thin/templates/types.ts.j2 +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/utils/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/utils/naming.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/codegen/utils/type_converter.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/decorators.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/management/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/management/commands/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/managers/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/managers/centrifugo_log.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/migrations/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/models/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/models/centrifugo_log.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/registry.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/router.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/serializers/admin_api.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/serializers/channels.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/serializers/health.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/client/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/client/exceptions.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/config_helper.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/dashboard_notifier.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/services/logging.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/urls.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/views/__init__.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/views/admin_api.py +0 -0
- /django_cfg/apps/{centrifugo → integrations/centrifugo}/views/testing_api.py +0 -0
- /django_cfg/apps/{support/utils → integrations/grpc/management/commands}/__init__.py +0 -0
- /django_cfg/apps/{tasks → integrations/grpc}/migrations/__init__.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/apizones.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/base.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/charts.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/overview.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/statistics.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/serializers/system.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/services/apizones_service.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/services/commands_security.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/services/overview_service.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/views/activity_views.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/views/apizones_views.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/views/charts_views.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/views/statistics_views.py +0 -0
- /django_cfg/apps/{dashboard → system/dashboard}/views/system_views.py +0 -0
- /django_cfg/apps/{frontend → system/frontend}/JWT_AUTO_INJECTION.md +0 -0
- /django_cfg/apps/{frontend → system/frontend}/templates/frontend/404.html +0 -0
- /django_cfg/apps/{frontend → system/frontend}/test_routing.py +0 -0
- /django_cfg/apps/{frontend → system/frontend}/urls.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/admin/__init__.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/admin/actions.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/admin/log_admin.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/managers/__init__.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/managers/cloudflare_site_manager.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/managers/maintenance_log_manager.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/migrations/0001_initial.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/migrations/0002_cloudflaresite_maintenance_url.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/migrations/0003_cloudflaresite_include_subdomains_and_more.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/models/cloudflare_api_key.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/models/cloudflare_site.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/models/maintenance_log.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/models/scheduled_maintenance.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/services/bulk_operations_service.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/services/maintenance_service.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/services/scheduled_maintenance_service.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/services/site_sync_service.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/urls.py +0 -0
- /django_cfg/apps/{support → system/maintenance}/urls_admin.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/utils/__init__.py +0 -0
- /django_cfg/apps/{maintenance → system/maintenance}/utils/retry_utils.py +0 -0
- /django_cfg/modules/django_admin/utils/{mermaid_plugin.py → markdown/mermaid_plugin.py} +0 -0
- /django_cfg/modules/django_admin/utils/{markdown_renderer.py → markdown/renderer.py} +0 -0
- {django_cfg-1.4.116.dist-info → django_cfg-1.5.14.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.116.dist-info → django_cfg-1.5.14.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.116.dist-info → django_cfg-1.5.14.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC Server Status Admin.
|
|
3
|
+
|
|
4
|
+
PydanticAdmin for GRPCServerStatus model with server monitoring and lifecycle tracking.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from django.contrib import admin
|
|
8
|
+
from django_cfg.modules.django_admin import Icons, computed_field
|
|
9
|
+
from django_cfg.modules.django_admin.base import PydanticAdmin
|
|
10
|
+
|
|
11
|
+
from ..models import GRPCServerStatus
|
|
12
|
+
from .config import grpcserverstatus_config
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@admin.register(GRPCServerStatus)
|
|
16
|
+
class GRPCServerStatusAdmin(PydanticAdmin):
|
|
17
|
+
"""
|
|
18
|
+
Admin interface for gRPC server status monitoring.
|
|
19
|
+
|
|
20
|
+
Features:
|
|
21
|
+
- Real-time server status indicators
|
|
22
|
+
- Uptime tracking and display
|
|
23
|
+
- Process information (PID, hostname)
|
|
24
|
+
- Service registration details
|
|
25
|
+
- Error tracking and display
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
config = grpcserverstatus_config
|
|
29
|
+
|
|
30
|
+
@computed_field("Uptime", ordering="started_at")
|
|
31
|
+
def uptime_display(self, obj):
|
|
32
|
+
"""Display server uptime with performance indicator."""
|
|
33
|
+
uptime_text = obj.uptime_display
|
|
34
|
+
|
|
35
|
+
if not obj.is_running:
|
|
36
|
+
return self.html.badge(
|
|
37
|
+
uptime_text,
|
|
38
|
+
variant="secondary",
|
|
39
|
+
icon=Icons.SCHEDULE
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Color code based on uptime
|
|
43
|
+
uptime_seconds = obj.uptime_seconds
|
|
44
|
+
if uptime_seconds > 86400: # > 1 day
|
|
45
|
+
variant = "success"
|
|
46
|
+
icon = Icons.CHECK_CIRCLE
|
|
47
|
+
elif uptime_seconds > 3600: # > 1 hour
|
|
48
|
+
variant = "info"
|
|
49
|
+
icon = Icons.TIMER
|
|
50
|
+
else: # < 1 hour
|
|
51
|
+
variant = "warning"
|
|
52
|
+
icon = Icons.SCHEDULE
|
|
53
|
+
|
|
54
|
+
return self.html.badge(uptime_text, variant=variant, icon=icon)
|
|
55
|
+
|
|
56
|
+
def server_config_display(self, obj):
|
|
57
|
+
"""Display server configuration details."""
|
|
58
|
+
return self.html.breakdown(
|
|
59
|
+
self.html.key_value(
|
|
60
|
+
"Address",
|
|
61
|
+
self.html.badge(obj.address, variant="info", icon=Icons.CLOUD)
|
|
62
|
+
),
|
|
63
|
+
self.html.key_value(
|
|
64
|
+
"Host",
|
|
65
|
+
self.html.code(obj.host)
|
|
66
|
+
),
|
|
67
|
+
self.html.key_value(
|
|
68
|
+
"Port",
|
|
69
|
+
self.html.text(str(obj.port), variant="primary")
|
|
70
|
+
),
|
|
71
|
+
self.html.key_value(
|
|
72
|
+
"Max Workers",
|
|
73
|
+
self.html.badge(str(obj.max_workers), variant="secondary", icon=Icons.SETTINGS)
|
|
74
|
+
),
|
|
75
|
+
self.html.key_value(
|
|
76
|
+
"Reflection",
|
|
77
|
+
self.html.badge(
|
|
78
|
+
"Enabled" if obj.enable_reflection else "Disabled",
|
|
79
|
+
variant="success" if obj.enable_reflection else "secondary",
|
|
80
|
+
icon=Icons.VISIBILITY if obj.enable_reflection else Icons.VISIBILITY_OFF
|
|
81
|
+
)
|
|
82
|
+
),
|
|
83
|
+
self.html.key_value(
|
|
84
|
+
"Health Check",
|
|
85
|
+
self.html.badge(
|
|
86
|
+
"Enabled" if obj.enable_health_check else "Disabled",
|
|
87
|
+
variant="success" if obj.enable_health_check else "secondary",
|
|
88
|
+
icon=Icons.HEALTH_AND_SAFETY if obj.enable_health_check else Icons.CANCEL
|
|
89
|
+
)
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
server_config_display.short_description = "Server Configuration"
|
|
94
|
+
|
|
95
|
+
def process_info_display(self, obj):
|
|
96
|
+
"""Display process information."""
|
|
97
|
+
return self.html.breakdown(
|
|
98
|
+
self.html.key_value(
|
|
99
|
+
"Instance ID",
|
|
100
|
+
self.html.code(obj.instance_id)
|
|
101
|
+
),
|
|
102
|
+
self.html.key_value(
|
|
103
|
+
"PID",
|
|
104
|
+
self.html.badge(str(obj.pid), variant="info", icon=Icons.MEMORY)
|
|
105
|
+
),
|
|
106
|
+
self.html.key_value(
|
|
107
|
+
"Hostname",
|
|
108
|
+
self.html.text(obj.hostname, variant="secondary")
|
|
109
|
+
),
|
|
110
|
+
self.html.key_value(
|
|
111
|
+
"Running",
|
|
112
|
+
self.html.badge(
|
|
113
|
+
"Yes" if obj.is_running else "No",
|
|
114
|
+
variant="success" if obj.is_running else "danger",
|
|
115
|
+
icon=Icons.CHECK_CIRCLE if obj.is_running else Icons.CANCEL
|
|
116
|
+
)
|
|
117
|
+
),
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
process_info_display.short_description = "Process Information"
|
|
121
|
+
|
|
122
|
+
def registered_services_display(self, obj):
|
|
123
|
+
"""Display registered services."""
|
|
124
|
+
if not obj.registered_services:
|
|
125
|
+
return self.html.empty("No services registered")
|
|
126
|
+
|
|
127
|
+
import json
|
|
128
|
+
try:
|
|
129
|
+
formatted = json.dumps(obj.registered_services, indent=2)
|
|
130
|
+
return self.html.code_block(formatted, language="json", max_height="400px")
|
|
131
|
+
except Exception:
|
|
132
|
+
return self.html.code(str(obj.registered_services))
|
|
133
|
+
|
|
134
|
+
registered_services_display.short_description = "Registered Services"
|
|
135
|
+
|
|
136
|
+
def error_display(self, obj):
|
|
137
|
+
"""Display error information if status is ERROR."""
|
|
138
|
+
if obj.status != "error" or not obj.error_message:
|
|
139
|
+
return self.html.inline(
|
|
140
|
+
self.html.icon(Icons.CHECK_CIRCLE, size="sm"),
|
|
141
|
+
self.html.text("No errors", variant="success"),
|
|
142
|
+
separator=" "
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return self.html.breakdown(
|
|
146
|
+
self.html.key_value(
|
|
147
|
+
"Error Message",
|
|
148
|
+
self.html.text(obj.error_message, variant="danger")
|
|
149
|
+
),
|
|
150
|
+
self.html.key_value(
|
|
151
|
+
"Stopped At",
|
|
152
|
+
self.html.text(
|
|
153
|
+
obj.stopped_at.strftime("%Y-%m-%d %H:%M:%S") if obj.stopped_at else "N/A",
|
|
154
|
+
variant="secondary"
|
|
155
|
+
)
|
|
156
|
+
),
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
error_display.short_description = "Error Details"
|
|
160
|
+
|
|
161
|
+
def lifecycle_display(self, obj):
|
|
162
|
+
"""Display server lifecycle timestamps."""
|
|
163
|
+
return self.html.breakdown(
|
|
164
|
+
self.html.key_value(
|
|
165
|
+
"Started",
|
|
166
|
+
self.html.text(
|
|
167
|
+
obj.started_at.strftime("%Y-%m-%d %H:%M:%S"),
|
|
168
|
+
variant="success"
|
|
169
|
+
)
|
|
170
|
+
),
|
|
171
|
+
self.html.key_value(
|
|
172
|
+
"Last Heartbeat",
|
|
173
|
+
self.html.text(
|
|
174
|
+
obj.last_heartbeat.strftime("%Y-%m-%d %H:%M:%S"),
|
|
175
|
+
variant="info"
|
|
176
|
+
)
|
|
177
|
+
) if obj.last_heartbeat else None,
|
|
178
|
+
self.html.key_value(
|
|
179
|
+
"Stopped",
|
|
180
|
+
self.html.text(
|
|
181
|
+
obj.stopped_at.strftime("%Y-%m-%d %H:%M:%S"),
|
|
182
|
+
variant="danger"
|
|
183
|
+
)
|
|
184
|
+
) if obj.stopped_at else None,
|
|
185
|
+
self.html.key_value(
|
|
186
|
+
"Uptime",
|
|
187
|
+
self.html.badge(obj.uptime_display, variant="primary", icon=Icons.TIMER)
|
|
188
|
+
),
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
lifecycle_display.short_description = "Lifecycle"
|
|
192
|
+
|
|
193
|
+
# Fieldsets for detail view
|
|
194
|
+
def get_fieldsets(self, request, obj=None):
|
|
195
|
+
"""Dynamic fieldsets based on object state."""
|
|
196
|
+
fieldsets = [
|
|
197
|
+
(
|
|
198
|
+
"Server Identity",
|
|
199
|
+
{"fields": ("id", "instance_id", "address", "status")},
|
|
200
|
+
),
|
|
201
|
+
(
|
|
202
|
+
"Configuration",
|
|
203
|
+
{"fields": ("server_config_display", "host", "port", "max_workers", "enable_reflection", "enable_health_check")},
|
|
204
|
+
),
|
|
205
|
+
(
|
|
206
|
+
"Process Information",
|
|
207
|
+
{"fields": ("process_info_display", "pid", "hostname", "is_running")},
|
|
208
|
+
),
|
|
209
|
+
(
|
|
210
|
+
"Lifecycle",
|
|
211
|
+
{"fields": ("lifecycle_display", "started_at", "last_heartbeat", "stopped_at", "uptime_display")},
|
|
212
|
+
),
|
|
213
|
+
]
|
|
214
|
+
|
|
215
|
+
# Add registered services section if available
|
|
216
|
+
if obj and obj.registered_services:
|
|
217
|
+
fieldsets.append(
|
|
218
|
+
(
|
|
219
|
+
"Registered Services",
|
|
220
|
+
{"fields": ("registered_services_display",), "classes": ("collapse",)},
|
|
221
|
+
)
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Add error section only if status is ERROR
|
|
225
|
+
if obj and obj.status == "error":
|
|
226
|
+
fieldsets.append(
|
|
227
|
+
(
|
|
228
|
+
"Error Details",
|
|
229
|
+
{"fields": ("error_display", "error_message")},
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
return fieldsets
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
__all__ = ["GRPCServerStatusAdmin"]
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django app configuration for gRPC integration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from django.apps import AppConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class GRPCAppConfig(AppConfig):
|
|
13
|
+
"""
|
|
14
|
+
Django app config for gRPC integration.
|
|
15
|
+
|
|
16
|
+
Provides:
|
|
17
|
+
- gRPC server with Django ORM integration
|
|
18
|
+
- JWT authentication
|
|
19
|
+
- Request logging to database
|
|
20
|
+
- Admin interface for monitoring
|
|
21
|
+
- REST API for metrics
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
default_auto_field = 'django.db.models.BigAutoField'
|
|
25
|
+
name = 'django_cfg.apps.integrations.grpc'
|
|
26
|
+
verbose_name = 'gRPC Integration'
|
|
27
|
+
|
|
28
|
+
def ready(self):
|
|
29
|
+
"""
|
|
30
|
+
Called when Django starts.
|
|
31
|
+
|
|
32
|
+
Validates that all required gRPC dependencies are installed.
|
|
33
|
+
"""
|
|
34
|
+
# Only check dependencies if we're running a command that needs gRPC
|
|
35
|
+
# (avoid breaking migrations, shell, etc.)
|
|
36
|
+
self._check_dependencies_if_needed()
|
|
37
|
+
|
|
38
|
+
# Import signal handlers if needed
|
|
39
|
+
# from . import signals
|
|
40
|
+
|
|
41
|
+
def _check_dependencies_if_needed(self):
|
|
42
|
+
"""
|
|
43
|
+
Check gRPC dependencies only when running gRPC-related commands.
|
|
44
|
+
|
|
45
|
+
Skips check for:
|
|
46
|
+
- Migrations (makemigrations, migrate)
|
|
47
|
+
- Shell commands (shell, shell_plus)
|
|
48
|
+
- Test discovery (test --help)
|
|
49
|
+
- Django checks (check)
|
|
50
|
+
- Management command listing (help)
|
|
51
|
+
"""
|
|
52
|
+
import sys
|
|
53
|
+
|
|
54
|
+
# Get command name from sys.argv
|
|
55
|
+
if len(sys.argv) < 2:
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
command = sys.argv[1]
|
|
59
|
+
|
|
60
|
+
# Commands that don't need gRPC dependencies
|
|
61
|
+
skip_commands = [
|
|
62
|
+
'makemigrations',
|
|
63
|
+
'migrate',
|
|
64
|
+
'shell',
|
|
65
|
+
'shell_plus',
|
|
66
|
+
'check',
|
|
67
|
+
'help',
|
|
68
|
+
'test',
|
|
69
|
+
'collectstatic',
|
|
70
|
+
'createsuperuser',
|
|
71
|
+
'changepassword',
|
|
72
|
+
'showmigrations',
|
|
73
|
+
'sqlmigrate',
|
|
74
|
+
'inspectdb',
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
# Skip check for these commands
|
|
78
|
+
if command in skip_commands:
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
# Also skip if running tests (pytest, nose, etc.)
|
|
82
|
+
if 'test' in sys.argv or 'pytest' in sys.argv[0]:
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
# Skip if DJANGO_SKIP_GRPC_CHECK environment variable is set
|
|
86
|
+
if os.environ.get('DJANGO_SKIP_GRPC_CHECK', '').lower() in ('1', 'true', 'yes'):
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
# For 'rungrpc' command, perform strict check
|
|
90
|
+
if command == 'rungrpc':
|
|
91
|
+
from ._cfg import check_grpc_dependencies
|
|
92
|
+
try:
|
|
93
|
+
check_grpc_dependencies(raise_on_missing=True)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
# Print error and exit
|
|
96
|
+
print(str(e))
|
|
97
|
+
sys.exit(1)
|
|
98
|
+
|
|
99
|
+
# For other commands, perform silent check (just import validation)
|
|
100
|
+
# This ensures basic imports work but doesn't block the command
|
|
101
|
+
else:
|
|
102
|
+
from ._cfg import check_grpc_dependencies
|
|
103
|
+
try:
|
|
104
|
+
# Silent check - only validates that checker itself works
|
|
105
|
+
check_grpc_dependencies(raise_on_missing=False)
|
|
106
|
+
except Exception:
|
|
107
|
+
# Silently ignore - don't break other commands
|
|
108
|
+
pass
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC authentication components.
|
|
3
|
+
|
|
4
|
+
Provides API key authentication for gRPC services.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .api_key_auth import (
|
|
8
|
+
ApiKeyAuthInterceptor,
|
|
9
|
+
get_current_grpc_user,
|
|
10
|
+
get_current_grpc_api_key,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"ApiKeyAuthInterceptor",
|
|
15
|
+
"get_current_grpc_user",
|
|
16
|
+
"get_current_grpc_api_key",
|
|
17
|
+
]
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Key Authentication Interceptor for gRPC.
|
|
3
|
+
|
|
4
|
+
Handles API key verification and Django user authentication for gRPC requests.
|
|
5
|
+
Simple, secure, and manageable through Django admin.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import contextvars
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Callable, Optional
|
|
12
|
+
|
|
13
|
+
import grpc
|
|
14
|
+
import grpc.aio
|
|
15
|
+
from django.conf import settings
|
|
16
|
+
from django.contrib.auth import get_user_model
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
User = get_user_model()
|
|
21
|
+
|
|
22
|
+
# Context variables for passing user/api_key between async interceptors
|
|
23
|
+
_grpc_user_var: contextvars.ContextVar = contextvars.ContextVar('grpc_user', default=None)
|
|
24
|
+
_grpc_api_key_var: contextvars.ContextVar = contextvars.ContextVar('grpc_api_key', default=None)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ApiKeyAuthInterceptor(grpc.aio.ServerInterceptor):
|
|
28
|
+
"""
|
|
29
|
+
gRPC interceptor for API key authentication.
|
|
30
|
+
|
|
31
|
+
Features:
|
|
32
|
+
- Validates API keys from database (GrpcApiKey model)
|
|
33
|
+
- Accepts Django SECRET_KEY for development/internal use
|
|
34
|
+
- Loads Django user from API key
|
|
35
|
+
- Sets user on request context
|
|
36
|
+
- Supports public methods whitelist
|
|
37
|
+
- Tracks API key usage
|
|
38
|
+
- Handles authentication errors gracefully
|
|
39
|
+
|
|
40
|
+
Example:
|
|
41
|
+
```python
|
|
42
|
+
# In Django settings (auto-configured by django-cfg)
|
|
43
|
+
GRPC_FRAMEWORK = {
|
|
44
|
+
"SERVER_INTERCEPTORS": [
|
|
45
|
+
"django_cfg.apps.integrations.grpc.auth.ApiKeyAuthInterceptor",
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
API Key Format:
|
|
51
|
+
x-api-key: <api_key_string>
|
|
52
|
+
|
|
53
|
+
Or for SECRET_KEY:
|
|
54
|
+
x-api-key: <Django SECRET_KEY>
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(self):
|
|
58
|
+
"""Initialize API key authentication interceptor."""
|
|
59
|
+
self.grpc_auth_config = getattr(settings, "GRPC_AUTH", {})
|
|
60
|
+
self.enabled = self.grpc_auth_config.get("enabled", True)
|
|
61
|
+
self.require_auth = self.grpc_auth_config.get("require_auth", False)
|
|
62
|
+
|
|
63
|
+
# API Key settings
|
|
64
|
+
self.api_key_header = self.grpc_auth_config.get("api_key_header", "x-api-key")
|
|
65
|
+
self.accept_django_secret_key = self.grpc_auth_config.get(
|
|
66
|
+
"accept_django_secret_key", True
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Public methods (don't require auth)
|
|
70
|
+
self.public_methods = self.grpc_auth_config.get("public_methods", [
|
|
71
|
+
"/grpc.health.v1.Health/Check",
|
|
72
|
+
"/grpc.health.v1.Health/Watch",
|
|
73
|
+
"/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo",
|
|
74
|
+
])
|
|
75
|
+
|
|
76
|
+
async def intercept_service(
|
|
77
|
+
self,
|
|
78
|
+
continuation: Callable,
|
|
79
|
+
handler_call_details: grpc.HandlerCallDetails
|
|
80
|
+
) -> grpc.RpcMethodHandler:
|
|
81
|
+
"""
|
|
82
|
+
Intercept gRPC service call for authentication (async).
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
continuation: Function to invoke the next interceptor or handler
|
|
86
|
+
handler_call_details: Details about the RPC call
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
RPC method handler (possibly wrapped with auth)
|
|
90
|
+
"""
|
|
91
|
+
# Skip if auth is disabled
|
|
92
|
+
if not self.enabled:
|
|
93
|
+
return await continuation(handler_call_details)
|
|
94
|
+
|
|
95
|
+
# Check if method is public
|
|
96
|
+
method_name = handler_call_details.method
|
|
97
|
+
if method_name in self.public_methods:
|
|
98
|
+
logger.debug(f"Public method accessed: {method_name}")
|
|
99
|
+
return await continuation(handler_call_details)
|
|
100
|
+
|
|
101
|
+
# Extract API key from metadata
|
|
102
|
+
api_key = self._extract_api_key(handler_call_details.invocation_metadata)
|
|
103
|
+
|
|
104
|
+
# If no API key provided
|
|
105
|
+
if not api_key:
|
|
106
|
+
if self.require_auth:
|
|
107
|
+
logger.warning(f"Missing API key for {method_name}")
|
|
108
|
+
return self._abort_unauthenticated("API key is required")
|
|
109
|
+
else:
|
|
110
|
+
# Allow anonymous access (no user/api_key in context)
|
|
111
|
+
logger.debug(f"No API key provided for {method_name}, allowing anonymous access")
|
|
112
|
+
return await continuation(handler_call_details)
|
|
113
|
+
|
|
114
|
+
# Verify API key and get user + api_key instance (async)
|
|
115
|
+
user, api_key_instance = await self._verify_api_key(api_key)
|
|
116
|
+
|
|
117
|
+
# If API key is valid, ALWAYS set user and api_key in context (even if require_auth=False)
|
|
118
|
+
if user:
|
|
119
|
+
logger.debug(f"Authenticated user {user.id} ({user.username}) for {method_name}")
|
|
120
|
+
return await self._continue_with_user(continuation, handler_call_details, user, api_key_instance)
|
|
121
|
+
|
|
122
|
+
# API key provided but invalid
|
|
123
|
+
if self.require_auth:
|
|
124
|
+
logger.warning(f"Invalid API key for {method_name}")
|
|
125
|
+
return self._abort_unauthenticated("Invalid or expired API key")
|
|
126
|
+
else:
|
|
127
|
+
# Allow anonymous access even with invalid key
|
|
128
|
+
logger.debug(f"Invalid API key for {method_name}, allowing anonymous access")
|
|
129
|
+
return await continuation(handler_call_details)
|
|
130
|
+
|
|
131
|
+
def _extract_api_key(self, metadata: tuple) -> Optional[str]:
|
|
132
|
+
"""
|
|
133
|
+
Extract API key from gRPC metadata.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
metadata: gRPC invocation metadata
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
API key string or None
|
|
140
|
+
"""
|
|
141
|
+
if not metadata:
|
|
142
|
+
return None
|
|
143
|
+
|
|
144
|
+
# Convert metadata to dict (case-insensitive lookup)
|
|
145
|
+
metadata_dict = dict(metadata)
|
|
146
|
+
|
|
147
|
+
# Get API key header (case-insensitive)
|
|
148
|
+
for key, value in metadata_dict.items():
|
|
149
|
+
if key.lower() == self.api_key_header.lower():
|
|
150
|
+
return value
|
|
151
|
+
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
async def _verify_api_key(self, api_key: str) -> tuple[Optional[User], Optional["GrpcApiKey"]]:
|
|
155
|
+
"""
|
|
156
|
+
Verify API key and return user and api_key instance (async).
|
|
157
|
+
|
|
158
|
+
Checks:
|
|
159
|
+
1. Django SECRET_KEY (if enabled)
|
|
160
|
+
2. GrpcApiKey model in database
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
api_key: API key string
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Tuple of (Django User instance or None, GrpcApiKey instance or None)
|
|
167
|
+
"""
|
|
168
|
+
# Check if it's Django SECRET_KEY
|
|
169
|
+
if self.accept_django_secret_key and api_key == settings.SECRET_KEY:
|
|
170
|
+
logger.debug("API key matches Django SECRET_KEY")
|
|
171
|
+
# For SECRET_KEY, return first superuser or None (no api_key instance)
|
|
172
|
+
try:
|
|
173
|
+
# Wrap Django ORM in asyncio.to_thread()
|
|
174
|
+
superuser = await asyncio.to_thread(
|
|
175
|
+
lambda: User.objects.filter(is_superuser=True, is_active=True).first()
|
|
176
|
+
)
|
|
177
|
+
if superuser:
|
|
178
|
+
return superuser, None
|
|
179
|
+
else:
|
|
180
|
+
logger.warning("No active superuser found for SECRET_KEY authentication")
|
|
181
|
+
return None, None
|
|
182
|
+
except Exception as e:
|
|
183
|
+
logger.error(f"Error loading superuser for SECRET_KEY: {e}")
|
|
184
|
+
return None, None
|
|
185
|
+
|
|
186
|
+
# Check API key in database
|
|
187
|
+
try:
|
|
188
|
+
from django_cfg.apps.integrations.grpc.models import GrpcApiKey
|
|
189
|
+
|
|
190
|
+
# Wrap Django ORM in asyncio.to_thread()
|
|
191
|
+
api_key_obj = await asyncio.to_thread(
|
|
192
|
+
lambda: GrpcApiKey.objects.filter(key=api_key, is_active=True).first()
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if api_key_obj and api_key_obj.is_valid:
|
|
196
|
+
# Update usage tracking (also wrapped in to_thread)
|
|
197
|
+
await asyncio.to_thread(api_key_obj.mark_used)
|
|
198
|
+
logger.debug(f"Valid API key for user {api_key_obj.user.id} ({api_key_obj.user.username})")
|
|
199
|
+
return api_key_obj.user, api_key_obj
|
|
200
|
+
else:
|
|
201
|
+
logger.debug("API key not found or invalid in database")
|
|
202
|
+
return None, None
|
|
203
|
+
|
|
204
|
+
except Exception as e:
|
|
205
|
+
logger.error(f"Error validating API key: {e}")
|
|
206
|
+
return None, None
|
|
207
|
+
|
|
208
|
+
async def _continue_with_user(
|
|
209
|
+
self,
|
|
210
|
+
continuation: Callable,
|
|
211
|
+
handler_call_details: grpc.HandlerCallDetails,
|
|
212
|
+
user: User,
|
|
213
|
+
api_key_instance: Optional["GrpcApiKey"] = None,
|
|
214
|
+
) -> grpc.RpcMethodHandler:
|
|
215
|
+
"""
|
|
216
|
+
Continue RPC with authenticated user and api_key in context (async).
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
continuation: Function to invoke next interceptor or handler
|
|
220
|
+
handler_call_details: Details about the RPC call
|
|
221
|
+
user: Authenticated Django user
|
|
222
|
+
api_key_instance: GrpcApiKey instance used for authentication (if applicable)
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
RPC method handler with user and api_key context
|
|
226
|
+
"""
|
|
227
|
+
# Get the handler (await because continuation is async)
|
|
228
|
+
handler = await continuation(handler_call_details)
|
|
229
|
+
|
|
230
|
+
if handler is None:
|
|
231
|
+
return None
|
|
232
|
+
|
|
233
|
+
# Wrap the handler to inject user and api_key into contextvars (not context directly)
|
|
234
|
+
# All wrappers must be async for grpc.aio
|
|
235
|
+
async def wrapped_unary_unary(request, context):
|
|
236
|
+
# Set context variables for async context
|
|
237
|
+
_grpc_user_var.set(user)
|
|
238
|
+
_grpc_api_key_var.set(api_key_instance)
|
|
239
|
+
logger.info(f"[Auth] Set contextvar api_key = {api_key_instance} (user={user})")
|
|
240
|
+
return await handler.unary_unary(request, context)
|
|
241
|
+
|
|
242
|
+
async def wrapped_unary_stream(request, context):
|
|
243
|
+
# Set context variables for async context
|
|
244
|
+
_grpc_user_var.set(user)
|
|
245
|
+
_grpc_api_key_var.set(api_key_instance)
|
|
246
|
+
logger.info(f"[Auth] Set contextvar api_key = {api_key_instance} (user={user})")
|
|
247
|
+
async for response in handler.unary_stream(request, context):
|
|
248
|
+
yield response
|
|
249
|
+
|
|
250
|
+
async def wrapped_stream_unary(request_iterator, context):
|
|
251
|
+
# Set context variables for async context
|
|
252
|
+
_grpc_user_var.set(user)
|
|
253
|
+
_grpc_api_key_var.set(api_key_instance)
|
|
254
|
+
return await handler.stream_unary(request_iterator, context)
|
|
255
|
+
|
|
256
|
+
async def wrapped_stream_stream(request_iterator, context):
|
|
257
|
+
# Set context variables for async context
|
|
258
|
+
_grpc_user_var.set(user)
|
|
259
|
+
_grpc_api_key_var.set(api_key_instance)
|
|
260
|
+
async for response in handler.stream_stream(request_iterator, context):
|
|
261
|
+
yield response
|
|
262
|
+
|
|
263
|
+
# Return wrapped handler based on type
|
|
264
|
+
return grpc.unary_unary_rpc_method_handler(
|
|
265
|
+
wrapped_unary_unary,
|
|
266
|
+
request_deserializer=handler.request_deserializer,
|
|
267
|
+
response_serializer=handler.response_serializer,
|
|
268
|
+
) if handler.unary_unary else (
|
|
269
|
+
grpc.unary_stream_rpc_method_handler(
|
|
270
|
+
wrapped_unary_stream,
|
|
271
|
+
request_deserializer=handler.request_deserializer,
|
|
272
|
+
response_serializer=handler.response_serializer,
|
|
273
|
+
) if handler.unary_stream else (
|
|
274
|
+
grpc.stream_unary_rpc_method_handler(
|
|
275
|
+
wrapped_stream_unary,
|
|
276
|
+
request_deserializer=handler.request_deserializer,
|
|
277
|
+
response_serializer=handler.response_serializer,
|
|
278
|
+
) if handler.stream_unary else (
|
|
279
|
+
grpc.stream_stream_rpc_method_handler(
|
|
280
|
+
wrapped_stream_stream,
|
|
281
|
+
request_deserializer=handler.request_deserializer,
|
|
282
|
+
response_serializer=handler.response_serializer,
|
|
283
|
+
) if handler.stream_stream else None
|
|
284
|
+
)
|
|
285
|
+
)
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def _abort_unauthenticated(self, message: str) -> grpc.RpcMethodHandler:
|
|
289
|
+
"""
|
|
290
|
+
Return handler that aborts with UNAUTHENTICATED status.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
message: Error message
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
RPC method handler that aborts
|
|
297
|
+
"""
|
|
298
|
+
def abort(*args, **kwargs):
|
|
299
|
+
context = args[1] if len(args) > 1 else None
|
|
300
|
+
if context:
|
|
301
|
+
context.abort(grpc.StatusCode.UNAUTHENTICATED, message)
|
|
302
|
+
|
|
303
|
+
return grpc.unary_unary_rpc_method_handler(
|
|
304
|
+
abort,
|
|
305
|
+
request_deserializer=lambda x: x,
|
|
306
|
+
response_serializer=lambda x: x,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
__all__ = ["ApiKeyAuthInterceptor", "get_current_grpc_user", "get_current_grpc_api_key"]
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def get_current_grpc_user():
|
|
314
|
+
"""Get current gRPC user from context variables (async-safe)."""
|
|
315
|
+
return _grpc_user_var.get()
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def get_current_grpc_api_key():
|
|
319
|
+
"""Get current gRPC API key from context variables (async-safe)."""
|
|
320
|
+
return _grpc_api_key_var.get()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC interceptors for logging, metrics, and error handling.
|
|
3
|
+
|
|
4
|
+
Provides production-ready interceptors for gRPC services.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .errors import ErrorHandlingInterceptor
|
|
8
|
+
from .logging import LoggingInterceptor
|
|
9
|
+
from .metrics import MetricsInterceptor, get_metrics, reset_metrics
|
|
10
|
+
from .request_logger import RequestLoggerInterceptor
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"LoggingInterceptor",
|
|
14
|
+
"MetricsInterceptor",
|
|
15
|
+
"ErrorHandlingInterceptor",
|
|
16
|
+
"RequestLoggerInterceptor",
|
|
17
|
+
"get_metrics",
|
|
18
|
+
"reset_metrics",
|
|
19
|
+
]
|