django-cfg 1.5.20__py3-none-any.whl → 1.5.29__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 +1 -1
- django_cfg/apps/integrations/centrifugo/__init__.py +2 -0
- django_cfg/apps/integrations/centrifugo/services/client/client.py +1 -1
- django_cfg/apps/integrations/centrifugo/services/logging.py +47 -0
- django_cfg/apps/integrations/centrifugo/views/admin_api.py +29 -32
- django_cfg/apps/integrations/centrifugo/views/testing_api.py +31 -37
- django_cfg/apps/integrations/centrifugo/views/wrapper.py +25 -23
- django_cfg/apps/integrations/grpc/auth/api_key_auth.py +11 -10
- django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +1 -1
- django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +21 -36
- django_cfg/apps/integrations/grpc/managers/grpc_request_log.py +84 -0
- django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +126 -3
- django_cfg/apps/integrations/grpc/models/grpc_api_key.py +7 -1
- django_cfg/apps/integrations/grpc/models/grpc_server_status.py +22 -3
- django_cfg/apps/integrations/grpc/services/__init__.py +102 -17
- django_cfg/apps/integrations/grpc/services/centrifugo/bridge.py +469 -0
- django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/demo.py +1 -1
- django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/test_publish.py +4 -4
- django_cfg/apps/integrations/grpc/services/client/__init__.py +26 -0
- django_cfg/apps/integrations/grpc/services/commands/IMPLEMENTATION.md +456 -0
- django_cfg/apps/integrations/grpc/services/commands/README.md +252 -0
- django_cfg/apps/integrations/grpc/services/commands/__init__.py +93 -0
- django_cfg/apps/integrations/grpc/services/commands/base.py +243 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/__init__.py +22 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/base_client.py +228 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/client.py +272 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/config.py +177 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/start.py +125 -0
- django_cfg/apps/integrations/grpc/services/commands/examples/stop.py +101 -0
- django_cfg/apps/integrations/grpc/services/commands/registry.py +170 -0
- django_cfg/apps/integrations/grpc/services/discovery/__init__.py +39 -0
- django_cfg/apps/integrations/grpc/services/{discovery.py → discovery/discovery.py} +62 -55
- django_cfg/apps/integrations/grpc/services/{service_registry.py → discovery/registry.py} +215 -5
- django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/metrics.py +3 -3
- django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/request_logger.py +10 -13
- django_cfg/apps/integrations/grpc/services/management/__init__.py +37 -0
- django_cfg/apps/integrations/grpc/services/monitoring/__init__.py +38 -0
- django_cfg/apps/integrations/grpc/services/{monitoring_service.py → monitoring/monitoring.py} +2 -2
- django_cfg/apps/integrations/grpc/services/{testing_service.py → monitoring/testing.py} +5 -5
- django_cfg/apps/integrations/grpc/services/rendering/__init__.py +27 -0
- django_cfg/apps/integrations/grpc/services/{chart_generator.py → rendering/charts.py} +1 -1
- django_cfg/apps/integrations/grpc/services/routing/__init__.py +59 -0
- django_cfg/apps/integrations/grpc/services/routing/config.py +76 -0
- django_cfg/apps/integrations/grpc/services/routing/router.py +430 -0
- django_cfg/apps/integrations/grpc/services/streaming/__init__.py +117 -0
- django_cfg/apps/integrations/grpc/services/streaming/config.py +451 -0
- django_cfg/apps/integrations/grpc/services/streaming/service.py +651 -0
- django_cfg/apps/integrations/grpc/services/streaming/types.py +367 -0
- django_cfg/apps/integrations/grpc/utils/__init__.py +58 -1
- django_cfg/apps/integrations/grpc/utils/converters.py +565 -0
- django_cfg/apps/integrations/grpc/utils/handlers.py +242 -0
- django_cfg/apps/integrations/grpc/utils/proto_gen.py +1 -1
- django_cfg/apps/integrations/grpc/utils/streaming_logger.py +55 -8
- django_cfg/apps/integrations/grpc/views/charts.py +1 -1
- django_cfg/apps/integrations/grpc/views/config.py +1 -1
- django_cfg/core/base/config_model.py +11 -0
- django_cfg/core/builders/middleware_builder.py +5 -0
- django_cfg/management/commands/pool_status.py +153 -0
- django_cfg/middleware/pool_cleanup.py +261 -0
- django_cfg/models/api/grpc/config.py +2 -2
- django_cfg/models/infrastructure/database/config.py +16 -0
- django_cfg/models/infrastructure/database/converters.py +2 -0
- django_cfg/modules/django_admin/utils/html/composition.py +57 -13
- django_cfg/modules/django_admin/utils/html_builder.py +1 -0
- django_cfg/modules/django_client/core/groups/manager.py +25 -18
- django_cfg/modules/django_client/management/commands/generate_client.py +9 -5
- django_cfg/modules/django_logging/django_logger.py +58 -19
- django_cfg/pyproject.toml +3 -3
- django_cfg/static/frontend/admin.zip +0 -0
- django_cfg/templates/admin/index.html +0 -39
- django_cfg/utils/pool_monitor.py +320 -0
- django_cfg/utils/smart_defaults.py +233 -7
- {django_cfg-1.5.20.dist-info → django_cfg-1.5.29.dist-info}/METADATA +75 -5
- {django_cfg-1.5.20.dist-info → django_cfg-1.5.29.dist-info}/RECORD +87 -59
- django_cfg/apps/integrations/grpc/centrifugo/bridge.py +0 -277
- /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/__init__.py +0 -0
- /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/config.py +0 -0
- /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/transformers.py +0 -0
- /django_cfg/apps/integrations/grpc/services/{grpc_client.py → client/client.py} +0 -0
- /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/__init__.py +0 -0
- /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/centrifugo.py +0 -0
- /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/errors.py +0 -0
- /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/logging.py +0 -0
- /django_cfg/apps/integrations/grpc/services/{config_helper.py → management/config_helper.py} +0 -0
- /django_cfg/apps/integrations/grpc/services/{proto_files_manager.py → management/proto_manager.py} +0 -0
- {django_cfg-1.5.20.dist-info → django_cfg-1.5.29.dist-info}/WHEEL +0 -0
- {django_cfg-1.5.20.dist-info → django_cfg-1.5.29.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.5.20.dist-info → django_cfg-1.5.29.dist-info}/licenses/LICENSE +0 -0
|
@@ -367,8 +367,8 @@ class RequestLoggerInterceptor(grpc.aio.ServerInterceptor):
|
|
|
367
367
|
):
|
|
368
368
|
"""Create initial log entry in database (async)."""
|
|
369
369
|
try:
|
|
370
|
-
from
|
|
371
|
-
from
|
|
370
|
+
from ...models import GRPCRequestLog
|
|
371
|
+
from ...auth import get_current_grpc_user, get_current_grpc_api_key
|
|
372
372
|
|
|
373
373
|
# Get user and api_key from contextvars (set by ApiKeyAuthInterceptor)
|
|
374
374
|
user = get_current_grpc_user()
|
|
@@ -380,9 +380,8 @@ class RequestLoggerInterceptor(grpc.aio.ServerInterceptor):
|
|
|
380
380
|
# Extract client IP from peer
|
|
381
381
|
client_ip = self._extract_ip_from_peer(peer)
|
|
382
382
|
|
|
383
|
-
# Create log entry (
|
|
384
|
-
log_entry = await
|
|
385
|
-
GRPCRequestLog.objects.create,
|
|
383
|
+
# Create log entry (Django 5.2: Native async ORM)
|
|
384
|
+
log_entry = await GRPCRequestLog.objects.acreate(
|
|
386
385
|
request_id=request_id,
|
|
387
386
|
service_name=service_name,
|
|
388
387
|
method_name=method_name,
|
|
@@ -416,15 +415,14 @@ class RequestLoggerInterceptor(grpc.aio.ServerInterceptor):
|
|
|
416
415
|
return
|
|
417
416
|
|
|
418
417
|
try:
|
|
419
|
-
from
|
|
418
|
+
from ...models import GRPCRequestLog
|
|
420
419
|
|
|
421
420
|
# Prepare response data
|
|
422
421
|
if response:
|
|
423
422
|
response_data = self._serialize_message(response)
|
|
424
423
|
|
|
425
|
-
#
|
|
426
|
-
await
|
|
427
|
-
GRPCRequestLog.objects.mark_success,
|
|
424
|
+
# Django 5.2: Use async manager method
|
|
425
|
+
await GRPCRequestLog.objects.amark_success(
|
|
428
426
|
log_entry,
|
|
429
427
|
duration_ms=duration_ms,
|
|
430
428
|
response_data=response_data,
|
|
@@ -445,14 +443,13 @@ class RequestLoggerInterceptor(grpc.aio.ServerInterceptor):
|
|
|
445
443
|
return
|
|
446
444
|
|
|
447
445
|
try:
|
|
448
|
-
from
|
|
446
|
+
from ...models import GRPCRequestLog
|
|
449
447
|
|
|
450
448
|
# Get gRPC status code
|
|
451
449
|
grpc_code = self._get_grpc_code(error, context)
|
|
452
450
|
|
|
453
|
-
#
|
|
454
|
-
await
|
|
455
|
-
GRPCRequestLog.objects.mark_error,
|
|
451
|
+
# Django 5.2: Use async manager method
|
|
452
|
+
await GRPCRequestLog.objects.amark_error(
|
|
456
453
|
log_entry,
|
|
457
454
|
grpc_status_code=grpc_code,
|
|
458
455
|
error_message=str(error),
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC service management utilities.
|
|
3
|
+
|
|
4
|
+
This package provides tools for managing protobuf files, configuration,
|
|
5
|
+
and service lifecycle.
|
|
6
|
+
|
|
7
|
+
**Components**:
|
|
8
|
+
- proto_manager: Protobuf file management and compilation
|
|
9
|
+
- config_helper: Configuration utilities for gRPC services
|
|
10
|
+
|
|
11
|
+
**Usage Example**:
|
|
12
|
+
```python
|
|
13
|
+
from django_cfg.apps.integrations.grpc.services.management import (
|
|
14
|
+
ProtoFilesManager,
|
|
15
|
+
ConfigHelper,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# Manage proto files
|
|
19
|
+
proto_mgr = ProtoFilesManager()
|
|
20
|
+
proto_mgr.compile_all()
|
|
21
|
+
|
|
22
|
+
# Configuration helpers
|
|
23
|
+
config = ConfigHelper.get_grpc_config()
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Created: 2025-11-07
|
|
27
|
+
Status: %%PRODUCTION%%
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
# Export when modules are refactored
|
|
31
|
+
# from .proto_manager import ProtoFilesManager
|
|
32
|
+
# from .config_helper import ConfigHelper
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
# 'ProtoFilesManager',
|
|
36
|
+
# 'ConfigHelper',
|
|
37
|
+
]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC service monitoring and testing utilities.
|
|
3
|
+
|
|
4
|
+
This package provides tools for monitoring gRPC service health,
|
|
5
|
+
performance, and testing service functionality.
|
|
6
|
+
|
|
7
|
+
**Components**:
|
|
8
|
+
- monitoring: Service health monitoring and metrics
|
|
9
|
+
- testing: Testing utilities for gRPC services
|
|
10
|
+
|
|
11
|
+
**Usage Example**:
|
|
12
|
+
```python
|
|
13
|
+
from django_cfg.apps.integrations.grpc.services.monitoring import (
|
|
14
|
+
MonitoringService,
|
|
15
|
+
TestingService,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# Monitor service health
|
|
19
|
+
monitor = MonitoringService()
|
|
20
|
+
health = monitor.check_health()
|
|
21
|
+
|
|
22
|
+
# Test service
|
|
23
|
+
tester = TestingService()
|
|
24
|
+
results = tester.run_tests()
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Created: 2025-11-07
|
|
28
|
+
Status: %%PRODUCTION%%
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# Export when modules are refactored
|
|
32
|
+
# from .monitoring import MonitoringService
|
|
33
|
+
# from .testing import TestingService
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
# 'MonitoringService',
|
|
37
|
+
# 'TestingService',
|
|
38
|
+
]
|
django_cfg/apps/integrations/grpc/services/{monitoring_service.py → monitoring/monitoring.py}
RENAMED
|
@@ -12,8 +12,8 @@ from django.db.models import Avg, Count, Max
|
|
|
12
12
|
from django.db.models.functions import TruncDay, TruncHour
|
|
13
13
|
from django_cfg.modules.django_logging import get_logger
|
|
14
14
|
|
|
15
|
-
from
|
|
16
|
-
from .config_helper import get_grpc_server_config
|
|
15
|
+
from ...models import GRPCRequestLog, GRPCServerStatus
|
|
16
|
+
from ..management.config_helper import get_grpc_server_config
|
|
17
17
|
|
|
18
18
|
logger = get_logger("grpc.monitoring_service")
|
|
19
19
|
|
|
@@ -10,9 +10,9 @@ from django.db import models
|
|
|
10
10
|
from django.db.models import Count
|
|
11
11
|
from django_cfg.modules.django_logging import get_logger
|
|
12
12
|
|
|
13
|
-
from
|
|
14
|
-
from
|
|
15
|
-
from .
|
|
13
|
+
from ...models import GRPCRequestLog
|
|
14
|
+
from ...testing import get_example
|
|
15
|
+
from ..discovery.registry import ServiceRegistryManager
|
|
16
16
|
|
|
17
17
|
logger = get_logger("grpc.testing_service")
|
|
18
18
|
|
|
@@ -197,8 +197,8 @@ class TestingService:
|
|
|
197
197
|
import grpc
|
|
198
198
|
from time import time
|
|
199
199
|
|
|
200
|
-
from .
|
|
201
|
-
from .config_helper import get_grpc_server_config
|
|
200
|
+
from ..client.client import DynamicGRPCClient
|
|
201
|
+
from ..management.config_helper import get_grpc_server_config
|
|
202
202
|
|
|
203
203
|
# Get gRPC server config
|
|
204
204
|
grpc_config = get_grpc_server_config()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
gRPC content rendering services.
|
|
3
|
+
|
|
4
|
+
This package provides tools for generating charts, graphs, and other
|
|
5
|
+
visual content for gRPC responses.
|
|
6
|
+
|
|
7
|
+
**Components**:
|
|
8
|
+
- charts: Chart generation service
|
|
9
|
+
|
|
10
|
+
**Usage Example**:
|
|
11
|
+
```python
|
|
12
|
+
from django_cfg.apps.integrations.grpc.services.rendering import ChartGenerator
|
|
13
|
+
|
|
14
|
+
generator = ChartGenerator()
|
|
15
|
+
chart_data = generator.generate_chart(data=timeseries, chart_type="line")
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Created: 2025-11-07
|
|
19
|
+
Status: %%PRODUCTION%%
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# Export when modules are refactored
|
|
23
|
+
# from .charts import ChartGenerator
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
# 'ChartGenerator',
|
|
27
|
+
]
|
|
@@ -13,7 +13,7 @@ from django.db.models import Avg, Count, Max, Min, Q
|
|
|
13
13
|
from django.db.models.functions import TruncDay, TruncHour
|
|
14
14
|
from django.utils import timezone
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from ...models import GRPCRequestLog, GRPCServerStatus
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class ChartGeneratorService:
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cross-process command routing for Django multi-process architecture.
|
|
3
|
+
|
|
4
|
+
This package provides automatic routing between direct calls (same process)
|
|
5
|
+
and gRPC calls (cross-process) for scenarios where Django runs multiple processes
|
|
6
|
+
(e.g., runserver + rungrpc).
|
|
7
|
+
|
|
8
|
+
**Components**:
|
|
9
|
+
- router: CrossProcessCommandRouter implementation
|
|
10
|
+
- CrossProcessConfig: Pydantic configuration model
|
|
11
|
+
|
|
12
|
+
**Usage Example**:
|
|
13
|
+
```python
|
|
14
|
+
from django_cfg.apps.integrations.grpc.services.routing import (
|
|
15
|
+
CrossProcessCommandRouter,
|
|
16
|
+
CrossProcessConfig,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
# Configure router
|
|
20
|
+
config = CrossProcessConfig(
|
|
21
|
+
grpc_host="localhost",
|
|
22
|
+
grpc_port=50051,
|
|
23
|
+
rpc_method_name="SendCommandToClient",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# Create router with factories
|
|
27
|
+
router = CrossProcessCommandRouter(
|
|
28
|
+
config=config,
|
|
29
|
+
get_service_instance=lambda: get_global_service(),
|
|
30
|
+
stub_factory=create_grpc_stub,
|
|
31
|
+
request_factory=create_request,
|
|
32
|
+
extract_success=lambda r: r.success,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
# Route commands (automatically chooses direct vs gRPC)
|
|
36
|
+
await router.send_command("client_123", command_pb)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Created: 2025-11-07
|
|
40
|
+
Status: %%PRODUCTION%%
|
|
41
|
+
Phase: Phase 1 - Universal Components
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
# Config can be imported directly (no grpc dependency)
|
|
45
|
+
from .config import CrossProcessConfig
|
|
46
|
+
|
|
47
|
+
# Lazy import for router (requires grpc)
|
|
48
|
+
def __getattr__(name):
|
|
49
|
+
"""Lazy import router to avoid grpc dependency."""
|
|
50
|
+
if name == 'CrossProcessCommandRouter':
|
|
51
|
+
from .router import CrossProcessCommandRouter
|
|
52
|
+
return CrossProcessCommandRouter
|
|
53
|
+
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
__all__ = [
|
|
57
|
+
'CrossProcessConfig',
|
|
58
|
+
'CrossProcessCommandRouter',
|
|
59
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration for cross-process command routing.
|
|
3
|
+
|
|
4
|
+
This module provides Pydantic configuration models without gRPC dependencies.
|
|
5
|
+
|
|
6
|
+
Created: 2025-11-07
|
|
7
|
+
Status: %%PRODUCTION%%
|
|
8
|
+
Phase: Phase 1 - Universal Components
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# ============================================================================
|
|
15
|
+
# Configuration
|
|
16
|
+
# ============================================================================
|
|
17
|
+
|
|
18
|
+
class CrossProcessConfig(BaseModel):
|
|
19
|
+
"""
|
|
20
|
+
Configuration for cross-process command routing.
|
|
21
|
+
|
|
22
|
+
**Parameters**:
|
|
23
|
+
grpc_host: gRPC server host (usually "localhost")
|
|
24
|
+
grpc_port: gRPC server port
|
|
25
|
+
rpc_method_name: Name of RPC method to call (e.g., "SendCommandToBot")
|
|
26
|
+
timeout: Timeout for gRPC calls in seconds
|
|
27
|
+
enable_logging: Enable detailed logging
|
|
28
|
+
|
|
29
|
+
**Example**:
|
|
30
|
+
```python
|
|
31
|
+
config = CrossProcessConfig(
|
|
32
|
+
grpc_host="localhost",
|
|
33
|
+
grpc_port=50051,
|
|
34
|
+
rpc_method_name="SendCommandToClient",
|
|
35
|
+
timeout=5.0,
|
|
36
|
+
)
|
|
37
|
+
```
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
grpc_host: str = Field(
|
|
41
|
+
default="localhost",
|
|
42
|
+
description="gRPC server host",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
grpc_port: int = Field(
|
|
46
|
+
gt=0,
|
|
47
|
+
le=65535,
|
|
48
|
+
description="gRPC server port (1-65535)",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
rpc_method_name: str = Field(
|
|
52
|
+
min_length=1,
|
|
53
|
+
description="Name of RPC method for cross-process calls",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
timeout: float = Field(
|
|
57
|
+
default=5.0,
|
|
58
|
+
gt=0.0,
|
|
59
|
+
le=60.0,
|
|
60
|
+
description="Timeout for gRPC calls in seconds",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
enable_logging: bool = Field(
|
|
64
|
+
default=True,
|
|
65
|
+
description="Enable detailed logging",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
model_config = {
|
|
69
|
+
'extra': 'forbid',
|
|
70
|
+
'frozen': True,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def grpc_address(self) -> str:
|
|
75
|
+
"""Get full gRPC address (host:port)."""
|
|
76
|
+
return f"{self.grpc_host}:{self.grpc_port}"
|