Flask-Exts 0.2.7__tar.gz → 0.2.8__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 (445) hide show
  1. {flask_exts-0.2.7 → flask_exts-0.2.8}/.gitignore +4 -0
  2. {flask_exts-0.2.7 → flask_exts-0.2.8}/CHANGES.rst +8 -0
  3. {flask_exts-0.2.7 → flask_exts-0.2.8}/PKG-INFO +4 -4
  4. {flask_exts-0.2.7 → flask_exts-0.2.8}/README.rst +3 -3
  5. flask_exts-0.2.8/docs/advanced/bootstrap5.rst +429 -0
  6. flask_exts-0.2.8/docs/advanced/custom_fields.rst +384 -0
  7. flask_exts-0.2.8/docs/advanced/custom_plugins.rst +247 -0
  8. flask_exts-0.2.8/docs/advanced/custom_validators.rst +4 -0
  9. flask_exts-0.2.8/docs/advanced/index.rst +16 -0
  10. flask_exts-0.2.8/docs/advanced/modelview.rst +337 -0
  11. flask_exts-0.2.8/docs/advanced/performance.rst +493 -0
  12. flask_exts-0.2.8/docs/advanced/security.rst +498 -0
  13. flask_exts-0.2.8/docs/advanced/theming.rst +401 -0
  14. flask_exts-0.2.8/docs/api.rst +17 -0
  15. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/conf.py +0 -1
  16. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/configure.rst +2 -2
  17. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/develop.rst +9 -15
  18. flask_exts-0.2.8/docs/examples.rst +6 -0
  19. flask_exts-0.2.8/docs/index.rst +44 -0
  20. flask_exts-0.2.8/docs/quickstart.rst +264 -0
  21. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/README.rst +5 -7
  22. flask_exts-0.2.8/examples/demo/admin_views.py +12 -0
  23. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/build_sample.py +4 -4
  24. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/make_app.py +10 -13
  25. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/templates/field_list.html +2 -3
  26. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/views/author_view.py +12 -1
  27. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/views/post_view.py +6 -6
  28. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/views/tag_view.py +1 -1
  29. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/views/tree_view.py +1 -1
  30. flask_exts-0.2.8/examples/simple/__init__.py +43 -0
  31. flask_exts-0.2.8/package.json +22 -0
  32. flask_exts-0.2.8/src/flask_exts/__about__.py +1 -0
  33. flask_exts-0.2.8/src/flask_exts/__init__.py +2 -0
  34. flask_exts-0.2.8/src/flask_exts/builtin_extensions/__init__.py +29 -0
  35. flask_exts-0.2.8/src/flask_exts/builtin_extensions/babel_ext.py +102 -0
  36. flask_exts-0.2.8/src/flask_exts/builtin_extensions/database_ext.py +15 -0
  37. flask_exts-0.2.8/src/flask_exts/builtin_extensions/email_ext.py +16 -0
  38. flask_exts-0.2.8/src/flask_exts/builtin_extensions/html_ext.py +45 -0
  39. flask_exts-0.2.8/src/flask_exts/builtin_extensions/login_ext.py +113 -0
  40. flask_exts-0.2.8/src/flask_exts/builtin_extensions/security_ext.py +23 -0
  41. flask_exts-0.2.8/src/flask_exts/builtin_extensions/startup_ext.py +41 -0
  42. flask_exts-0.2.8/src/flask_exts/builtin_extensions/usercenter_ext.py +20 -0
  43. flask_exts-0.2.8/src/flask_exts/builtin_extensions/userstore_ext.py +22 -0
  44. flask_exts-0.2.8/src/flask_exts/builtin_extensions/web_ext.py +19 -0
  45. flask_exts-0.2.8/src/flask_exts/commands.py +52 -0
  46. flask_exts-0.2.8/src/flask_exts/datastore/sqla/__init__.py +3 -0
  47. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/datastore}/sqla/query.py +0 -135
  48. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/__init__.py +24 -0
  49. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/filter_builder.py +50 -0
  50. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/join_builder.py +51 -0
  51. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/pagination_builder.py +41 -0
  52. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/sort_builder.py +40 -0
  53. flask_exts-0.2.7/src/flask_exts/datastore/sqla/db.py → flask_exts-0.2.8/src/flask_exts/datastore/sqla/sqla_db.py +2 -2
  54. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/__init__.py +6 -0
  55. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/model_mapper.py +142 -0
  56. flask_exts-0.2.8/src/flask_exts/extension_core/base.py +127 -0
  57. flask_exts-0.2.8/src/flask_exts/extension_core/manager.py +143 -0
  58. flask_exts-0.2.8/src/flask_exts/extension_core/registry.py +263 -0
  59. flask_exts-0.2.8/src/flask_exts/forms/__init__.py +1 -0
  60. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/ajax_select.py +1 -1
  61. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/datetime.py +4 -4
  62. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/inline.py +4 -31
  63. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/json.py +1 -0
  64. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/select.py +9 -7
  65. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/sqla.py +15 -24
  66. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/__init__.py +39 -0
  67. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/checkbox_fields.py +9 -0
  68. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/inline_fields.py +10 -0
  69. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/query_fields.py +11 -0
  70. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/taglist.py +3 -0
  71. flask_exts-0.2.8/src/flask_exts/forms/form/__init__.py +1 -0
  72. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/__init__.py +1 -1
  73. flask_exts-0.2.7/src/flask_exts/template/forms/widgets/xeditable.py → flask_exts-0.2.8/src/flask_exts/forms/widgets/editable.py +14 -23
  74. flask_exts-0.2.8/src/flask_exts/forms/widgets/inline.py +14 -0
  75. flask_exts-0.2.8/src/flask_exts/html/plugin_base.py +32 -0
  76. flask_exts-0.2.8/src/flask_exts/html/plugin_manager.py +85 -0
  77. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_detail_filter_plugin.py +11 -0
  78. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_filters_plugin.py +11 -0
  79. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_form_plugin.py +11 -0
  80. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_list_action_plugin.py +11 -0
  81. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_modal_plugin.py +11 -0
  82. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_plugin.py +11 -0
  83. flask_exts-0.2.8/src/flask_exts/html/plugins/bootstrap4_plugin.py +19 -0
  84. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/html}/plugins/bootstrap5_plugin.py +7 -5
  85. flask_exts-0.2.8/src/flask_exts/html/plugins/clipboard_plugin.py +11 -0
  86. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/html}/plugins/copybutton_plugin.py +4 -3
  87. flask_exts-0.2.8/src/flask_exts/html/plugins/dayjs_plugin.py +73 -0
  88. flask_exts-0.2.8/src/flask_exts/html/plugins/editable_plugin.py +59 -0
  89. flask_exts-0.2.8/src/flask_exts/html/plugins/flatpickr_plugin.py +69 -0
  90. flask_exts-0.2.8/src/flask_exts/html/plugins/qrcode_plugin.py +11 -0
  91. flask_exts-0.2.8/src/flask_exts/html/plugins/rediscli_plugin.py +15 -0
  92. flask_exts-0.2.8/src/flask_exts/html/plugins/sphinx_copybutton_plugin.py +20 -0
  93. flask_exts-0.2.8/src/flask_exts/html/plugins/tom_select_plugin.py +68 -0
  94. flask_exts-0.2.8/src/flask_exts/html/template.py +18 -0
  95. flask_exts-0.2.8/src/flask_exts/html/theme.py +17 -0
  96. flask_exts-0.2.8/src/flask_exts/proxies.py +24 -0
  97. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/security/core.py +13 -25
  98. flask_exts-0.2.8/src/flask_exts/security/plugins/email_verification.py +48 -0
  99. flask_exts-0.2.8/src/flask_exts/security/plugins/reset_password.py +49 -0
  100. flask_exts-0.2.8/src/flask_exts/security/registry.py +34 -0
  101. flask_exts-0.2.8/src/flask_exts/security/token_action.py +138 -0
  102. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/signals.py +1 -1
  103. flask_exts-0.2.8/src/flask_exts/static/css/editable.css +13 -0
  104. flask_exts-0.2.8/src/flask_exts/static/js/editable.js +243 -0
  105. flask_exts-0.2.8/src/flask_exts/static/js/field-registry.js +241 -0
  106. flask_exts-0.2.8/src/flask_exts/static/js/filters.js +282 -0
  107. flask_exts-0.2.8/src/flask_exts/static/js/form.js +673 -0
  108. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/modal.js +1 -2
  109. flask_exts-0.2.8/src/flask_exts/static/js/ui-factory.js +163 -0
  110. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/master.html +10 -3
  111. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/details.html +2 -2
  112. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/edit.html +2 -0
  113. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/list.html +12 -18
  114. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/modals/details.html +3 -3
  115. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/base.html +2 -0
  116. flask_exts-0.2.8/src/flask_exts/templates/layout.html +7 -0
  117. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/form.html +2 -2
  118. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/inline.html +2 -2
  119. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/layout.html +3 -3
  120. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/menu.html +1 -1
  121. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/message.html +1 -1
  122. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/modal.html +1 -1
  123. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/recovery_codes.html +1 -1
  124. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/setup_tfa.html +1 -1
  125. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/show_tfa.html +1 -1
  126. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/verify_tfa_modal.html +1 -1
  127. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/auth_requires.py +3 -3
  128. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/core.py +1 -4
  129. flask_exts-0.2.8/src/flask_exts/usercenter/forms/__init__.py +1 -0
  130. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/forgot_password.py +2 -2
  131. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/profile.py +1 -1
  132. flask_exts-0.2.7/src/flask_exts/usercenter/base_user.py → flask_exts-0.2.8/src/flask_exts/usercenter/user.py +2 -2
  133. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/user_view.py +44 -40
  134. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/user.py +7 -3
  135. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/sqla_user_store.py +4 -3
  136. flask_exts-0.2.8/src/flask_exts/userstore/store.py +50 -0
  137. flask_exts-0.2.8/src/flask_exts/web/__init__.py +3 -0
  138. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/admin.py +4 -4
  139. {flask_exts-0.2.7/src/flask_exts/bootstrap → flask_exts-0.2.8/src/flask_exts/web/default_views}/index_view.py +1 -1
  140. flask_exts-0.2.8/src/flask_exts/web/model/__init__.py +65 -0
  141. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/model/actions_mixin.py +7 -8
  142. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/model/ajax.py +0 -2
  143. flask_exts-0.2.8/src/flask_exts/web/model/base.py +469 -0
  144. flask_exts-0.2.8/src/flask_exts/web/model/core/__init__.py +13 -0
  145. flask_exts-0.2.8/src/flask_exts/web/model/core/columns.py +169 -0
  146. flask_exts-0.2.8/src/flask_exts/web/model/core/forms.py +227 -0
  147. flask_exts-0.2.8/src/flask_exts/web/model/core/pagination.py +125 -0
  148. flask_exts-0.2.8/src/flask_exts/web/model/core/sorting.py +79 -0
  149. flask_exts-0.2.8/src/flask_exts/web/model/core/values.py +170 -0
  150. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/model/filter_mixin.py +6 -6
  151. flask_exts-0.2.8/src/flask_exts/web/model/operations/__init__.py +19 -0
  152. flask_exts-0.2.8/src/flask_exts/web/model/operations/create.py +34 -0
  153. flask_exts-0.2.8/src/flask_exts/web/model/operations/delete.py +31 -0
  154. flask_exts-0.2.8/src/flask_exts/web/model/operations/export.py +179 -0
  155. flask_exts-0.2.8/src/flask_exts/web/model/operations/read.py +57 -0
  156. flask_exts-0.2.8/src/flask_exts/web/model/operations/update.py +31 -0
  157. flask_exts-0.2.7/src/flask_exts/admin/model/rowaction.py → flask_exts-0.2.8/src/flask_exts/web/model/row_actions.py +32 -0
  158. flask_exts-0.2.8/src/flask_exts/web/model/types.py +4 -0
  159. flask_exts-0.2.8/src/flask_exts/web/model/view.py +464 -0
  160. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/sqla/ajax.py +31 -7
  161. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/__init__.py +1 -0
  162. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/filter_converter.py +221 -0
  163. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/filters.py +391 -0
  164. flask_exts-0.2.8/src/flask_exts/web/sqla/form/__init__.py +1 -0
  165. flask_exts-0.2.8/src/flask_exts/web/sqla/form/field_converters.py +177 -0
  166. flask_exts-0.2.8/src/flask_exts/web/sqla/form/inline_form.py +32 -0
  167. flask_exts-0.2.8/src/flask_exts/web/sqla/form/inline_model_convert.py +347 -0
  168. flask_exts-0.2.8/src/flask_exts/web/sqla/form/model_field_convert.py +218 -0
  169. flask_exts-0.2.8/src/flask_exts/web/sqla/form/utils.py +79 -0
  170. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/__init__.py +24 -0
  171. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/pagination_handler.py +22 -0
  172. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/query_handler.py +29 -0
  173. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/relationships_handler.py +41 -0
  174. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/sorting_handler.py +23 -0
  175. flask_exts-0.2.7/src/flask_exts/admin/sqla/typefmt.py → flask_exts-0.2.8/src/flask_exts/web/sqla/type_formatters.py +2 -2
  176. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/sqla/view.py +43 -39
  177. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/conftest.py +10 -10
  178. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/datastore/sqla/test_db.py +4 -4
  179. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/datastore}/sqla/test_query.py +9 -7
  180. flask_exts-0.2.8/tests/forms/common.py +6 -0
  181. flask_exts-0.2.8/tests/forms/fields/test_datetime.py +26 -0
  182. {flask_exts-0.2.7/tests/template/forms → flask_exts-0.2.8/tests/forms/fields}/test_filefield.py +1 -1
  183. flask_exts-0.2.8/tests/forms/fields/test_json.py +34 -0
  184. {flask_exts-0.2.7/tests/template/forms → flask_exts-0.2.8/tests/forms/fields}/test_uploadfile.py +3 -3
  185. flask_exts-0.2.8/tests/forms/fields/test_wtforms.py +127 -0
  186. flask_exts-0.2.8/tests/forms/form/test_form.py +46 -0
  187. flask_exts-0.2.8/tests/html/__init__.py +0 -0
  188. {flask_exts-0.2.7/tests/template → flask_exts-0.2.8/tests/html}/conftest.py +1 -1
  189. flask_exts-0.2.8/tests/html/test_base.py +28 -0
  190. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/relations.py +17 -14
  191. flask_exts-0.2.8/tests/security/test_authorizer.py +116 -0
  192. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/security/test_core.py +8 -7
  193. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/security/test_tfa.py +1 -1
  194. flask_exts-0.2.7/tests/test_exts_babel.py → flask_exts-0.2.8/tests/test_babel.py +14 -9
  195. flask_exts-0.2.8/tests/test_base.py +9 -0
  196. flask_exts-0.2.7/tests/test_exts_db.py → flask_exts-0.2.8/tests/test_db.py +0 -1
  197. flask_exts-0.2.8/tests/test_exts_base.py +38 -0
  198. flask_exts-0.2.7/tests/security/test_auth_crypt.py → flask_exts-0.2.8/tests/test_login.py +35 -2
  199. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/usercenter/test_sqla_usercenter.py +2 -2
  200. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/views/test_user_view.py +26 -22
  201. flask_exts-0.2.8/tests/web/__init__.py +0 -0
  202. flask_exts-0.2.8/tests/web/model/core/test_columns.py +19 -0
  203. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/model/test_action_mixin.py +5 -5
  204. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/model/test_model_view.py +35 -35
  205. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/model/test_model_view_csrf.py +5 -5
  206. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/custom_sqla_model_view.py +1 -1
  207. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_basic.py +70 -68
  208. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_filter.py +3 -3
  209. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_form.py +3 -3
  210. flask_exts-0.2.8/tests/web/sqla/test_inline_model.py +288 -0
  211. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_multi_pk.py +2 -2
  212. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_primary_string.py +1 -1
  213. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_translation.py +6 -5
  214. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/test_admin.py +12 -15
  215. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/test_view.py +2 -2
  216. flask_exts-0.2.7/docs/api.rst +0 -17
  217. flask_exts-0.2.7/docs/examples.rst +0 -1
  218. flask_exts-0.2.7/docs/index.rst +0 -65
  219. flask_exts-0.2.7/examples/demo/admin_views.py +0 -12
  220. flask_exts-0.2.7/examples/simple/__init__.py +0 -39
  221. flask_exts-0.2.7/src/flask_exts/__about__.py +0 -1
  222. flask_exts-0.2.7/src/flask_exts/__init__.py +0 -1
  223. flask_exts-0.2.7/src/flask_exts/admin/__init__.py +0 -3
  224. flask_exts-0.2.7/src/flask_exts/admin/model/form.py +0 -173
  225. flask_exts-0.2.7/src/flask_exts/admin/model/form_mixin.py +0 -39
  226. flask_exts-0.2.7/src/flask_exts/admin/model/rowaction_mixin.py +0 -34
  227. flask_exts-0.2.7/src/flask_exts/admin/model/types.py +0 -5
  228. flask_exts-0.2.7/src/flask_exts/admin/model/view.py +0 -1591
  229. flask_exts-0.2.7/src/flask_exts/admin/model/view_args.py +0 -35
  230. flask_exts-0.2.7/src/flask_exts/admin/sqla/filter.py +0 -551
  231. flask_exts-0.2.7/src/flask_exts/admin/sqla/form.py +0 -725
  232. flask_exts-0.2.7/src/flask_exts/babel/__init__.py +0 -60
  233. flask_exts-0.2.7/src/flask_exts/babel/selector.py +0 -35
  234. flask_exts-0.2.7/src/flask_exts/bootstrap/init_admin_views.py +0 -8
  235. flask_exts-0.2.7/src/flask_exts/bootstrap/init_flask_login.py +0 -59
  236. flask_exts-0.2.7/src/flask_exts/bootstrap/init_template.py +0 -7
  237. flask_exts-0.2.7/src/flask_exts/bootstrap/startup.py +0 -12
  238. flask_exts-0.2.7/src/flask_exts/bootstrap/subscribe.py +0 -24
  239. flask_exts-0.2.7/src/flask_exts/commands.py +0 -34
  240. flask_exts-0.2.7/src/flask_exts/datastore/sqla/__init__.py +0 -3
  241. flask_exts-0.2.7/src/flask_exts/datastore/sqla/utils/model.py +0 -29
  242. flask_exts-0.2.7/src/flask_exts/exts.py +0 -88
  243. flask_exts-0.2.7/src/flask_exts/proxies.py +0 -18
  244. flask_exts-0.2.7/src/flask_exts/security/auth_crypt.py +0 -42
  245. flask_exts-0.2.7/src/flask_exts/security/email_verification.py +0 -84
  246. flask_exts-0.2.7/src/flask_exts/security/reset_password.py +0 -78
  247. flask_exts-0.2.7/src/flask_exts/static/js/filters.js +0 -200
  248. flask_exts-0.2.7/src/flask_exts/static/js/form.js +0 -679
  249. flask_exts-0.2.7/src/flask_exts/static/vendor/bootstrap4/bootstrap.bundle.min.js +0 -7
  250. flask_exts-0.2.7/src/flask_exts/static/vendor/bootstrap4/bootstrap.min.css +0 -7
  251. flask_exts-0.2.7/src/flask_exts/static/vendor/bootstrap5/bootstrap.bundle.min.js +0 -7
  252. flask_exts-0.2.7/src/flask_exts/static/vendor/bootstrap5/bootstrap.min.css +0 -6
  253. flask_exts-0.2.7/src/flask_exts/static/vendor/clipboard/clipboard.min.js +0 -7
  254. flask_exts-0.2.7/src/flask_exts/static/vendor/daterangepicker/daterangepicker.css +0 -410
  255. flask_exts-0.2.7/src/flask_exts/static/vendor/daterangepicker/daterangepicker.js +0 -1578
  256. flask_exts-0.2.7/src/flask_exts/static/vendor/jquery/jquery.min.js +0 -2
  257. flask_exts-0.2.7/src/flask_exts/static/vendor/moment.min.js +0 -1
  258. flask_exts-0.2.7/src/flask_exts/static/vendor/select2/select2.min.css +0 -1
  259. flask_exts-0.2.7/src/flask_exts/static/vendor/select2/select2.min.js +0 -2
  260. flask_exts-0.2.7/src/flask_exts/static/vendor/vanilla-editor/css/bootstrap-editable.css +0 -670
  261. flask_exts-0.2.7/src/flask_exts/static/vendor/vanilla-editor/img/clear.png +0 -0
  262. flask_exts-0.2.7/src/flask_exts/static/vendor/vanilla-editor/img/loading.gif +0 -0
  263. flask_exts-0.2.7/src/flask_exts/static/vendor/vanilla-editor/js/bootstrap-editable.min.js +0 -1
  264. flask_exts-0.2.7/src/flask_exts/template/core.py +0 -44
  265. flask_exts-0.2.7/src/flask_exts/template/forms/widgets/inline.py +0 -15
  266. flask_exts-0.2.7/src/flask_exts/template/forms/widgets/render_template.py +0 -25
  267. flask_exts-0.2.7/src/flask_exts/template/funcs.py +0 -5
  268. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_admin_plugin.py +0 -10
  269. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_detail_filter_plugin.py +0 -10
  270. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_filters_plugin.py +0 -10
  271. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_form_plugin.py +0 -10
  272. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_list_action_plugin.py +0 -10
  273. flask_exts-0.2.7/src/flask_exts/template/plugins/admin_modal_plugin.py +0 -10
  274. flask_exts-0.2.7/src/flask_exts/template/plugins/base_plugin.py +0 -16
  275. flask_exts-0.2.7/src/flask_exts/template/plugins/bootstrap4_plugin.py +0 -17
  276. flask_exts-0.2.7/src/flask_exts/template/plugins/clipboard_plugin.py +0 -10
  277. flask_exts-0.2.7/src/flask_exts/template/plugins/daterangepicker_plugin.py +0 -17
  278. flask_exts-0.2.7/src/flask_exts/template/plugins/jquery_plugin.py +0 -10
  279. flask_exts-0.2.7/src/flask_exts/template/plugins/moment_plugin.py +0 -10
  280. flask_exts-0.2.7/src/flask_exts/template/plugins/plugin_manager.py +0 -84
  281. flask_exts-0.2.7/src/flask_exts/template/plugins/qrcode_plugin.py +0 -10
  282. flask_exts-0.2.7/src/flask_exts/template/plugins/rediscli_plugin.py +0 -13
  283. flask_exts-0.2.7/src/flask_exts/template/plugins/select2_plugin.py +0 -13
  284. flask_exts-0.2.7/src/flask_exts/template/plugins/sphinx_copybutton_plugin.py +0 -13
  285. flask_exts-0.2.7/src/flask_exts/template/plugins/xeditor_plugin.py +0 -19
  286. flask_exts-0.2.7/src/flask_exts/template/theme.py +0 -21
  287. flask_exts-0.2.7/src/flask_exts/templates/layout.html +0 -7
  288. flask_exts-0.2.7/src/flask_exts/templates/widgets/inline_field_list.html +0 -4
  289. flask_exts-0.2.7/src/flask_exts/templates/widgets/inline_form.html +0 -3
  290. flask_exts-0.2.7/src/flask_exts/usercenter/base_user_store.py +0 -32
  291. flask_exts-0.2.7/src/flask_exts/usercenter/forms/__init__.py +0 -1
  292. flask_exts-0.2.7/tests/admin/sqla/test_inlineform.py +0 -1
  293. flask_exts-0.2.7/tests/bootstrap/test_login.py +0 -31
  294. flask_exts-0.2.7/tests/template/forms/test_csrf.py +0 -39
  295. flask_exts-0.2.7/tests/template/forms/test_fields.py +0 -92
  296. flask_exts-0.2.7/tests/template/test_base.py +0 -36
  297. flask_exts-0.2.7/tests/test_exts_base.py +0 -35
  298. {flask_exts-0.2.7 → flask_exts-0.2.8}/.djlintrc +0 -0
  299. {flask_exts-0.2.7 → flask_exts-0.2.8}/.github/workflows/release.yml +0 -0
  300. {flask_exts-0.2.7 → flask_exts-0.2.8}/.readthedocs.yaml +0 -0
  301. {flask_exts-0.2.7 → flask_exts-0.2.8}/LICENSE.rst +0 -0
  302. {flask_exts-0.2.7 → flask_exts-0.2.8}/babel/babel.cfg +0 -0
  303. {flask_exts-0.2.7 → flask_exts-0.2.8}/babel/babel.sh +0 -0
  304. {flask_exts-0.2.7 → flask_exts-0.2.8}/babel/messages.pot +0 -0
  305. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/Makefile +0 -0
  306. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/_static/logo.png +0 -0
  307. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/changes.rst +0 -0
  308. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/make.bat +0 -0
  309. {flask_exts-0.2.7 → flask_exts-0.2.8}/docs/requirements.txt +0 -0
  310. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/__init__.py +0 -0
  311. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/file_op.py +0 -0
  312. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/__init__.py +0 -0
  313. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/author.py +0 -0
  314. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/post.py +0 -0
  315. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/post_tag.py +0 -0
  316. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/tag.py +0 -0
  317. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/models/tree.py +0 -0
  318. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/static/favicon.ico +0 -0
  319. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/templates/locations.html +0 -0
  320. {flask_exts-0.2.7 → flask_exts-0.2.8}/examples/demo/templates/tree_list.html +0 -0
  321. {flask_exts-0.2.7 → flask_exts-0.2.8}/pyproject.toml +0 -0
  322. {flask_exts-0.2.7 → flask_exts-0.2.8}/requirements/build.in +0 -0
  323. {flask_exts-0.2.7 → flask_exts-0.2.8}/requirements/test.in +0 -0
  324. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/constants.py +0 -0
  325. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/datastore/__init__.py +0 -0
  326. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/datastore/sqla/utils/orm.py +0 -0
  327. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/datastore/sqla/utils/paginate.py +0 -0
  328. {flask_exts-0.2.7/src/flask_exts/datastore/sqla/utils → flask_exts-0.2.8/src/flask_exts/email}/__init__.py +0 -0
  329. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/email/base.py +0 -0
  330. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/email/reset_password_sender.py +0 -0
  331. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/email/sender.py +0 -0
  332. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/email/smtp.py +0 -0
  333. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/email/verify_email_sender.py +0 -0
  334. {flask_exts-0.2.7/src/flask_exts/email → flask_exts-0.2.8/src/flask_exts/extension_core}/__init__.py +0 -0
  335. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/__init__.py +0 -0
  336. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/file.py +0 -0
  337. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/recaptcha.py +0 -0
  338. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/fields/switch.py +0 -0
  339. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/base_form.py +0 -0
  340. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/csrf.py +0 -0
  341. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/flask_form.py +0 -0
  342. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/meta.py +0 -0
  343. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/session_csrf.py +0 -0
  344. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/form/utils.py +0 -0
  345. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/validators/__init__.py +0 -0
  346. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/validators/field_list.py +0 -0
  347. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/validators/file.py +0 -0
  348. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/validators/recaptcha.py +0 -0
  349. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/validators/sqla.py +0 -0
  350. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/checkbox.py +0 -0
  351. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/datetime.py +0 -0
  352. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/file.py +0 -0
  353. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/recaptcha.py +0 -0
  354. {flask_exts-0.2.7/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts}/forms/widgets/select.py +0 -0
  355. {flask_exts-0.2.7/src/flask_exts/security → flask_exts-0.2.8/src/flask_exts/html}/__init__.py +0 -0
  356. {flask_exts-0.2.7/src/flask_exts/security/authorizer → flask_exts-0.2.8/src/flask_exts/html/plugins}/__init__.py +0 -0
  357. {flask_exts-0.2.7/src/flask_exts/template/forms → flask_exts-0.2.8/src/flask_exts/security}/__init__.py +0 -0
  358. {flask_exts-0.2.7/src/flask_exts/template/forms/form → flask_exts-0.2.8/src/flask_exts/security/authorizer}/__init__.py +0 -0
  359. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/security/authorizer/base.py +0 -0
  360. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/security/authorizer/simple_authorizer.py +0 -0
  361. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/security/hasher.py +0 -0
  362. {flask_exts-0.2.7/src/flask_exts/security → flask_exts-0.2.8/src/flask_exts/security/plugins}/two_factor_authentication.py +0 -0
  363. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/security/serializer.py +0 -0
  364. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/css/admin.css +0 -0
  365. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/css/rediscli.css +0 -0
  366. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/copybutton.js +0 -0
  367. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/detail_filter.js +0 -0
  368. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/list_action.js +0 -0
  369. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/qrcode.js +0 -0
  370. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/rediscli.js +0 -0
  371. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/security/base64.js +0 -0
  372. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/js/security/webauthn.js +0 -0
  373. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/logo.png +0 -0
  374. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/vendor/sphinx-copybutton/sphinx-copybutton.css +0 -0
  375. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/static/vendor/sphinx-copybutton/sphinx-copybutton.js +0 -0
  376. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/index.html +0 -0
  377. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/create.html +0 -0
  378. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/modals/create.html +0 -0
  379. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/admin/model/modals/edit.html +0 -0
  380. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/index.html +0 -0
  381. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/icon.html +0 -0
  382. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/nav.html +0 -0
  383. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/macro/pagination.html +0 -0
  384. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/change_password.html +0 -0
  385. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/forgot_password.html +0 -0
  386. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/index.html +0 -0
  387. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/list.html +0 -0
  388. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/login.html +0 -0
  389. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/recovery.html +0 -0
  390. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/register.html +0 -0
  391. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/reset_password.html +0 -0
  392. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/verify_email.html +0 -0
  393. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/templates/user/verify_tfa.html +0 -0
  394. {flask_exts-0.2.7/src/flask_exts/template/plugins → flask_exts-0.2.8/src/flask_exts/translations}/__init__.py +0 -0
  395. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
  396. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/translations/en/LC_MESSAGES/messages.po +0 -0
  397. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  398. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  399. {flask_exts-0.2.7/src/flask_exts/translations → flask_exts-0.2.8/src/flask_exts/usercenter}/__init__.py +0 -0
  400. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/change_password.py +0 -0
  401. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/login.py +0 -0
  402. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/recovery.py +0 -0
  403. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/register.py +0 -0
  404. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/reset_password.py +0 -0
  405. {flask_exts-0.2.7 → flask_exts-0.2.8}/src/flask_exts/usercenter/forms/two_factor.py +0 -0
  406. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/__init__.py +0 -0
  407. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/role.py +0 -0
  408. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/user_profile.py +0 -0
  409. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/user_role.py +0 -0
  410. {flask_exts-0.2.7/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/web/default_views}/__init__.py +0 -0
  411. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/exposer.py +0 -0
  412. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/menu.py +0 -0
  413. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/model/filter.py +0 -0
  414. /flask_exts-0.2.7/src/flask_exts/admin/model/typefmt.py → /flask_exts-0.2.8/src/flask_exts/web/model/type_formatters.py +0 -0
  415. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/src/flask_exts/web/sqla}/__init__.py +0 -0
  416. {flask_exts-0.2.7/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/view.py +0 -0
  417. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/__init__.py +0 -0
  418. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/data/copyleft.gif +0 -0
  419. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/data/copyleft.jpeg +0 -0
  420. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/data/copyleft.jpg +0 -0
  421. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/data/copyleft.png +0 -0
  422. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/data/copyleft.tiff +0 -0
  423. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/email/test_base.py +0 -0
  424. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/email/test_smtp.py +0 -0
  425. /flask_exts-0.2.7/tests/template/__init__.py → /flask_exts-0.2.8/tests/forms/fields/test_inline.py +0 -0
  426. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/helper.py +0 -0
  427. {flask_exts-0.2.7/tests/template → flask_exts-0.2.8/tests/html}/macros/test_render_breadcrumb_item.py +0 -0
  428. {flask_exts-0.2.7/tests/template → flask_exts-0.2.8/tests/html}/macros/test_render_nav_item.py +0 -0
  429. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/__init__.py +0 -0
  430. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/demo.py +0 -0
  431. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/multpk.py +0 -0
  432. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/primary_string_model.py +0 -0
  433. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/simple.py +0 -0
  434. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/tree.py +0 -0
  435. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/models/unique.py +0 -0
  436. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/templates/method.html +0 -0
  437. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/templates/mock.html +0 -0
  438. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  439. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/translations/en/LC_MESSAGES/messages.po +0 -0
  440. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/translations/messages.pot +0 -0
  441. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  442. {flask_exts-0.2.7 → flask_exts-0.2.8}/tests/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  443. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/__init__.py +0 -0
  444. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/templates/another_macro.html +0 -0
  445. {flask_exts-0.2.7/tests/admin → flask_exts-0.2.8/tests/web}/sqla/templates/macro.html +0 -0
@@ -33,5 +33,9 @@ docs/_build/
33
33
  # sqlite db
34
34
  *.sqlite
35
35
 
36
+ # npm front-end deps (symlinked into src/flask_exts/static/vendor; install via `npm ci`)
37
+ node_modules/
38
+ package-lock.json
39
+
36
40
  # production config
37
41
  **/config_prod.py
@@ -1,3 +1,11 @@
1
+ v0.2.8
2
+ ------
3
+
4
+ Released 2026-09-27
5
+
6
+ - rewrite extension
7
+ - rewrite editable.js
8
+
1
9
  v0.2.7
2
10
  ------
3
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: Flask-Exts
3
- Version: 0.2.7
3
+ Version: 0.2.8
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
@@ -61,6 +61,7 @@ Flask-Exts is mainly inspired by:
61
61
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
62
62
  - `Bootstrap <https://getbootstrap.com/>`_
63
63
 
64
+ Flask-Exts is a Flask extension toolkit that combines SQLAlchemy, forms, Babel, and admin features to help developers build modern web applications quickly.
64
65
 
65
66
  License
66
67
  -------
@@ -83,13 +84,12 @@ Examples
83
84
  .. code-block:: python
84
85
 
85
86
  from flask import Flask
86
- from flask_exts import Exts
87
+ from flask_exts import ExtensionManager
87
88
 
88
89
  app = Flask(__name__)
89
90
  app.config["SECRET_KEY"] = "dev"
90
- exts = Exts()
91
+ exts = ExtensionManager()
91
92
  exts.init_app(app)
92
93
 
93
94
  if __name__ == "__main__":
94
95
  app.run(debug=True)
95
-
@@ -6,6 +6,7 @@ Flask-Exts is mainly inspired by:
6
6
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
7
7
  - `Bootstrap <https://getbootstrap.com/>`_
8
8
 
9
+ Flask-Exts is a Flask extension toolkit that combines SQLAlchemy, forms, Babel, and admin features to help developers build modern web applications quickly.
9
10
 
10
11
  License
11
12
  -------
@@ -28,13 +29,12 @@ Examples
28
29
  .. code-block:: python
29
30
 
30
31
  from flask import Flask
31
- from flask_exts import Exts
32
+ from flask_exts import ExtensionManager
32
33
 
33
34
  app = Flask(__name__)
34
35
  app.config["SECRET_KEY"] = "dev"
35
- exts = Exts()
36
+ exts = ExtensionManager()
36
37
  exts.init_app(app)
37
38
 
38
39
  if __name__ == "__main__":
39
40
  app.run(debug=True)
40
-
@@ -0,0 +1,429 @@
1
+ Bootstrap 5 Migration Guide
2
+ ===========================
3
+
4
+ Complete guide for migrating from Bootstrap 4 + jQuery to Bootstrap 5 + Native JavaScript.
5
+
6
+ Overview
7
+ --------
8
+
9
+ This migration replaces jQuery and its dependent libraries with native JavaScript alternatives:
10
+
11
+ - **Select2** → **Tom Select** (lightweight select component)
12
+ - **daterangepicker** → **Flatpickr** (lightweight date picker)
13
+ - **Moment.js** → **Day.js** (lightweight date library)
14
+
15
+ Phase Completion Status
16
+ -----------------------
17
+
18
+ ✅ Phase 1: Bootstrap 5 Template Migration (COMPLETED)
19
+ - Updated data attributes: data-toggle → data-bs-toggle
20
+ - Updated CSS utilities: mr-auto → me-auto, etc.
21
+ - 11 template files updated
22
+
23
+ 🚀 Phase 2: JavaScript Library Replacements (IN PROGRESS)
24
+ - Tom Select for Select2
25
+ - Flatpickr for daterangepicker
26
+ - Day.js for Moment.js
27
+
28
+ Detailed Changes
29
+ ----------------
30
+
31
+ Select2 → Tom Select
32
+ ~~~~~~~~~~~~~~~~~~~~
33
+
34
+ **Before (jQuery required):**
35
+
36
+ ::
37
+
38
+ <select name="category" data-toggle="select2" style="width: 100%">
39
+ <option value="">Select...</option>
40
+ <option value="1">Category 1</option>
41
+ <option value="2">Category 2</option>
42
+ </select>
43
+
44
+ <script>
45
+ $('[data-toggle="select2"]').select2({
46
+ placeholder: 'Select a category...',
47
+ allowClear: true
48
+ });
49
+ </script>
50
+
51
+ **After (No jQuery required):**
52
+
53
+ ::
54
+
55
+ <select name="category" data-tom-select data-placeholder="Select a category...">
56
+ <option value="">Select...</option>
57
+ <option value="1">Category 1</option>
58
+ <option value="2">Category 2</option>
59
+ </select>
60
+
61
+ <!-- Automatically initialized by tom_select_plugin.js -->
62
+
63
+ **Programmatic Usage:**
64
+
65
+ ::
66
+
67
+ // Manual initialization
68
+ const tomSelect = window.initTomSelect('#mySelect', {
69
+ create: true,
70
+ placeholder: 'Type to search...'
71
+ });
72
+
73
+ // Get selected value
74
+ const value = tomSelect.getValue();
75
+
76
+ // Set value
77
+ tomSelect.setValue('value1');
78
+
79
+ daterangepicker → Flatpickr
80
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
81
+
82
+ **Before:**
83
+
84
+ ::
85
+
86
+ <input type="text" name="daterange" data-toggle="daterangepicker" />
87
+
88
+ <script>
89
+ $('[data-toggle="daterangepicker"]').daterangepicker({
90
+ startDate: moment(),
91
+ endDate: moment().add(7, 'days'),
92
+ ranges: {
93
+ 'Today': [moment(), moment()],
94
+ 'Last 7 Days': [moment().subtract(6, 'days'), moment()]
95
+ }
96
+ });
97
+ </script>
98
+
99
+ **After:**
100
+
101
+ ::
102
+
103
+ <!-- Single date -->
104
+ <input type="date" data-flatpickr />
105
+
106
+ <!-- Date range -->
107
+ <input type="date" data-flatpickr-range />
108
+ <input type="date" data-flatpickr-range />
109
+
110
+ <!-- Programmatic usage -->
111
+ <script>
112
+ window.initFlatpickr('input[name="daterange"]', {
113
+ mode: 'range',
114
+ dateFormat: 'Y-m-d'
115
+ });
116
+ </script>
117
+
118
+ Moment.js → Day.js
119
+ ~~~~~~~~~~~~~~~~~~
120
+
121
+ **Before:**
122
+
123
+ ::
124
+
125
+ <script>
126
+ const date = moment('2024-01-15');
127
+ const formatted = date.format('YYYY-MM-DD');
128
+ const relative = date.fromNow();
129
+ </script>
130
+
131
+ **After:**
132
+
133
+ ::
134
+
135
+ <script>
136
+ const date = dayjs('2024-01-15');
137
+ const formatted = date.format('YYYY-MM-DD');
138
+ const relative = window.getRelativeTime('2024-01-15');
139
+ </script>
140
+
141
+ X-Editable → Inline Edit
142
+ ~~~~~~~~~~~~~~~~~~~~~~~~
143
+
144
+ **Before (jQuery + X-Editable):**
145
+
146
+ ::
147
+
148
+ <a href="#" id="username" data-type="text">John Doe</a>
149
+
150
+ <script>
151
+ $('#username').editable({
152
+ url: '/api/user/username',
153
+ title: 'Enter username'
154
+ });
155
+ </script>
156
+
157
+ **After (Native JS):**
158
+
159
+ ::
160
+
161
+ <span class="inline-edit"
162
+ data-type="text"
163
+ data-name="username"
164
+ data-save-url="/api/user/username">
165
+ John Doe
166
+ </span>
167
+
168
+ <!-- Automatically initialized by inline_edit_plugin.js -->
169
+
170
+ **Manual Initialization:**
171
+
172
+ ::
173
+
174
+ <script>
175
+ const inlineEdit = new InlineEdit(element, {
176
+ type: 'text',
177
+ name: 'username',
178
+ saveUrl: '/api/user/username',
179
+ onSave: (data) => console.log('Saved:', data)
180
+ });
181
+ </script>
182
+
183
+ Migration Checklist
184
+ -------------------
185
+
186
+ Preparation
187
+ ☐ Backup current application
188
+ ☐ Review all jQuery usage
189
+ ☐ Test current functionality
190
+ ☐ Review browser support requirements
191
+
192
+ Form Elements
193
+ ☐ Update select fields to use Tom Select
194
+ ☐ Update date inputs to use Flatpickr
195
+ ☐ Update datetime inputs
196
+ ☐ Test form submission
197
+
198
+ Admin Interface
199
+ ☐ Test admin list view
200
+ ☐ Test admin edit forms
201
+ ☐ Test inline editing
202
+ ☐ Test filters and search
203
+
204
+ Templates
205
+ ☐ Remove jQuery CDN/local script
206
+ ☐ Add Tom Select plugin
207
+ ☐ Add Flatpickr plugin
208
+ ☐ Add Day.js plugin
209
+ ☐ Add Inline Edit plugin
210
+ ☐ Test template rendering
211
+
212
+ JavaScript
213
+ ☐ Remove jQuery-dependent scripts
214
+ ☐ Update event listeners to native JS
215
+ ☐ Update AJAX calls
216
+ ☐ Update DOM manipulation
217
+
218
+ Testing
219
+ ☐ Manual browser testing
220
+ ☐ Test on different browsers
221
+ ☐ Test mobile responsiveness
222
+ ☐ Run automated tests
223
+ ☐ Performance testing
224
+
225
+ Browser Compatibility
226
+ ---------------------
227
+
228
+ All replacement libraries support:
229
+
230
+ - Chrome/Edge 60+
231
+ - Firefox 55+
232
+ - Safari 12+
233
+ - iOS Safari 12+
234
+ - Android Browser 60+
235
+
236
+ No IE11 support (consistent with Bootstrap 5).
237
+
238
+ Performance Improvements
239
+ ------------------------
240
+
241
+ Size Reduction
242
+ ~~~~~~~~~~~~~~
243
+
244
+ ::
245
+
246
+ jQuery: ~87 KB (min+gzip)
247
+ Select2: ~42 KB (min+gzip)
248
+ daterangepicker: ~8 KB (min+gzip)
249
+ Moment.js: ~67 KB (min+gzip)
250
+ X-Editable: ~25 KB (min+gzip)
251
+ ──────────────────────────────────
252
+ Total: ~229 KB
253
+
254
+ Replaced by:
255
+ ::
256
+
257
+ Tom Select: ~8 KB (min+gzip)
258
+ Flatpickr: ~5 KB (min+gzip)
259
+ Day.js: ~2 KB (min+gzip)
260
+ Inline Edit: ~2 KB (min+gzip)
261
+ ──────────────────────────────────
262
+ Total: ~17 KB
263
+
264
+ **Savings: 92% reduction in JavaScript size**
265
+
266
+ Load Time Improvements
267
+ ~~~~~~~~~~~~~~~~~~~~~~~
268
+
269
+ - Faster parsing (no jQuery abstraction layer)
270
+ - Better browser optimization
271
+ - Reduced network transfer
272
+ - Parallel loading of small libraries
273
+
274
+ Troubleshooting
275
+ ---------------
276
+
277
+ Elements not initializing
278
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
279
+
280
+ ::
281
+
282
+ // Ensure DOM is ready
283
+ document.addEventListener('DOMContentLoaded', function() {
284
+ // Manually initialize if needed
285
+ window.initTomSelect('#mySelect');
286
+ });
287
+
288
+ Tom Select styling issues
289
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
290
+
291
+ ::
292
+
293
+ <!-- Ensure Bootstrap 5 CSS is loaded first -->
294
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css">
295
+
296
+ <!-- Then Tom Select CSS -->
297
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tom-select@1.7.9/dist/css/tom-select.bootstrap5.min.css">
298
+
299
+ Flatpickr not showing calendar
300
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
301
+
302
+ ::
303
+
304
+ // Check console for errors
305
+ console.log(flatpickr);
306
+
307
+ // Manually initialize
308
+ flatpickr('#myDate', { dateFormat: 'Y-m-d' });
309
+
310
+ Day.js timezone issues
311
+ ~~~~~~~~~~~~~~~~~~~~~~
312
+
313
+ ::
314
+
315
+ // Ensure plugins are registered
316
+ dayjs.extend(window.dayjs_plugin_utc);
317
+ dayjs.extend(window.dayjs_plugin_timezone);
318
+
319
+ // Use timezone-aware formatting
320
+ const date = dayjs().tz('America/New_York').format('YYYY-MM-DD HH:mm:ss z');
321
+
322
+ Inline Edit not working
323
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
324
+
325
+ ::
326
+
327
+ // Ensure element has required data attributes
328
+ // data-type: type of input
329
+ // data-name: field name
330
+ // data-save-url: (optional) save endpoint
331
+
332
+ // Check for CSRF token in page
333
+ <meta name="csrf-token" content="...">
334
+
335
+ Migration Examples
336
+ ------------------
337
+
338
+ Simple Select Field
339
+ ~~~~~~~~~~~~~~~~~~~
340
+
341
+ ::
342
+
343
+ {% extends "admin/master.html" %}
344
+
345
+ {% block content %}
346
+ <form method="POST">
347
+ <div class="form-group">
348
+ <label>Status</label>
349
+ <select name="status" data-tom-select data-placeholder="Choose status...">
350
+ <option value="active">Active</option>
351
+ <option value="inactive">Inactive</option>
352
+ </select>
353
+ </div>
354
+ <button type="submit" class="btn btn-primary">Save</button>
355
+ </form>
356
+ {% endblock %}
357
+
358
+ Date Range Picker
359
+ ~~~~~~~~~~~~~~~~~
360
+
361
+ ::
362
+
363
+ <div class="row">
364
+ <div class="col-md-6">
365
+ <label>Start Date</label>
366
+ <input type="date" name="start_date" data-flatpickr-range required>
367
+ </div>
368
+ <div class="col-md-6">
369
+ <label>End Date</label>
370
+ <input type="date" name="end_date" data-flatpickr-range required>
371
+ </div>
372
+ </div>
373
+
374
+ Inline Editing
375
+ ~~~~~~~~~~~~~~
376
+
377
+ ::
378
+
379
+ <table class="table">
380
+ <tr>
381
+ <td>Username</td>
382
+ <td>
383
+ <span class="inline-edit"
384
+ data-type="text"
385
+ data-name="username"
386
+ data-save-url="/api/user/update">
387
+ john_doe
388
+ </span>
389
+ </td>
390
+ </tr>
391
+ <tr>
392
+ <td>Status</td>
393
+ <td>
394
+ <span class="inline-edit"
395
+ data-type="select"
396
+ data-name="status"
397
+ data-options='{"active":"Active","inactive":"Inactive"}'
398
+ data-save-url="/api/user/update">
399
+ active
400
+ </span>
401
+ </td>
402
+ </tr>
403
+ </table>
404
+
405
+ Rollback Plan
406
+ -------------
407
+
408
+ If issues arise:
409
+
410
+ 1. Keep old bootstrap4 branch
411
+ 2. Test thoroughly before deploying
412
+ 3. Monitor application logs
413
+ 4. Have quick rollback plan ready
414
+ 5. Communicate changes to users
415
+
416
+ Support and Resources
417
+ ---------------------
418
+
419
+ - `Tom Select Documentation <https://tom-select.js.org/>`_
420
+ - `Flatpickr Documentation <https://flatpickr.js.org/>`_
421
+ - `Day.js Documentation <https://day.js.org/>`_
422
+ - `Bootstrap 5 Guide <https://getbootstrap.com/docs/5.0/>`_
423
+ - Flask-Exts Documentation
424
+
425
+ See Also
426
+ --------
427
+
428
+ - :doc:`performance` - Performance optimization
429
+ - :doc:`theming` - Theme customization