Flask-Exts 0.2.8__tar.gz → 0.3.0__tar.gz

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 (436) hide show
  1. flask_exts-0.3.0/.editorconfig +69 -0
  2. flask_exts-0.3.0/.github/workflows/docs.yml +49 -0
  3. {flask_exts-0.2.8 → flask_exts-0.3.0}/.gitignore +3 -3
  4. flask_exts-0.3.0/.vscode/settings.json +16 -0
  5. flask_exts-0.3.0/CHANGES.rst +32 -0
  6. flask_exts-0.3.0/Makefile +31 -0
  7. {flask_exts-0.2.8 → flask_exts-0.3.0}/PKG-INFO +3 -2
  8. {flask_exts-0.2.8 → flask_exts-0.3.0}/README.rst +1 -1
  9. {flask_exts-0.2.8 → flask_exts-0.3.0}/babel/messages.pot +79 -83
  10. flask_exts-0.3.0/docs/advanced/database.rst +10 -0
  11. flask_exts-0.3.0/docs/advanced/index.rst +13 -0
  12. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/api.rst +2 -2
  13. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/conf.py +10 -9
  14. flask_exts-0.3.0/docs/configure.rst +53 -0
  15. flask_exts-0.3.0/docs/develop.rst +81 -0
  16. flask_exts-0.3.0/docs/examples.rst +11 -0
  17. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/index.rst +14 -5
  18. flask_exts-0.3.0/docs/quickstart.rst +52 -0
  19. flask_exts-0.3.0/examples/README.rst +51 -0
  20. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/admin_views.py +3 -3
  21. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/build_sample.py +42 -38
  22. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/make_app.py +3 -14
  23. flask_exts-0.3.0/examples/demo/models/__init__.py +9 -0
  24. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/models/author.py +14 -17
  25. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/models/post.py +7 -8
  26. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/models/post_tag.py +2 -3
  27. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/models/tag.py +4 -4
  28. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/models/tree.py +6 -8
  29. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/views/author_view.py +8 -7
  30. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/views/post_view.py +10 -10
  31. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/views/tag_view.py +3 -1
  32. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/views/tree_view.py +3 -6
  33. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/simple/__init__.py +4 -3
  34. {flask_exts-0.2.8 → flask_exts-0.3.0}/package.json +5 -1
  35. {flask_exts-0.2.8 → flask_exts-0.3.0}/pyproject.toml +15 -0
  36. flask_exts-0.3.0/requirements/develop.in +1 -0
  37. flask_exts-0.3.0/scripts/copy-vendor.js +195 -0
  38. flask_exts-0.3.0/src/flask_exts/__about__.py +1 -0
  39. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/__init__.py +0 -1
  40. flask_exts-0.3.0/src/flask_exts/admin/__init__.py +10 -0
  41. flask_exts-0.2.8/src/flask_exts/web/admin.py → flask_exts-0.3.0/src/flask_exts/admin/base.py +40 -37
  42. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/exposer.py +12 -10
  43. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/menu.py +31 -32
  44. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/__init__.py +23 -26
  45. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/actions_mixin.py +3 -2
  46. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/ajax.py +13 -10
  47. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/base.py +22 -57
  48. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/__init__.py +7 -7
  49. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/columns.py +26 -25
  50. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/forms.py +26 -23
  51. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/pagination.py +45 -39
  52. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/sorting.py +13 -24
  53. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/core/values.py +25 -19
  54. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/filter.py +24 -18
  55. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/filter_mixin.py +15 -10
  56. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/__init__.py +7 -7
  57. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/create.py +3 -3
  58. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/export.py +14 -17
  59. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/read.py +9 -9
  60. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/update.py +5 -4
  61. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/row_actions.py +2 -8
  62. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/type_formatters.py +22 -15
  63. flask_exts-0.3.0/src/flask_exts/admin/model/types.py +5 -0
  64. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/view.py +24 -29
  65. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/ajax.py +22 -19
  66. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/filter/filter_converter.py +43 -55
  67. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/filter/filters.py +14 -14
  68. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/field_converters.py +8 -6
  69. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/inline_form.py +6 -4
  70. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/inline_model_convert.py +57 -98
  71. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/model_field_convert.py +9 -8
  72. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/utils.py +22 -14
  73. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/sqla_view/__init__.py +6 -6
  74. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/type_formatters.py +1 -2
  75. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/view.py +270 -59
  76. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/view.py +51 -47
  77. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/__init__.py +7 -8
  78. flask_exts-0.2.8/src/flask_exts/builtin_extensions/web_ext.py → flask_exts-0.3.0/src/flask_exts/builtin_extensions/admin_ext.py +2 -6
  79. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/babel_ext.py +34 -37
  80. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/database_ext.py +4 -5
  81. flask_exts-0.3.0/src/flask_exts/builtin_extensions/emailer_ext.py +15 -0
  82. flask_exts-0.2.8/src/flask_exts/builtin_extensions/html_ext.py → flask_exts-0.3.0/src/flask_exts/builtin_extensions/frontend_ext.py +7 -7
  83. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/login_ext.py +55 -28
  84. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/security_ext.py +0 -8
  85. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/startup_ext.py +35 -14
  86. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/usercenter_ext.py +7 -5
  87. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/builtin_extensions/userstore_ext.py +1 -5
  88. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/commands.py +17 -5
  89. flask_exts-0.3.0/src/flask_exts/datastore/sqla/__init__.py +4 -0
  90. flask_exts-0.3.0/src/flask_exts/datastore/sqla/_db.py +45 -0
  91. flask_exts-0.2.8/src/flask_exts/datastore/sqla/sqla_db.py → flask_exts-0.3.0/src/flask_exts/datastore/sqla/database.py +15 -12
  92. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query.py +16 -10
  93. flask_exts-0.3.0/src/flask_exts/datastore/sqla/utils/__init__.py +8 -0
  94. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/utils/model_mapper.py +4 -4
  95. flask_exts-0.3.0/src/flask_exts/datastore/sqla/utils/orm.py +32 -0
  96. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/emailer}/base.py +9 -3
  97. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/emailer}/smtp.py +15 -5
  98. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/extension_core/base.py +2 -53
  99. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/extension_core/manager.py +32 -26
  100. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/extension_core/registry.py +72 -116
  101. flask_exts-0.3.0/src/flask_exts/forms/fields/__init__.py +5 -0
  102. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/ajax_select.py +6 -7
  103. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/datetime.py +24 -21
  104. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/file.py +38 -28
  105. flask_exts-0.3.0/src/flask_exts/forms/fields/inline.py +51 -0
  106. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/json.py +1 -0
  107. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/select.py +14 -32
  108. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/sqla.py +3 -146
  109. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/__init__.py +2 -0
  110. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/base_form.py +2 -1
  111. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/csrf.py +7 -10
  112. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/meta.py +8 -12
  113. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/session_csrf.py +7 -10
  114. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/validators/field_list.py +4 -1
  115. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/validators/file.py +20 -21
  116. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/validators/recaptcha.py +5 -5
  117. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/validators/sqla.py +7 -6
  118. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/widgets/__init__.py +1 -1
  119. flask_exts-0.3.0/src/flask_exts/forms/widgets/checkbox.py +30 -0
  120. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/widgets/editable.py +21 -17
  121. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/widgets/file.py +1 -0
  122. flask_exts-0.3.0/src/flask_exts/forms/widgets/inline.py +8 -0
  123. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/widgets/recaptcha.py +4 -3
  124. flask_exts-0.3.0/src/flask_exts/forms/widgets/select.py +75 -0
  125. flask_exts-0.3.0/src/flask_exts/frontend/plugin_base.py +24 -0
  126. flask_exts-0.3.0/src/flask_exts/frontend/plugin_manager.py +117 -0
  127. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_detail_filter_plugin.py +1 -0
  128. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_filters_plugin.py +1 -0
  129. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_form_plugin.py +1 -0
  130. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_list_action_plugin.py +1 -0
  131. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_modal_plugin.py +1 -0
  132. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/admin_plugin.py +1 -0
  133. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/bootstrap5_plugin.py +1 -0
  134. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/clipboard_plugin.py +1 -0
  135. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/copybutton_plugin.py +1 -0
  136. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/dayjs_plugin.py +8 -8
  137. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/editable_plugin.py +3 -3
  138. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/flatpickr_plugin.py +10 -7
  139. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/qrcode_plugin.py +1 -0
  140. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/rediscli_plugin.py +1 -0
  141. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/sphinx_copybutton_plugin.py +1 -0
  142. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/plugins/tom_select_plugin.py +4 -3
  143. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/template.py +0 -5
  144. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/proxies.py +3 -2
  145. flask_exts-0.3.0/src/flask_exts/security/__init__.py +3 -0
  146. flask_exts-0.3.0/src/flask_exts/security/authorizer/base.py +8 -0
  147. flask_exts-0.3.0/src/flask_exts/security/authorizer/simple_authorizer.py +58 -0
  148. flask_exts-0.3.0/src/flask_exts/security/core.py +39 -0
  149. flask_exts-0.3.0/src/flask_exts/security/exceptions.py +24 -0
  150. flask_exts-0.3.0/src/flask_exts/security/keys.py +23 -0
  151. flask_exts-0.3.0/src/flask_exts/security/plugins/email_change.py +92 -0
  152. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/plugins/email_verification.py +8 -4
  153. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/plugins/reset_password.py +13 -7
  154. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/plugins/two_factor_authentication.py +1 -0
  155. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/registry.py +7 -1
  156. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/serializer.py +19 -13
  157. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/token_action.py +60 -33
  158. flask_exts-0.3.0/src/flask_exts/security/urls.py +28 -0
  159. flask_exts-0.3.0/src/flask_exts/security/user_mixin.py +10 -0
  160. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/css/admin.css +2 -3
  161. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/copybutton.js +4 -4
  162. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/detail_filter.js +13 -9
  163. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/editable.js +2 -2
  164. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/field-registry.js +0 -2
  165. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/filters.js +5 -23
  166. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/form.js +167 -121
  167. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/rediscli.js +2 -6
  168. flask_exts-0.3.0/src/flask_exts/static/vendor/bootstrap5/bootstrap.bundle.min.js +7 -0
  169. flask_exts-0.3.0/src/flask_exts/static/vendor/bootstrap5/bootstrap.min.css +6 -0
  170. flask_exts-0.3.0/src/flask_exts/static/vendor/clipboard/clipboard.min.js +7 -0
  171. flask_exts-0.3.0/src/flask_exts/static/vendor/dayjs/dayjs.min.js +1 -0
  172. flask_exts-0.3.0/src/flask_exts/static/vendor/dayjs/timezone.js +1 -0
  173. flask_exts-0.3.0/src/flask_exts/static/vendor/dayjs/utc.js +1 -0
  174. flask_exts-0.3.0/src/flask_exts/static/vendor/flatpickr/flatpickr.min.css +13 -0
  175. flask_exts-0.3.0/src/flask_exts/static/vendor/flatpickr/flatpickr.min.js +2 -0
  176. flask_exts-0.3.0/src/flask_exts/static/vendor/tom-select/tom-select.bootstrap5.min.css +2 -0
  177. flask_exts-0.3.0/src/flask_exts/static/vendor/tom-select/tom-select.complete.min.js +454 -0
  178. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/master.html +7 -7
  179. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/model/create.html +3 -1
  180. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/model/details.html +1 -1
  181. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/model/edit.html +1 -1
  182. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/model/list.html +34 -45
  183. flask_exts-0.3.0/src/flask_exts/templates/base.html +19 -0
  184. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/index.html +0 -1
  185. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/layout.html +2 -2
  186. flask_exts-0.3.0/src/flask_exts/templates/macro/form.html +137 -0
  187. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/layout.html +10 -7
  188. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/menu.html +7 -7
  189. flask_exts-0.3.0/src/flask_exts/templates/macro/message.html +22 -0
  190. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/modal.html +2 -4
  191. flask_exts-0.3.0/src/flask_exts/templates/user/email_change.html +22 -0
  192. flask_exts-0.3.0/src/flask_exts/templates/user/index.html +42 -0
  193. flask_exts-0.3.0/src/flask_exts/templates/user/list.html +5 -0
  194. flask_exts-0.3.0/src/flask_exts/templates/user/profile.html +77 -0
  195. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/recovery_codes.html +4 -6
  196. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/setup_tfa.html +11 -3
  197. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/show_tfa.html +3 -3
  198. flask_exts-0.3.0/src/flask_exts/templates/user/verify_email.html +26 -0
  199. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/verify_tfa_modal.html +2 -2
  200. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
  201. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/translations/en/LC_MESSAGES/messages.po +139 -83
  202. flask_exts-0.3.0/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  203. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +159 -102
  204. flask_exts-0.3.0/src/flask_exts/usercenter/auth_requires.py +34 -0
  205. flask_exts-0.3.0/src/flask_exts/usercenter/forms/email_change.py +29 -0
  206. flask_exts-0.3.0/src/flask_exts/usercenter/forms/forgot_password.py +12 -0
  207. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/register.py +8 -6
  208. flask_exts-0.3.0/src/flask_exts/usercenter/forms/resend_verification.py +7 -0
  209. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/user_view.py +168 -75
  210. flask_exts-0.2.8/src/flask_exts/userstore/store.py → flask_exts-0.3.0/src/flask_exts/userstore/base.py +1 -3
  211. flask_exts-0.3.0/src/flask_exts/userstore/exceptions.py +15 -0
  212. flask_exts-0.3.0/src/flask_exts/userstore/sqla/__init__.py +4 -0
  213. flask_exts-0.3.0/src/flask_exts/userstore/sqla/models/__init__.py +6 -0
  214. {flask_exts-0.2.8/src/flask_exts/userstore → flask_exts-0.3.0/src/flask_exts/userstore/sqla}/models/role.py +5 -5
  215. {flask_exts-0.2.8/src/flask_exts/userstore → flask_exts-0.3.0/src/flask_exts/userstore/sqla}/models/user.py +25 -21
  216. {flask_exts-0.2.8/src/flask_exts/userstore → flask_exts-0.3.0/src/flask_exts/userstore/sqla}/models/user_profile.py +13 -12
  217. {flask_exts-0.2.8/src/flask_exts/userstore → flask_exts-0.3.0/src/flask_exts/userstore/sqla}/models/user_role.py +3 -4
  218. flask_exts-0.2.8/src/flask_exts/userstore/sqla_user_store.py → flask_exts-0.3.0/src/flask_exts/userstore/sqla/userstore.py +18 -14
  219. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/model/core/test_columns.py +1 -1
  220. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/model/test_action_mixin.py +2 -4
  221. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/model/test_model_view.py +25 -91
  222. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/model/test_model_view_csrf.py +17 -14
  223. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/custom_sqla_model_view.py +1 -1
  224. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_basic.py +41 -49
  225. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_filter.py +2 -3
  226. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_form.py +11 -5
  227. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_inline_model.py +219 -48
  228. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_multi_pk.py +30 -3
  229. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_primary_string.py +3 -3
  230. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/test_translation.py +5 -5
  231. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/test_admin.py +3 -25
  232. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/test_view.py +1 -3
  233. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/conftest.py +7 -4
  234. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/datastore/sqla/test_db.py +8 -3
  235. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/datastore/sqla/test_query.py +5 -3
  236. {flask_exts-0.2.8/tests/email → flask_exts-0.3.0/tests/emailer}/test_base.py +1 -0
  237. {flask_exts-0.2.8/tests/email → flask_exts-0.3.0/tests/emailer}/test_smtp.py +2 -1
  238. flask_exts-0.3.0/tests/extension_core/test_manager.py +100 -0
  239. flask_exts-0.3.0/tests/extension_core/test_registry.py +200 -0
  240. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_datetime.py +2 -0
  241. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_filefield.py +4 -3
  242. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_json.py +4 -4
  243. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_uploadfile.py +5 -3
  244. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_wtforms.py +3 -2
  245. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/form/test_form.py +19 -1
  246. {flask_exts-0.2.8/tests/html → flask_exts-0.3.0/tests/frontend}/conftest.py +2 -1
  247. flask_exts-0.3.0/tests/frontend/test_base.py +23 -0
  248. flask_exts-0.3.0/tests/frontend/test_plugin_manager.py +95 -0
  249. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/demo.py +37 -32
  250. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/multpk.py +1 -3
  251. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/primary_string_model.py +2 -4
  252. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/relations.py +5 -7
  253. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/simple.py +1 -3
  254. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/tree.py +4 -9
  255. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/unique.py +2 -3
  256. flask_exts-0.3.0/tests/security/test_authorizer.py +72 -0
  257. flask_exts-0.3.0/tests/security/test_core.py +118 -0
  258. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/security/test_tfa.py +3 -1
  259. flask_exts-0.3.0/tests/security/test_urls.py +23 -0
  260. flask_exts-0.2.8/tests/test_exts_base.py → flask_exts-0.3.0/tests/test_builtin_exts.py +15 -5
  261. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/test_db.py +3 -2
  262. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/test_login.py +23 -14
  263. {flask_exts-0.2.8/tests/views → flask_exts-0.3.0/tests/usercenter}/test_user_view.py +272 -45
  264. flask_exts-0.3.0/tests/userstore/test_sqla_userstore.py +72 -0
  265. flask_exts-0.2.8/.djlintrc +0 -8
  266. flask_exts-0.2.8/CHANGES.rst +0 -147
  267. flask_exts-0.2.8/docs/advanced/bootstrap5.rst +0 -429
  268. flask_exts-0.2.8/docs/advanced/custom_fields.rst +0 -384
  269. flask_exts-0.2.8/docs/advanced/custom_plugins.rst +0 -247
  270. flask_exts-0.2.8/docs/advanced/custom_validators.rst +0 -4
  271. flask_exts-0.2.8/docs/advanced/index.rst +0 -16
  272. flask_exts-0.2.8/docs/advanced/modelview.rst +0 -337
  273. flask_exts-0.2.8/docs/advanced/performance.rst +0 -493
  274. flask_exts-0.2.8/docs/advanced/security.rst +0 -498
  275. flask_exts-0.2.8/docs/advanced/theming.rst +0 -401
  276. flask_exts-0.2.8/docs/configure.rst +0 -25
  277. flask_exts-0.2.8/docs/develop.rst +0 -65
  278. flask_exts-0.2.8/docs/examples.rst +0 -6
  279. flask_exts-0.2.8/docs/quickstart.rst +0 -264
  280. flask_exts-0.2.8/examples/README.rst +0 -38
  281. flask_exts-0.2.8/examples/demo/models/__init__.py +0 -9
  282. flask_exts-0.2.8/src/flask_exts/__about__.py +0 -1
  283. flask_exts-0.2.8/src/flask_exts/builtin_extensions/email_ext.py +0 -16
  284. flask_exts-0.2.8/src/flask_exts/datastore/sqla/__init__.py +0 -3
  285. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/__init__.py +0 -6
  286. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/orm.py +0 -40
  287. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/paginate.py +0 -74
  288. flask_exts-0.2.8/src/flask_exts/forms/fields/__init__.py +0 -6
  289. flask_exts-0.2.8/src/flask_exts/forms/fields/inline.py +0 -90
  290. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/__init__.py +0 -39
  291. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/checkbox_fields.py +0 -9
  292. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/inline_fields.py +0 -10
  293. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/query_fields.py +0 -11
  294. flask_exts-0.2.8/src/flask_exts/forms/validators/__init__.py +0 -1
  295. flask_exts-0.2.8/src/flask_exts/forms/widgets/checkbox.py +0 -32
  296. flask_exts-0.2.8/src/flask_exts/forms/widgets/inline.py +0 -14
  297. flask_exts-0.2.8/src/flask_exts/forms/widgets/select.py +0 -81
  298. flask_exts-0.2.8/src/flask_exts/html/plugin_base.py +0 -32
  299. flask_exts-0.2.8/src/flask_exts/html/plugin_manager.py +0 -85
  300. flask_exts-0.2.8/src/flask_exts/html/plugins/bootstrap4_plugin.py +0 -19
  301. flask_exts-0.2.8/src/flask_exts/security/authorizer/base.py +0 -17
  302. flask_exts-0.2.8/src/flask_exts/security/authorizer/simple_authorizer.py +0 -21
  303. flask_exts-0.2.8/src/flask_exts/security/core.py +0 -54
  304. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/create.html +0 -5
  305. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/details.html +0 -37
  306. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/edit.html +0 -5
  307. flask_exts-0.2.8/src/flask_exts/templates/base.html +0 -19
  308. flask_exts-0.2.8/src/flask_exts/templates/macro/form.html +0 -83
  309. flask_exts-0.2.8/src/flask_exts/templates/macro/inline.html +0 -44
  310. flask_exts-0.2.8/src/flask_exts/templates/macro/message.html +0 -22
  311. flask_exts-0.2.8/src/flask_exts/templates/user/index.html +0 -53
  312. flask_exts-0.2.8/src/flask_exts/templates/user/list.html +0 -5
  313. flask_exts-0.2.8/src/flask_exts/templates/user/verify_email.html +0 -5
  314. flask_exts-0.2.8/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  315. flask_exts-0.2.8/src/flask_exts/usercenter/auth_requires.py +0 -39
  316. flask_exts-0.2.8/src/flask_exts/usercenter/forms/forgot_password.py +0 -19
  317. flask_exts-0.2.8/src/flask_exts/usercenter/forms/profile.py +0 -11
  318. flask_exts-0.2.8/src/flask_exts/usercenter/user.py +0 -14
  319. flask_exts-0.2.8/src/flask_exts/userstore/models/__init__.py +0 -1
  320. flask_exts-0.2.8/src/flask_exts/web/__init__.py +0 -3
  321. flask_exts-0.2.8/src/flask_exts/web/default_views/index_view.py +0 -25
  322. flask_exts-0.2.8/src/flask_exts/web/model/types.py +0 -4
  323. flask_exts-0.2.8/tests/html/test_base.py +0 -28
  324. flask_exts-0.2.8/tests/security/test_authorizer.py +0 -116
  325. flask_exts-0.2.8/tests/security/test_core.py +0 -51
  326. flask_exts-0.2.8/tests/test_base.py +0 -9
  327. flask_exts-0.2.8/tests/usercenter/test_sqla_usercenter.py +0 -50
  328. {flask_exts-0.2.8 → flask_exts-0.3.0}/.github/workflows/release.yml +0 -0
  329. {flask_exts-0.2.8 → flask_exts-0.3.0}/.readthedocs.yaml +0 -0
  330. {flask_exts-0.2.8 → flask_exts-0.3.0}/LICENSE.rst +0 -0
  331. {flask_exts-0.2.8 → flask_exts-0.3.0}/babel/babel.cfg +0 -0
  332. {flask_exts-0.2.8 → flask_exts-0.3.0}/babel/babel.sh +0 -0
  333. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/Makefile +0 -0
  334. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/_static/logo.png +0 -0
  335. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/changes.rst +0 -0
  336. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/make.bat +0 -0
  337. {flask_exts-0.2.8 → flask_exts-0.3.0}/docs/requirements.txt +0 -0
  338. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/__init__.py +0 -0
  339. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/file_op.py +0 -0
  340. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/static/favicon.ico +0 -0
  341. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/templates/field_list.html +0 -0
  342. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/templates/locations.html +0 -0
  343. {flask_exts-0.2.8 → flask_exts-0.3.0}/examples/demo/templates/tree_list.html +0 -0
  344. {flask_exts-0.2.8 → flask_exts-0.3.0}/requirements/build.in +0 -0
  345. {flask_exts-0.2.8 → flask_exts-0.3.0}/requirements/test.in +0 -0
  346. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/model/operations/delete.py +0 -0
  347. {flask_exts-0.2.8/src/flask_exts/datastore → flask_exts-0.3.0/src/flask_exts/admin/sqla}/__init__.py +0 -0
  348. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/filter/__init__.py +0 -0
  349. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/form/__init__.py +0 -0
  350. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/sqla_view/pagination_handler.py +0 -0
  351. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/sqla_view/query_handler.py +0 -0
  352. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/sqla_view/relationships_handler.py +0 -0
  353. {flask_exts-0.2.8/src/flask_exts/web → flask_exts-0.3.0/src/flask_exts/admin}/sqla/sqla_view/sorting_handler.py +0 -0
  354. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/constants.py +0 -0
  355. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/datastore}/__init__.py +0 -0
  356. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query_builders/__init__.py +0 -0
  357. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query_builders/filter_builder.py +0 -0
  358. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query_builders/join_builder.py +0 -0
  359. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query_builders/pagination_builder.py +0 -0
  360. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/datastore/sqla/query_builders/sort_builder.py +0 -0
  361. {flask_exts-0.2.8/src/flask_exts/extension_core → flask_exts-0.3.0/src/flask_exts/emailer}/__init__.py +0 -0
  362. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/emailer}/reset_password_sender.py +0 -0
  363. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/emailer}/sender.py +0 -0
  364. {flask_exts-0.2.8/src/flask_exts/email → flask_exts-0.3.0/src/flask_exts/emailer}/verify_email_sender.py +0 -0
  365. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/extension_core}/__init__.py +0 -0
  366. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/__init__.py +0 -0
  367. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/recaptcha.py +0 -0
  368. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/switch.py +0 -0
  369. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/fields/taglist.py +0 -0
  370. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/flask_form.py +0 -0
  371. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/form/utils.py +0 -0
  372. {flask_exts-0.2.8/src/flask_exts/html/plugins → flask_exts-0.3.0/src/flask_exts/forms/validators}/__init__.py +0 -0
  373. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/forms/widgets/datetime.py +0 -0
  374. {flask_exts-0.2.8/src/flask_exts/security → flask_exts-0.3.0/src/flask_exts/frontend}/__init__.py +0 -0
  375. {flask_exts-0.2.8/src/flask_exts/security/authorizer → flask_exts-0.3.0/src/flask_exts/frontend/plugins}/__init__.py +0 -0
  376. {flask_exts-0.2.8/src/flask_exts/html → flask_exts-0.3.0/src/flask_exts/frontend}/theme.py +0 -0
  377. {flask_exts-0.2.8/src/flask_exts/translations → flask_exts-0.3.0/src/flask_exts/security/authorizer}/__init__.py +0 -0
  378. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/security/hasher.py +0 -0
  379. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/signals.py +0 -0
  380. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/css/editable.css +0 -0
  381. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/css/rediscli.css +0 -0
  382. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/list_action.js +0 -0
  383. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/modal.js +0 -0
  384. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/qrcode.js +0 -0
  385. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/security/base64.js +0 -0
  386. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/security/webauthn.js +0 -0
  387. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/js/ui-factory.js +0 -0
  388. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/logo.png +0 -0
  389. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/vendor/sphinx-copybutton/sphinx-copybutton.css +0 -0
  390. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/static/vendor/sphinx-copybutton/sphinx-copybutton.js +0 -0
  391. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/admin/index.html +0 -0
  392. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/icon.html +0 -0
  393. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/nav.html +0 -0
  394. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/macro/pagination.html +0 -0
  395. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/change_password.html +0 -0
  396. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/forgot_password.html +0 -0
  397. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/login.html +0 -0
  398. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/recovery.html +0 -0
  399. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/register.html +0 -0
  400. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/reset_password.html +0 -0
  401. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/templates/user/verify_tfa.html +0 -0
  402. {flask_exts-0.2.8/src/flask_exts/usercenter → flask_exts-0.3.0/src/flask_exts/translations}/__init__.py +0 -0
  403. {flask_exts-0.2.8/src/flask_exts/web/default_views → flask_exts-0.3.0/src/flask_exts/usercenter}/__init__.py +0 -0
  404. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/core.py +0 -0
  405. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/__init__.py +0 -0
  406. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/change_password.py +0 -0
  407. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/login.py +0 -0
  408. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/recovery.py +0 -0
  409. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/reset_password.py +0 -0
  410. {flask_exts-0.2.8 → flask_exts-0.3.0}/src/flask_exts/usercenter/forms/two_factor.py +0 -0
  411. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/__init__.py +0 -0
  412. {flask_exts-0.2.8/src/flask_exts/web/sqla → flask_exts-0.3.0/tests/admin}/__init__.py +0 -0
  413. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/__init__.py +0 -0
  414. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/templates/another_macro.html +0 -0
  415. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/admin}/sqla/templates/macro.html +0 -0
  416. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/data/copyleft.gif +0 -0
  417. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/data/copyleft.jpeg +0 -0
  418. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/data/copyleft.jpg +0 -0
  419. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/data/copyleft.png +0 -0
  420. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/data/copyleft.tiff +0 -0
  421. {flask_exts-0.2.8/tests/html → flask_exts-0.3.0/tests/extension_core}/__init__.py +0 -0
  422. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/common.py +0 -0
  423. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/forms/fields/test_inline.py +0 -0
  424. {flask_exts-0.2.8/tests/web → flask_exts-0.3.0/tests/frontend}/__init__.py +0 -0
  425. {flask_exts-0.2.8/tests/html → flask_exts-0.3.0/tests/frontend}/macros/test_render_breadcrumb_item.py +0 -0
  426. {flask_exts-0.2.8/tests/html → flask_exts-0.3.0/tests/frontend}/macros/test_render_nav_item.py +0 -0
  427. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/helper.py +0 -0
  428. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/models/__init__.py +0 -0
  429. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/templates/method.html +0 -0
  430. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/templates/mock.html +0 -0
  431. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/test_babel.py +1 -1
  432. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  433. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/translations/en/LC_MESSAGES/messages.po +0 -0
  434. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/translations/messages.pot +0 -0
  435. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  436. {flask_exts-0.2.8 → flask_exts-0.3.0}/tests/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
@@ -0,0 +1,69 @@
1
+ # EditorConfig is awesome: https://EditorConfig.org
2
+ # Team style guide blending Google and Microsoft conventions
3
+
4
+ # Mark as root so EditorConfig stops searching parent directories
5
+ root = true
6
+
7
+ # ============================================================
8
+ # General defaults (common to Google and Microsoft)
9
+ # ============================================================
10
+ [*]
11
+ charset = utf-8
12
+ end_of_line = lf
13
+ insert_final_newline = true
14
+ trim_trailing_whitespace = true
15
+ indent_style = space
16
+ indent_size = 4
17
+
18
+ # ============================================================
19
+ # JavaScript / TypeScript (Google style: 2 spaces)
20
+ # Ref: Google JavaScript Style Guide - Block indentation
21
+ # ============================================================
22
+ [*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}]
23
+ indent_size = 2
24
+
25
+ # ============================================================
26
+ # JSON / YAML / HTML / CSS (industry common: 2 spaces)
27
+ # ============================================================
28
+ [*.{json,jsonc,yml,yaml,html,css,scss,less,vue,svelte}]
29
+ indent_size = 2
30
+
31
+ # ============================================================
32
+ # Python (Google style: 4 spaces, never tabs)
33
+ # Ref: Google Python Style Guide - Indentation
34
+ # ============================================================
35
+ [*.py]
36
+ indent_size = 4
37
+
38
+ # ============================================================
39
+ # Go (gofmt enforces tabs)
40
+ # Ref: gofmt specification
41
+ # ============================================================
42
+ [*.go]
43
+ indent_style = tab
44
+
45
+ # ============================================================
46
+ # C# / .NET (Microsoft style: 4 spaces, UTF-8 BOM)
47
+ # Ref: dotnet/roslyn .editorconfig
48
+ # ============================================================
49
+ [*.{cs,csx,vb,vbx}]
50
+ indent_size = 4
51
+ charset = utf-8-bom
52
+
53
+ # ============================================================
54
+ # Shell scripts
55
+ # ============================================================
56
+ [*.sh]
57
+ indent_size = 2
58
+
59
+ # ============================================================
60
+ # Markdown (do not trim trailing whitespace; preserves line breaks)
61
+ # ============================================================
62
+ [*.md]
63
+ trim_trailing_whitespace = false
64
+
65
+ # ============================================================
66
+ # Makefile (must use tabs)
67
+ # ============================================================
68
+ [Makefile]
69
+ indent_style = tab
@@ -0,0 +1,49 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - "docs/**"
7
+ - "src/**"
8
+ - "examples/**"
9
+ - "CHANGES.rst"
10
+ - "pyproject.toml"
11
+ - ".github/workflows/docs.yml"
12
+ pull_request:
13
+ paths:
14
+ - "docs/**"
15
+ - "src/**"
16
+ - "examples/**"
17
+ - "CHANGES.rst"
18
+ - "pyproject.toml"
19
+ - ".github/workflows/docs.yml"
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ jobs:
25
+ build-docs:
26
+ name: Build Sphinx documentation
27
+ runs-on: ubuntu-latest
28
+
29
+ steps:
30
+ - name: Check out repository
31
+ uses: actions/checkout@v4
32
+
33
+ - name: Set up Python
34
+ uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.13"
37
+ cache: pip
38
+ cache-dependency-path: |
39
+ pyproject.toml
40
+ docs/requirements.txt
41
+
42
+ - name: Install project and documentation dependencies
43
+ run: |
44
+ python -m pip install --upgrade pip
45
+ python -m pip install -e .
46
+ python -m pip install -r docs/requirements.txt
47
+
48
+ - name: Build documentation
49
+ run: python -m sphinx -b html docs docs/_build/html -W -n --keep-going
@@ -1,6 +1,3 @@
1
- ### vscode
2
- .vscode
3
-
4
1
  ### JupyterNotebooks ###
5
2
  .ipynb_checkpoints
6
3
  */.ipynb_checkpoints/*
@@ -24,6 +21,9 @@ build/
24
21
  .coverage
25
22
  htmlcov/
26
23
 
24
+ # djlint
25
+ .djlint_cache/
26
+
27
27
  # Translations
28
28
  # *.mo
29
29
 
@@ -0,0 +1,16 @@
1
+ {
2
+ "files.eol": "\n",
3
+ "files.associations": {
4
+ "**/templates/**/*.html": "jinja-html"
5
+ },
6
+ "[jinja-html]": {
7
+ "editor.defaultFormatter": "monosans.djlint",
8
+ "editor.formatOnSave": true
9
+ },
10
+ "djlint.useEditorIndentation": false,
11
+ "python.testing.unittestEnabled": false,
12
+ "python.testing.pytestEnabled": true,
13
+ "python.testing.pytestArgs": [
14
+ "tests"
15
+ ],
16
+ }
@@ -0,0 +1,32 @@
1
+ v0.3.0
2
+ ------
3
+
4
+ Released 2026-10-07
5
+
6
+ - usercenter
7
+ - userstore
8
+ - security
9
+ - user view, authentication and authorization
10
+ - 2FA with TOTP
11
+
12
+ v0.2.0
13
+ ------
14
+
15
+ Released 2026-01-07
16
+
17
+ - extensions
18
+ - admin
19
+ - datastore
20
+ - emailer
21
+ - forms
22
+ - frontend
23
+ - babel
24
+
25
+ v0.1.0
26
+ ------
27
+
28
+ Released 2024-03-20
29
+
30
+ - Init release
31
+ - Init docs
32
+ - .readthedocs.yaml
@@ -0,0 +1,31 @@
1
+ .PHONY: docs-build docs-serve docs-clean
2
+
3
+ docs-build:
4
+ python -m sphinx -b html docs docs/_build/html -W -n --keep-going
5
+
6
+ docs-serve:
7
+ python -m http.server -d docs/_build/html 8000
8
+
9
+ docs-clean:
10
+ rm -rf docs/_build
11
+
12
+ pytest:
13
+ pytest
14
+
15
+ pytest-last:
16
+ pytest --lf --last-failed-no-failures=none
17
+
18
+ pytest-clean:
19
+ rm -rf .pytest_cache
20
+
21
+ pytest-warn:
22
+ pytest -W error
23
+
24
+ pytest-print:
25
+ pytest -s
26
+
27
+ coverage:
28
+ coverage run -m pytest
29
+
30
+ coverage-report:
31
+ coverage report -m
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: Flask-Exts
3
- Version: 0.2.8
3
+ Version: 0.3.0
4
4
  Summary: Flask extensions with admin, SQLAlchemy, babel, forms, fields, widgets, and so on.
5
5
  Project-URL: Documentation, https://flask-exts.readthedocs.io
6
6
  Project-URL: Source, https://github.com/ojso/flask-exts
@@ -43,6 +43,7 @@ Classifier: Programming Language :: Python :: 3.12
43
43
  Classifier: Programming Language :: Python :: 3.13
44
44
  Classifier: Topic :: Software Development :: Build Tools
45
45
  Requires-Python: >=3.10
46
+ Requires-Dist: email-validator>=2.0
46
47
  Requires-Dist: flask-babel>=4.0
47
48
  Requires-Dist: flask-login>=0.6
48
49
  Requires-Dist: flask>=3.0
@@ -78,7 +79,7 @@ Install and update using pip:
78
79
 
79
80
  $ pip install Flask-Exts
80
81
 
81
- Examples
82
+ Example
82
83
  ----------
83
84
 
84
85
  .. code-block:: python
@@ -23,7 +23,7 @@ Install and update using pip:
23
23
 
24
24
  $ pip install Flask-Exts
25
25
 
26
- Examples
26
+ Example
27
27
  ----------
28
28
 
29
29
  .. code-block:: python
@@ -8,235 +8,231 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: Flask-Exts VERSION\n"
10
10
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
- "POT-Creation-Date: 2026-05-24 22:01+0800\n"
11
+ "POT-Creation-Date: 2026-10-03 19:07+0800\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
15
  "MIME-Version: 1.0\n"
16
16
  "Content-Type: text/plain; charset=utf-8\n"
17
17
  "Content-Transfer-Encoding: 8bit\n"
18
- "Generated-By: Babel 2.17.0\n"
18
+ "Generated-By: Babel 2.18.0\n"
19
19
 
20
- #: src/flask_exts/admin/model/actions.py:114
20
+ #: src/flask_exts/admin/model/actions_mixin.py:113
21
21
  msgid "Delete"
22
22
  msgstr ""
23
23
 
24
- #: src/flask_exts/admin/model/actions.py:115
24
+ #: src/flask_exts/admin/model/actions_mixin.py:114
25
25
  msgid "Are you sure you want to delete selected records?"
26
26
  msgstr ""
27
27
 
28
- #: src/flask_exts/admin/model/actions.py:121
29
- #: src/flask_exts/admin/model/view.py:1417
28
+ #: src/flask_exts/admin/model/actions_mixin.py:120
29
+ #: src/flask_exts/admin/model/view.py:387
30
30
  #, python-format
31
31
  msgid "Record was successfully deleted."
32
32
  msgid_plural "%(count)s records were successfully deleted."
33
33
  msgstr[0] ""
34
34
  msgstr[1] ""
35
35
 
36
- #: src/flask_exts/admin/model/filter.py:88
37
- #: src/flask_exts/template/forms/widgets/xeditable.py:53
36
+ #: src/flask_exts/admin/model/filter.py:124
37
+ #: src/flask_exts/forms/widgets/editable.py:45
38
38
  msgid "Yes"
39
39
  msgstr ""
40
40
 
41
- #: src/flask_exts/admin/model/filter.py:88
42
- #: src/flask_exts/template/forms/widgets/xeditable.py:52
41
+ #: src/flask_exts/admin/model/filter.py:124
42
+ #: src/flask_exts/forms/widgets/editable.py:44
43
43
  msgid "No"
44
44
  msgstr ""
45
45
 
46
- #: src/flask_exts/admin/model/filter.py:178
46
+ #: src/flask_exts/admin/model/filter.py:214
47
+ #: src/flask_exts/admin/sqla/filter/filters.py:313
48
+ #: src/flask_exts/admin/sqla/filter/filters.py:348
49
+ #: src/flask_exts/admin/sqla/filter/filters.py:377
47
50
  msgid "between"
48
51
  msgstr ""
49
52
 
50
- #: src/flask_exts/admin/model/filter_mixin.py:182
53
+ #: src/flask_exts/admin/model/filter_mixin.py:186
51
54
  #, python-format
52
55
  msgid "Invalid Filter Value: %(value)s"
53
56
  msgstr ""
54
57
 
55
- #: src/flask_exts/admin/model/rowaction.py:15
56
- #: src/flask_exts/admin/model/rowaction.py:22
58
+ #: src/flask_exts/admin/model/row_actions.py:15
59
+ #: src/flask_exts/admin/model/row_actions.py:22
57
60
  msgid "View Record"
58
61
  msgstr ""
59
62
 
60
- #: src/flask_exts/admin/model/rowaction.py:29
61
- #: src/flask_exts/admin/model/rowaction.py:36
63
+ #: src/flask_exts/admin/model/row_actions.py:29
64
+ #: src/flask_exts/admin/model/row_actions.py:36
62
65
  #: src/flask_exts/templates/admin/model/modals/edit.html:2
63
66
  msgid "Edit Record"
64
67
  msgstr ""
65
68
 
66
- #: src/flask_exts/admin/model/rowaction.py:43
69
+ #: src/flask_exts/admin/model/row_actions.py:43
67
70
  msgid "Delete Record"
68
71
  msgstr ""
69
72
 
70
- #: src/flask_exts/admin/model/rowaction.py:45
73
+ #: src/flask_exts/admin/model/row_actions.py:45
71
74
  msgid "Are you sure you want to delete this record?"
72
75
  msgstr ""
73
76
 
74
- #: src/flask_exts/admin/model/view.py:1295
77
+ #: src/flask_exts/admin/model/view.py:271
75
78
  msgid "Record was successfully created."
76
79
  msgstr ""
77
80
 
78
- #: src/flask_exts/admin/model/view.py:1340
79
- #: src/flask_exts/admin/model/view.py:1383
80
- #: src/flask_exts/admin/model/view.py:1411
81
- #: src/flask_exts/admin/model/view.py:1595
81
+ #: src/flask_exts/admin/model/view.py:312
82
+ #: src/flask_exts/admin/model/view.py:353
83
+ #: src/flask_exts/admin/model/view.py:380
84
+ #: src/flask_exts/admin/model/view.py:440
82
85
  msgid "Record does not exist."
83
86
  msgstr ""
84
87
 
85
- #: src/flask_exts/admin/model/view.py:1347
86
- #: src/flask_exts/admin/model/view.py:1599
88
+ #: src/flask_exts/admin/model/view.py:319
89
+ #: src/flask_exts/admin/model/view.py:443
87
90
  msgid "Record was successfully saved."
88
91
  msgstr ""
89
92
 
90
- #: src/flask_exts/admin/model/view.py:1470
93
+ #: src/flask_exts/admin/model/view.py:446
94
+ #: src/flask_exts/admin/model/view.py:453
95
+ #: src/flask_exts/admin/model/view.py:460 src/flask_exts/admin/sqla/view.py:482
96
+ #, python-format
97
+ msgid "Failed to update record. %(error)s"
98
+ msgstr ""
99
+
100
+ #: src/flask_exts/admin/model/view.py:464
101
+ msgid "Validation failed."
102
+ msgstr ""
103
+
104
+ #: src/flask_exts/admin/model/operations/export.py:146
105
+ #, python-format
106
+ msgid "Export type \"%(type)s\" not supported."
107
+ msgstr ""
108
+
109
+ #: src/flask_exts/admin/model/operations/export.py:172
91
110
  msgid "Permission denied."
92
111
  msgstr ""
93
112
 
94
- #: src/flask_exts/admin/model/view.py:1549
113
+ #: src/flask_exts/admin/sqla/view.py:461
95
114
  #, python-format
96
- msgid "Export type \"%(type)s not supported."
115
+ msgid "Failed to create record. %(error)s"
97
116
  msgstr ""
98
117
 
99
- #: src/flask_exts/admin/model/view.py:1603
100
- #: src/flask_exts/admin/model/view.py:1610
101
- #: src/flask_exts/admin/model/view.py:1617
102
- #: src/flask_exts/admin/sqla/view.py:474
118
+ #: src/flask_exts/admin/sqla/view.py:495
103
119
  #, python-format
104
- msgid "Failed to update record. %(error)s"
120
+ msgid "Failed to delete record. %(error)s"
105
121
  msgstr ""
106
122
 
107
- #: src/flask_exts/admin/sqla/filter.py:43
123
+ #: src/flask_exts/admin/sqla/filter/filters.py:59
108
124
  msgid "equals"
109
125
  msgstr ""
110
126
 
111
- #: src/flask_exts/admin/sqla/filter.py:51
127
+ #: src/flask_exts/admin/sqla/filter/filters.py:69
112
128
  msgid "not equal"
113
129
  msgstr ""
114
130
 
115
- #: src/flask_exts/admin/sqla/filter.py:59
131
+ #: src/flask_exts/admin/sqla/filter/filters.py:79
116
132
  msgid "greater than"
117
133
  msgstr ""
118
134
 
119
- #: src/flask_exts/admin/sqla/filter.py:67
135
+ #: src/flask_exts/admin/sqla/filter/filters.py:89
120
136
  msgid "smaller than"
121
137
  msgstr ""
122
138
 
123
- #: src/flask_exts/admin/sqla/filter.py:75
139
+ #: src/flask_exts/admin/sqla/filter/filters.py:99
124
140
  msgid "contains"
125
141
  msgstr ""
126
142
 
127
- #: src/flask_exts/admin/sqla/filter.py:83
143
+ #: src/flask_exts/admin/sqla/filter/filters.py:109
128
144
  msgid "not contains"
129
145
  msgstr ""
130
146
 
131
- #: src/flask_exts/admin/sqla/filter.py:91
147
+ #: src/flask_exts/admin/sqla/filter/filters.py:119
132
148
  msgid "empty"
133
149
  msgstr ""
134
150
 
135
- #: src/flask_exts/admin/sqla/filter.py:105
151
+ #: src/flask_exts/admin/sqla/filter/filters.py:135
136
152
  msgid "in list"
137
153
  msgstr ""
138
154
 
139
- #: src/flask_exts/admin/sqla/filter.py:116
155
+ #: src/flask_exts/admin/sqla/filter/filters.py:148
140
156
  msgid "not in list"
141
157
  msgstr ""
142
158
 
143
- #: src/flask_exts/admin/sqla/filter.py:204
144
- #: src/flask_exts/admin/sqla/filter.py:236
145
- #: src/flask_exts/admin/sqla/filter.py:268
159
+ #: src/flask_exts/admin/sqla/filter/filters.py:323
160
+ #: src/flask_exts/admin/sqla/filter/filters.py:358
161
+ #: src/flask_exts/admin/sqla/filter/filters.py:387
146
162
  msgid "not between"
147
163
  msgstr ""
148
164
 
149
- #: src/flask_exts/admin/sqla/view.py:453
150
- #, python-format
151
- msgid "Failed to create record. %(error)s"
152
- msgstr ""
153
-
154
- #: src/flask_exts/admin/sqla/view.py:487
155
- #, python-format
156
- msgid "Failed to delete record. %(error)s"
157
- msgstr ""
158
-
159
- #: src/flask_exts/template/forms/fields/ajax_select.py:60
160
- #: src/flask_exts/template/forms/fields/ajax_select.py:110
161
- #: src/flask_exts/template/forms/fields/sqla.py:118
162
- #: src/flask_exts/template/forms/fields/sqla.py:170
163
- #: src/flask_exts/template/forms/fields/sqla.py:175
165
+ #: src/flask_exts/forms/fields/ajax_select.py:60
166
+ #: src/flask_exts/forms/fields/ajax_select.py:109
167
+ #: src/flask_exts/forms/fields/sqla.py:120
168
+ #: src/flask_exts/forms/fields/sqla.py:172
169
+ #: src/flask_exts/forms/fields/sqla.py:177
164
170
  msgid "Not a valid choice"
165
171
  msgstr ""
166
172
 
167
- #: src/flask_exts/template/forms/fields/datetime.py:102
173
+ #: src/flask_exts/forms/fields/datetime.py:103
168
174
  msgid "Invalid time format"
169
175
  msgstr ""
170
176
 
171
- #: src/flask_exts/template/forms/fields/file.py:66
172
- #: src/flask_exts/template/forms/fields/file.py:76
177
+ #: src/flask_exts/forms/fields/file.py:68
178
+ #: src/flask_exts/forms/fields/file.py:78
173
179
  #, python-format
174
180
  msgid "File \"%s\" already exists."
175
181
  msgstr ""
176
182
 
177
- #: src/flask_exts/template/forms/fields/json.py:13
183
+ #: src/flask_exts/forms/fields/json.py:15
178
184
  msgid "Invalid JSON"
179
185
  msgstr ""
180
186
 
181
- #: src/flask_exts/template/forms/fields/select.py:62
187
+ #: src/flask_exts/forms/fields/select.py:64
182
188
  msgid "Invalid Choice: could not coerce"
183
189
  msgstr ""
184
190
 
185
- #: src/flask_exts/template/forms/form/csrf.py:57
191
+ #: src/flask_exts/forms/form/csrf.py:54
186
192
  msgid "CSRF token expired."
187
193
  msgstr ""
188
194
 
189
- #: src/flask_exts/template/forms/validators/field_list.py:11
195
+ #: src/flask_exts/forms/validators/field_list.py:13
190
196
  msgid "This field requires at least one item."
191
197
  msgstr ""
192
198
 
193
- #: src/flask_exts/template/forms/validators/file.py:18
199
+ #: src/flask_exts/forms/validators/file.py:18
194
200
  msgid "This field is required."
195
201
  msgstr ""
196
202
 
197
- #: src/flask_exts/template/forms/validators/file.py:50
203
+ #: src/flask_exts/forms/validators/file.py:50
198
204
  #, python-brace-format
199
205
  msgid "File does not have an approved extension: {extensions}"
200
206
  msgstr ""
201
207
 
202
- #: src/flask_exts/template/forms/validators/file.py:85
208
+ #: src/flask_exts/forms/validators/file.py:85
203
209
  #, python-brace-format
204
210
  msgid "File must be between {min_size} and {max_size} bytes."
205
211
  msgstr ""
206
212
 
207
- #: src/flask_exts/template/forms/validators/sqla.py:38
213
+ #: src/flask_exts/forms/validators/sqla.py:38
208
214
  msgid "Already exists."
209
215
  msgstr ""
210
216
 
211
- #: src/flask_exts/template/forms/validators/sqla.py:56
217
+ #: src/flask_exts/forms/validators/sqla.py:56
212
218
  #, python-format
213
219
  msgid "At least %(num)d item is required"
214
220
  msgid_plural "At least %(num)d items are required"
215
221
  msgstr[0] ""
216
222
  msgstr[1] ""
217
223
 
218
- #: src/flask_exts/template/forms/widgets/select.py:72
224
+ #: src/flask_exts/forms/widgets/select.py:71
219
225
  msgid "Please select model"
220
226
  msgstr ""
221
227
 
222
228
  #: src/flask_exts/templates/admin/model/create.html:8
223
- #: src/flask_exts/templates/admin/model/edit.html:7
224
229
  msgid "List"
225
230
  msgstr ""
226
231
 
227
232
  #: src/flask_exts/templates/admin/model/create.html:11
228
- #: src/flask_exts/templates/admin/model/edit.html:11
229
233
  msgid "Create"
230
234
  msgstr ""
231
235
 
232
- #: src/flask_exts/templates/admin/model/edit.html:15
233
- msgid "Edit"
234
- msgstr ""
235
-
236
- #: src/flask_exts/templates/admin/model/edit.html:18
237
- msgid "Details"
238
- msgstr ""
239
-
240
236
  #: src/flask_exts/templates/admin/model/modals/create.html:2
241
237
  msgid "Create New Record"
242
238
  msgstr ""
@@ -0,0 +1,10 @@
1
+ Database
2
+ ========
3
+
4
+ This page documents the database helpers and SQLAlchemy integration used by
5
+ Flask-Exts.
6
+
7
+ .. automodule:: flask_exts.datastore.sqla._db
8
+
9
+ .. automodule:: flask_exts.datastore.sqla.database
10
+ :members:
@@ -0,0 +1,13 @@
1
+ Advanced usage
2
+ ==============
3
+
4
+ This section covers advanced patterns for using Flask-Exts in larger projects,
5
+ including database configuration and application lifecycle management.
6
+
7
+ Use the pages in this section when you need more control over how extensions are
8
+ initialized, configured, or integrated with your application structure.
9
+
10
+ .. toctree::
11
+ :maxdepth: 2
12
+
13
+ database
@@ -4,14 +4,14 @@ API
4
4
  Admin
5
5
  -----
6
6
 
7
- .. automodule:: flask_exts.web.admin
7
+ .. automodule:: flask_exts.admin.base
8
8
  :members:
9
9
  :inherited-members:
10
10
 
11
11
  view
12
12
  -----
13
13
 
14
- .. autoclass:: flask_exts.web.view.View
14
+ .. autoclass:: flask_exts.admin.view.View
15
15
  :members:
16
16
 
17
17
 
@@ -10,9 +10,10 @@
10
10
  # add these directories to sys.path here. If the directory is relative to the
11
11
  # documentation root, use os.path.abspath to make it absolute, like shown here.
12
12
  #
13
- # import os
14
- # import sys
15
- # sys.path.insert(0, os.path.abspath('.'))
13
+ import os
14
+ import sys
15
+
16
+ sys.path.insert(0, os.path.abspath("../src"))
16
17
 
17
18
 
18
19
  # -- Project information -----------------------------------------------------
@@ -31,12 +32,12 @@ extensions = [
31
32
  "sphinx.ext.intersphinx",
32
33
  ]
33
34
 
34
- # intersphinx_mapping = {
35
- # "rtd": ("https://docs.readthedocs.io/en/stable/", None),
36
- # "python": ("https://docs.python.org/3/", None),
37
- # "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
38
- # }
39
- # intersphinx_disabled_domains = ["std"]
35
+ intersphinx_mapping = {
36
+ "python": ("https://docs.python.org/3/", None),
37
+ "flask": ("https://flask.palletsprojects.com/en/latest/", None),
38
+ "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
39
+ }
40
+ intersphinx_disabled_domains = ["std"]
40
41
 
41
42
  templates_path = ["_templates"]
42
43