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.
- CHANGELOG.md +10 -0
- fastlife/__init__.py +5 -0
- fastlife/adapters/jinjax/renderer.py +4 -52
- fastlife/adapters/jinjax/widget_factory/bool_builder.py +2 -2
- fastlife/adapters/jinjax/widget_factory/emailstr_builder.py +5 -4
- fastlife/adapters/jinjax/widget_factory/enum_builder.py +2 -2
- fastlife/adapters/jinjax/widget_factory/factory.py +20 -21
- fastlife/adapters/jinjax/widget_factory/literal_builder.py +7 -6
- fastlife/adapters/jinjax/widget_factory/model_builder.py +3 -3
- fastlife/adapters/jinjax/widget_factory/secretstr_builder.py +2 -2
- fastlife/adapters/jinjax/widget_factory/sequence_builder.py +3 -3
- fastlife/adapters/jinjax/widget_factory/set_builder.py +2 -2
- fastlife/adapters/jinjax/widget_factory/simpletype_builder.py +7 -8
- fastlife/adapters/jinjax/widget_factory/union_builder.py +3 -3
- fastlife/adapters/jinjax/widgets/base.py +35 -35
- fastlife/adapters/jinjax/widgets/boolean.py +13 -34
- fastlife/adapters/jinjax/widgets/checklist.py +36 -42
- fastlife/adapters/jinjax/widgets/dropdown.py +32 -38
- fastlife/adapters/jinjax/widgets/hidden.py +7 -15
- fastlife/adapters/jinjax/widgets/model.py +33 -40
- fastlife/adapters/jinjax/widgets/sequence.py +61 -40
- fastlife/adapters/jinjax/widgets/text.py +39 -78
- fastlife/adapters/jinjax/widgets/union.py +50 -57
- fastlife/components/CsrfToken.jinja +1 -1
- fastlife/components/pydantic_form/Widget.jinja +4 -3
- fastlife/config/configurator.py +65 -19
- fastlife/config/exceptions.py +0 -2
- fastlife/config/views.py +0 -2
- fastlife/domain/__init__.py +1 -0
- fastlife/domain/model/__init__.py +1 -0
- fastlife/domain/model/security.py +19 -0
- fastlife/domain/model/template.py +30 -0
- fastlife/domain/model/types.py +17 -0
- fastlife/request/request.py +19 -0
- fastlife/security/csrf.py +3 -13
- fastlife/services/templates.py +9 -42
- fastlife/services/translations.py +12 -0
- fastlife/templates/__init__.py +1 -6
- fastlife/templates/inline.py +18 -14
- {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/METADATA +1 -1
- {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/RECORD +44 -49
- fastlife/components/pydantic_form/Boolean.jinja +0 -13
- fastlife/components/pydantic_form/Checklist.jinja +0 -21
- fastlife/components/pydantic_form/Dropdown.jinja +0 -18
- fastlife/components/pydantic_form/Hidden.jinja +0 -3
- fastlife/components/pydantic_form/Model.jinja +0 -30
- fastlife/components/pydantic_form/Sequence.jinja +0 -47
- fastlife/components/pydantic_form/Text.jinja +0 -11
- fastlife/components/pydantic_form/Textarea.jinja +0 -38
- fastlife/components/pydantic_form/Union.jinja +0 -34
- fastlife/templates/binding.py +0 -52
- {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/WHEEL +0 -0
- {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/entry_points.txt +0 -0
- {fastlifeweb-0.20.1.dist-info → fastlifeweb-0.21.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,5 @@
|
|
1
|
-
CHANGELOG.md,sha256=
|
2
|
-
fastlife/__init__.py,sha256=
|
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=
|
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=
|
14
|
-
fastlife/adapters/jinjax/widget_factory/emailstr_builder.py,sha256=
|
15
|
-
fastlife/adapters/jinjax/widget_factory/enum_builder.py,sha256=
|
16
|
-
fastlife/adapters/jinjax/widget_factory/factory.py,sha256=
|
17
|
-
fastlife/adapters/jinjax/widget_factory/literal_builder.py,sha256=
|
18
|
-
fastlife/adapters/jinjax/widget_factory/model_builder.py,sha256=
|
19
|
-
fastlife/adapters/jinjax/widget_factory/secretstr_builder.py,sha256=
|
20
|
-
fastlife/adapters/jinjax/widget_factory/sequence_builder.py,sha256=
|
21
|
-
fastlife/adapters/jinjax/widget_factory/set_builder.py,sha256=
|
22
|
-
fastlife/adapters/jinjax/widget_factory/simpletype_builder.py,sha256=
|
23
|
-
fastlife/adapters/jinjax/widget_factory/union_builder.py,sha256
|
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=
|
26
|
-
fastlife/adapters/jinjax/widgets/boolean.py,sha256=
|
27
|
-
fastlife/adapters/jinjax/widgets/checklist.py,sha256=
|
28
|
-
fastlife/adapters/jinjax/widgets/dropdown.py,sha256=
|
29
|
-
fastlife/adapters/jinjax/widgets/hidden.py,sha256=
|
30
|
-
fastlife/adapters/jinjax/widgets/model.py,sha256=
|
31
|
-
fastlife/adapters/jinjax/widgets/sequence.py,sha256=
|
32
|
-
fastlife/adapters/jinjax/widgets/text.py,sha256=
|
33
|
-
fastlife/adapters/jinjax/widgets/union.py,sha256
|
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=
|
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/
|
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=
|
1688
|
-
fastlife/config/exceptions.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
1717
|
-
fastlife/services/translations.py,sha256=
|
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=
|
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=
|
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.
|
1733
|
-
fastlifeweb-0.
|
1734
|
-
fastlifeweb-0.
|
1735
|
-
fastlifeweb-0.
|
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.
|
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,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>
|
fastlife/templates/binding.py
DELETED
@@ -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))
|
File without changes
|
File without changes
|
File without changes
|