fastlifeweb 0.20.1__py3-none-any.whl → 0.21.0__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.
Files changed (54) hide show
  1. CHANGELOG.md +10 -0
  2. fastlife/__init__.py +5 -0
  3. fastlife/adapters/jinjax/renderer.py +4 -52
  4. fastlife/adapters/jinjax/widget_factory/bool_builder.py +2 -2
  5. fastlife/adapters/jinjax/widget_factory/emailstr_builder.py +5 -4
  6. fastlife/adapters/jinjax/widget_factory/enum_builder.py +2 -2
  7. fastlife/adapters/jinjax/widget_factory/factory.py +20 -21
  8. fastlife/adapters/jinjax/widget_factory/literal_builder.py +7 -6
  9. fastlife/adapters/jinjax/widget_factory/model_builder.py +3 -3
  10. fastlife/adapters/jinjax/widget_factory/secretstr_builder.py +2 -2
  11. fastlife/adapters/jinjax/widget_factory/sequence_builder.py +3 -3
  12. fastlife/adapters/jinjax/widget_factory/set_builder.py +2 -2
  13. fastlife/adapters/jinjax/widget_factory/simpletype_builder.py +7 -8
  14. fastlife/adapters/jinjax/widget_factory/union_builder.py +3 -3
  15. fastlife/adapters/jinjax/widgets/base.py +35 -35
  16. fastlife/adapters/jinjax/widgets/boolean.py +13 -34
  17. fastlife/adapters/jinjax/widgets/checklist.py +36 -42
  18. fastlife/adapters/jinjax/widgets/dropdown.py +32 -38
  19. fastlife/adapters/jinjax/widgets/hidden.py +7 -15
  20. fastlife/adapters/jinjax/widgets/model.py +33 -40
  21. fastlife/adapters/jinjax/widgets/sequence.py +61 -40
  22. fastlife/adapters/jinjax/widgets/text.py +39 -78
  23. fastlife/adapters/jinjax/widgets/union.py +50 -57
  24. fastlife/components/CsrfToken.jinja +1 -1
  25. fastlife/components/pydantic_form/Widget.jinja +4 -3
  26. fastlife/config/configurator.py +65 -19
  27. fastlife/config/exceptions.py +0 -2
  28. fastlife/config/views.py +0 -2
  29. fastlife/domain/__init__.py +1 -0
  30. fastlife/domain/model/__init__.py +1 -0
  31. fastlife/domain/model/security.py +19 -0
  32. fastlife/domain/model/template.py +30 -0
  33. fastlife/domain/model/types.py +17 -0
  34. fastlife/request/request.py +19 -0
  35. fastlife/security/csrf.py +3 -13
  36. fastlife/services/templates.py +9 -42
  37. fastlife/services/translations.py +12 -0
  38. fastlife/templates/__init__.py +1 -6
  39. fastlife/templates/inline.py +18 -14
  40. {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/METADATA +1 -1
  41. {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/RECORD +44 -49
  42. fastlife/components/pydantic_form/Boolean.jinja +0 -13
  43. fastlife/components/pydantic_form/Checklist.jinja +0 -21
  44. fastlife/components/pydantic_form/Dropdown.jinja +0 -18
  45. fastlife/components/pydantic_form/Hidden.jinja +0 -3
  46. fastlife/components/pydantic_form/Model.jinja +0 -30
  47. fastlife/components/pydantic_form/Sequence.jinja +0 -47
  48. fastlife/components/pydantic_form/Text.jinja +0 -11
  49. fastlife/components/pydantic_form/Textarea.jinja +0 -38
  50. fastlife/components/pydantic_form/Union.jinja +0 -34
  51. fastlife/templates/binding.py +0 -52
  52. {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/WHEEL +0 -0
  53. {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/entry_points.txt +0 -0
  54. {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastlifeweb
3
- Version: 0.20.1
3
+ Version: 0.21.0
4
4
  Summary: High-level web framework
5
5
  Author-Email: Guillaume Gauvrit <guillaume@gauvr.it>
6
6
  License: MIT License
@@ -1,5 +1,5 @@
1
- CHANGELOG.md,sha256=TigqTUTKqu3-oT4WGKkwO84U-SP7PpdzfaEE8C4eMd8,6032
2
- fastlife/__init__.py,sha256=l8SVz6RNy8QJNKFwUx9OHt-V21r9yeKK8pLuUY1u4ps,799
1
+ CHANGELOG.md,sha256=GaTZcagNH8oWB_T917vp4fV52KakMUJO2Tzu5Mme7ns,6617
2
+ fastlife/__init__.py,sha256=r7aiYUizYR5f2jZ5UBTugsP6Adm-k9AU-tlpPl71QLk,957
3
3
  fastlife/adapters/__init__.py,sha256=WYjEN8gp4r7LCHqmIO5VzzvsT8QGRE3w4G47UwYDtAo,94
4
4
  fastlife/adapters/jinjax/__init__.py,sha256=4JRAUwFGpTxYtRlg5sU79AahxyAiRMhllRFHoI-dnug,117
5
5
  fastlife/adapters/jinjax/jinjax_ext/__init__.py,sha256=z6NWvHzTNEq6bVO4iJoTR6-y4A6UtS_VuSMV_tff1jY,49
@@ -7,34 +7,34 @@ fastlife/adapters/jinjax/jinjax_ext/docstring.py,sha256=Zlx0oSxsRU9vQvGoyScXf9uB
7
7
  fastlife/adapters/jinjax/jinjax_ext/inspectable_catalog.py,sha256=KHOYTT6UNA41QwyLNQVoG4trOVXYdChlRmqq_G1pv1s,2987
8
8
  fastlife/adapters/jinjax/jinjax_ext/inspectable_component.py,sha256=Cz6PrRhO3lXUI9baxosOr6MtZFjuOki9YTEWMkfbbR0,2909
9
9
  fastlife/adapters/jinjax/jinjax_ext/jinjax_doc.py,sha256=uPcYiUTrliR2lLpRuQUrirmFzTEVRTwo1mUZE4Z5onc,10225
10
- fastlife/adapters/jinjax/renderer.py,sha256=6HjngkDNWUTlR_ST3v_WDu8KD4PJnniK74eQl_RXdzU,6866
10
+ fastlife/adapters/jinjax/renderer.py,sha256=PMqPpnF6wGwWAb4sXw_B-h35n7UHRViU8VxySlyWlBM,5240
11
11
  fastlife/adapters/jinjax/widget_factory/__init__.py,sha256=Dy_2xr_YDAyEF9WtNpjV-aYaehRO1iKEIHVFdfFeszw,59
12
12
  fastlife/adapters/jinjax/widget_factory/base.py,sha256=TLEpYdekR4AeHhIie_DICc_oSvQaUaL8GlatqNiRewg,1046
13
- fastlife/adapters/jinjax/widget_factory/bool_builder.py,sha256=2-Hv5w4hfBfGWGetb00I8Lm1FDAputH2MNt3tCx-RbA,1280
14
- fastlife/adapters/jinjax/widget_factory/emailstr_builder.py,sha256=GjRCT_kq9D6ZSu_Qs7ef2nj8gfaZMT0J-SpEj6NZWOg,1472
15
- fastlife/adapters/jinjax/widget_factory/enum_builder.py,sha256=xMZpxik9zmpZbMTcldOHQRXYscNO-9YlcduY3GpFEQI,1516
16
- fastlife/adapters/jinjax/widget_factory/factory.py,sha256=tD4RrOgWLqD1_R2ZVHiKDOdPCV5JDN3e6SgpklehBhQ,5649
17
- fastlife/adapters/jinjax/widget_factory/literal_builder.py,sha256=mk8cmXDah_WRpy6wTRA6_du7UV6vxHoDb9ujgAAxH44,1677
18
- fastlife/adapters/jinjax/widget_factory/model_builder.py,sha256=cqrb7zkJHy0r4angYRYnz5hyHx99EL4MbNl-sS6qq8I,2220
19
- fastlife/adapters/jinjax/widget_factory/secretstr_builder.py,sha256=DrFXJeoajai7r1qfq8kBavdoo33-9DImmM4u8l_MKfQ,1562
20
- fastlife/adapters/jinjax/widget_factory/sequence_builder.py,sha256=97aJ4K_pm1zDr_xNYUoO9UeziRT4VeFKIdkZ1gAcjdM,1928
21
- fastlife/adapters/jinjax/widget_factory/set_builder.py,sha256=Qulao7i7pJNF1ZRzFdpJ-onQ2faW8IjACOi2sZyoYzA,2731
22
- fastlife/adapters/jinjax/widget_factory/simpletype_builder.py,sha256=OFkbF_5_9DP56VQLXRXGi6_cm_6JmFgCzdCblnBb1aE,1670
23
- fastlife/adapters/jinjax/widget_factory/union_builder.py,sha256=-FlqGejzfEiyKb8vgSaMbECr8libC4BprK6F2OA_12M,2825
13
+ fastlife/adapters/jinjax/widget_factory/bool_builder.py,sha256=ElIDb6rlUiwuDAetC22TreoMa9HDgoZ2euVV1VurFFY,1291
14
+ fastlife/adapters/jinjax/widget_factory/emailstr_builder.py,sha256=hO0_4yd0lZ8mLqAzM_FMecdtkSa03AIG13cvs6K9JPA,1532
15
+ fastlife/adapters/jinjax/widget_factory/enum_builder.py,sha256=agx67oUeVy5_BKzY4WV0DxT67R43Vy74CoeHl9PBvK4,1527
16
+ fastlife/adapters/jinjax/widget_factory/factory.py,sha256=xEgrJ2U4Ys0XKhOCbw_Im2De_gD2fRO_BJgb1a0fCZI,5571
17
+ fastlife/adapters/jinjax/widget_factory/literal_builder.py,sha256=mrtWbDMKNFtw5ufJK3DnkkttGGk16EnDQhejyOd57Ys,1758
18
+ fastlife/adapters/jinjax/widget_factory/model_builder.py,sha256=WgIEUExtGO_s9AlNQlaTG_136ipe64MIJsNP0nlnsOc,2236
19
+ fastlife/adapters/jinjax/widget_factory/secretstr_builder.py,sha256=JJLqN74tUSTDDBYcRLDuqOLSL0P16S1Fp-SqTCdjjgg,1573
20
+ fastlife/adapters/jinjax/widget_factory/sequence_builder.py,sha256=j5KRfK5R8q_QdzGqjG86mjoKTWH7gvhjXesFAoItPaU,1944
21
+ fastlife/adapters/jinjax/widget_factory/set_builder.py,sha256=kwtVLATkoOFTcKBKHk7xZwQxRomPCic0sp4Bsd8YQfM,2742
22
+ fastlife/adapters/jinjax/widget_factory/simpletype_builder.py,sha256=olP66B9AMY1X8fgEAxhMdozWN_w1TtcIAIW6uPJRSng,1570
23
+ fastlife/adapters/jinjax/widget_factory/union_builder.py,sha256=qQOK3Y4I0Tg0XOzU_DwseaaKRmqQ7ORMfFyIHd6oysU,2841
24
24
  fastlife/adapters/jinjax/widgets/__init__.py,sha256=HERnX9xiXUbTDz3XtlnHWABTBjhIq_kkBgWs5E6ZIMY,42
25
- fastlife/adapters/jinjax/widgets/base.py,sha256=3bBThRMnsdCi6Q_Dm73ep5pNOqgpSXsvAIBbHshfY7I,4037
26
- fastlife/adapters/jinjax/widgets/boolean.py,sha256=w4hZMo_8xDoThStlIUR4eVfLm8JwUp0-TaGCjGSyCbA,1145
27
- fastlife/adapters/jinjax/widgets/checklist.py,sha256=8fgOrdxy1xpyQ6p3_mbRMd2vx6EU2WT5jI7QF27Y5EQ,1664
28
- fastlife/adapters/jinjax/widgets/dropdown.py,sha256=3Kc7i0z-7d6HrQchSHFCO5-xOh3bSEePo_pjXrIkvSE,1599
29
- fastlife/adapters/jinjax/widgets/hidden.py,sha256=ZOJoUwMMgyabTFII38lnr8QRgVo370Go0VZ4qhEW1zc,720
30
- fastlife/adapters/jinjax/widgets/model.py,sha256=t9A3C8wcptxvf7Mlrx9mUraxnG2p_39CrGnRq71t-A0,1322
31
- fastlife/adapters/jinjax/widgets/sequence.py,sha256=60rgz4LgE_TQQwajiZhn6EhY-s-HXOiIdQiQoKlUCvQ,1533
32
- fastlife/adapters/jinjax/widgets/text.py,sha256=KtUieF-q_BigG5AcL-4Sdr6LrIOQdWPwlaVW-2p-KPQ,3205
33
- fastlife/adapters/jinjax/widgets/union.py,sha256=CO6Q4_U8DieVsS5NzMp6TAbVXrBljfcjSARycEKYPDY,2540
25
+ fastlife/adapters/jinjax/widgets/base.py,sha256=hG6_MWnedKC55P2WAqtXokplMwAOmjb4WUVLx2n8ZOE,4121
26
+ fastlife/adapters/jinjax/widgets/boolean.py,sha256=GFvyO2Lz-vTJ8lpX2UrkJk7ymu0vU-xnBBEmyBKamJg,613
27
+ fastlife/adapters/jinjax/widgets/checklist.py,sha256=xsr_edMu1nTcNnMEs1AAS3U-ugK95pEqn5NV5hjTeI0,1747
28
+ fastlife/adapters/jinjax/widgets/dropdown.py,sha256=ou8U48txShr8IXdwF4_pBvTn1VcR9SazZKzbLcsN3_0,1458
29
+ fastlife/adapters/jinjax/widgets/hidden.py,sha256=IKcVYs6NjN8YjW-UTr3DRBong6Wrc0QLgcp8U9JoQmE,638
30
+ fastlife/adapters/jinjax/widgets/model.py,sha256=JKLDUxIReLO_0VcU2px3WHfF9d-eeNy4ZvJKwvGKzso,1299
31
+ fastlife/adapters/jinjax/widgets/sequence.py,sha256=qWiTrVe1BTl7_ZVsep6QzUZxKfeJj6PD0xl62KiEnpE,2560
32
+ fastlife/adapters/jinjax/widgets/text.py,sha256=uYdJ1bjA3-2vEumh2nnd264wAaHU758ZxEiN2BaqtcE,2143
33
+ fastlife/adapters/jinjax/widgets/union.py,sha256=-Pp8HDFmzoV4mT0u8oqqC3AVsWMt7vYo_ios0nyRLzw,2603
34
34
  fastlife/components/A.jinja,sha256=rjnOFNpM2SUeJ0P8FDe3jzc_1WlsL65Kv-tb6KMCEpw,1389
35
35
  fastlife/components/Button.jinja,sha256=COtCjDpzGLNqtBUYsHw7gdUay4kff3KdLJFAzrEnMmo,2310
36
36
  fastlife/components/Checkbox.jinja,sha256=47_E9uPdr3QKUvRVhNQA7VE0uh5FVslQM26cdF0WCtY,753
37
- fastlife/components/CsrfToken.jinja,sha256=ftqhcMibf1G8pbGCytlUcj5LGEmD8QJKwVKTro5w-ns,199
37
+ fastlife/components/CsrfToken.jinja,sha256=mS0q-3_hAevl_waWEPaN0QAYOBzMyzl-W1PSpEHUBA0,215
38
38
  fastlife/components/Details.jinja,sha256=BKyhSU7bZdbd_deTjmAGcMbgUoQW3h8JSR3thH-2oJA,741
39
39
  fastlife/components/Form.jinja,sha256=Wb0nK5xuhqhkuQll9j76i3nBJcYCIjXG9RE9nWeoPZc,2095
40
40
  fastlife/components/H1.jinja,sha256=ODwQMgwtuy2E2ShgamjFDlnCwOQQuuLIhvEzUF66nYM,375
@@ -1671,26 +1671,22 @@ fastlife/components/icons/solid/Wrench.jinja,sha256=ZdpxRZTC5p54FGWw3bgeaQyaPooJ
1671
1671
  fastlife/components/icons/solid/WrenchScrewdriver.jinja,sha256=bqF-g6PTJds_KK2cMosVfycBVIIrmy_3sCaTkb9-C9o,1566
1672
1672
  fastlife/components/icons/solid/XCircle.jinja,sha256=pO93hG8JImNOy94B62tN7fdzkzGvSsqkSkkZlkLaxeo,791
1673
1673
  fastlife/components/icons/solid/XMark.jinja,sha256=c-ngdLuYwEMicwm4-Aj4xcEc1uQ_LrBoPhdDhQutEA8,705
1674
- fastlife/components/pydantic_form/Boolean.jinja,sha256=PsuEGHO8Fo0tqsgY1S1vyDZkrtwNo9zOGBLQM3doUCM,589
1675
- fastlife/components/pydantic_form/Checklist.jinja,sha256=mWFntBPhJJV1oX-Y4ATQirQYd8o0qxLOyoup0hwiItg,919
1676
- fastlife/components/pydantic_form/Dropdown.jinja,sha256=zAXRPE3as2nCAqvheqh9J2S1e46olwVm18CWUQ3Tj5g,688
1677
1674
  fastlife/components/pydantic_form/Error.jinja,sha256=vVSb1BKyKLOD4IOAM7aCKSNh7aAlmoiZVgRuvDCwLIo,205
1678
- fastlife/components/pydantic_form/Hidden.jinja,sha256=aAi09brl26NV4lE98o86HJIg1Q3x-41ViysJ7ia3ZD0,224
1679
1675
  fastlife/components/pydantic_form/Hint.jinja,sha256=8leBpfMGDmalc_KAjr2paTojr_rwq-luS6m_1BGj7Tw,202
1680
- fastlife/components/pydantic_form/Model.jinja,sha256=GTlxcISBJseMObXDh-OXJOp0HWi8whCoqmUMzarbXL8,917
1681
- fastlife/components/pydantic_form/Sequence.jinja,sha256=LV5N56Z1t2amYfpkIo4jpk-u5pZlEFJmbLK2W3nliNM,1791
1682
- fastlife/components/pydantic_form/Text.jinja,sha256=2f_3Q32GySHTLFt-YO8gEJNCY-3XqCSqZH-RQTMooMg,514
1683
- fastlife/components/pydantic_form/Textarea.jinja,sha256=NzfCi5agRUSVcb5RXw0QamM8P1lZ-CdNI6P30zb2948,1155
1684
- fastlife/components/pydantic_form/Union.jinja,sha256=czTska54z9KCZKu-FaycLmOvtH6y6CGUFQ8DHnkjrJk,1461
1685
- fastlife/components/pydantic_form/Widget.jinja,sha256=EXskDqt22D5grpGVwlZA3ndve2Wr_6yQH4qVE9c31Og,397
1676
+ fastlife/components/pydantic_form/Widget.jinja,sha256=PgguUpvhG6CY9AW6H8qQMjKqjlybjDCAaFFAOHzrzVQ,418
1686
1677
  fastlife/config/__init__.py,sha256=R0HXh0rt6Aecf5kJmXvhH-6QrQb1SyuI83bOU8T80fc,488
1687
- fastlife/config/configurator.py,sha256=sVecDJbjeRQRjULjbQH1JCeBOqvS6DUeQGJ5Nh2HQlw,22649
1688
- fastlife/config/exceptions.py,sha256=kH2-akbzGeODlY_1bUhbzDKqBFrpOoqnVom0WPm0IGg,1237
1678
+ fastlife/config/configurator.py,sha256=vkoMcq4Ndr1JjEZWavoFspRyYGhdsvCo3LBj3icfu3Q,24618
1679
+ fastlife/config/exceptions.py,sha256=9MdBnbfy-Aw-KaIFzju0Kh8Snk41-v9LqK2w48Tdy1s,1169
1689
1680
  fastlife/config/openapiextra.py,sha256=rYoerrn9sni2XwnO3gIWqaz7M0aDZPhVLjzqhDxue0o,514
1690
1681
  fastlife/config/registry.py,sha256=zP_LPvwTcUZdrrsCnRaUfJzeYq7M_eVdRWlN0oO52RE,1754
1691
1682
  fastlife/config/resources.py,sha256=Wu3vVr7XD18Gf4-MYYCxAAnuRmsAJmpllonts_BVGdQ,8593
1692
1683
  fastlife/config/settings.py,sha256=t9goMfnc_oWrS_c3vgivIe0w6N2Byohcfol2CAnLiJs,3892
1693
- fastlife/config/views.py,sha256=C6Ot3mxTyN5isVsIe5b9x-VzD2q76pJQ8xY2aPWdMZM,2460
1684
+ fastlife/config/views.py,sha256=2YjkCN9da1ck20c69IZIozM1qRjAxWdSPjcxqupUX_o,2392
1685
+ fastlife/domain/__init__.py,sha256=3zDDos5InVX0el9OO0lgSDGzdUNYIhlA6w4uhBh2pF8,29
1686
+ fastlife/domain/model/__init__.py,sha256=aoBjaSpDscuFXvtknJHwiNyoJRUpE-v4X54h_wNuo2Y,27
1687
+ fastlife/domain/model/security.py,sha256=BUiWK-S7rVciWHO1qTkM8e_KxzpF6gGC4MMJK1v6iDo,414
1688
+ fastlife/domain/model/template.py,sha256=z9oxdKme1hMPuvk7mBiKR_tuVY8TqH77aTYqMgvEGl8,876
1689
+ fastlife/domain/model/types.py,sha256=64jJKFAi5x0e3vr8naHU1m_as0Qy8MS-s9CG0z6K1qc,381
1694
1690
  fastlife/middlewares/__init__.py,sha256=C3DUOzR5EhlAv5Zq7h-Abyvkd7bUsJohTRSB2wpRYQE,220
1695
1691
  fastlife/middlewares/base.py,sha256=9OYqByRuVoIrLt353NOedPQTLdr7LSmxhb2BZcp20qk,638
1696
1692
  fastlife/middlewares/reverse_proxy/__init__.py,sha256=g1SoVDmenKzpAAPYHTEsWgdBByOxtLg9fGx6RV3i0ok,846
@@ -1703,25 +1699,24 @@ fastlife/request/__init__.py,sha256=-wrh12uWM7ysmIUE6FszBit2H6iI5LWVEnHxQJ_23ZE,
1703
1699
  fastlife/request/form.py,sha256=BiuvbV85NkvnJECSxqabfq3PhMfdKMPVobS35PhxSFA,3595
1704
1700
  fastlife/request/form_data.py,sha256=JZmKbKZz8nnspvCHYHQrz-xsFVJFaWHkTilUWk7Fx-M,4448
1705
1701
  fastlife/request/localizer.py,sha256=9MXAcsod-Po5qeg4lttD3dyumiI0y5vGHCwSSmt9or8,349
1706
- fastlife/request/request.py,sha256=h4Ji0GElWJ3W2hHgOwjSKHQcxUjjPuOk09v-oyfjEd0,2568
1702
+ fastlife/request/request.py,sha256=6y7Su4tS7GLx-udzvKQBMb1-Sdt3GaCWaBz8vKSN5Hw,3291
1707
1703
  fastlife/routing/__init__.py,sha256=8EMnQE5n8oA4J9_c3nxzwKDVt3tefZ6fGH0d2owE8mo,195
1708
1704
  fastlife/routing/route.py,sha256=vqjfMsHAVO0l2B8fuB8t19CKMtE7WoBkG4kvi4lUonM,1441
1709
1705
  fastlife/routing/router.py,sha256=ho9TvTkX2iUW6GEh99FgclZVFKkCCCxYG4pPHeUtGn8,482
1710
1706
  fastlife/security/__init__.py,sha256=QYDcJ3oXQzqXQxoDD_6biGAtercFrtePttoifiL1j34,25
1711
- fastlife/security/csrf.py,sha256=PIKG83LPqKz4kDALnZxIyPdYVwbNqsIryi7JPqRPQag,2168
1707
+ fastlife/security/csrf.py,sha256=lQ6GcSrs6GiUN03hRJqlqw2a9CJ9Wkt1joLE9lszd6w,1870
1712
1708
  fastlife/security/policy.py,sha256=4WHu8xhR7tAdXUHpHY1kdVIdTOFsUl92R8IsIRyYMSU,5579
1713
1709
  fastlife/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1714
1710
  fastlife/services/locale_negociator.py,sha256=Np2O8s7xnYTpf5eCG7LvcfFJ2LV7p_k86NNrU9Lju88,846
1715
1711
  fastlife/services/policy.py,sha256=RfYGPjfEAAoHECUnZVLPZgN0iRanu8UKQSky6oAz81o,1687
1716
- fastlife/services/templates.py,sha256=xSoVofpKXrZc1fDLAJyDDceJrKZaZRL1K8wFp2rGsE0,4272
1717
- fastlife/services/translations.py,sha256=Akazow9YTb6N2IDdMZOAMef-grbAC7fM0nA3hw-mHt4,5315
1712
+ fastlife/services/templates.py,sha256=ICNznXw3lEEiMyU60uqmq1uu8IWjF2iro1l-8SE0w_8,2716
1713
+ fastlife/services/translations.py,sha256=dfLopdQnkMTaehth2guRVBOKxxt7paMp8SgoJ4z0Ilc,5664
1718
1714
  fastlife/shared_utils/__init__.py,sha256=i66ytuf-Ezo7jSiNQHIsBMVIcB-tDX0tg28-pUOlhzE,26
1719
1715
  fastlife/shared_utils/infer.py,sha256=3G_u6q2aWzeiVlAyGaWIlnAcz90m4bFNwpPYd5JIqfE,723
1720
1716
  fastlife/shared_utils/resolver.py,sha256=Wb9cO2MWavpti63hju15xmwFMgaD5DsQaxikRpB39E8,3713
1721
- fastlife/templates/__init__.py,sha256=yB6Zpz-jsFytLAz4Z6Nmuvr7Z8kbCXSdgw6kMpggTxk,241
1722
- fastlife/templates/binding.py,sha256=0pE2btOwLf4xOEgBXVOyz_dIX9tBCYCaJ7RhZI3knbs,1464
1717
+ fastlife/templates/__init__.py,sha256=OEXVdehy-rZ9IHikjNAAlfVdC0tJPlkTsIFTltIAFGo,162
1723
1718
  fastlife/templates/constants.py,sha256=MGdUjkF9hsPMN8rOS49eWbAApcb8FL-FAeFvJU8k90M,8387
1724
- fastlife/templates/inline.py,sha256=wrZDAtd7zXcACHl2LVz0HqDT1VSPsiVy4srt3JSDiu4,704
1719
+ fastlife/templates/inline.py,sha256=PEG53QXSYie6MMOM7ty2zl_uvdE4TvrZJGrySSJTgvU,722
1725
1720
  fastlife/testing/__init__.py,sha256=VpxkS3Zp3t_hH8dBiLaGFGhsvt511dhBS_8fMoFXdmU,99
1726
1721
  fastlife/testing/dom.py,sha256=dVzDoZokn-ii681UaEwAr-khM5KE-CHgXSSLSo24oH0,4489
1727
1722
  fastlife/testing/form.py,sha256=ST0xNCoUqz_oD92cWHzQ6CbJ5hFopvu_NNKpOfiuYWY,7874
@@ -1729,9 +1724,9 @@ fastlife/testing/session.py,sha256=LEFFbiR67_x_g-ioudkY0C7PycHdbDfaIaoo_G7GXQ8,2
1729
1724
  fastlife/testing/testclient.py,sha256=WmUnGkDPuSd4dKzTiXWyHWlJ31zBbySvMH9m8p0acg8,6741
1730
1725
  fastlife/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1731
1726
  fastlife/views/pydantic_form.py,sha256=4dv37JORLpvkgCgMGZfUN_qy7wme040GLZAzOTFqdnU,1367
1732
- fastlifeweb-0.20.1.dist-info/METADATA,sha256=1bgPaE9fkIVQFavMvtJgVJbNpOwBezDcb_SwR_2LB00,3663
1733
- fastlifeweb-0.20.1.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
1734
- fastlifeweb-0.20.1.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
1735
- fastlifeweb-0.20.1.dist-info/licenses/LICENSE,sha256=NlRX9Z-dcv8X1VFW9odlIQBbgNN9pcO94XzvKp2R16o,1075
1727
+ fastlifeweb-0.21.0.dist-info/METADATA,sha256=lw-gAs-o2cUJKjUL2xz1H_o0tW8Kbpgnc8qbrhKXzxQ,3663
1728
+ fastlifeweb-0.21.0.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
1729
+ fastlifeweb-0.21.0.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
1730
+ fastlifeweb-0.21.0.dist-info/licenses/LICENSE,sha256=NlRX9Z-dcv8X1VFW9odlIQBbgNN9pcO94XzvKp2R16o,1075
1736
1731
  tailwind.config.js,sha256=y_xTuRmjIdrfyo92PoUW0wjFTnkO27xepwfirkaCFno,1351
1737
- fastlifeweb-0.20.1.dist-info/RECORD,,
1732
+ fastlifeweb-0.21.0.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- {# doc Render a checkbox and a label for boolean field. #}
2
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.boolean.BooleanWidget, "widget to display."] #}
3
- <pydantic_form.Widget :widget="widget">
4
- <div class="pt-4">
5
- <div class="flex items-center">
6
- <Checkbox :name="widget.name" type="checkbox" :id="widget.id" :checked="widget.value" value="1" />
7
- <Label :for="widget.id" class="ms-2 text-base text-neutral-900 dark:text-white">
8
- {{widget.title|safe}}
9
- </Label>
10
- </div>
11
- <pydantic_form.Error :text="widget.error" />
12
- </div>
13
- </pydantic_form.Widget>
@@ -1,21 +0,0 @@
1
- {# doc Render a list of checkbox and a label for Literal and enum fields #}
2
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.checklist.ChecklistWidget, "widget to display."] #}
3
- <pydantic_form.Widget :widget="widget">
4
- <div class="pt-4">
5
- <Details>
6
- <Summary :id="widget.id + '-summary'">
7
- <H3 :class="H3_SUMMARY_CLASS">{{widget.title}}</H3>
8
- <pydantic_form.Error :text="widget.error" />
9
- </Summary>
10
- <div>
11
- {% for value in widget.value %}
12
- <div class="flex items-center mb-4">
13
- <Checkbox :name="value.field_name" type="checkbox" :id="value.id" :value="value.value" :checked="value.checked" />
14
- <Label :for="value.id" class="ms-2 text-base text-neutral-900 dark:text-white">{{value.label}}</Label>
15
- <pydantic_form.Error :text="value.error" />
16
- </div>
17
- {% endfor %}
18
- </div>
19
- </Details>
20
- </div>
21
- </pydantic_form.Widget>
@@ -1,18 +0,0 @@
1
- {# doc Render a Select with options #}
2
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.dropdown.DropDownWidget, "widget to display."] #}
3
-
4
- <pydantic_form.Widget :widget="widget">
5
- <div class="pt-4">
6
- <Label :for="widget.id">{{widget.title}}</Label>
7
- <Select :name="widget.name" :id="widget.id">
8
- {%- for opt in widget.options -%}
9
- <Option :value="opt.value" id={{widget.id + "-" + opt.value.replace(" ", " -")}}
10
- :selected="widget.value==opt.value">
11
- {{- opt.text -}}
12
- </Option>
13
- {%- endfor -%}
14
- </Select>
15
- <pydantic_form.Error :text="widget.error" />
16
- <pydantic_form.Hint :text="widget.hint" />
17
- </div>
18
- </pydantic_form.Widget>
@@ -1,3 +0,0 @@
1
- {# doc Render a hidden input field for a field. #}
2
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.hidden.HiddenWidget, "widget to display."] #}
3
- <Hidden :name="widget.name" :value="widget.value" :id="widget.id" />
@@ -1,30 +0,0 @@
1
- {# doc Widget for pydantic BaseModel subclasses. #}
2
- {# def
3
- widget: Annotated[fastlife.adapters.jinjax.widgets.model.ModelWidget, "widget to display."],
4
- children_widget : Annotated[
5
- Sequence[fastlife.adapters.jinjax.widgets.base.Widget],
6
- "child widgets for every fields of the model."
7
- ],
8
- #}
9
-
10
- <pydantic_form.Widget :widget="widget">
11
- <div id="{{widget.id}}"{% if widget.nested %} class="m-4"{%endif%}>
12
- {% if widget.nested %}
13
- <Details>
14
- <Summary :id="widget.id + '-summary'">
15
- <H3 :class="H3_SUMMARY_CLASS">{{widget.title}}</H3>
16
- <pydantic_form.Error :text="widget.error" />
17
- </Summary>
18
- <div>
19
- {% for child in children_widget %}
20
- {{ child }}
21
- {% endfor %}
22
- </div>
23
- </Details>
24
- {% else %}
25
- {% for child in children_widget %}
26
- {{ child }}
27
- {% endfor %}
28
- {% endif %}
29
- </div>
30
- </pydantic_form.Widget>
@@ -1,47 +0,0 @@
1
- {# doc Widget for pydantic BaseModel subclasses. #}
2
- {# def
3
- widget: Annotated[fastlife.adapters.jinjax.widgets.sequence.SequenceWidget, "widget to display."],
4
- children_widgets : Annotated[
5
- Sequence[fastlife.adapters.jinjax.widgets.base.Widget],
6
- "child widgets for every fields of the model."
7
- ],
8
- type: Annotated[fastlife.adapters.jinjax.widgets.base.TypeWrapper, "child type wrapped."]
9
- #}
10
-
11
- <pydantic_form.Widget :widget="widget">
12
- <Details :id="widget.id">
13
- <Summary :id="widget.id + '-summary'">
14
- <H3 :class="H3_SUMMARY_CLASS">{{widget.title}}</H3>
15
- <pydantic_form.Error :text="widget.error" />
16
- </Summary>
17
- <div>
18
- {% set fnGetName = "get" + widget.id.replace("-", "_") %}
19
- <script>
20
- function {{ fnGetName }} () {
21
- const el = document.getElementById("{{widget.id}}-content");
22
- const len = el.dataset.length;
23
- el.dataset.length = parseInt(len) + 1;
24
- return "{{type.name}}." + len;
25
- }
26
- </script>
27
-
28
- <div id="{{widget.id}}-content" class="m-4" data-length="{{children_widgets|length|string}}">
29
- {% set container_id = widget.id + "-children-container" %}
30
- <div id="{{container_id}}">
31
- {% for child in children_widgets %}
32
- {{ child }}
33
- {% endfor%}
34
- </div>
35
- </div>
36
-
37
- <div>
38
- {% set container_id = "#" + widget.id + "-children-container" %}
39
- {% set add_id = widget.id + "-add" %}
40
- {% set vals = 'js:{"name": '+ fnGetName + '(), "token": "' + type.token + '", "removable": true}' %}
41
- <Button type="button" :hx-target="container_id" hx-swap="beforeend" :id="add_id" :hx-vals="vals" :hx-get="type.url">
42
- Add
43
- </Button>
44
- </div>
45
- </div>
46
- </Details>
47
- </pydantic_form.Widget>
@@ -1,11 +0,0 @@
1
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.text.TextWidget, "widget to display."] #}
2
-
3
- <pydantic_form.Widget :widget="widget">
4
- <div class="pt-4">
5
- <Label :for="widget.id">{{widget.title}}</Label>
6
- <pydantic_form.Error :text="widget.error" />
7
- <Input :name="widget.name" :value="widget.value" :type="widget.input_type" :id="widget.id"
8
- :aria-label="widget.aria_label" :placeholder="widget.placeholder" />
9
- <pydantic_form.Hint :text="widget.hint" />
10
- </div>
11
- </pydantic_form.Widget>
@@ -1,38 +0,0 @@
1
- {# doc
2
- Render textarea widget for field of type text of event sequence.
3
-
4
- ::
5
-
6
- from fastlife.adapters.jinjax.widgets.text import TextareaWidget
7
- from pydantic import BaseModel, Field, field_validator
8
-
9
- class TagsForm(BaseModel):
10
-
11
- tags: Annotated[Sequence[str], TextareaWidget] = Field(
12
- default_factory=list,
13
- title="Tags",
14
- description="One tag per line",
15
- )
16
-
17
- @field_validator("tags", mode="before")
18
- def split(cls, s: Any) -> Sequence[str]:
19
- return s.split() if s else []
20
-
21
- #}
22
- {# def widget: Annotated[fastlife.adapters.jinjax.widgets.text.TextareaWidget, "widget to display."] #}
23
-
24
- <pydantic_form.Widget :widget="widget">
25
- <div class="pt-4">
26
- <Label :for="widget.id">{{widget.title}}</Label>
27
- <pydantic_form.Error :text="widget.error" />
28
- <Textarea :name="widget.name" :id="widget.id" :aria-label="widget.aria_label">
29
- {%- if v is string -%}
30
- {{- v -}}}
31
- {%- else -%}
32
- {%- for v in widget.value %}{{v}}
33
- {% endfor -%}
34
- {% endif %}
35
- </Textarea>
36
- <pydantic_form.Hint :text="widget.hint" />
37
- </div>
38
- </pydantic_form.Widget>
@@ -1,34 +0,0 @@
1
- {# doc display widget for union type field #}
2
- {# def
3
- widget: Annotated[fastlife.adapters.jinjax.widgets.base.Widget, "widget to display."],
4
- child: Annotated[fastlife.adapters.jinjax.widgets.base.Widget, "current widget if any"],
5
- types: Annotated[Sequence[fastlife.adapters.jinjax.widgets.base.TypeWrapper], "Child types to choose"],
6
- parent_type: Annotated[fastlife.adapters.jinjax.widgets.base.TypeWrapper, "parent type"]
7
- #}
8
-
9
- <pydantic_form.Widget :widget="widget">
10
- <div id="{{widget.id}}">
11
- <Details>
12
- <Summary :id="widget.id + '-union-summary'">
13
- <H3 :class="H3_SUMMARY_CLASS">{{widget.title}}</H3>
14
- <pydantic_form.Error :text="widget.error" />
15
- </Summary>
16
- <div hx-sync="this" id="{{widget.id}}-child">
17
- {% if child %}
18
- {{ child }}
19
- {% else %}
20
- {% for typ in types %}
21
- <Button type="button" hx-target="closest div" :hx-get="typ.url" :hx-vals="typ.params|tojson" :id="typ.id"
22
- onclick={{ "document.getElementById('" + widget.id + "-remove-btn').hidden=false" }}
23
- :class="SECONDARY_BUTTON_CLASS">{{typ.title}}</Button>
24
- {% endfor %}
25
- {% endif %}
26
- </div>
27
- <Button type="button" :id="widget.id + '-remove-btn'" :hx-target="'#' + widget.id"
28
- :hx-vals="parent_type.params|tojson" :hx-get="parent_type.url" :hidden="not child"
29
- :class="SECONDARY_BUTTON_CLASS">
30
- Remove
31
- </Button>
32
- </Details>
33
- </div>
34
- </pydantic_form.Widget>
@@ -1,52 +0,0 @@
1
- """
2
- Bind template to the view in order to build an html response.
3
- """
4
-
5
- from collections.abc import Callable
6
- from typing import Any
7
-
8
- from fastapi import Depends, Response
9
-
10
- from fastlife.request import Request
11
- from fastlife.security.csrf import create_csrf_token
12
-
13
- Template = Callable[..., Response]
14
- """Type to annotate a FastAPI depency injection."""
15
-
16
- TemplateEngine = Callable[[Request], Template]
17
-
18
-
19
- def get_template(template: str, *, content_type: str = "text/html") -> TemplateEngine:
20
- """
21
- Return a closure to render the given template.
22
-
23
- :param template: path to template to render.
24
- :param content_type: response ``Content-Type`` header.
25
- """
26
-
27
- def render_template(
28
- request: Request,
29
- *,
30
- _create_csrf_token: Callable[..., str] = create_csrf_token,
31
- ) -> Template:
32
- reg = request.registry
33
-
34
- def parametrizer(**kwargs: Any) -> Response:
35
- return reg.get_renderer(template)(request).render(
36
- template, content_type=content_type, params=kwargs
37
- )
38
-
39
- return parametrizer
40
-
41
- return render_template
42
-
43
-
44
- def template(template_path: str) -> Template:
45
- """
46
- Return a FastAPI dependency template engine ready to render the template.
47
-
48
-
49
- :param template_path: path to template to render by the engine setup in the regitry.
50
- :return: A callable accepting kwargs to pass as the context, returning a string.
51
- """
52
- return Depends(get_template(template_path))