django-cfg 1.5.8__py3-none-any.whl → 1.5.20__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 (159) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/api/commands/serializers.py +152 -0
  3. django_cfg/apps/api/commands/views.py +32 -0
  4. django_cfg/apps/business/accounts/management/commands/otp_test.py +5 -2
  5. django_cfg/apps/business/accounts/serializers/profile.py +42 -0
  6. django_cfg/apps/business/agents/management/commands/create_agent.py +5 -194
  7. django_cfg/apps/business/agents/management/commands/load_agent_templates.py +205 -0
  8. django_cfg/apps/business/agents/management/commands/orchestrator_status.py +4 -2
  9. django_cfg/apps/business/knowbase/management/commands/knowbase_stats.py +4 -2
  10. django_cfg/apps/business/knowbase/management/commands/setup_knowbase.py +4 -2
  11. django_cfg/apps/business/newsletter/management/commands/test_newsletter.py +5 -2
  12. django_cfg/apps/business/payments/management/commands/check_payment_status.py +4 -2
  13. django_cfg/apps/business/payments/management/commands/create_payment.py +4 -2
  14. django_cfg/apps/business/payments/management/commands/sync_currencies.py +4 -2
  15. django_cfg/apps/business/support/serializers.py +3 -2
  16. django_cfg/apps/integrations/centrifugo/apps.py +2 -1
  17. django_cfg/apps/integrations/centrifugo/codegen/generators/typescript_thin/templates/rpc-client.ts.j2 +151 -12
  18. django_cfg/apps/integrations/centrifugo/management/commands/generate_centrifugo_clients.py +6 -6
  19. django_cfg/apps/integrations/centrifugo/serializers/__init__.py +2 -1
  20. django_cfg/apps/integrations/centrifugo/serializers/publishes.py +22 -2
  21. django_cfg/apps/integrations/centrifugo/services/__init__.py +6 -0
  22. django_cfg/apps/integrations/centrifugo/services/client/__init__.py +6 -1
  23. django_cfg/apps/integrations/centrifugo/services/client/direct_client.py +282 -0
  24. django_cfg/apps/integrations/centrifugo/services/publisher.py +371 -0
  25. django_cfg/apps/integrations/centrifugo/services/token_generator.py +122 -0
  26. django_cfg/apps/integrations/centrifugo/urls.py +8 -0
  27. django_cfg/apps/integrations/centrifugo/views/__init__.py +2 -0
  28. django_cfg/apps/integrations/centrifugo/views/monitoring.py +25 -40
  29. django_cfg/apps/integrations/centrifugo/views/testing_api.py +0 -79
  30. django_cfg/apps/integrations/centrifugo/views/token_api.py +101 -0
  31. django_cfg/apps/integrations/centrifugo/views/wrapper.py +257 -0
  32. django_cfg/apps/integrations/grpc/admin/__init__.py +7 -1
  33. django_cfg/apps/integrations/grpc/admin/config.py +113 -9
  34. django_cfg/apps/integrations/grpc/admin/grpc_api_key.py +129 -0
  35. django_cfg/apps/integrations/grpc/admin/grpc_request_log.py +72 -63
  36. django_cfg/apps/integrations/grpc/admin/grpc_server_status.py +236 -0
  37. django_cfg/apps/integrations/grpc/auth/__init__.py +11 -3
  38. django_cfg/apps/integrations/grpc/auth/api_key_auth.py +320 -0
  39. django_cfg/apps/integrations/grpc/centrifugo/__init__.py +29 -0
  40. django_cfg/apps/integrations/grpc/centrifugo/bridge.py +277 -0
  41. django_cfg/apps/integrations/grpc/centrifugo/config.py +167 -0
  42. django_cfg/apps/integrations/grpc/centrifugo/demo.py +626 -0
  43. django_cfg/apps/integrations/grpc/centrifugo/test_publish.py +229 -0
  44. django_cfg/apps/integrations/grpc/centrifugo/transformers.py +89 -0
  45. django_cfg/apps/integrations/grpc/interceptors/__init__.py +3 -1
  46. django_cfg/apps/integrations/grpc/interceptors/centrifugo.py +541 -0
  47. django_cfg/apps/integrations/grpc/interceptors/logging.py +17 -20
  48. django_cfg/apps/integrations/grpc/interceptors/metrics.py +15 -14
  49. django_cfg/apps/integrations/grpc/interceptors/request_logger.py +79 -59
  50. django_cfg/apps/integrations/grpc/management/commands/compile_proto.py +105 -0
  51. django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +185 -0
  52. django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +474 -95
  53. django_cfg/apps/integrations/grpc/management/commands/test_grpc_integration.py +75 -0
  54. django_cfg/apps/integrations/grpc/management/proto/__init__.py +3 -0
  55. django_cfg/apps/integrations/grpc/management/proto/compiler.py +194 -0
  56. django_cfg/apps/integrations/grpc/managers/__init__.py +2 -0
  57. django_cfg/apps/integrations/grpc/managers/grpc_api_key.py +192 -0
  58. django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +19 -11
  59. django_cfg/apps/integrations/grpc/migrations/0005_grpcapikey.py +143 -0
  60. django_cfg/apps/integrations/grpc/migrations/0006_grpcrequestlog_api_key_and_more.py +34 -0
  61. django_cfg/apps/integrations/grpc/models/__init__.py +2 -0
  62. django_cfg/apps/integrations/grpc/models/grpc_api_key.py +198 -0
  63. django_cfg/apps/integrations/grpc/models/grpc_request_log.py +11 -0
  64. django_cfg/apps/integrations/grpc/models/grpc_server_status.py +39 -4
  65. django_cfg/apps/integrations/grpc/serializers/__init__.py +22 -6
  66. django_cfg/apps/integrations/grpc/serializers/api_keys.py +63 -0
  67. django_cfg/apps/integrations/grpc/serializers/charts.py +118 -120
  68. django_cfg/apps/integrations/grpc/serializers/config.py +65 -51
  69. django_cfg/apps/integrations/grpc/serializers/health.py +7 -7
  70. django_cfg/apps/integrations/grpc/serializers/proto_files.py +74 -0
  71. django_cfg/apps/integrations/grpc/serializers/requests.py +13 -7
  72. django_cfg/apps/integrations/grpc/serializers/service_registry.py +181 -112
  73. django_cfg/apps/integrations/grpc/serializers/services.py +14 -32
  74. django_cfg/apps/integrations/grpc/serializers/stats.py +50 -12
  75. django_cfg/apps/integrations/grpc/serializers/testing.py +66 -58
  76. django_cfg/apps/integrations/grpc/services/__init__.py +2 -0
  77. django_cfg/apps/integrations/grpc/services/discovery.py +7 -1
  78. django_cfg/apps/integrations/grpc/services/monitoring_service.py +149 -43
  79. django_cfg/apps/integrations/grpc/services/proto_files_manager.py +268 -0
  80. django_cfg/apps/integrations/grpc/services/service_registry.py +48 -46
  81. django_cfg/apps/integrations/grpc/services/testing_service.py +10 -15
  82. django_cfg/apps/integrations/grpc/urls.py +8 -0
  83. django_cfg/apps/integrations/grpc/utils/SERVER_LOGGING.md +164 -0
  84. django_cfg/apps/integrations/grpc/utils/__init__.py +4 -13
  85. django_cfg/apps/integrations/grpc/utils/integration_test.py +334 -0
  86. django_cfg/apps/integrations/grpc/utils/proto_gen.py +48 -8
  87. django_cfg/apps/integrations/grpc/utils/streaming_logger.py +378 -0
  88. django_cfg/apps/integrations/grpc/views/__init__.py +4 -0
  89. django_cfg/apps/integrations/grpc/views/api_keys.py +255 -0
  90. django_cfg/apps/integrations/grpc/views/charts.py +21 -14
  91. django_cfg/apps/integrations/grpc/views/config.py +8 -6
  92. django_cfg/apps/integrations/grpc/views/monitoring.py +51 -79
  93. django_cfg/apps/integrations/grpc/views/proto_files.py +214 -0
  94. django_cfg/apps/integrations/grpc/views/services.py +30 -21
  95. django_cfg/apps/integrations/grpc/views/testing.py +45 -43
  96. django_cfg/apps/integrations/rq/views/jobs.py +19 -9
  97. django_cfg/apps/integrations/rq/views/schedule.py +7 -3
  98. django_cfg/apps/system/dashboard/serializers/commands.py +25 -1
  99. django_cfg/apps/system/dashboard/serializers/config.py +95 -9
  100. django_cfg/apps/system/dashboard/serializers/statistics.py +9 -4
  101. django_cfg/apps/system/dashboard/services/commands_service.py +12 -1
  102. django_cfg/apps/system/frontend/views.py +87 -6
  103. django_cfg/apps/system/maintenance/management/commands/maintenance.py +5 -2
  104. django_cfg/apps/system/maintenance/management/commands/process_scheduled_maintenance.py +4 -2
  105. django_cfg/apps/system/maintenance/management/commands/sync_cloudflare.py +5 -2
  106. django_cfg/config.py +33 -0
  107. django_cfg/core/builders/security_builder.py +1 -0
  108. django_cfg/core/generation/integration_generators/api.py +2 -0
  109. django_cfg/core/generation/integration_generators/grpc_generator.py +30 -32
  110. django_cfg/management/commands/check_endpoints.py +2 -2
  111. django_cfg/management/commands/check_settings.py +3 -10
  112. django_cfg/management/commands/clear_constance.py +3 -10
  113. django_cfg/management/commands/create_token.py +4 -11
  114. django_cfg/management/commands/list_urls.py +4 -10
  115. django_cfg/management/commands/migrate_all.py +18 -12
  116. django_cfg/management/commands/migrator.py +4 -11
  117. django_cfg/management/commands/script.py +4 -10
  118. django_cfg/management/commands/show_config.py +8 -16
  119. django_cfg/management/commands/show_urls.py +5 -11
  120. django_cfg/management/commands/superuser.py +4 -11
  121. django_cfg/management/commands/tree.py +5 -10
  122. django_cfg/management/utils/README.md +402 -0
  123. django_cfg/management/utils/__init__.py +29 -0
  124. django_cfg/management/utils/mixins.py +176 -0
  125. django_cfg/middleware/pagination.py +53 -54
  126. django_cfg/models/api/grpc/__init__.py +15 -21
  127. django_cfg/models/api/grpc/config.py +155 -73
  128. django_cfg/models/ngrok/config.py +7 -6
  129. django_cfg/modules/django_client/core/generator/python/files_generator.py +5 -13
  130. django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +16 -4
  131. django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +2 -3
  132. django_cfg/modules/django_client/core/generator/typescript/files_generator.py +6 -5
  133. django_cfg/modules/django_client/core/generator/typescript/generator.py +26 -0
  134. django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +7 -1
  135. django_cfg/modules/django_client/core/generator/typescript/models_generator.py +5 -0
  136. django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +11 -0
  137. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/fetchers.ts.jinja +1 -0
  138. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/function.ts.jinja +29 -1
  139. django_cfg/modules/django_client/core/generator/typescript/templates/hooks/hooks.ts.jinja +4 -0
  140. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +12 -8
  141. django_cfg/modules/django_client/core/ir/schema.py +15 -1
  142. django_cfg/modules/django_client/core/parser/base.py +126 -30
  143. django_cfg/modules/django_client/management/commands/generate_client.py +5 -2
  144. django_cfg/modules/django_client/management/commands/validate_openapi.py +5 -2
  145. django_cfg/modules/django_email/management/commands/test_email.py +4 -10
  146. django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +16 -13
  147. django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -11
  148. django_cfg/modules/django_twilio/management/commands/test_twilio.py +4 -11
  149. django_cfg/modules/django_unfold/navigation.py +6 -18
  150. django_cfg/pyproject.toml +1 -1
  151. django_cfg/registry/modules.py +1 -4
  152. django_cfg/requirements.txt +52 -0
  153. django_cfg/static/frontend/admin.zip +0 -0
  154. {django_cfg-1.5.8.dist-info → django_cfg-1.5.20.dist-info}/METADATA +1 -1
  155. {django_cfg-1.5.8.dist-info → django_cfg-1.5.20.dist-info}/RECORD +158 -121
  156. django_cfg/apps/integrations/grpc/auth/jwt_auth.py +0 -295
  157. {django_cfg-1.5.8.dist-info → django_cfg-1.5.20.dist-info}/WHEEL +0 -0
  158. {django_cfg-1.5.8.dist-info → django_cfg-1.5.20.dist-info}/entry_points.txt +0 -0
  159. {django_cfg-1.5.8.dist-info → django_cfg-1.5.20.dist-info}/licenses/LICENSE +0 -0
@@ -1,202 +1,200 @@
1
1
  """
2
- Pydantic serializers for gRPC charts and statistics data.
2
+ DRF serializers for gRPC charts and statistics data.
3
3
 
4
4
  These serializers define the structure for chart endpoints
5
5
  that provide time-series data for visualization.
6
6
  """
7
7
 
8
- from typing import List, Optional
8
+ from rest_framework import serializers
9
9
 
10
- from pydantic import BaseModel, Field
11
10
 
12
-
13
- class TimeSeriesDataPoint(BaseModel):
11
+ class TimeSeriesDataPoint(serializers.Serializer):
14
12
  """Single data point in time series."""
15
13
 
16
- timestamp: str = Field(..., description="ISO timestamp")
17
- value: float = Field(..., description="Value at this timestamp")
18
- label: Optional[str] = Field(None, description="Optional label for this point")
14
+ timestamp = serializers.CharField(help_text="ISO timestamp")
15
+ value = serializers.FloatField(help_text="Value at this timestamp")
16
+ label = serializers.CharField(
17
+ required=False, allow_null=True, help_text="Optional label for this point"
18
+ )
19
19
 
20
20
 
21
- class ServerUptimeDataPoint(BaseModel):
21
+ class ServerUptimeDataPoint(serializers.Serializer):
22
22
  """Server uptime data point."""
23
23
 
24
- timestamp: str = Field(..., description="ISO timestamp")
25
- server_count: int = Field(..., description="Number of running servers")
26
- servers: List[str] = Field(
27
- default_factory=list, description="List of server addresses"
24
+ timestamp = serializers.CharField(help_text="ISO timestamp")
25
+ server_count = serializers.IntegerField(help_text="Number of running servers")
26
+ servers = serializers.ListField(
27
+ child=serializers.CharField(), default=list, help_text="List of server addresses"
28
28
  )
29
29
 
30
30
 
31
- class RequestVolumeDataPoint(BaseModel):
31
+ class RequestVolumeDataPoint(serializers.Serializer):
32
32
  """Request volume data point."""
33
33
 
34
- timestamp: str = Field(..., description="ISO timestamp")
35
- total_requests: int = Field(..., description="Total requests in period")
36
- successful_requests: int = Field(..., description="Successful requests")
37
- failed_requests: int = Field(..., description="Failed requests")
38
- success_rate: float = Field(..., description="Success rate percentage")
34
+ timestamp = serializers.CharField(help_text="ISO timestamp")
35
+ total_requests = serializers.IntegerField(help_text="Total requests in period")
36
+ successful_requests = serializers.IntegerField(help_text="Successful requests")
37
+ failed_requests = serializers.IntegerField(help_text="Failed requests")
38
+ success_rate = serializers.FloatField(help_text="Success rate percentage")
39
39
 
40
40
 
41
- class ResponseTimeDataPoint(BaseModel):
41
+ class ResponseTimeDataPoint(serializers.Serializer):
42
42
  """Response time statistics data point."""
43
43
 
44
- timestamp: str = Field(..., description="ISO timestamp")
45
- avg_duration_ms: float = Field(..., description="Average duration")
46
- p50_duration_ms: float = Field(..., description="P50 percentile")
47
- p95_duration_ms: float = Field(..., description="P95 percentile")
48
- p99_duration_ms: float = Field(..., description="P99 percentile")
49
- min_duration_ms: float = Field(..., description="Minimum duration")
50
- max_duration_ms: float = Field(..., description="Maximum duration")
44
+ timestamp = serializers.CharField(help_text="ISO timestamp")
45
+ avg_duration_ms = serializers.FloatField(help_text="Average duration")
46
+ p50_duration_ms = serializers.FloatField(help_text="P50 percentile")
47
+ p95_duration_ms = serializers.FloatField(help_text="P95 percentile")
48
+ p99_duration_ms = serializers.FloatField(help_text="P99 percentile")
49
+ min_duration_ms = serializers.FloatField(help_text="Minimum duration")
50
+ max_duration_ms = serializers.FloatField(help_text="Maximum duration")
51
51
 
52
52
 
53
- class ServiceActivityDataPoint(BaseModel):
53
+ class ServiceActivityDataPoint(serializers.Serializer):
54
54
  """Service activity data point."""
55
55
 
56
- service_name: str = Field(..., description="Service name")
57
- request_count: int = Field(..., description="Number of requests")
58
- success_rate: float = Field(..., description="Success rate percentage")
59
- avg_duration_ms: float = Field(..., description="Average duration")
56
+ service_name = serializers.CharField(help_text="Service name")
57
+ request_count = serializers.IntegerField(help_text="Number of requests")
58
+ success_rate = serializers.FloatField(help_text="Success rate percentage")
59
+ avg_duration_ms = serializers.FloatField(help_text="Average duration")
60
60
 
61
61
 
62
- class ServerLifecycleEvent(BaseModel):
62
+ class ServerLifecycleEvent(serializers.Serializer):
63
63
  """Server lifecycle event."""
64
64
 
65
- timestamp: str = Field(..., description="Event timestamp")
66
- event_type: str = Field(
67
- ..., description="Event type (started, stopped, error)"
65
+ timestamp = serializers.CharField(help_text="Event timestamp")
66
+ event_type = serializers.CharField(
67
+ help_text="Event type (started, stopped, error)"
68
+ )
69
+ server_address = serializers.CharField(help_text="Server address")
70
+ server_pid = serializers.IntegerField(help_text="Server process ID")
71
+ uptime_seconds = serializers.IntegerField(
72
+ required=False,
73
+ allow_null=True,
74
+ help_text="Uptime at event time (for stop events)",
68
75
  )
69
- server_address: str = Field(..., description="Server address")
70
- server_pid: int = Field(..., description="Server process ID")
71
- uptime_seconds: Optional[int] = Field(
72
- None, description="Uptime at event time (for stop events)"
76
+ error_message = serializers.CharField(
77
+ required=False, allow_null=True, help_text="Error message if applicable"
73
78
  )
74
- error_message: Optional[str] = Field(None, description="Error message if applicable")
75
79
 
76
80
 
77
- class TimeSeriesChartData(BaseModel):
81
+ class TimeSeriesChartData(serializers.Serializer):
78
82
  """Generic time series chart data."""
79
83
 
80
- title: str = Field(..., description="Chart title")
81
- series_name: str = Field(..., description="Series name")
82
- data_points: List[TimeSeriesDataPoint] = Field(
83
- default_factory=list, description="Data points"
84
- )
85
- period_hours: int = Field(..., description="Period in hours")
86
- granularity: str = Field(
87
- ..., description="Data granularity (hour, day, week)"
88
- )
84
+ title = serializers.CharField(help_text="Chart title")
85
+ series_name = serializers.CharField(help_text="Series name")
86
+ data_points = TimeSeriesDataPoint(many=True, default=list, help_text="Data points")
87
+ period_hours = serializers.IntegerField(help_text="Period in hours")
88
+ granularity = serializers.CharField(help_text="Data granularity (hour, day, week)")
89
89
 
90
90
 
91
- class ServerUptimeChartSerializer(BaseModel):
91
+ class ServerUptimeChartSerializer(serializers.Serializer):
92
92
  """Server uptime over time chart data."""
93
93
 
94
- title: str = Field(default="Server Uptime", description="Chart title")
95
- data_points: List[ServerUptimeDataPoint] = Field(
96
- default_factory=list, description="Uptime data points"
94
+ title = serializers.CharField(default="Server Uptime", help_text="Chart title")
95
+ data_points = ServerUptimeDataPoint(
96
+ many=True, default=list, help_text="Uptime data points"
97
97
  )
98
- period_hours: int = Field(..., description="Period in hours")
99
- granularity: str = Field(..., description="Data granularity")
100
- total_servers: int = Field(..., description="Total unique servers in period")
101
- currently_running: int = Field(..., description="Currently running servers")
98
+ period_hours = serializers.IntegerField(help_text="Period in hours")
99
+ granularity = serializers.CharField(help_text="Data granularity")
100
+ total_servers = serializers.IntegerField(
101
+ help_text="Total unique servers in period"
102
+ )
103
+ currently_running = serializers.IntegerField(help_text="Currently running servers")
102
104
 
103
105
 
104
- class RequestVolumeChartSerializer(BaseModel):
106
+ class RequestVolumeChartSerializer(serializers.Serializer):
105
107
  """Request volume over time chart data."""
106
108
 
107
- title: str = Field(default="Request Volume", description="Chart title")
108
- data_points: List[RequestVolumeDataPoint] = Field(
109
- default_factory=list, description="Volume data points"
109
+ title = serializers.CharField(default="Request Volume", help_text="Chart title")
110
+ data_points = RequestVolumeDataPoint(
111
+ many=True, default=list, help_text="Volume data points"
110
112
  )
111
- period_hours: int = Field(..., description="Period in hours")
112
- granularity: str = Field(..., description="Data granularity")
113
- total_requests: int = Field(..., description="Total requests in period")
114
- avg_success_rate: float = Field(..., description="Average success rate")
113
+ period_hours = serializers.IntegerField(help_text="Period in hours")
114
+ granularity = serializers.CharField(help_text="Data granularity")
115
+ total_requests = serializers.IntegerField(help_text="Total requests in period")
116
+ avg_success_rate = serializers.FloatField(help_text="Average success rate")
115
117
 
116
118
 
117
- class ResponseTimeChartSerializer(BaseModel):
119
+ class ResponseTimeChartSerializer(serializers.Serializer):
118
120
  """Response time over time chart data."""
119
121
 
120
- title: str = Field(default="Response Time", description="Chart title")
121
- data_points: List[ResponseTimeDataPoint] = Field(
122
- default_factory=list, description="Response time data points"
122
+ title = serializers.CharField(default="Response Time", help_text="Chart title")
123
+ data_points = ResponseTimeDataPoint(
124
+ many=True, default=list, help_text="Response time data points"
123
125
  )
124
- period_hours: int = Field(..., description="Period in hours")
125
- granularity: str = Field(..., description="Data granularity")
126
- overall_avg_ms: float = Field(..., description="Overall average duration")
127
- overall_p95_ms: float = Field(..., description="Overall P95 duration")
126
+ period_hours = serializers.IntegerField(help_text="Period in hours")
127
+ granularity = serializers.CharField(help_text="Data granularity")
128
+ overall_avg_ms = serializers.FloatField(help_text="Overall average duration")
129
+ overall_p95_ms = serializers.FloatField(help_text="Overall P95 duration")
128
130
 
129
131
 
130
- class ServiceActivityChartSerializer(BaseModel):
132
+ class ServiceActivityChartSerializer(serializers.Serializer):
131
133
  """Service activity comparison chart data."""
132
134
 
133
- title: str = Field(default="Service Activity", description="Chart title")
134
- services: List[ServiceActivityDataPoint] = Field(
135
- default_factory=list, description="Service activity data"
135
+ title = serializers.CharField(default="Service Activity", help_text="Chart title")
136
+ services = ServiceActivityDataPoint(
137
+ many=True, default=list, help_text="Service activity data"
136
138
  )
137
- period_hours: int = Field(..., description="Period in hours")
138
- total_services: int = Field(..., description="Total number of services")
139
- most_active_service: Optional[str] = Field(
140
- None, description="Most active service name"
139
+ period_hours = serializers.IntegerField(help_text="Period in hours")
140
+ total_services = serializers.IntegerField(help_text="Total number of services")
141
+ most_active_service = serializers.CharField(
142
+ required=False, allow_null=True, help_text="Most active service name"
141
143
  )
142
144
 
143
145
 
144
- class ServerLifecycleChartSerializer(BaseModel):
146
+ class ServerLifecycleChartSerializer(serializers.Serializer):
145
147
  """Server lifecycle events timeline."""
146
148
 
147
- title: str = Field(default="Server Lifecycle", description="Chart title")
148
- events: List[ServerLifecycleEvent] = Field(
149
- default_factory=list, description="Lifecycle events"
149
+ title = serializers.CharField(default="Server Lifecycle", help_text="Chart title")
150
+ events = ServerLifecycleEvent(
151
+ many=True, default=list, help_text="Lifecycle events"
150
152
  )
151
- period_hours: int = Field(..., description="Period in hours")
152
- total_events: int = Field(..., description="Total number of events")
153
- restart_count: int = Field(..., description="Number of server restarts")
154
- error_count: int = Field(..., description="Number of error events")
153
+ period_hours = serializers.IntegerField(help_text="Period in hours")
154
+ total_events = serializers.IntegerField(help_text="Total number of events")
155
+ restart_count = serializers.IntegerField(help_text="Number of server restarts")
156
+ error_count = serializers.IntegerField(help_text="Number of error events")
155
157
 
156
158
 
157
- class ErrorDistributionDataPoint(BaseModel):
159
+ class ErrorDistributionDataPoint(serializers.Serializer):
158
160
  """Error distribution data point."""
159
161
 
160
- error_code: str = Field(..., description="gRPC status code")
161
- count: int = Field(..., description="Number of occurrences")
162
- percentage: float = Field(..., description="Percentage of total errors")
163
- service_name: Optional[str] = Field(None, description="Service name if filtered")
162
+ error_code = serializers.CharField(help_text="gRPC status code")
163
+ count = serializers.IntegerField(help_text="Number of occurrences")
164
+ percentage = serializers.FloatField(help_text="Percentage of total errors")
165
+ service_name = serializers.CharField(
166
+ required=False, allow_null=True, help_text="Service name if filtered"
167
+ )
164
168
 
165
169
 
166
- class ErrorDistributionChartSerializer(BaseModel):
170
+ class ErrorDistributionChartSerializer(serializers.Serializer):
167
171
  """Error distribution chart data."""
168
172
 
169
- title: str = Field(default="Error Distribution", description="Chart title")
170
- error_types: List[ErrorDistributionDataPoint] = Field(
171
- default_factory=list, description="Error distribution data"
173
+ title = serializers.CharField(default="Error Distribution", help_text="Chart title")
174
+ error_types = ErrorDistributionDataPoint(
175
+ many=True, default=list, help_text="Error distribution data"
172
176
  )
173
- period_hours: int = Field(..., description="Period in hours")
174
- total_errors: int = Field(..., description="Total number of errors")
175
- most_common_error: Optional[str] = Field(
176
- None, description="Most common error code"
177
+ period_hours = serializers.IntegerField(help_text="Period in hours")
178
+ total_errors = serializers.IntegerField(help_text="Total number of errors")
179
+ most_common_error = serializers.CharField(
180
+ required=False, allow_null=True, help_text="Most common error code"
177
181
  )
178
182
 
179
183
 
180
- class DashboardChartsSerializer(BaseModel):
184
+ class DashboardChartsSerializer(serializers.Serializer):
181
185
  """Combined dashboard charts data."""
182
186
 
183
- server_uptime: ServerUptimeChartSerializer = Field(
184
- ..., description="Server uptime chart"
185
- )
186
- request_volume: RequestVolumeChartSerializer = Field(
187
- ..., description="Request volume chart"
188
- )
189
- response_time: ResponseTimeChartSerializer = Field(
190
- ..., description="Response time chart"
191
- )
192
- service_activity: ServiceActivityChartSerializer = Field(
193
- ..., description="Service activity chart"
187
+ server_uptime = ServerUptimeChartSerializer(help_text="Server uptime chart")
188
+ request_volume = RequestVolumeChartSerializer(help_text="Request volume chart")
189
+ response_time = ResponseTimeChartSerializer(help_text="Response time chart")
190
+ service_activity = ServiceActivityChartSerializer(help_text="Service activity chart")
191
+ error_distribution = ErrorDistributionChartSerializer(
192
+ help_text="Error distribution chart"
194
193
  )
195
- error_distribution: ErrorDistributionChartSerializer = Field(
196
- ..., description="Error distribution chart"
194
+ period_hours = serializers.IntegerField(
195
+ help_text="Period in hours for all charts"
197
196
  )
198
- period_hours: int = Field(..., description="Period in hours for all charts")
199
- generated_at: str = Field(..., description="When data was generated")
197
+ generated_at = serializers.CharField(help_text="When data was generated")
200
198
 
201
199
 
202
200
  __all__ = [
@@ -1,97 +1,111 @@
1
1
  """
2
- Pydantic serializers for gRPC configuration and server info.
2
+ DRF serializers for gRPC configuration and server info.
3
3
 
4
4
  These serializers define the structure for configuration and server
5
5
  information endpoints.
6
6
  """
7
7
 
8
- from typing import List, Optional
8
+ from rest_framework import serializers
9
9
 
10
- from pydantic import BaseModel, Field
11
10
 
12
-
13
- class GRPCServerConfigSerializer(BaseModel):
11
+ class GRPCServerConfigSerializer(serializers.Serializer):
14
12
  """gRPC server configuration details."""
15
13
 
16
- host: str = Field(..., description="Server host address")
17
- port: int = Field(..., description="Server port")
18
- enabled: bool = Field(..., description="Whether gRPC server is enabled")
19
- max_workers: int = Field(..., description="Maximum worker threads")
20
- max_concurrent_rpcs: Optional[int] = Field(
21
- None, description="Maximum concurrent RPCs"
14
+ host = serializers.CharField(help_text="Server host address")
15
+ port = serializers.IntegerField(help_text="Server port")
16
+ enabled = serializers.BooleanField(help_text="Whether gRPC server is enabled")
17
+ max_concurrent_streams = serializers.IntegerField(
18
+ allow_null=True, required=False, help_text="Maximum concurrent streams (async server)"
19
+ )
20
+ max_concurrent_rpcs = serializers.IntegerField(
21
+ allow_null=True, required=False, help_text="Maximum concurrent RPCs"
22
22
  )
23
23
 
24
24
 
25
- class GRPCFrameworkConfigSerializer(BaseModel):
25
+ class GRPCFrameworkConfigSerializer(serializers.Serializer):
26
26
  """gRPC framework configuration details."""
27
27
 
28
- enabled: bool = Field(..., description="Whether framework is enabled")
29
- auto_discover: bool = Field(..., description="Auto-discover services")
30
- services_path: str = Field(..., description="Services discovery path pattern")
31
- interceptors: List[str] = Field(
32
- default_factory=list, description="Registered interceptors"
28
+ enabled = serializers.BooleanField(help_text="Whether framework is enabled")
29
+ auto_discover = serializers.BooleanField(help_text="Auto-discover services")
30
+ services_path = serializers.CharField(help_text="Services discovery path pattern")
31
+ interceptors = serializers.ListField(
32
+ child=serializers.CharField(),
33
+ default=list,
34
+ help_text="Registered interceptors",
33
35
  )
34
36
 
35
37
 
36
- class GRPCFeaturesSerializer(BaseModel):
38
+ class GRPCFeaturesSerializer(serializers.Serializer):
37
39
  """gRPC features configuration."""
38
40
 
39
- jwt_auth: bool = Field(..., description="JWT authentication enabled")
40
- request_logging: bool = Field(..., description="Request logging enabled")
41
- metrics: bool = Field(..., description="Metrics collection enabled")
42
- reflection: bool = Field(..., description="gRPC reflection enabled")
41
+ api_key_auth = serializers.BooleanField(help_text="API key authentication enabled")
42
+ request_logging = serializers.BooleanField(help_text="Request logging enabled")
43
+ metrics = serializers.BooleanField(help_text="Metrics collection enabled")
44
+ reflection = serializers.BooleanField(help_text="gRPC reflection enabled")
43
45
 
44
46
 
45
- class GRPCConfigSerializer(BaseModel):
47
+ class GRPCConfigSerializer(serializers.Serializer):
46
48
  """Complete gRPC configuration response."""
47
49
 
48
- server: GRPCServerConfigSerializer = Field(..., description="Server configuration")
49
- framework: GRPCFrameworkConfigSerializer = Field(
50
- ..., description="Framework configuration"
50
+ server = GRPCServerConfigSerializer(help_text="Server configuration")
51
+ framework = GRPCFrameworkConfigSerializer(help_text="Framework configuration")
52
+ features = GRPCFeaturesSerializer(help_text="Feature flags")
53
+ registered_services = serializers.IntegerField(
54
+ help_text="Number of registered services"
51
55
  )
52
- features: GRPCFeaturesSerializer = Field(..., description="Feature flags")
53
- registered_services: int = Field(..., description="Number of registered services")
54
- total_methods: int = Field(..., description="Total number of methods")
56
+ total_methods = serializers.IntegerField(help_text="Total number of methods")
55
57
 
56
58
 
57
- class GRPCServiceInfoSerializer(BaseModel):
59
+ class GRPCServiceInfoSerializer(serializers.Serializer):
58
60
  """Information about a single gRPC service."""
59
61
 
60
- name: str = Field(..., description="Service name")
61
- methods: List[str] = Field(default_factory=list, description="Service methods")
62
- full_name: str = Field(..., description="Full service name with package")
63
- description: str = Field("", description="Service description")
62
+ name = serializers.CharField(help_text="Service name")
63
+ methods = serializers.ListField(
64
+ child=serializers.CharField(), default=list, help_text="Service methods"
65
+ )
66
+ full_name = serializers.CharField(help_text="Full service name with package")
67
+ description = serializers.CharField(
68
+ default="", allow_blank=True, help_text="Service description"
69
+ )
64
70
 
65
71
 
66
- class GRPCInterceptorInfoSerializer(BaseModel):
72
+ class GRPCInterceptorInfoSerializer(serializers.Serializer):
67
73
  """Information about an interceptor."""
68
74
 
69
- name: str = Field(..., description="Interceptor name")
70
- enabled: bool = Field(..., description="Whether interceptor is enabled")
75
+ name = serializers.CharField(help_text="Interceptor name")
76
+ enabled = serializers.BooleanField(help_text="Whether interceptor is enabled")
71
77
 
72
78
 
73
- class GRPCStatsSerializer(BaseModel):
79
+ class GRPCStatsSerializer(serializers.Serializer):
74
80
  """Runtime statistics summary."""
75
81
 
76
- total_requests: int = Field(..., description="Total number of requests")
77
- success_rate: float = Field(..., description="Success rate percentage")
78
- avg_duration_ms: float = Field(..., description="Average duration in milliseconds")
82
+ total_requests = serializers.IntegerField(help_text="Total number of requests")
83
+ success_rate = serializers.FloatField(help_text="Success rate percentage")
84
+ avg_duration_ms = serializers.FloatField(
85
+ help_text="Average duration in milliseconds"
86
+ )
79
87
 
80
88
 
81
- class GRPCServerInfoSerializer(BaseModel):
89
+ class GRPCServerInfoSerializer(serializers.Serializer):
82
90
  """Complete gRPC server information response."""
83
91
 
84
- server_status: str = Field(..., description="Server status (running, stopped)")
85
- address: str = Field(..., description="Server address (host:port)")
86
- started_at: Optional[str] = Field(None, description="Server start timestamp")
87
- uptime_seconds: Optional[int] = Field(None, description="Server uptime in seconds")
88
- services: List[GRPCServiceInfoSerializer] = Field(
89
- default_factory=list, description="Registered services"
92
+ server_status = serializers.CharField(
93
+ help_text="Server status (running, stopped)"
94
+ )
95
+ address = serializers.CharField(help_text="Server address (host:port)")
96
+ started_at = serializers.CharField(
97
+ allow_null=True, required=False, help_text="Server start timestamp"
98
+ )
99
+ uptime_seconds = serializers.IntegerField(
100
+ allow_null=True, required=False, help_text="Server uptime in seconds"
101
+ )
102
+ services = GRPCServiceInfoSerializer(
103
+ many=True, default=list, help_text="Registered services"
90
104
  )
91
- interceptors: List[GRPCInterceptorInfoSerializer] = Field(
92
- default_factory=list, description="Active interceptors"
105
+ interceptors = GRPCInterceptorInfoSerializer(
106
+ many=True, default=list, help_text="Active interceptors"
93
107
  )
94
- stats: GRPCStatsSerializer = Field(..., description="Runtime statistics")
108
+ stats = GRPCStatsSerializer(help_text="Runtime statistics")
95
109
 
96
110
 
97
111
  __all__ = [
@@ -2,17 +2,17 @@
2
2
  Health check serializer for gRPC monitoring API.
3
3
  """
4
4
 
5
- from pydantic import BaseModel, Field
5
+ from rest_framework import serializers
6
6
 
7
7
 
8
- class GRPCHealthCheckSerializer(BaseModel):
8
+ class GRPCHealthCheckSerializer(serializers.Serializer):
9
9
  """gRPC health check response."""
10
10
 
11
- status: str = Field(description="Health status: healthy or unhealthy")
12
- server_host: str = Field(description="Configured gRPC server host")
13
- server_port: int = Field(description="Configured gRPC server port")
14
- enabled: bool = Field(description="Whether gRPC is enabled")
15
- timestamp: str = Field(description="Current timestamp")
11
+ status = serializers.CharField(help_text="Health status: healthy or unhealthy")
12
+ server_host = serializers.CharField(help_text="Configured gRPC server host")
13
+ server_port = serializers.IntegerField(help_text="Configured gRPC server port")
14
+ enabled = serializers.BooleanField(help_text="Whether gRPC is enabled")
15
+ timestamp = serializers.CharField(help_text="Current timestamp")
16
16
 
17
17
 
18
18
  __all__ = ["GRPCHealthCheckSerializer"]
@@ -0,0 +1,74 @@
1
+ """
2
+ Serializers for gRPC proto files API.
3
+ """
4
+
5
+ from rest_framework import serializers
6
+
7
+
8
+ class ProtoFileDetailSerializer(serializers.Serializer):
9
+ """Proto file metadata."""
10
+
11
+ app_label = serializers.CharField()
12
+ filename = serializers.CharField()
13
+ size_bytes = serializers.IntegerField()
14
+ package = serializers.CharField(allow_blank=True)
15
+ messages_count = serializers.IntegerField()
16
+ services_count = serializers.IntegerField()
17
+ created_at = serializers.FloatField()
18
+ modified_at = serializers.FloatField()
19
+ download_url = serializers.CharField(
20
+ required=False,
21
+ help_text="API endpoint to download this proto file"
22
+ )
23
+
24
+
25
+ class ProtoFileListSerializer(serializers.Serializer):
26
+ """List of proto files."""
27
+
28
+ files = ProtoFileDetailSerializer(many=True)
29
+ total_files = serializers.IntegerField()
30
+ proto_dir = serializers.CharField()
31
+ download_all_url = serializers.CharField(
32
+ required=False,
33
+ help_text="API endpoint to download all proto files as .zip archive"
34
+ )
35
+
36
+
37
+ class ProtoGenerateRequestSerializer(serializers.Serializer):
38
+ """Request to generate proto files."""
39
+
40
+ apps = serializers.ListField(
41
+ child=serializers.CharField(),
42
+ required=False,
43
+ help_text="List of app labels to generate protos for (uses enabled_apps from config if not specified)",
44
+ )
45
+ force = serializers.BooleanField(
46
+ default=False,
47
+ required=False,
48
+ help_text="Force regeneration even if proto file exists",
49
+ )
50
+
51
+
52
+ class ProtoGenerateErrorSerializer(serializers.Serializer):
53
+ """Proto generation error."""
54
+
55
+ app = serializers.CharField()
56
+ error = serializers.CharField()
57
+
58
+
59
+ class ProtoGenerateResponseSerializer(serializers.Serializer):
60
+ """Response from proto generation."""
61
+
62
+ status = serializers.CharField()
63
+ generated = serializers.ListField(child=serializers.CharField())
64
+ generated_count = serializers.IntegerField()
65
+ errors = ProtoGenerateErrorSerializer(many=True)
66
+ proto_dir = serializers.CharField()
67
+
68
+
69
+ __all__ = [
70
+ "ProtoFileDetailSerializer",
71
+ "ProtoFileListSerializer",
72
+ "ProtoGenerateRequestSerializer",
73
+ "ProtoGenerateResponseSerializer",
74
+ ]
@@ -2,17 +2,23 @@
2
2
  Requests serializers for gRPC monitoring API.
3
3
  """
4
4
 
5
- from pydantic import BaseModel, Field
5
+ from rest_framework import serializers
6
6
 
7
7
 
8
- class RecentRequestsSerializer(BaseModel):
8
+ class RecentRequestsSerializer(serializers.Serializer):
9
9
  """Recent gRPC requests list."""
10
10
 
11
- requests: list[dict] = Field(description="List of recent requests")
12
- count: int = Field(description="Number of requests returned")
13
- total_available: int = Field(description="Total requests available")
14
- offset: int = Field(default=0, description="Current offset for pagination")
15
- has_more: bool = Field(default=False, description="Whether more results are available")
11
+ requests = serializers.ListField(
12
+ child=serializers.DictField(), help_text="List of recent requests"
13
+ )
14
+ count = serializers.IntegerField(help_text="Number of requests returned")
15
+ total_available = serializers.IntegerField(help_text="Total requests available")
16
+ offset = serializers.IntegerField(
17
+ default=0, help_text="Current offset for pagination"
18
+ )
19
+ has_more = serializers.BooleanField(
20
+ default=False, help_text="Whether more results are available"
21
+ )
16
22
 
17
23
 
18
24
  __all__ = ["RecentRequestsSerializer"]