django-cfg 1.5.20__py3-none-any.whl → 1.5.31__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.

Files changed (98) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/integrations/centrifugo/__init__.py +2 -0
  3. django_cfg/apps/integrations/centrifugo/services/client/client.py +1 -1
  4. django_cfg/apps/integrations/centrifugo/services/logging.py +90 -14
  5. django_cfg/apps/integrations/centrifugo/views/admin_api.py +29 -32
  6. django_cfg/apps/integrations/centrifugo/views/testing_api.py +47 -43
  7. django_cfg/apps/integrations/centrifugo/views/wrapper.py +41 -29
  8. django_cfg/apps/integrations/grpc/auth/api_key_auth.py +11 -10
  9. django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +1 -1
  10. django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +22 -36
  11. django_cfg/apps/integrations/grpc/managers/grpc_request_log.py +84 -0
  12. django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +126 -3
  13. django_cfg/apps/integrations/grpc/models/grpc_api_key.py +7 -1
  14. django_cfg/apps/integrations/grpc/models/grpc_server_status.py +22 -3
  15. django_cfg/apps/integrations/grpc/services/__init__.py +102 -17
  16. django_cfg/apps/integrations/grpc/services/centrifugo/bridge.py +469 -0
  17. django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/demo.py +1 -1
  18. django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/test_publish.py +4 -4
  19. django_cfg/apps/integrations/grpc/services/client/__init__.py +26 -0
  20. django_cfg/apps/integrations/grpc/services/commands/IMPLEMENTATION.md +456 -0
  21. django_cfg/apps/integrations/grpc/services/commands/README.md +252 -0
  22. django_cfg/apps/integrations/grpc/services/commands/__init__.py +93 -0
  23. django_cfg/apps/integrations/grpc/services/commands/base.py +243 -0
  24. django_cfg/apps/integrations/grpc/services/commands/examples/__init__.py +22 -0
  25. django_cfg/apps/integrations/grpc/services/commands/examples/base_client.py +228 -0
  26. django_cfg/apps/integrations/grpc/services/commands/examples/client.py +272 -0
  27. django_cfg/apps/integrations/grpc/services/commands/examples/config.py +177 -0
  28. django_cfg/apps/integrations/grpc/services/commands/examples/start.py +125 -0
  29. django_cfg/apps/integrations/grpc/services/commands/examples/stop.py +101 -0
  30. django_cfg/apps/integrations/grpc/services/commands/registry.py +170 -0
  31. django_cfg/apps/integrations/grpc/services/discovery/__init__.py +39 -0
  32. django_cfg/apps/integrations/grpc/services/{discovery.py → discovery/discovery.py} +62 -55
  33. django_cfg/apps/integrations/grpc/services/{service_registry.py → discovery/registry.py} +216 -5
  34. django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/metrics.py +3 -3
  35. django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/request_logger.py +10 -13
  36. django_cfg/apps/integrations/grpc/services/management/__init__.py +37 -0
  37. django_cfg/apps/integrations/grpc/services/monitoring/__init__.py +38 -0
  38. django_cfg/apps/integrations/grpc/services/{monitoring_service.py → monitoring/monitoring.py} +2 -2
  39. django_cfg/apps/integrations/grpc/services/{testing_service.py → monitoring/testing.py} +5 -5
  40. django_cfg/apps/integrations/grpc/services/rendering/__init__.py +27 -0
  41. django_cfg/apps/integrations/grpc/services/{chart_generator.py → rendering/charts.py} +1 -1
  42. django_cfg/apps/integrations/grpc/services/routing/__init__.py +59 -0
  43. django_cfg/apps/integrations/grpc/services/routing/config.py +76 -0
  44. django_cfg/apps/integrations/grpc/services/routing/router.py +430 -0
  45. django_cfg/apps/integrations/grpc/services/streaming/__init__.py +117 -0
  46. django_cfg/apps/integrations/grpc/services/streaming/config.py +451 -0
  47. django_cfg/apps/integrations/grpc/services/streaming/service.py +651 -0
  48. django_cfg/apps/integrations/grpc/services/streaming/types.py +367 -0
  49. django_cfg/apps/integrations/grpc/utils/__init__.py +58 -1
  50. django_cfg/apps/integrations/grpc/utils/converters.py +565 -0
  51. django_cfg/apps/integrations/grpc/utils/handlers.py +242 -0
  52. django_cfg/apps/integrations/grpc/utils/proto_gen.py +1 -1
  53. django_cfg/apps/integrations/grpc/utils/streaming_logger.py +55 -8
  54. django_cfg/apps/integrations/grpc/views/charts.py +1 -1
  55. django_cfg/apps/integrations/grpc/views/config.py +1 -1
  56. django_cfg/core/base/config_model.py +11 -0
  57. django_cfg/core/builders/middleware_builder.py +5 -0
  58. django_cfg/management/commands/pool_status.py +153 -0
  59. django_cfg/middleware/pool_cleanup.py +261 -0
  60. django_cfg/models/api/grpc/config.py +2 -2
  61. django_cfg/models/infrastructure/database/config.py +16 -0
  62. django_cfg/models/infrastructure/database/converters.py +2 -0
  63. django_cfg/modules/django_admin/utils/html/composition.py +57 -13
  64. django_cfg/modules/django_admin/utils/html_builder.py +1 -0
  65. django_cfg/modules/django_client/core/generator/typescript/files_generator.py +12 -0
  66. django_cfg/modules/django_client/core/generator/typescript/generator.py +8 -0
  67. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/function.ts.jinja +22 -0
  68. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -0
  69. django_cfg/modules/django_client/core/generator/typescript/templates/utils/validation-events.ts.jinja +133 -0
  70. django_cfg/modules/django_client/core/groups/manager.py +25 -18
  71. django_cfg/modules/django_client/management/commands/generate_client.py +9 -5
  72. django_cfg/modules/django_client/urls.py +38 -5
  73. django_cfg/modules/django_logging/django_logger.py +58 -19
  74. django_cfg/modules/django_twilio/email_otp.py +3 -1
  75. django_cfg/modules/django_twilio/sms.py +3 -1
  76. django_cfg/modules/django_twilio/unified.py +6 -2
  77. django_cfg/modules/django_twilio/whatsapp.py +3 -1
  78. django_cfg/pyproject.toml +3 -3
  79. django_cfg/static/frontend/admin.zip +0 -0
  80. django_cfg/templates/admin/index.html +17 -57
  81. django_cfg/utils/pool_monitor.py +320 -0
  82. django_cfg/utils/smart_defaults.py +233 -7
  83. {django_cfg-1.5.20.dist-info → django_cfg-1.5.31.dist-info}/METADATA +75 -5
  84. {django_cfg-1.5.20.dist-info → django_cfg-1.5.31.dist-info}/RECORD +97 -68
  85. django_cfg/apps/integrations/grpc/centrifugo/bridge.py +0 -277
  86. /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/__init__.py +0 -0
  87. /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/config.py +0 -0
  88. /django_cfg/apps/integrations/grpc/{centrifugo → services/centrifugo}/transformers.py +0 -0
  89. /django_cfg/apps/integrations/grpc/services/{grpc_client.py → client/client.py} +0 -0
  90. /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/__init__.py +0 -0
  91. /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/centrifugo.py +0 -0
  92. /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/errors.py +0 -0
  93. /django_cfg/apps/integrations/grpc/{interceptors → services/interceptors}/logging.py +0 -0
  94. /django_cfg/apps/integrations/grpc/services/{config_helper.py → management/config_helper.py} +0 -0
  95. /django_cfg/apps/integrations/grpc/services/{proto_files_manager.py → management/proto_manager.py} +0 -0
  96. {django_cfg-1.5.20.dist-info → django_cfg-1.5.31.dist-info}/WHEEL +0 -0
  97. {django_cfg-1.5.20.dist-info → django_cfg-1.5.31.dist-info}/entry_points.txt +0 -0
  98. {django_cfg-1.5.20.dist-info → django_cfg-1.5.31.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 ..models import GRPCRequestLog
371
- from ..auth import get_current_grpc_user, get_current_grpc_api_key
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 (wrap Django ORM in asyncio.to_thread)
384
- log_entry = await asyncio.to_thread(
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 ..models import GRPCRequestLog
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
- # Wrap Django ORM in asyncio.to_thread
426
- await asyncio.to_thread(
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 ..models import GRPCRequestLog
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
- # Wrap Django ORM in asyncio.to_thread
454
- await asyncio.to_thread(
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
+ ]
@@ -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 ..models import GRPCRequestLog, GRPCServerStatus
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 ..models import GRPCRequestLog
14
- from ..testing import get_example
15
- from .service_registry import ServiceRegistryManager
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 .grpc_client import DynamicGRPCClient
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 ..models import GRPCRequestLog, GRPCServerStatus
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}"