django-cfg 1.4.120__py3-none-any.whl → 1.5.1__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 (80) hide show
  1. django_cfg/__init__.py +8 -4
  2. django_cfg/apps/centrifugo/admin/centrifugo_log.py +33 -71
  3. django_cfg/apps/grpc/__init__.py +9 -0
  4. django_cfg/apps/grpc/admin/__init__.py +11 -0
  5. django_cfg/apps/grpc/admin/config.py +89 -0
  6. django_cfg/apps/grpc/admin/grpc_request_log.py +252 -0
  7. django_cfg/apps/grpc/apps.py +28 -0
  8. django_cfg/apps/grpc/auth/__init__.py +9 -0
  9. django_cfg/apps/grpc/auth/jwt_auth.py +295 -0
  10. django_cfg/apps/grpc/interceptors/__init__.py +19 -0
  11. django_cfg/apps/grpc/interceptors/errors.py +241 -0
  12. django_cfg/apps/grpc/interceptors/logging.py +270 -0
  13. django_cfg/apps/grpc/interceptors/metrics.py +306 -0
  14. django_cfg/apps/grpc/interceptors/request_logger.py +515 -0
  15. django_cfg/apps/grpc/management/__init__.py +1 -0
  16. django_cfg/apps/grpc/management/commands/__init__.py +0 -0
  17. django_cfg/apps/grpc/management/commands/rungrpc.py +302 -0
  18. django_cfg/apps/grpc/managers/__init__.py +10 -0
  19. django_cfg/apps/grpc/managers/grpc_request_log.py +310 -0
  20. django_cfg/apps/grpc/migrations/0001_initial.py +69 -0
  21. django_cfg/apps/grpc/migrations/0002_rename_django_cfg__service_4c4a8e_idx_django_cfg__service_584308_idx_and_more.py +38 -0
  22. django_cfg/apps/grpc/migrations/__init__.py +0 -0
  23. django_cfg/apps/grpc/models/__init__.py +9 -0
  24. django_cfg/apps/grpc/models/grpc_request_log.py +219 -0
  25. django_cfg/apps/grpc/serializers/__init__.py +23 -0
  26. django_cfg/apps/grpc/serializers/health.py +18 -0
  27. django_cfg/apps/grpc/serializers/requests.py +18 -0
  28. django_cfg/apps/grpc/serializers/services.py +50 -0
  29. django_cfg/apps/grpc/serializers/stats.py +22 -0
  30. django_cfg/apps/grpc/services/__init__.py +16 -0
  31. django_cfg/apps/grpc/services/base.py +375 -0
  32. django_cfg/apps/grpc/services/discovery.py +415 -0
  33. django_cfg/apps/grpc/urls.py +23 -0
  34. django_cfg/apps/grpc/utils/__init__.py +13 -0
  35. django_cfg/apps/grpc/utils/proto_gen.py +423 -0
  36. django_cfg/apps/grpc/views/__init__.py +9 -0
  37. django_cfg/apps/grpc/views/monitoring.py +497 -0
  38. django_cfg/apps/maintenance/admin/api_key_admin.py +7 -8
  39. django_cfg/apps/maintenance/admin/site_admin.py +5 -4
  40. django_cfg/apps/payments/admin/balance_admin.py +26 -36
  41. django_cfg/apps/payments/admin/payment_admin.py +65 -85
  42. django_cfg/apps/payments/admin/withdrawal_admin.py +65 -100
  43. django_cfg/apps/tasks/admin/task_log.py +20 -47
  44. django_cfg/apps/urls.py +7 -1
  45. django_cfg/config.py +106 -0
  46. django_cfg/core/base/config_model.py +6 -0
  47. django_cfg/core/builders/apps_builder.py +3 -0
  48. django_cfg/core/generation/integration_generators/grpc_generator.py +318 -0
  49. django_cfg/core/generation/orchestrator.py +10 -0
  50. django_cfg/models/api/grpc/__init__.py +59 -0
  51. django_cfg/models/api/grpc/config.py +364 -0
  52. django_cfg/modules/base.py +15 -0
  53. django_cfg/modules/django_admin/base/pydantic_admin.py +2 -2
  54. django_cfg/modules/django_admin/utils/__init__.py +41 -3
  55. django_cfg/modules/django_admin/utils/badges/__init__.py +13 -0
  56. django_cfg/modules/django_admin/utils/{badges.py → badges/status_badges.py} +3 -3
  57. django_cfg/modules/django_admin/utils/displays/__init__.py +13 -0
  58. django_cfg/modules/django_admin/utils/{displays.py → displays/data_displays.py} +2 -2
  59. django_cfg/modules/django_admin/utils/html/__init__.py +26 -0
  60. django_cfg/modules/django_admin/utils/html/badges.py +47 -0
  61. django_cfg/modules/django_admin/utils/html/base.py +167 -0
  62. django_cfg/modules/django_admin/utils/html/code.py +87 -0
  63. django_cfg/modules/django_admin/utils/html/composition.py +198 -0
  64. django_cfg/modules/django_admin/utils/html/formatting.py +231 -0
  65. django_cfg/modules/django_admin/utils/html/keyvalue.py +219 -0
  66. django_cfg/modules/django_admin/utils/html/markdown_integration.py +108 -0
  67. django_cfg/modules/django_admin/utils/html/progress.py +127 -0
  68. django_cfg/modules/django_admin/utils/html_builder.py +55 -408
  69. django_cfg/modules/django_admin/utils/markdown/__init__.py +21 -0
  70. django_cfg/modules/django_unfold/navigation.py +28 -0
  71. django_cfg/pyproject.toml +3 -5
  72. django_cfg/registry/modules.py +6 -0
  73. {django_cfg-1.4.120.dist-info → django_cfg-1.5.1.dist-info}/METADATA +10 -1
  74. {django_cfg-1.4.120.dist-info → django_cfg-1.5.1.dist-info}/RECORD +79 -30
  75. django_cfg/modules/django_admin/utils/CODE_BLOCK_DOCS.md +0 -396
  76. /django_cfg/modules/django_admin/utils/{mermaid_plugin.py → markdown/mermaid_plugin.py} +0 -0
  77. /django_cfg/modules/django_admin/utils/{markdown_renderer.py → markdown/renderer.py} +0 -0
  78. {django_cfg-1.4.120.dist-info → django_cfg-1.5.1.dist-info}/WHEEL +0 -0
  79. {django_cfg-1.4.120.dist-info → django_cfg-1.5.1.dist-info}/entry_points.txt +0 -0
  80. {django_cfg-1.4.120.dist-info → django_cfg-1.5.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,9 +1,9 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=2aQpPujqEk1Kt4OCSixn0JVIQ-ppeqKrE6o-xJY4Ltg,1621
2
+ django_cfg/__init__.py,sha256=mpY7XOaDnNfCaqOu98wZDVwBaishlliqu2fYJgJQ2pU,1777
3
3
  django_cfg/apps.py,sha256=72m3uuvyqGiLx6gOfE-BD3P61jddCCERuBOYpxTX518,1605
4
- django_cfg/config.py,sha256=xdwFE8bocOEnMjqDOwr1_M02oUgdaMG_2M6F_IuB9GQ,1351
4
+ django_cfg/config.py,sha256=eIzEviUGuqgrwUqea7R2VUwmNmapbFYRXLzlRuenw4A,4446
5
5
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
6
- django_cfg/apps/urls.py,sha256=oUmBXmhZp6BwXUs8R_H9rYWskbpVTs1wQDqyGfMnIt4,6693
6
+ django_cfg/apps/urls.py,sha256=eV1OW1mGGo9JYqBK76tIW8S83Il92OwxDsLI3s2U7G4,6891
7
7
  django_cfg/apps/accounts/README.md,sha256=YkUYJ3iKMYTmm9ALK2PDnX75SDqZxgnkzNLCD5efxRs,8227
8
8
  django_cfg/apps/accounts/__init__.py,sha256=I9pq6H5oOFv59Du0VP-g7KsAUDhjKeUcP0spMvhtIjk,99
9
9
  django_cfg/apps/accounts/__models.py,sha256=fYhobXbGIYKnG4mZ_pwNePei8O-SHHqgBMhe6qhH3KQ,10075
@@ -131,7 +131,7 @@ django_cfg/apps/centrifugo/registry.py,sha256=HRaBN39UlCMX6ZAysYhdCWMlzAx1scGTvg
131
131
  django_cfg/apps/centrifugo/router.py,sha256=HyiJF0t3w085Upu9SPaTJ-qcSW8JYND71rXtuEFAt2g,3116
132
132
  django_cfg/apps/centrifugo/urls.py,sha256=wb7MwTmsZC1uewLQrUBpULpCVwzwh9YztUEgmMnLDQ4,902
133
133
  django_cfg/apps/centrifugo/admin/__init__.py,sha256=JoDpJaJwT4f0ntWi8eNgNN5RRzWRty2fKdbDm-7PwEY,254
134
- django_cfg/apps/centrifugo/admin/centrifugo_log.py,sha256=ME4MThn7dSTe26MHxmSJ37lzo98OO3_WGQu5Kz9TOqA,8096
134
+ django_cfg/apps/centrifugo/admin/centrifugo_log.py,sha256=1tcwB2bsJpklbVHOQOGR3vNwvGaSS94sRiZTjQiVzTE,6963
135
135
  django_cfg/apps/centrifugo/admin/config.py,sha256=W_2x55AY8X8xxDxn92UU2jdVzRDlHSu9p3l4VtSAy1M,2005
136
136
  django_cfg/apps/centrifugo/codegen/IMPLEMENTATION_SUMMARY.md,sha256=8AGzxD-5i7auP0OGIoCAwm5WSxzWvVaio6xNjatAT6s,13239
137
137
  django_cfg/apps/centrifugo/codegen/README.md,sha256=2UUicvh_wVAyMoR9wZlO5F98TlN_Jx2imzKklYEiJQE,7149
@@ -233,6 +233,41 @@ django_cfg/apps/frontend/test_routing.py,sha256=fshJOR9ln7m3gXY9EI1_ix_6E5xua6DR
233
233
  django_cfg/apps/frontend/urls.py,sha256=Vz22_2i2w1J0KQYDCxHnTF5rUf32kUUSBDJZrP07XgY,284
234
234
  django_cfg/apps/frontend/views.py,sha256=JPTJRPCGY3zLLiiz1F9CsZiLkXbQ5RfnViJZzBUpV7o,15023
235
235
  django_cfg/apps/frontend/templates/frontend/404.html,sha256=LCFig_dcgDDmYKhgOLu8R2KDs_aQS6Es6rAxLTAEXWs,2175
236
+ django_cfg/apps/grpc/__init__.py,sha256=Sen6KfKksoyO3ov9uguK4alr3oWZRyVuxxS2kIL4TvI,209
237
+ django_cfg/apps/grpc/apps.py,sha256=jrGDKmsZyfcRB15C9lJ0H_CCvKEF7ZIVkWOnTYwmoPc,649
238
+ django_cfg/apps/grpc/urls.py,sha256=GCkgA-dIIVpIb3_TjLamzssUrNtpE3k7_idDZacygus,478
239
+ django_cfg/apps/grpc/admin/__init__.py,sha256=ZdlCRR_RYyiFoRaEzeKqQLxWoW86DkczADf67ofIcwQ,202
240
+ django_cfg/apps/grpc/admin/config.py,sha256=_eJDj7IFChSpkShjD05UaXBRS_e7Iu49v3IT_DWoXNY,2330
241
+ django_cfg/apps/grpc/admin/grpc_request_log.py,sha256=rI2b3QjCOKGXn6sD0JWKkUqAukUWHEcIEK4TUsB8BfY,8524
242
+ django_cfg/apps/grpc/auth/__init__.py,sha256=iCw1EBiyfM_SfSTzQEM1wtTSFTX0Qi4ZiW26oz9J7X8,164
243
+ django_cfg/apps/grpc/auth/jwt_auth.py,sha256=sU_meAIiXipQUG8FYp0bzSiLTbQHnu_bIAK1sKznIfc,10277
244
+ django_cfg/apps/grpc/interceptors/__init__.py,sha256=Ahd1CW97P2NfBBTNhucbc1cBmSc4PlypMbcgljE_Aak,505
245
+ django_cfg/apps/grpc/interceptors/errors.py,sha256=IAH8si_bAmK90WISeNPZPX7HlMUvSEMj8FCCA3WreQU,7955
246
+ django_cfg/apps/grpc/interceptors/logging.py,sha256=w9IGyGFzg1xAbfEZovOC796M38xgWfzolxRtRaiHZek,9527
247
+ django_cfg/apps/grpc/interceptors/metrics.py,sha256=crWSL2i-F7aJK9LRT7G7Z6qvkvkMQf2bv_lY9w7-7AM,9843
248
+ django_cfg/apps/grpc/interceptors/request_logger.py,sha256=ciWKjx81i4c8rQvyAqlIIcP48GCx6slTn0OOj4y4rsI,16673
249
+ django_cfg/apps/grpc/management/__init__.py,sha256=qeaIQO1EY_-VkrUFRigi-UGbrHmN6U_0ZetCQkjDGvk,40
250
+ django_cfg/apps/grpc/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
+ django_cfg/apps/grpc/management/commands/rungrpc.py,sha256=mHCSgCn8abhA3pb4oefysEklKbEsgwXeSeGGbtEGbqw,9653
252
+ django_cfg/apps/grpc/managers/__init__.py,sha256=SsQkxSYpwIA1W9UOZxL51wiIHjqQVX8VLGVI0zNJx6I,189
253
+ django_cfg/apps/grpc/managers/grpc_request_log.py,sha256=QvRgXmPkSkJKdOOguiPIhwWzmXKx7gF30MfR52rVDfQ,9315
254
+ django_cfg/apps/grpc/migrations/0001_initial.py,sha256=UeDDdEQBEpW7-11bGaohVxVh9ii0ssUoj_59tLL0YmM,4549
255
+ django_cfg/apps/grpc/migrations/0002_rename_django_cfg__service_4c4a8e_idx_django_cfg__service_584308_idx_and_more.py,sha256=88Ox17gYjdhYEymiKbt8F8-clVoad56gm7xSaJCtNvQ,1179
256
+ django_cfg/apps/grpc/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
+ django_cfg/apps/grpc/models/__init__.py,sha256=epjZUfI7Q55e5RYnElxWuIM22FA7IS_jDiJ_hzQcz1k,112
258
+ django_cfg/apps/grpc/models/grpc_request_log.py,sha256=R_00D_WaxhFzCSMZQsCbmNJ6Oyce_DxZP8WKkuulWN8,5742
259
+ django_cfg/apps/grpc/serializers/__init__.py,sha256=wiXXMgDzj5WzA6FORqSNnPWTzFs3wvTPk3B1EAShcF0,544
260
+ django_cfg/apps/grpc/serializers/health.py,sha256=0xIXOBvD6uGmmm_KMqlR8JiQuhpOGsitp9ietTl3TIs,554
261
+ django_cfg/apps/grpc/serializers/requests.py,sha256=Z6xue882pmyjH_7tUFUS9OmbWNZSbDSzR74umMdWgII,600
262
+ django_cfg/apps/grpc/serializers/services.py,sha256=VlV2rMRj4dIC8_uxyU7CH90vHbxx3EYFbbDy3kkua40,1704
263
+ django_cfg/apps/grpc/serializers/stats.py,sha256=X41Vz3T0yQWCjgbhaurXTpHMysmtinMUoGkfq71NWEs,851
264
+ django_cfg/apps/grpc/services/__init__.py,sha256=dIVywzIvzbJNp7xaLhPsYI4Om2zDzL1WdpAKfjBkRLM,384
265
+ django_cfg/apps/grpc/services/base.py,sha256=U1VClr9pASuc0wdhZk8z6CR19G3qLoq-5PhHdCDyK8c,11135
266
+ django_cfg/apps/grpc/services/discovery.py,sha256=IkWtr-4LnvDMCSlqjxxL2lMQZXcd4W2ogXVbqp-rslA,13698
267
+ django_cfg/apps/grpc/utils/__init__.py,sha256=NX8vLgAVI5ymsL3awZiQhIRstYVxcSAErL4x18jqs3I,251
268
+ django_cfg/apps/grpc/utils/proto_gen.py,sha256=IDJHf8msoGzsTWCiblNwem_7eIRvZujAsuHlTl2vvwQ,12656
269
+ django_cfg/apps/grpc/views/__init__.py,sha256=IZWj31gnice6VOBZ1hkunPnnA5pXwJFTdzxuOk7OVAw,124
270
+ django_cfg/apps/grpc/views/monitoring.py,sha256=sVulfX_r5TIITisRea-jzLTcql9PQPN4txXY3fNM9NE,18125
236
271
  django_cfg/apps/knowbase/README.md,sha256=HXt_J6WCN-LsMhA7p9mdvih07_vp_r_hkPdmqHhNEeo,3965
237
272
  django_cfg/apps/knowbase/__init__.py,sha256=XLhl7_wweUm1nqmA_xVlPxiCSuARxtCro-uY41JFQgs,1039
238
273
  django_cfg/apps/knowbase/apps.py,sha256=Y1n4ZoEP5oL-lDGLNRHtxhPClEcBElMX8iXFFS4OsPE,3052
@@ -370,10 +405,10 @@ django_cfg/apps/maintenance/urls.py,sha256=wOd5n5Ky62gUx-TVaIC5OZcH9K6plsC2pCAJH
370
405
  django_cfg/apps/maintenance/urls_admin.py,sha256=E61etVCrwAzWZdPckWWX5yMDPsZzi3cQtAXn_zzZNL4,226
371
406
  django_cfg/apps/maintenance/admin/__init__.py,sha256=9EDtPitnC45uazpAky927lzo0jW7Qg-qfzv5LCxMW_I,463
372
407
  django_cfg/apps/maintenance/admin/actions.py,sha256=a2y5Gg7m806yAg8J4V_i-jxbFN6A47L5Qa7a1sYVZrg,5304
373
- django_cfg/apps/maintenance/admin/api_key_admin.py,sha256=uDiTmugMPhE8Cjw_XyuDBmcYKjl6EOQx98D39L-9JU8,5638
408
+ django_cfg/apps/maintenance/admin/api_key_admin.py,sha256=QIomApJZhzeFyxWrxw1vuMYiLbLXmatNH9RhYAI_I2A,5628
374
409
  django_cfg/apps/maintenance/admin/log_admin.py,sha256=9Kb9IN95QATKVn0yVfFmn5VsvoxJ6B9BeQFUZ-HCd_Y,5551
375
410
  django_cfg/apps/maintenance/admin/scheduled_admin.py,sha256=Vn9qLlC7XjYntAfdSHJbchZ32t3913yZiC8dHjWAhjc,6630
376
- django_cfg/apps/maintenance/admin/site_admin.py,sha256=BGxxZa3lS-tiYNraE7prbIxa2t2EtbUXiXlY0-EK2oA,8267
411
+ django_cfg/apps/maintenance/admin/site_admin.py,sha256=LDG2XXmoBmZnbkCpLX1yUXra8ibjZTK57exVVzm6y2c,8280
377
412
  django_cfg/apps/maintenance/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
378
413
  django_cfg/apps/maintenance/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
379
414
  django_cfg/apps/maintenance/management/commands/maintenance.py,sha256=axNv5oBR5_rncTddGT0Ued_YH4O84EQWe7dMz7G77ak,11008
@@ -436,13 +471,13 @@ django_cfg/apps/payments/urls.py,sha256=MGIK3zzYemgZd4sVuL6kUi8gXhsxZfMQF-g7_05U
436
471
  django_cfg/apps/payments/admin/__init__.py,sha256=7jmi4x7PqtdNdhw4ckhVZnHklh-L63x49J2Gl_Xmin0,985
437
472
  django_cfg/apps/payments/admin/actions.py,sha256=_uj30lTKLmQ1TfyF1Hj36tgSNz5axcS7LG7TY4Tv8tE,582
438
473
  django_cfg/apps/payments/admin/balance_actions.py,sha256=BGCwvXOETj0KN3EVIYicVqeXuOCsut-H5fT7og07iDg,422
439
- django_cfg/apps/payments/admin/balance_admin.py,sha256=Z5LnYvh_9_9CBLuweEPUr2rZXmEQ9TWhrr4apqJyhmg,9787
474
+ django_cfg/apps/payments/admin/balance_admin.py,sha256=24go6i5fF9lskTl9VPTtYV9KaJCxCoXZjxjxgoBDAyo,9420
440
475
  django_cfg/apps/payments/admin/currency_admin.py,sha256=NrmwaYwANESvcsW1ENLCR0H-e_MiawLkIzgc3xZAJCY,3073
441
476
  django_cfg/apps/payments/admin/filters.py,sha256=YA3zP8gxVNb50ObmGV5YRBybn5Sih4crJi9zFqHBSGs,7379
442
477
  django_cfg/apps/payments/admin/payment_actions.py,sha256=oAUtmRxJZVFktXmFUxDGfwVy0dxdbR2lyH_EzghhKtM,1677
443
- django_cfg/apps/payments/admin/payment_admin.py,sha256=kKrWp9k_xVxq68_CEwLXPVkJzF-qb8TGnSuna32Uvhw,9699
478
+ django_cfg/apps/payments/admin/payment_admin.py,sha256=Mq2PId7W3WhZu-3oBUDvR_KNE4hab8WnndEVNhEnxSo,8979
444
479
  django_cfg/apps/payments/admin/withdrawal_actions.py,sha256=Hhv6FXZfGAUTVmoWkmRLNOWTWK9e2X03rZtrGuZs02s,1873
445
- django_cfg/apps/payments/admin/withdrawal_admin.py,sha256=OelLCqdt61chNO1hKNto1ksyUcsWS75yz0T2GXSpqFE,10483
480
+ django_cfg/apps/payments/admin/withdrawal_admin.py,sha256=4CXq3p-Jl_90CiaqNPN8w7Fi3hRk15cQ4R6Es3l0qSM,9330
446
481
  django_cfg/apps/payments/api/__init__.py,sha256=GxB5Tn-W_Sr1Ki7OcCE6iq61or9ELOVMpLmd1nmni3w,78
447
482
  django_cfg/apps/payments/api/serializers.py,sha256=zjxIfekOJMJ5bEjeo_6Jc2YMHMQxMBshQlOb9rP-XOA,6640
448
483
  django_cfg/apps/payments/api/urls.py,sha256=TVimVX_ba-0YnqzNeNn9DRDzppT9snNzmAcikp_um-I,1085
@@ -505,7 +540,7 @@ django_cfg/apps/tasks/apps.py,sha256=jcl4NO8t37_RNHyaCh2GJXXlZqYIMLwpiAY26lnMO8M
505
540
  django_cfg/apps/tasks/urls.py,sha256=4KA6on-Hii-4mQLJaSQ58iPrYBZL4apSsvksLbyhzWU,344
506
541
  django_cfg/apps/tasks/admin/__init__.py,sha256=h4Hx8VGvbohLLS6nt0OFE7mi0JBx1pHA0lbjjcaXPgU,106
507
542
  django_cfg/apps/tasks/admin/config.py,sha256=SZ4gh2omc5sPEa3VLz7ewUjV-_O4qPFgHe_e0AkEm9c,2161
508
- django_cfg/apps/tasks/admin/task_log.py,sha256=H7gv8k7J_1rd31jmbMU6TKuDkzH_mx2beNbju--VycQ,8255
543
+ django_cfg/apps/tasks/admin/task_log.py,sha256=a9XYEvdFfsLcMeaw12o66dLtww9tmv6VTYwDw785Uys,7604
509
544
  django_cfg/apps/tasks/filters/__init__.py,sha256=9H6dh9ryI_zJ0_tPENjsSS2V3Mx8MMcWze8hyHokfhc,151
510
545
  django_cfg/apps/tasks/filters/task_log.py,sha256=BY67R3jyzHR6XdhNty8gjGmLTC5VDTx2_tGeGODOJXE,4929
511
546
  django_cfg/apps/tasks/migrations/0001_initial.py,sha256=dVbEPP7umgjsJsubxaTYsrDq7dvwv2xf6_K8hfju-lE,7367
@@ -542,16 +577,16 @@ django_cfg/core/validation.py,sha256=QmwGlNDa0MFG2OUmgykIUAaEotT55YNh-wAWSVxOAos
542
577
  django_cfg/core/backends/__init__.py,sha256=5Qfza7oKQ8_UIHOs4ibhYvwtgAjngUqLrlwjKl_q124,38
543
578
  django_cfg/core/backends/smtp.py,sha256=kWkNMG7UwLsHcFYSKRgrk1HbP9mU1fxzWYnalHXqoL8,2308
544
579
  django_cfg/core/base/__init__.py,sha256=Z3bZvxejxk4vvWqmqTBLUi9XJpo6A_5Bq4R0J8q81Y4,116
545
- django_cfg/core/base/config_model.py,sha256=fnmvjOs2fHTb8ifjFv0EsbVPFScG87ExikIqVAqpDZc,21810
580
+ django_cfg/core/base/config_model.py,sha256=WokIZUa-CPmDQUOqyi8UCO44e5BNfV3x5O1tZfNwFig,22016
546
581
  django_cfg/core/builders/__init__.py,sha256=jkInI7_jbxcjitapohw6QmbJPpacnnID6V1JovqtOFM,282
547
- django_cfg/core/builders/apps_builder.py,sha256=1C7M3Uq4aScuz4syuNGHyl3USus1h_FgULPfzKAerak,6810
582
+ django_cfg/core/builders/apps_builder.py,sha256=Ue6RQDVF4bZFkO3FXD-E48uo9Rc-zHczRbv9xGyv2dU,6917
548
583
  django_cfg/core/builders/middleware_builder.py,sha256=OwqQRoJKYWlXsQNPFBfUvVMYdppUHCPw-UDczV_esYg,3101
549
584
  django_cfg/core/builders/security_builder.py,sha256=W8Lk9eTMi3PuNK5qH-BIHegeE0cbvmuHKTumLcwOAh8,23961
550
585
  django_cfg/core/environment/__init__.py,sha256=sMOIe9z1i51j8B1VGjpLHJMaeDsBfsgn1TmL03FIeNo,141
551
586
  django_cfg/core/environment/detector.py,sha256=bI9k4fdK8Nbfl61ZcQ3yNbm3WlmK-L0xB-g-aXKUdhA,8923
552
587
  django_cfg/core/generation/__init__.py,sha256=0cYgeQ5EDN6sscQuFnXsFCy6m1BKgv_izNz0a1TlYSc,1355
553
588
  django_cfg/core/generation/generation.py,sha256=uLLJnJ_9kq8zV_auySK05dXwZB-BJx920mID0Pm4RCo,2524
554
- django_cfg/core/generation/orchestrator.py,sha256=GdR5HBjuDE4Rxzj8q6_mm24XbIJd7cORncHGYgCCwkI,12046
589
+ django_cfg/core/generation/orchestrator.py,sha256=a6U4fsRlM1deKSBdcjoi-sWs7DwgmDugE3LyUVG8Z3Q,12526
555
590
  django_cfg/core/generation/protocols.py,sha256=9pqGsZD_Y5v3jdYp4YdkL-i--8feuvX_iKXxV-Cc4Bg,676
556
591
  django_cfg/core/generation/core_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
557
592
  django_cfg/core/generation/core_generators/settings.py,sha256=Rto9qjqQC-MeQJMNyoflS91RrNDS_lBNH4d4ZtgER-8,2632
@@ -563,6 +598,7 @@ django_cfg/core/generation/data_generators/database.py,sha256=mYR2mBvqWU93YP9XUU
563
598
  django_cfg/core/generation/integration_generators/__init__.py,sha256=wPPiVQnmCEXKigp-d_jKznU2i1M6aP4P2YOVYipuMDk,737
564
599
  django_cfg/core/generation/integration_generators/api.py,sha256=Xsyu3mYyq9mje8QGNSU0Yp4tLbtF0ckq4lEf_Rj5pLc,11062
565
600
  django_cfg/core/generation/integration_generators/django_q2.py,sha256=ZRIApW0lQWHOizd9jvFBSckk_O-bhrgr7rCnKg7M8U0,4155
601
+ django_cfg/core/generation/integration_generators/grpc_generator.py,sha256=UpeumEd7ASWiWUUTsyWu35scOP3kVz14CDIxyc4AszU,10423
566
602
  django_cfg/core/generation/integration_generators/sessions.py,sha256=GbRC72Gny4dzj7oTIrbuhYyvhCQBoWI-0GxB8ZHTrEU,1644
567
603
  django_cfg/core/generation/integration_generators/tailwind.py,sha256=YgiV5c-l0DDJnMKx6mWcUtH5zyMdewAJXjLDwmHrSuc,1208
568
604
  django_cfg/core/generation/integration_generators/tasks.py,sha256=fMbuIdjRenuZQ6rfco7imLzDbCdX4WEO1aLslBpxjTQ,2253
@@ -637,6 +673,8 @@ django_cfg/models/api/drf/config.py,sha256=PXDfFtwcYh_QHG54FYLKynPhByT28fGr8hsCV
637
673
  django_cfg/models/api/drf/redoc.py,sha256=XNNWnMwkfIhtkCUt_KiPtc0-Nw0E3jvQOIjwcdie5a0,762
638
674
  django_cfg/models/api/drf/spectacular.py,sha256=UYBATiEY3qzx0IlTvCyhpymASO2Wej_j-gQsgL03Nec,5020
639
675
  django_cfg/models/api/drf/swagger.py,sha256=ku_eE7bWgHxjXD6Z2sEKSYE-bIzmZfAR0vQW9xqlG4Q,2127
676
+ django_cfg/models/api/grpc/__init__.py,sha256=-yX9qAaBalmaRj9f88lUzrAW55a2ghydHJvTEsZ8CNA,1510
677
+ django_cfg/models/api/grpc/config.py,sha256=YY0KKCzPiLxV3l-l7oXoKN-n-CbcH11Iala-s3A3bwI,9884
640
678
  django_cfg/models/base/__init__.py,sha256=f6sMVyd-YEFdLebmIKOOPviu1Ovn4BHGp7j7ZVNqFDo,271
641
679
  django_cfg/models/base/config.py,sha256=hfpf35yMR8oOE1J0SBPNNSBwXckK3F2-Iv0Vw6cNX4E,10114
642
680
  django_cfg/models/base/module.py,sha256=nxN1Y9J4l94kOfSXLQJ2eGgIGWTq8kyh7hUGvCQNyIs,2674
@@ -673,11 +711,11 @@ django_cfg/models/tasks/backends.py,sha256=r5VcuAxyyxqd5grpktEd-0yJNvSJu2jv0IBgr
673
711
  django_cfg/models/tasks/config.py,sha256=0Tc7O2mVQLc8IYXMm__cdeP0ytYn_NucL2xyA95wyT4,5892
674
712
  django_cfg/models/tasks/utils.py,sha256=9TEbdxgd0N_O2T_7GGwkyPeDg4H7tSKLHoHG_n8edqg,4459
675
713
  django_cfg/modules/__init__.py,sha256=Ip9WMpzImEwIAywpFwU056_v0O9oIGG7nCT1YSArxkw,316
676
- django_cfg/modules/base.py,sha256=Grmgxc5dvnAEM1sudWEWO4kv8L0Ks-y32nxTk2vwdjQ,6272
714
+ django_cfg/modules/base.py,sha256=03SUBaSOduJjhJRdG5bUdmQrcgKxNtliSUd7mHSpTic,6684
677
715
  django_cfg/modules/django_admin/__init__.py,sha256=0g5SJPtmMhM57MMZG4msvhKbgDTqabf5r95_EsQMQuY,3370
678
716
  django_cfg/modules/django_admin/apps.py,sha256=xJjgIRgS_I1ehyq7ZbFpZY_L4umRa5ZPQP3mf0alUaU,526
679
717
  django_cfg/modules/django_admin/base/__init__.py,sha256=tzre09bnD_SlS-pA30WzYZRxyvch7eLq3q0wLEcZOmc,118
680
- django_cfg/modules/django_admin/base/pydantic_admin.py,sha256=xewt_ld40NntdjtZ-k-VwinhfDkIRk71nwu5DVDQzeQ,25364
718
+ django_cfg/modules/django_admin/base/pydantic_admin.py,sha256=mD8LWqRWZXiGO6QLVGmECsf-9UhvuJhmn4CMqzwVJBg,25382
681
719
  django_cfg/modules/django_admin/base/unfold_admin.py,sha256=iqpRWSkzW5HktXDuuG7G3J6RoIfW48dWPMJTa7Yk08g,729
682
720
  django_cfg/modules/django_admin/config/__init__.py,sha256=yhoZcTjgl40bDnaPe1MFdNLqYQj02cdE48aVrfGCmXU,968
683
721
  django_cfg/modules/django_admin/config/action_config.py,sha256=JjS01JxLT-FzUVq7RlKaB7L38wmVL8uibXO_iXZcljo,1668
@@ -702,14 +740,25 @@ django_cfg/modules/django_admin/templates/django_admin/documentation_block.html,
702
740
  django_cfg/modules/django_admin/templates/django_admin/markdown_docs_block.html,sha256=nO9oEyDYozYF-euaLzE0Cn_Yo_LGUlta-BsRgShDG10,1992
703
741
  django_cfg/modules/django_admin/templates/django_admin/widgets/encrypted_field.html,sha256=-Kd4twY0sav2M5x_0oDj8ElA7CBccToVHFiwGa2WF-w,2774
704
742
  django_cfg/modules/django_admin/templates/django_admin/widgets/encrypted_password.html,sha256=BdiM0CqRyBH1aHGf6iLSfSKOoADY5qaqetbC9AktzaI,2154
705
- django_cfg/modules/django_admin/utils/CODE_BLOCK_DOCS.md,sha256=rp5qMG-Ci30fIs6EyZctjEbhQwxfNq9e36B4CTZOnR0,9456
706
- django_cfg/modules/django_admin/utils/__init__.py,sha256=5V1Og6fpIpRqDIoqF7jYnBmPl9TjV5kByghzT6iOpPs,745
707
- django_cfg/modules/django_admin/utils/badges.py,sha256=eZ1UThdwvv2cHAIDc4vTrD5xAet7fmeb9h9yj4ZXJ-c,6328
743
+ django_cfg/modules/django_admin/utils/__init__.py,sha256=Y0c62CUe41GNsz6ibbYaj7rSOg5Cq8kHDUvAH4eySTo,1712
708
744
  django_cfg/modules/django_admin/utils/decorators.py,sha256=s4jTcgPklY4T4xjXsMHpShd71K_LzgKogem9JKBgNzk,8371
709
- django_cfg/modules/django_admin/utils/displays.py,sha256=f-FT1mD-X56X6xLDJ9FuCi4oz_UYirdLosYrXnJP3hI,7862
710
- django_cfg/modules/django_admin/utils/html_builder.py,sha256=E0ysbbImpZqSr7YFw3FYryG0jjJfffIOqFzefk-HMl8,14500
711
- django_cfg/modules/django_admin/utils/markdown_renderer.py,sha256=eMYde8cDo9y5CO5qNjy7juYe_OPpSpFB1-d84ylpbk4,14324
712
- django_cfg/modules/django_admin/utils/mermaid_plugin.py,sha256=37x_0FQE5IyR6TiaDZDrQQHeQmAsPtlZBnq5N8eAKqA,8889
745
+ django_cfg/modules/django_admin/utils/html_builder.py,sha256=Xm0U0kn02Et8Ml1c1AXAEFpPCvXeIerpiSnVcQbiMBs,2190
746
+ django_cfg/modules/django_admin/utils/badges/__init__.py,sha256=_S5uUxavLG0ouUWrsVqBF1CSLrcxWTb5GlRmTuev_l0,250
747
+ django_cfg/modules/django_admin/utils/badges/status_badges.py,sha256=kOShlu3MZv7kjhtpxPgub0t91CBMb8Mm3ZZvTMh_Gyo,6331
748
+ django_cfg/modules/django_admin/utils/displays/__init__.py,sha256=q0N2kForOp2IRhnMTmj2tJRx7P1ekTu425vHHZ63UI8,258
749
+ django_cfg/modules/django_admin/utils/displays/data_displays.py,sha256=NFy94qaJJER_BhXSifsAFKuHAZFVUDtbmTSGjLrRrGk,7864
750
+ django_cfg/modules/django_admin/utils/html/__init__.py,sha256=22_xZ2Mlec5U-eSRZw1T2j2eo2ahTTRana0VuDtX_zg,646
751
+ django_cfg/modules/django_admin/utils/html/badges.py,sha256=fAEW_4U44xcrbQg7wvk3bQb1BYUAp-nWCbDFm8WNBOw,1769
752
+ django_cfg/modules/django_admin/utils/html/base.py,sha256=HWhGTRy1pXFcK2v2Gds7psFDze1S-GS89HDlrmWLq3M,5302
753
+ django_cfg/modules/django_admin/utils/html/code.py,sha256=yBhBjEWI0o9NlB-EJiHFmyxzPDh8wH3iJwv7kB6HDw8,3012
754
+ django_cfg/modules/django_admin/utils/html/composition.py,sha256=BqKB1aiX2-iyDk-gS35hQZR9-X2y4BzcaEixfLJiqU8,7061
755
+ django_cfg/modules/django_admin/utils/html/formatting.py,sha256=EeSHyObFGPr2Ie6KbySE8WBQtqUFT_BQfXf0oucigIU,8613
756
+ django_cfg/modules/django_admin/utils/html/keyvalue.py,sha256=cBw2RPE3J_3kENYSYNxpm8eY56bwp5yityxBl6N4_q8,7299
757
+ django_cfg/modules/django_admin/utils/html/markdown_integration.py,sha256=r28EyVtma9YfCnSoDDbBthWrZtT9LVmhcXSwe4OG4Ws,3372
758
+ django_cfg/modules/django_admin/utils/html/progress.py,sha256=gAqvZd4bLw7CRJf4f_5UbHHkEzIJrGj_2Ygn8SdNLBk,4348
759
+ django_cfg/modules/django_admin/utils/markdown/__init__.py,sha256=2wA0orNx13WBAy26yJ8d88FGFWDiuu9pmO0ZIdey7To,419
760
+ django_cfg/modules/django_admin/utils/markdown/mermaid_plugin.py,sha256=37x_0FQE5IyR6TiaDZDrQQHeQmAsPtlZBnq5N8eAKqA,8889
761
+ django_cfg/modules/django_admin/utils/markdown/renderer.py,sha256=eMYde8cDo9y5CO5qNjy7juYe_OPpSpFB1-d84ylpbk4,14324
713
762
  django_cfg/modules/django_admin/widgets/__init__.py,sha256=SVVytNURG_TlWePwhws9FYeDe_xp4Ob_CYVA88Y08es,256
714
763
  django_cfg/modules/django_admin/widgets/encrypted_field_widget.py,sha256=h4bSAI2sLjKuBFDufWhtQQQ-eMIAqUzsUezi1p0ERuM,2146
715
764
  django_cfg/modules/django_admin/widgets/registry.py,sha256=P2kQiB3eYXhjRiCXlcImHAoCDyQjZNNoF_-FyQyBZ1w,6864
@@ -995,7 +1044,7 @@ django_cfg/modules/django_twilio/templates/guide.md,sha256=nZfwx-sgWyK5NApm93zOe
995
1044
  django_cfg/modules/django_twilio/templates/sendgrid_otp_email.html,sha256=sXR6_D9hmOFfk9CrfPizpLddVhkRirBWpZd_ioEsxVk,6671
996
1045
  django_cfg/modules/django_twilio/templates/sendgrid_test_data.json,sha256=fh1VyuSiDELHsS_CIz9gp7tlsMAEjaDOoqbAPSZ3yyo,339
997
1046
  django_cfg/modules/django_unfold/__init__.py,sha256=Uquez6xgPUIc8FBMP7qif-adRYQSjQ2dBHxnJPom3eQ,1337
998
- django_cfg/modules/django_unfold/navigation.py,sha256=MqMA7-sfQpaH3T8V3eI0fJY1gPKd5AVx1eJenqwJWNg,14428
1047
+ django_cfg/modules/django_unfold/navigation.py,sha256=0iZnp5q1ghsFisur54HMCukaIzQGe7THZrB0W_aMgIE,15362
999
1048
  django_cfg/modules/django_unfold/system_monitor.py,sha256=KcrTa5irstdB1pDKe3sC0zl4tz9LVjhp7xvbqUM4YVk,6781
1000
1049
  django_cfg/modules/django_unfold/tailwind.py,sha256=NY8nWcUdQw61oNmjPoPl7agcTb-r5IqcpFYy35MNsTM,9107
1001
1050
  django_cfg/modules/django_unfold/utils.py,sha256=5aFaceRc9B3eXfpOVyKRD2wWqFt8KcHxjQg54oD7Oyg,4482
@@ -1014,7 +1063,7 @@ django_cfg/modules/nextjs_admin/templatetags/nextjs_admin.py,sha256=aAekrlu3pvvx
1014
1063
  django_cfg/registry/__init__.py,sha256=CaiL9KwqPzXlIe5-4Qr7PQu5ZxAW1HtuDIXZ7-ktRQg,538
1015
1064
  django_cfg/registry/core.py,sha256=LqqmWwaOo-0KivPD61yolBwxxigvKARZflOv6rLAcHM,3546
1016
1065
  django_cfg/registry/exceptions.py,sha256=b4pIakeRxhT1-ST3lbAnmAQaASRBARCoah_w6vb3VF0,399
1017
- django_cfg/registry/modules.py,sha256=DC9veh6DdnqOa_KPNwDhnxvvNKRNF0Um2isHn1XGoxU,1915
1066
+ django_cfg/registry/modules.py,sha256=OXQ9Ls7KM28kmW2yjT_xPNA_3BsDQyXJFxCmmQpzL7s,2220
1018
1067
  django_cfg/registry/services.py,sha256=l0V2twGpF9BwVlo-TTfFu8dV7GVBS7XKCsScIZXWWbc,2457
1019
1068
  django_cfg/registry/third_party.py,sha256=YPcj0IsxEmh_gpJAcPvIFa21ZWnoFjcreHlXtS4UR-I,2239
1020
1069
  django_cfg/routing/__init__.py,sha256=94No0CWltLJJvKDwqFfKU5CHo_S1OynghWqpx7PsyBY,272
@@ -1070,9 +1119,9 @@ django_cfg/utils/version_check.py,sha256=WO51J2m2e-wVqWCRwbultEwu3q1lQasV67Mw2aa
1070
1119
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
1071
1120
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
1072
1121
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1073
- django_cfg/pyproject.toml,sha256=620u5Gcr1JnM0aTc2dDPlLe4epX8WqX5tLTogwr_CrE,8665
1074
- django_cfg-1.4.120.dist-info/METADATA,sha256=3deYIU64Wm0FWERqzn5Q8ICvGOqOVsC68azVQtUww1k,23876
1075
- django_cfg-1.4.120.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1076
- django_cfg-1.4.120.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1077
- django_cfg-1.4.120.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1078
- django_cfg-1.4.120.dist-info/RECORD,,
1122
+ django_cfg/pyproject.toml,sha256=L1IZT2BI_W7lLh_LF4LiZhCIdxKtxTfj15zLIqh2gmc,8844
1123
+ django_cfg-1.5.1.dist-info/METADATA,sha256=-BLq93lmM19G7ej38baJZOozOTDza884zWY7mI23yb4,24341
1124
+ django_cfg-1.5.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1125
+ django_cfg-1.5.1.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1126
+ django_cfg-1.5.1.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1127
+ django_cfg-1.5.1.dist-info/RECORD,,
@@ -1,396 +0,0 @@
1
- # Code Block Methods Documentation
2
-
3
- New methods added to `HtmlBuilder` for displaying code in Django Admin.
4
-
5
- ## Methods Added
6
-
7
- ### 1. `code()` - Inline Code
8
-
9
- Display short code snippets inline.
10
-
11
- **Signature:**
12
- ```python
13
- def code(text: Any, css_class: str = "") -> SafeString
14
- ```
15
-
16
- **Parameters:**
17
- - `text`: Code text to display
18
- - `css_class`: Additional CSS classes (optional)
19
-
20
- **Usage:**
21
- ```python
22
- from django_cfg.modules.django_admin.base import PydanticAdmin
23
-
24
- class MyAdmin(PydanticAdmin):
25
- @computed_field("Command")
26
- def command_display(self, obj):
27
- return self.html.code(obj.full_command)
28
- ```
29
-
30
- **Examples:**
31
- ```python
32
- # File path
33
- self.html.code("/path/to/file")
34
-
35
- # Command
36
- self.html.code("python manage.py migrate")
37
-
38
- # Configuration value
39
- self.html.code("DEBUG=True")
40
- ```
41
-
42
- **Renders as:**
43
- ```html
44
- <code class="font-mono text-xs bg-base-100 dark:bg-base-800 px-1.5 py-0.5 rounded">
45
- /path/to/file
46
- </code>
47
- ```
48
-
49
- ---
50
-
51
- ### 2. `code_block()` - Multi-line Code Block
52
-
53
- Display multi-line code with syntax highlighting hints, scrolling, and color variants.
54
-
55
- **Signature:**
56
- ```python
57
- def code_block(
58
- text: Any,
59
- language: Optional[str] = None,
60
- max_height: Optional[str] = None,
61
- variant: str = "default"
62
- ) -> SafeString
63
- ```
64
-
65
- **Parameters:**
66
- - `text`: Code content (multi-line supported)
67
- - `language`: Programming language hint (`"json"`, `"python"`, `"bash"`, etc.) - for future syntax highlighting
68
- - `max_height`: Maximum height with overflow scroll (e.g., `"400px"`, `"20rem"`)
69
- - `variant`: Color variant - `"default"`, `"warning"`, `"danger"`, `"success"`, `"info"`
70
-
71
- **Usage:**
72
- ```python
73
- from django_cfg.modules.django_admin.base import PydanticAdmin
74
- import json
75
-
76
- class MyAdmin(PydanticAdmin):
77
- @computed_field("Configuration")
78
- def config_display(self, obj):
79
- if not obj.config:
80
- return self.html.empty()
81
-
82
- return self.html.code_block(
83
- json.dumps(obj.config, indent=2),
84
- language="json"
85
- )
86
-
87
- @computed_field("Standard Output")
88
- def stdout_display(self, obj):
89
- if not obj.stdout:
90
- return self.html.empty()
91
-
92
- return self.html.code_block(
93
- obj.stdout,
94
- max_height="400px"
95
- )
96
-
97
- @computed_field("Error Message")
98
- def error_display(self, obj):
99
- if not obj.error_message:
100
- return self.html.empty()
101
-
102
- return self.html.code_block(
103
- obj.error_message,
104
- max_height="200px",
105
- variant="danger"
106
- )
107
- ```
108
-
109
- **Examples:**
110
-
111
- #### JSON Display
112
- ```python
113
- # Display JSON configuration
114
- self.html.code_block(
115
- json.dumps({"key": "value", "nested": {"foo": "bar"}}, indent=2),
116
- language="json"
117
- )
118
- ```
119
-
120
- #### Log Output with Scrolling
121
- ```python
122
- # Display command output with scroll
123
- self.html.code_block(
124
- "Line 1\nLine 2\nLine 3\n...",
125
- max_height="400px"
126
- )
127
- ```
128
-
129
- #### Error Messages
130
- ```python
131
- # Display error with danger styling
132
- self.html.code_block(
133
- "Traceback (most recent call last):\n File ...",
134
- variant="danger",
135
- max_height="300px"
136
- )
137
- ```
138
-
139
- #### Warnings
140
- ```python
141
- # Display warnings with warning styling
142
- self.html.code_block(
143
- "Warning: This is deprecated\nUse new_method() instead",
144
- variant="warning"
145
- )
146
- ```
147
-
148
- **Renders as:**
149
- ```html
150
- <!-- Default variant -->
151
- <pre class="font-mono text-xs whitespace-pre-wrap break-words border rounded-md p-3
152
- bg-base-50 dark:bg-base-900 border-base-200 dark:border-base-700"
153
- style="max-height: 400px; overflow-y: auto;">
154
- <code>{"key": "value"}</code>
155
- </pre>
156
-
157
- <!-- Danger variant -->
158
- <pre class="font-mono text-xs whitespace-pre-wrap break-words border rounded-md p-3
159
- bg-danger-50 dark:bg-danger-900/20 border-danger-200 dark:border-danger-700"
160
- style="max-height: 200px; overflow-y: auto;">
161
- <code>Error: Something went wrong</code>
162
- </pre>
163
- ```
164
-
165
- ---
166
-
167
- ## Color Variants
168
-
169
- | Variant | Background | Border | Use Case |
170
- |---------|-----------|--------|----------|
171
- | `default` | Gray | Gray | Standard code, JSON, logs |
172
- | `warning` | Yellow/Orange | Yellow/Orange | Warnings, stderr output |
173
- | `danger` | Red | Red | Errors, exceptions, failures |
174
- | `success` | Green | Green | Success messages, confirmations |
175
- | `info` | Blue | Blue | Info messages, metadata |
176
-
177
- ---
178
-
179
- ## Use Cases
180
-
181
- ### 1. Command Execution Logs
182
- ```python
183
- @computed_field("Output")
184
- def output_display(self, obj):
185
- return self.html.code_block(
186
- obj.stdout,
187
- max_height="400px"
188
- )
189
- ```
190
-
191
- ### 2. JSON Configuration
192
- ```python
193
- @computed_field("Settings")
194
- def settings_display(self, obj):
195
- return self.html.code_block(
196
- json.dumps(obj.settings, indent=2),
197
- language="json"
198
- )
199
- ```
200
-
201
- ### 3. Error Details
202
- ```python
203
- @computed_field("Error")
204
- def error_display(self, obj):
205
- if not obj.error_message:
206
- return self.html.empty()
207
-
208
- return self.html.code_block(
209
- obj.error_message,
210
- max_height="300px",
211
- variant="danger"
212
- )
213
- ```
214
-
215
- ### 4. API Request/Response
216
- ```python
217
- @computed_field("Request Body")
218
- def request_body_display(self, obj):
219
- return self.html.code_block(
220
- obj.request_body,
221
- language="json",
222
- max_height="300px"
223
- )
224
- ```
225
-
226
- ### 5. SQL Queries
227
- ```python
228
- @computed_field("Query")
229
- def query_display(self, obj):
230
- return self.html.code_block(
231
- obj.sql_query,
232
- language="sql",
233
- max_height="200px"
234
- )
235
- ```
236
-
237
- ---
238
-
239
- ## Styling Details
240
-
241
- ### Tailwind Classes Used
242
-
243
- **Base Classes:**
244
- - `font-mono` - Monospace font
245
- - `text-xs` - Small text size
246
- - `whitespace-pre-wrap` - Preserve whitespace, wrap long lines
247
- - `break-words` - Break long words
248
- - `border` - Border
249
- - `rounded-md` - Rounded corners
250
- - `p-3` - Padding
251
-
252
- **Variant-specific:**
253
- - Light mode: `bg-{variant}-50 border-{variant}-200`
254
- - Dark mode: `dark:bg-{variant}-900/20 dark:border-{variant}-700`
255
-
256
- **Scrolling:**
257
- - Applied via inline `style` attribute
258
- - `max-height` and `overflow-y: auto`
259
-
260
- ---
261
-
262
- ## Implementation Notes
263
-
264
- 1. **Escaping**: All text is automatically escaped using Django's `escape()` to prevent XSS
265
- 2. **SafeString**: Returns Django's `SafeString` for safe HTML rendering
266
- 3. **Dark Mode**: Full dark mode support with Tailwind's dark: prefix
267
- 4. **Responsive**: Works on mobile with `break-words` and `whitespace-pre-wrap`
268
- 5. **Future-proof**: `language` parameter allows for syntax highlighting integration later
269
-
270
- ---
271
-
272
- ## Complete Example: Command Execution Admin
273
-
274
- ```python
275
- from django.contrib import admin
276
- from django_cfg.modules.django_admin import (
277
- AdminConfig, BadgeField, DateTimeField, Icons, computed_field
278
- )
279
- from django_cfg.modules.django_admin.base import PydanticAdmin
280
- import json
281
-
282
- commandexecution_config = AdminConfig(
283
- model=CommandExecution,
284
- list_display=["id", "command", "status", "created_at"],
285
- readonly_fields=[
286
- "command_display",
287
- "args_display",
288
- "stdout_display",
289
- "stderr_display",
290
- "error_display",
291
- ],
292
- )
293
-
294
- @admin.register(CommandExecution)
295
- class CommandExecutionAdmin(PydanticAdmin):
296
- config = commandexecution_config
297
-
298
- @computed_field("Command")
299
- def command_display(self, obj):
300
- """Inline code for command."""
301
- return self.html.code(obj.full_command)
302
-
303
- @computed_field("Arguments")
304
- def args_display(self, obj):
305
- """JSON code block for args."""
306
- if not obj.args:
307
- return self.html.empty()
308
-
309
- return self.html.code_block(
310
- json.dumps(obj.args, indent=2),
311
- language="json"
312
- )
313
-
314
- @computed_field("Standard Output")
315
- def stdout_display(self, obj):
316
- """Scrollable output."""
317
- if not obj.stdout:
318
- return self.html.empty()
319
-
320
- return self.html.code_block(
321
- obj.stdout,
322
- max_height="400px"
323
- )
324
-
325
- @computed_field("Standard Error")
326
- def stderr_display(self, obj):
327
- """Warning-styled error output."""
328
- if not obj.stderr:
329
- return self.html.empty()
330
-
331
- return self.html.code_block(
332
- obj.stderr,
333
- max_height="400px",
334
- variant="warning"
335
- )
336
-
337
- @computed_field("Error Message")
338
- def error_display(self, obj):
339
- """Danger-styled error message."""
340
- if not obj.error_message:
341
- return self.html.empty()
342
-
343
- return self.html.code_block(
344
- obj.error_message,
345
- max_height="200px",
346
- variant="danger"
347
- )
348
- ```
349
-
350
- ---
351
-
352
- ## Testing
353
-
354
- ```python
355
- # Test inline code
356
- assert 'font-mono' in str(html.code("test"))
357
-
358
- # Test code block
359
- assert '<pre' in str(html.code_block("test"))
360
- assert 'overflow-y: auto' in str(html.code_block("test", max_height="400px"))
361
-
362
- # Test variants
363
- assert 'bg-danger' in str(html.code_block("error", variant="danger"))
364
- assert 'bg-warning' in str(html.code_block("warn", variant="warning"))
365
- ```
366
-
367
- ---
368
-
369
- ## Migration from Old Format
370
-
371
- **Before (manual HTML):**
372
- ```python
373
- def output_display(self, obj):
374
- return format_html(
375
- '<pre style="max-height: 400px; overflow-y: auto; '
376
- 'background: #f8f9fa; padding: 10px; border-radius: 4px;">{}</pre>',
377
- obj.stdout
378
- )
379
- ```
380
-
381
- **After (with code_block):**
382
- ```python
383
- def output_display(self, obj):
384
- return self.html.code_block(
385
- obj.stdout,
386
- max_height="400px"
387
- )
388
- ```
389
-
390
- Benefits:
391
- - ✅ Cleaner, more readable code
392
- - ✅ Consistent styling across project
393
- - ✅ Dark mode support
394
- - ✅ Proper escaping
395
- - ✅ Tailwind CSS classes
396
- - ✅ Variant support for different contexts