django-cfg 1.4.67__py3-none-any.whl → 1.4.69__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 CHANGED
@@ -32,7 +32,7 @@ Example:
32
32
  default_app_config = "django_cfg.apps.DjangoCfgConfig"
33
33
 
34
34
  # Version information
35
- __version__ = "1.4.67"
35
+ __version__ = "1.4.69"
36
36
  __license__ = "MIT"
37
37
 
38
38
  # Import registry for organized lazy loading
@@ -96,6 +96,14 @@ class AdminConfig(BaseModel):
96
96
  default_factory=list,
97
97
  description="Fields with raw ID widget"
98
98
  )
99
+ filter_horizontal: List[str] = Field(
100
+ default_factory=list,
101
+ description="M2M fields with horizontal filter widget"
102
+ )
103
+ filter_vertical: List[str] = Field(
104
+ default_factory=list,
105
+ description="M2M fields with vertical filter widget"
106
+ )
99
107
  prepopulated_fields: Dict[str, tuple] = Field(
100
108
  default_factory=dict,
101
109
  description="Auto-populate fields (e.g., {'slug': ('name',)})"
@@ -87,10 +87,10 @@ class WidgetsSection(DataSection):
87
87
  metrics_data = {}
88
88
  metrics_data.update(self.get_system_metrics())
89
89
 
90
- # Add RPC metrics if enabled
90
+ # Add Centrifugo metrics if enabled
91
91
  dashboard_manager = self._get_dashboard_manager()
92
- if dashboard_manager.is_rpc_enabled():
93
- metrics_data.update(self.get_rpc_metrics())
92
+ if dashboard_manager.is_centrifugo_enabled():
93
+ metrics_data.update(self.get_centrifugo_metrics())
94
94
 
95
95
  # Also merge any custom metrics from kwargs
96
96
  custom_metrics = kwargs.get('custom_metrics', {})
@@ -169,41 +169,54 @@ class WidgetsSection(DataSection):
169
169
  'disk_percent': round(psutil.disk_usage('/').percent, 1),
170
170
  }
171
171
 
172
- def get_rpc_metrics(self) -> Dict[str, Any]:
173
- """Get RPC metrics for widgets."""
172
+ def get_centrifugo_metrics(self) -> Dict[str, Any]:
173
+ """Get Centrifugo metrics for widgets."""
174
174
  try:
175
- from django_cfg.apps.ipc.models import RPCLog
175
+ from django_cfg.apps.centrifugo.models import CentrifugoLog
176
176
 
177
177
  # Get stats for last 24 hours
178
178
  since = timezone.now() - timedelta(hours=24)
179
179
 
180
- logs = RPCLog.objects.filter(timestamp__gte=since)
180
+ logs = CentrifugoLog.objects.filter(created_at__gte=since)
181
181
 
182
- total_calls = logs.count()
183
- successful_calls = logs.filter(status='success').count()
184
- failed_calls = logs.filter(status='error').count()
182
+ total_publishes = logs.count()
183
+ successful_publishes = logs.filter(status='success').count()
184
+ failed_publishes = logs.filter(status='failed').count()
185
+ timeout_publishes = logs.filter(status='timeout').count()
185
186
 
186
- success_rate = round((successful_calls / total_calls * 100) if total_calls > 0 else 0, 1)
187
+ success_rate = round((successful_publishes / total_publishes * 100) if total_publishes > 0 else 0, 1)
187
188
 
188
189
  avg_duration = logs.filter(
189
- duration__isnull=False
190
+ duration_ms__isnull=False
190
191
  ).aggregate(
191
- avg=Avg('duration')
192
+ avg=Avg('duration_ms')
192
193
  )['avg']
193
194
 
194
- avg_duration = round(avg_duration * 1000, 1) if avg_duration else 0 # Convert to ms
195
+ avg_duration = round(avg_duration, 1) if avg_duration else 0 # Already in ms
196
+
197
+ avg_acks = logs.filter(
198
+ acks_received__isnull=False
199
+ ).aggregate(
200
+ avg=Avg('acks_received')
201
+ )['avg']
202
+
203
+ avg_acks = round(avg_acks, 1) if avg_acks else 0
195
204
 
196
205
  return {
197
- 'rpc_total_calls': total_calls,
198
- 'rpc_success_rate': success_rate,
199
- 'rpc_avg_duration': avg_duration,
200
- 'rpc_failed_calls': failed_calls,
206
+ 'centrifugo_total_publishes': total_publishes,
207
+ 'centrifugo_success_rate': success_rate,
208
+ 'centrifugo_avg_duration': avg_duration,
209
+ 'centrifugo_failed_publishes': failed_publishes,
210
+ 'centrifugo_timeout_publishes': timeout_publishes,
211
+ 'centrifugo_avg_acks': avg_acks,
201
212
  }
202
213
  except Exception as e:
203
- # Return zeros if RPC models not available
214
+ # Return zeros if Centrifugo models not available
204
215
  return {
205
- 'rpc_total_calls': 0,
206
- 'rpc_success_rate': 0,
207
- 'rpc_avg_duration': 0,
208
- 'rpc_failed_calls': 0,
216
+ 'centrifugo_total_publishes': 0,
217
+ 'centrifugo_success_rate': 0,
218
+ 'centrifugo_avg_duration': 0,
219
+ 'centrifugo_failed_publishes': 0,
220
+ 'centrifugo_timeout_publishes': 0,
221
+ 'centrifugo_avg_acks': 0,
209
222
  }
django_cfg/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-cfg"
7
- version = "1.4.67"
7
+ version = "1.4.69"
8
8
  description = "Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django."
9
9
  readme = "README.md"
10
10
  keywords = [ "django", "configuration", "pydantic", "settings", "type-safety", "pydantic-settings", "django-environ", "startup-validation", "ide-autocomplete", "ai-agents", "enterprise-django", "django-settings", "type-safe-config",]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.67
3
+ Version: 1.4.69
4
4
  Summary: Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -1,5 +1,5 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=U-piumasZ1lUl8E_V9tzG64TkyXIzVkWoRCw3i-tl6U,1620
2
+ django_cfg/__init__.py,sha256=87Afsd0OsMU0j9vvMvIdbybWTRkILN5zlaKGwBTsxe0,1620
3
3
  django_cfg/apps.py,sha256=72m3uuvyqGiLx6gOfE-BD3P61jddCCERuBOYpxTX518,1605
4
4
  django_cfg/config.py,sha256=y4Z3rnYsHBE0TehpwAIPaxr---mkvyKrZGGsNwYso74,1398
5
5
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
@@ -666,7 +666,7 @@ django_cfg/modules/django_admin/base/pydantic_admin.py,sha256=0xKaELl6rCdSkw_U2n
666
666
  django_cfg/modules/django_admin/base/unfold_admin.py,sha256=iqpRWSkzW5HktXDuuG7G3J6RoIfW48dWPMJTa7Yk08g,729
667
667
  django_cfg/modules/django_admin/config/__init__.py,sha256=UJGJMP1iAguzd33E1BgeIjWaooFYylku3aR_Arib-cg,604
668
668
  django_cfg/modules/django_admin/config/action_config.py,sha256=JjS01JxLT-FzUVq7RlKaB7L38wmVL8uibXO_iXZcljo,1668
669
- django_cfg/modules/django_admin/config/admin_config.py,sha256=TcyXOOXkeXV49yknaajAtm1xUYOR-02TOJTMdhdJGrg,4291
669
+ django_cfg/modules/django_admin/config/admin_config.py,sha256=vX9CVjC8FgDLdkhUMHNqkpaoO9c1dhzR4mNltET12kM,4569
670
670
  django_cfg/modules/django_admin/config/field_config.py,sha256=TXdmz1GHC0N7euzqgB9p5EhFCYzsEobb8VSgS4kG4ho,8928
671
671
  django_cfg/modules/django_admin/config/fieldset_config.py,sha256=5BPUWO_HvS6YhPU_vqQPzRT2y3OIPrBCioFuer5-mrA,1249
672
672
  django_cfg/modules/django_admin/icons/README.md,sha256=j-NUixSC1QJh7PqYKxLZpPrTxKrAnx0urQraXgv4JHI,5612
@@ -863,7 +863,7 @@ django_cfg/modules/django_dashboard/sections/documentation.py,sha256=rpBRGhawCay
863
863
  django_cfg/modules/django_dashboard/sections/overview.py,sha256=Gfgl55d9S9ohzDJ_UxxCP7ny6NbbhfZ24l1uAs0PEc0,13391
864
864
  django_cfg/modules/django_dashboard/sections/stats.py,sha256=5k2DKr_87Os0H8Wd_hU3sIcAq799OOnjApJ14hDF-gc,1282
865
865
  django_cfg/modules/django_dashboard/sections/system.py,sha256=3zAfms02qB2zSQt3BjBYKw-JlLTjaj0A6qciqYOKNMo,2026
866
- django_cfg/modules/django_dashboard/sections/widgets.py,sha256=sFUhk8BWW-KzMw3hDjcotw1hz3LFULGhHRhx5shrYC4,7646
866
+ django_cfg/modules/django_dashboard/sections/widgets.py,sha256=m9X8lxdnnqP5P8343gqHJaztaMAg3D2dUlIc3TCkGOM,8323
867
867
  django_cfg/modules/django_drf_theme/__init__.py,sha256=0D5ctzcjadbw-z7jpvVjvo8C1ufrGRk6b-mA4xSutTE,525
868
868
  django_cfg/modules/django_drf_theme/apps.py,sha256=UzcjnTQyMqExKGwhg5KhCK0eEqgGXtaYbCztHd_V2pw,428
869
869
  django_cfg/modules/django_drf_theme/renderers.py,sha256=AVlXpepI62iHcZhbGAsLwtXpnQ8NeN0zyWQbePUnN3w,1808
@@ -1103,9 +1103,9 @@ django_cfg/utils/version_check.py,sha256=WO51J2m2e-wVqWCRwbultEwu3q1lQasV67Mw2aa
1103
1103
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
1104
1104
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
1105
1105
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1106
- django_cfg/pyproject.toml,sha256=Q0mUQT9__N7U154e7DE7nkTXgKGED6mn6JLBa7EC414,8155
1107
- django_cfg-1.4.67.dist-info/METADATA,sha256=xYpYst6FzblbfBlMBwKsmzPeKmk3qiBOGRjr3DicFC8,22589
1108
- django_cfg-1.4.67.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1109
- django_cfg-1.4.67.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1110
- django_cfg-1.4.67.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1111
- django_cfg-1.4.67.dist-info/RECORD,,
1106
+ django_cfg/pyproject.toml,sha256=1-Wg8Zd5b1rjUXJEhM7lzHjw-FGm-Nvgs220cfZIBOs,8155
1107
+ django_cfg-1.4.69.dist-info/METADATA,sha256=QjQ5P7rM1QqosLgSJTnyvRAfgDsk9ABZeK__0VEiTTw,22589
1108
+ django_cfg-1.4.69.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1109
+ django_cfg-1.4.69.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1110
+ django_cfg-1.4.69.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1111
+ django_cfg-1.4.69.dist-info/RECORD,,