Flask-Exts 0.2.3__tar.gz → 0.2.5__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 (431) hide show
  1. {flask_exts-0.2.3 → flask_exts-0.2.5}/CHANGES.rst +20 -2
  2. {flask_exts-0.2.3 → flask_exts-0.2.5}/PKG-INFO +4 -1
  3. flask_exts-0.2.5/docs/api.rst +9 -0
  4. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/configure.rst +4 -1
  5. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/develop.rst +0 -25
  6. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/index.rst +11 -0
  7. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/README.rst +25 -25
  8. flask_exts-0.2.5/examples/bootstrap/forms.py +113 -0
  9. flask_exts-0.2.5/examples/bootstrap/make_app.py +46 -0
  10. flask_exts-0.2.5/examples/bootstrap/models.py +19 -0
  11. flask_exts-0.2.5/examples/bootstrap/static/favicon.ico +0 -0
  12. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/flash.html +1 -1
  13. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/icon.html +4 -4
  14. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/icons.html +2050 -2050
  15. flask_exts-0.2.5/examples/bootstrap/templates/bootstrap/index.html +16 -0
  16. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/nav.html +8 -8
  17. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/table.html +6 -6
  18. flask_exts-0.2.5/examples/bootstrap/templates/mybase.html +34 -0
  19. flask_exts-0.2.5/examples/bootstrap/view.py +151 -0
  20. flask_exts-0.2.5/examples/bootstrap5/static/favicon.ico +0 -0
  21. flask_exts-0.2.5/examples/demo/__init__.py +1 -0
  22. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/build_sample.py +4 -4
  23. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/make_app.py +2 -6
  24. flask_exts-0.2.5/examples/demo/templates/my/index.html +7 -0
  25. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/file_view.py +1 -1
  26. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/make_app.py +6 -9
  27. flask_exts-0.2.5/examples/rediscli.py +26 -0
  28. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/simple.py +9 -4
  29. {flask_exts-0.2.3 → flask_exts-0.2.5}/pyproject.toml +4 -1
  30. flask_exts-0.2.5/src/flask_exts/__about__.py +1 -0
  31. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/actions.py +0 -1
  32. flask_exts-0.2.3/src/flask_exts/admin/base_admin.py → flask_exts-0.2.5/src/flask_exts/admin/admin.py +20 -10
  33. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/view.py +4 -12
  34. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/form.py +3 -7
  35. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/view.py +17 -3
  36. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/commands.py +5 -5
  37. flask_exts-0.2.5/src/flask_exts/constants.py +6 -0
  38. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/sqla/orm.py +2 -3
  39. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/base.py +33 -10
  40. flask_exts-0.2.5/src/flask_exts/email/reset_password_sender.py +12 -0
  41. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/manager.py +12 -25
  42. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/proxies.py +2 -5
  43. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/casbin_authorizer.py +1 -4
  44. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/core.py +25 -0
  45. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/email_verification.py +6 -5
  46. flask_exts-0.2.5/src/flask_exts/security/reset_password.py +78 -0
  47. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/serializer.py +2 -2
  48. flask_exts-0.2.5/src/flask_exts/security/two_factor_authentication.py +38 -0
  49. flask_exts-0.2.5/src/flask_exts/template/base.py +18 -0
  50. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/flask_form.py +1 -6
  51. flask_exts-0.2.5/src/flask_exts/template/forms/change_password.py +28 -0
  52. flask_exts-0.2.5/src/flask_exts/template/forms/forgot_password.py +19 -0
  53. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/login.py +1 -1
  54. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/profile.py +1 -1
  55. flask_exts-0.2.5/src/flask_exts/template/forms/recovery.py +10 -0
  56. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/register.py +1 -1
  57. flask_exts-0.2.5/src/flask_exts/template/forms/reset_password.py +16 -0
  58. flask_exts-0.2.5/src/flask_exts/template/forms/two_factor.py +10 -0
  59. flask_exts-0.2.5/src/flask_exts/template/funcs.py +39 -0
  60. flask_exts-0.2.5/src/flask_exts/themes/plugins/base_plugin.py +9 -0
  61. flask_exts-0.2.5/src/flask_exts/themes/plugins/bootstrap4_plugin.py +17 -0
  62. flask_exts-0.2.5/src/flask_exts/themes/plugins/bootstrap5_plugin.py +17 -0
  63. flask_exts-0.2.5/src/flask_exts/themes/plugins/clipboard_plugin.py +10 -0
  64. flask_exts-0.2.5/src/flask_exts/themes/plugins/copybutton_plugin.py +12 -0
  65. flask_exts-0.2.5/src/flask_exts/themes/plugins/jquery_plugin.py +10 -0
  66. flask_exts-0.2.5/src/flask_exts/themes/plugins/plugin_manager.py +55 -0
  67. flask_exts-0.2.5/src/flask_exts/themes/plugins/qrcode_plugin.py +10 -0
  68. flask_exts-0.2.5/src/flask_exts/themes/plugins/rediscli_plugin.py +13 -0
  69. flask_exts-0.2.5/src/flask_exts/themes/plugins/sphinx_copybutton_plugin.py +13 -0
  70. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/css/rediscli.css +0 -2
  71. flask_exts-0.2.5/src/flask_exts/themes/static/js/copybutton.js +45 -0
  72. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/modal.js +1 -1
  73. flask_exts-0.2.5/src/flask_exts/themes/static/js/qrcode.js +1945 -0
  74. flask_exts-0.2.5/src/flask_exts/themes/static/js/rediscli.js +142 -0
  75. flask_exts-0.2.5/src/flask_exts/themes/static/vendor/clipboard/clipboard.min.js +7 -0
  76. flask_exts-0.2.5/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.css +97 -0
  77. flask_exts-0.2.5/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.js +247 -0
  78. flask_exts-0.2.3/src/flask_exts/templates/admin/base.html → flask_exts-0.2.5/src/flask_exts/themes/templates/default/admin/master.html +6 -5
  79. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/details.html +1 -1
  80. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/list.html +4 -4
  81. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/details.html +1 -1
  82. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/base.html +3 -7
  83. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/form.html +6 -6
  84. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/pagination.html +3 -3
  85. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap5/form.html +9 -9
  86. flask_exts-0.2.5/src/flask_exts/themes/templates/default/layout.html +11 -0
  87. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/actions.html +4 -6
  88. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/form.html +5 -5
  89. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/icon.html +1 -10
  90. flask_exts-0.2.5/src/flask_exts/themes/templates/default/macro/javascript.html +10 -0
  91. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/menu.html +2 -5
  92. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/row_actions.html +2 -2
  93. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/table.html +13 -12
  94. flask_exts-0.2.5/src/flask_exts/themes/templates/default/macro/vendor.html +17 -0
  95. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/rediscli/console.html +34 -0
  96. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/rediscli/response.html +1 -1
  97. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/change_password.html +11 -0
  98. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/forgot_password.html +11 -0
  99. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/index.html +24 -0
  100. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/login.html +4 -3
  101. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/recovery.html +10 -0
  102. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/recovery_codes.html +50 -0
  103. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/register.html +1 -1
  104. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/reset_password.html +11 -0
  105. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/setup_tfa.html +49 -0
  106. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/show_tfa.html +18 -0
  107. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/verify_tfa.html +11 -0
  108. flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/verify_tfa_modal.html +17 -0
  109. flask_exts-0.2.5/src/flask_exts/themes/theme.py +49 -0
  110. flask_exts-0.2.5/src/flask_exts/usercenter/base_user.py +14 -0
  111. flask_exts-0.2.5/src/flask_exts/usercenter/base_user_store.py +29 -0
  112. flask_exts-0.2.5/src/flask_exts/usercenter/core.py +43 -0
  113. {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/role.py +3 -3
  114. {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/user.py +18 -13
  115. {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/user_profile.py +8 -10
  116. {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/webauthn.py +11 -8
  117. flask_exts-0.2.3/src/flask_exts/usercenter/sqla_usercenter.py → flask_exts-0.2.5/src/flask_exts/usercenter/sqla_user_store.py +11 -11
  118. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/__init__.py +0 -2
  119. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/decorators.py +3 -3
  120. flask_exts-0.2.5/src/flask_exts/utils/image.py +12 -0
  121. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/request_user.py +4 -4
  122. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/tools.py +19 -35
  123. {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/base_file_view.py +1 -1
  124. flask_exts-0.2.5/src/flask_exts/views/index/view.py +26 -0
  125. flask_exts-0.2.5/src/flask_exts/views/rediscli/mock_redis.py +155 -0
  126. flask_exts-0.2.3/src/flask_exts/views/rediscli_view.py → flask_exts-0.2.5/src/flask_exts/views/rediscli/view.py +2 -7
  127. flask_exts-0.2.5/src/flask_exts/views/user/view.py +295 -0
  128. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/conftest.py +2 -9
  129. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/test_admin.py +1 -2
  130. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/test_base.py +5 -12
  131. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/test_sqlalchemy_adapter.py +3 -3
  132. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/test_casbin_auth.py +14 -14
  133. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/test_core.py +11 -3
  134. flask_exts-0.2.5/tests/security/test_tfa.py +18 -0
  135. flask_exts-0.2.5/tests/template/__init__.py +0 -0
  136. flask_exts-0.2.5/tests/template/bootstrap4/__init__.py +0 -0
  137. flask_exts-0.2.3/tests/template/bootstrap4/test_render_icon_sprite.py → flask_exts-0.2.5/tests/template/bootstrap4/test_render_icon.py +12 -12
  138. flask_exts-0.2.5/tests/template/bootstrap5/__init__.py +0 -0
  139. flask_exts-0.2.5/tests/template/bootstrap5/conftest.py +15 -0
  140. flask_exts-0.2.5/tests/template/test_base.py +16 -0
  141. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_base.py +6 -4
  142. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/zh_CN/LC_MESSAGES/messages.po +1 -1
  143. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/usercenter/test_sqla_usercenter.py +3 -3
  144. flask_exts-0.2.5/tests/utils/test_image.py +7 -0
  145. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/utils/test_request_user.py +2 -2
  146. flask_exts-0.2.5/tests/views/files/dummy.txt +0 -0
  147. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/views/test_file_view.py +1 -1
  148. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/views/test_rediscli_view.py +1 -1
  149. flask_exts-0.2.5/tests/views/test_user_view.py +481 -0
  150. flask_exts-0.2.3/examples/bootstrap4/app.py +0 -277
  151. flask_exts-0.2.3/examples/bootstrap4/templates/index.html +0 -16
  152. flask_exts-0.2.3/examples/bootstrap4/templates/mybase.html +0 -58
  153. flask_exts-0.2.3/examples/bootstrap5/app.py +0 -329
  154. flask_exts-0.2.3/examples/bootstrap5/static/favicon.ico +0 -0
  155. flask_exts-0.2.3/examples/demo/templates/my/index.html +0 -7
  156. flask_exts-0.2.3/examples/rediscli.py +0 -18
  157. flask_exts-0.2.3/src/flask_exts/__about__.py +0 -1
  158. flask_exts-0.2.3/src/flask_exts/admin/admin.py +0 -15
  159. flask_exts-0.2.3/src/flask_exts/static/js/rediscli.js +0 -121
  160. flask_exts-0.2.3/src/flask_exts/template/base.py +0 -48
  161. flask_exts-0.2.3/src/flask_exts/template/theme.py +0 -62
  162. flask_exts-0.2.3/src/flask_exts/template/utils.py +0 -35
  163. flask_exts-0.2.3/src/flask_exts/templates/admin/master.html +0 -1
  164. flask_exts-0.2.3/src/flask_exts/templates/layout.html +0 -21
  165. flask_exts-0.2.3/src/flask_exts/templates/macro/vendor.html +0 -20
  166. flask_exts-0.2.3/src/flask_exts/templates/views/rediscli/console.html +0 -27
  167. flask_exts-0.2.3/src/flask_exts/templates/views/user/index.html +0 -7
  168. flask_exts-0.2.3/src/flask_exts/usercenter/base_user.py +0 -7
  169. flask_exts-0.2.3/src/flask_exts/usercenter/base_usercenter.py +0 -40
  170. flask_exts-0.2.3/src/flask_exts/utils/authorize.py +0 -21
  171. flask_exts-0.2.3/src/flask_exts/views/index_view.py +0 -46
  172. flask_exts-0.2.3/src/flask_exts/views/user_view.py +0 -132
  173. flask_exts-0.2.3/tests/template/bootstrap5/conftest.py +0 -21
  174. flask_exts-0.2.3/tests/template/test_base.py +0 -16
  175. flask_exts-0.2.3/tests/views/test_user_view.py +0 -96
  176. {flask_exts-0.2.3 → flask_exts-0.2.5}/.github/workflows/release.yml +0 -0
  177. {flask_exts-0.2.3 → flask_exts-0.2.5}/.gitignore +0 -0
  178. {flask_exts-0.2.3 → flask_exts-0.2.5}/.readthedocs.yaml +0 -0
  179. {flask_exts-0.2.3 → flask_exts-0.2.5}/LICENSE.rst +0 -0
  180. {flask_exts-0.2.3 → flask_exts-0.2.5}/README.rst +0 -0
  181. {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/babel.cfg +0 -0
  182. {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/babel.sh +0 -0
  183. {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/messages.pot +0 -0
  184. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/Makefile +0 -0
  185. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/_static/logo.png +0 -0
  186. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/changes.rst +0 -0
  187. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/conf.py +0 -0
  188. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/examples.rst +0 -0
  189. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/make.bat +0 -0
  190. {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/requirements.txt +0 -0
  191. {flask_exts-0.2.3/examples/demo → flask_exts-0.2.5/examples/bootstrap}/__init__.py +0 -0
  192. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/bootswatch.html +0 -0
  193. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/form.html +0 -0
  194. {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/pagination.html +0 -0
  195. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/bootswatch.html +0 -0
  196. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/flash.html +0 -0
  197. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/form.html +0 -0
  198. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/icon.html +0 -0
  199. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/icons.html +0 -0
  200. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/index.html +0 -0
  201. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/mybase.html +0 -0
  202. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/nav.html +0 -0
  203. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/pagination.html +0 -0
  204. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/table.html +0 -0
  205. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/admin_views.py +0 -0
  206. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/file_op.py +0 -0
  207. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/__init__.py +0 -0
  208. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/author.py +0 -0
  209. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/keyword.py +0 -0
  210. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/location_image.py +0 -0
  211. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/post.py +0 -0
  212. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/post_tag.py +0 -0
  213. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/tag.py +0 -0
  214. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/tree.py +0 -0
  215. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/user.py +0 -0
  216. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/user_keyword.py +0 -0
  217. {flask_exts-0.2.3/examples/bootstrap4 → flask_exts-0.2.5/examples/demo}/static/favicon.ico +0 -0
  218. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/field_list.html +0 -0
  219. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/locations.html +0 -0
  220. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/tree_list.html +0 -0
  221. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/author_view.py +0 -0
  222. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/keyword_view.py +0 -0
  223. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/location_image_view.py +0 -0
  224. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/my_view.py +0 -0
  225. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/post_view.py +0 -0
  226. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/tag_view.py +0 -0
  227. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/tree_view.py +0 -0
  228. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/user_view.py +0 -0
  229. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/__init__.py +0 -0
  230. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/tmp/bbb/a.txt +0 -0
  231. {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/instance/config.py +0 -0
  232. {flask_exts-0.2.3 → flask_exts-0.2.5}/requirements/build.in +0 -0
  233. {flask_exts-0.2.3 → flask_exts-0.2.5}/requirements/test.in +0 -0
  234. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/__init__.py +0 -0
  235. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/__init__.py +0 -0
  236. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/menu.py +0 -0
  237. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/__init__.py +0 -0
  238. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/ajax.py +0 -0
  239. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/filters.py +0 -0
  240. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/form.py +0 -0
  241. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/typefmt.py +0 -0
  242. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/row_action.py +0 -0
  243. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/__init__.py +0 -0
  244. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/ajax.py +0 -0
  245. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/filters.py +0 -0
  246. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/typefmt.py +0 -0
  247. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/view.py +0 -0
  248. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/babel/__init__.py +0 -0
  249. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/babel/selector.py +0 -0
  250. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/__init__.py +0 -0
  251. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/sqla/__init__.py +0 -0
  252. {flask_exts-0.2.3/src/flask_exts/datastore/sqla/models → flask_exts-0.2.5/src/flask_exts/email}/__init__.py +0 -0
  253. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/sender.py +0 -0
  254. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/smtp.py +0 -0
  255. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/verify_email_sender.py +0 -0
  256. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/__init__.py +0 -0
  257. {flask_exts-0.2.3/src/flask_exts/email → flask_exts-0.2.5/src/flask_exts/security/authorizer}/__init__.py +0 -0
  258. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/base.py +0 -0
  259. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/sqlalchemy_adapter.py +0 -0
  260. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/hasher.py +0 -0
  261. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/identity.py +0 -0
  262. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/identity_context.py +0 -0
  263. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/permission.py +0 -0
  264. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/principal.py +0 -0
  265. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/signals.py +0 -0
  266. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/__init__.py +0 -0
  267. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/__init__.py +0 -0
  268. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/ajax_select.py +0 -0
  269. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/datetime.py +0 -0
  270. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/file.py +0 -0
  271. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/inline.py +0 -0
  272. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/json.py +0 -0
  273. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/recaptcha.py +0 -0
  274. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/select.py +0 -0
  275. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/sqla.py +0 -0
  276. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/switch.py +0 -0
  277. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/taglist.py +0 -0
  278. {flask_exts-0.2.3/src/flask_exts/forms → flask_exts-0.2.5/src/flask_exts/template/form}/__init__.py +0 -0
  279. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/base_form.py +0 -0
  280. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/csrf.py +0 -0
  281. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/form_opts.py +0 -0
  282. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/meta.py +0 -0
  283. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/session_csrf.py +0 -0
  284. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/utils.py +0 -0
  285. {flask_exts-0.2.3/src/flask_exts/security/authorizer → flask_exts-0.2.5/src/flask_exts/template/forms}/__init__.py +0 -0
  286. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/rules.py +0 -0
  287. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/__init__.py +0 -0
  288. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/field_list.py +0 -0
  289. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/file.py +0 -0
  290. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/recaptcha.py +0 -0
  291. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/sqla.py +0 -0
  292. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/__init__.py +0 -0
  293. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/checkbox.py +0 -0
  294. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/datetime.py +0 -0
  295. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/file.py +0 -0
  296. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/inline.py +0 -0
  297. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/recaptcha.py +0 -0
  298. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/render_template.py +0 -0
  299. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/select.py +0 -0
  300. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/xeditable.py +0 -0
  301. {flask_exts-0.2.3/src/flask_exts/template/form → flask_exts-0.2.5/src/flask_exts/themes/plugins}/__init__.py +0 -0
  302. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/css/admin.css +0 -0
  303. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/actions.js +0 -0
  304. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/details_filter.js +0 -0
  305. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/filters.js +0 -0
  306. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/form.js +0 -0
  307. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/helper.js +0 -0
  308. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/security/base64.js +0 -0
  309. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/security/webauthn.js +0 -0
  310. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/logo.png +0 -0
  311. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/bootstrap-icons.svg +0 -0
  312. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.css +0 -0
  313. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.json +0 -0
  314. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.min.css +0 -0
  315. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.scss +0 -0
  316. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
  317. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
  318. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap4/bootstrap.bundle.min.js +0 -0
  319. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap4/bootstrap.min.css +0 -0
  320. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap5/bootstrap.bundle.min.js +0 -0
  321. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap5/bootstrap.min.css +0 -0
  322. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/daterangepicker/daterangepicker.css +0 -0
  323. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/daterangepicker/daterangepicker.js +0 -0
  324. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/jquery/jquery.min.js +0 -0
  325. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/moment.min.js +0 -0
  326. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/select2/select2.min.css +0 -0
  327. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/select2/select2.min.js +0 -0
  328. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/css/bootstrap-editable.css +0 -0
  329. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/img/clear.png +0 -0
  330. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/img/loading.gif +0 -0
  331. {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/js/bootstrap-editable.min.js +0 -0
  332. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/index.html +0 -0
  333. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/create.html +0 -0
  334. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/edit.html +0 -0
  335. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/create.html +0 -0
  336. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/edit.html +0 -0
  337. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/message.html +0 -0
  338. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap5/message.html +0 -0
  339. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/index.html +0 -0
  340. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/inline.html +0 -0
  341. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/layout.html +0 -0
  342. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/message.html +0 -0
  343. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/nav.html +0 -0
  344. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/pagination.html +0 -0
  345. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/form.html +0 -0
  346. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/list.html +0 -0
  347. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/modals/form.html +0 -0
  348. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/list.html +0 -0
  349. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/verify_email.html +0 -0
  350. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/widgets/inline_field_list.html +0 -0
  351. {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/widgets/inline_form.html +0 -0
  352. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/__init__.py +0 -0
  353. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
  354. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/en/LC_MESSAGES/messages.po +0 -0
  355. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  356. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  357. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/types.py +0 -0
  358. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/usercenter/__init__.py +0 -0
  359. {flask_exts-0.2.3/tests/admin → flask_exts-0.2.5/src/flask_exts/usercenter/models}/__init__.py +0 -0
  360. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/flask.py +0 -0
  361. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/jwt.py +0 -0
  362. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/sqla.py +0 -0
  363. {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/url.py +0 -0
  364. {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/__init__.py +0 -0
  365. {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/local_file_storage.py +0 -0
  366. {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/local_file_view.py +0 -0
  367. {flask_exts-0.2.3/tests/admin/sqla → flask_exts-0.2.5/src/flask_exts/views/index}/__init__.py +0 -0
  368. {flask_exts-0.2.3/tests/security/authorizer → flask_exts-0.2.5/src/flask_exts/views/rediscli}/__init__.py +0 -0
  369. {flask_exts-0.2.3/tests/template → flask_exts-0.2.5/src/flask_exts/views/user}/__init__.py +0 -0
  370. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/__init__.py +0 -0
  371. {flask_exts-0.2.3/tests/template/bootstrap4 → flask_exts-0.2.5/tests/admin}/__init__.py +0 -0
  372. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/templates/mock.html +0 -0
  373. {flask_exts-0.2.3/tests/template/bootstrap5 → flask_exts-0.2.5/tests/admin/sqla}/__init__.py +0 -0
  374. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/templates/another_macro.html +0 -0
  375. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/templates/macro.html +0 -0
  376. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_basic.py +0 -0
  377. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_form_rules.py +0 -0
  378. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_inlineform.py +0 -0
  379. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_multi_pk.py +0 -0
  380. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_translation.py +0 -0
  381. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/test_model.py +0 -0
  382. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/conftest.py +0 -0
  383. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.gif +0 -0
  384. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.jpeg +0 -0
  385. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.jpg +0 -0
  386. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.png +0 -0
  387. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.tiff +0 -0
  388. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/email/test_base.py +0 -0
  389. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/email/test_smtp.py +0 -0
  390. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/helper.py +0 -0
  391. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/__init__.py +0 -0
  392. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/message.py +0 -0
  393. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/model1.py +0 -0
  394. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/multpk.py +0 -0
  395. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/polymorphic.py +0 -0
  396. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/tree.py +0 -0
  397. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/user.py +0 -0
  398. /flask_exts-0.2.3/tests/views/files/dummy.txt → /flask_exts-0.2.5/tests/security/authorizer/__init__.py +0 -0
  399. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/rbac_model.conf +0 -0
  400. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/rbac_policy.csv +0 -0
  401. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/authz_policy.csv +0 -0
  402. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/rbac_model.conf +0 -0
  403. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/rbac_policy.csv +0 -0
  404. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/test_principal.py +0 -0
  405. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_field.py +0 -0
  406. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_form.py +0 -0
  407. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_form_row.py +0 -0
  408. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_hidden_errors.py +0 -0
  409. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_messages.py +0 -0
  410. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_pager.py +0 -0
  411. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_pagination.py +0 -0
  412. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_table.py +0 -0
  413. /flask_exts-0.2.3/tests/template/bootstrap5/test_base.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_base.py +0 -0
  414. /flask_exts-0.2.3/tests/template/bootstrap5/test_render_form.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_form.py +0 -0
  415. /flask_exts-0.2.3/tests/template/bootstrap5/test_render_form_row.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_form_row.py +0 -0
  416. /flask_exts-0.2.3/tests/template/bootstrap5/test_render_messages.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_messages.py +0 -0
  417. /flask_exts-0.2.3/tests/template/bootstrap5/test_render_pagination.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_pagination.py +0 -0
  418. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/conftest.py +0 -0
  419. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_csrf.py +0 -0
  420. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_fields.py +0 -0
  421. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_filefield.py +0 -0
  422. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_uploadfile.py +0 -0
  423. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/macros/test_render_breadcrumb_item.py +0 -0
  424. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/macros/test_render_nav_item.py +0 -0
  425. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/templates/method.html +0 -0
  426. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/templates/mock.html +0 -0
  427. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_babel.py +0 -0
  428. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_flask.py +0 -0
  429. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  430. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/en/LC_MESSAGES/messages.po +0 -0
  431. {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/utils/test_url.py +0 -0
@@ -1,3 +1,22 @@
1
+ v0.2.5
2
+ ------
3
+
4
+ Released 2025-10-24
5
+
6
+ - rewrite template structure
7
+ - rewrite user view, user authentication and authorization
8
+
9
+ v0.2.4
10
+ ------
11
+
12
+ Released 2025-10-06
13
+
14
+ - user change password
15
+ - user forgot password
16
+ - user 2FA with TOTP
17
+ - user recovery codes
18
+ - user recovery
19
+
1
20
  v0.2.3
2
21
  ------
3
22
 
@@ -7,7 +26,6 @@ Released 2025-08-28
7
26
  - add folder email
8
27
  - add security.email_verification
9
28
 
10
-
11
29
  v0.2.2
12
30
  ------
13
31
 
@@ -64,7 +82,7 @@ Released 2024-09-14
64
82
 
65
83
  - merge translations of wtforms, flask_exts and app into flask_babel.get_translations()
66
84
  - update FileField and ImageField
67
- - add url for template.static
85
+ - add url for _template.static
68
86
 
69
87
  v0.1.5
70
88
  ------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Flask-Exts
3
- Version: 0.2.3
3
+ Version: 0.2.5
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
@@ -46,7 +46,10 @@ Requires-Dist: flask-babel>=4.0
46
46
  Requires-Dist: flask-login>=0.6
47
47
  Requires-Dist: flask-sqlalchemy>=3.0
48
48
  Requires-Dist: flask>=3.0
49
+ Requires-Dist: pillow>=11.0
49
50
  Requires-Dist: pyjwt>=2.0
51
+ Requires-Dist: pyotp>=2.0
52
+ Requires-Dist: qrcode>=8.0
50
53
  Requires-Dist: tablib>=3.0
51
54
  Requires-Dist: webauthn>=2.0
52
55
  Requires-Dist: wtforms>=3.0
@@ -0,0 +1,9 @@
1
+ API
2
+ ===
3
+
4
+ views
5
+ =======
6
+
7
+ .. automodule:: flask_exts.views.user.view
8
+ :members:
9
+ :inherited-members:
@@ -6,6 +6,9 @@ Configuration
6
6
  ==============
7
7
 
8
8
  ========================== =====================================================================
9
+ ``ADMIN_ALL_ACCESSED`` Set to ``True`` to enable access within admin views for all users,
10
+ otherwise, only the users with access role can access admin views.
11
+ Default is ``False``.
9
12
  ``BABEL_ACCEPT_LANGUAGES`` Set to ``en;zh`` to bebel's accept languages.
10
13
  Default is ``None``.
11
14
  ``BABEL_DEFAULT_TIMEZONE`` Set to ``Asia/Shanghai`` to babel's default timezone.
@@ -18,7 +21,7 @@ Configuration
18
21
  Default is ``csrf_token``.
19
22
  ``CSRF_TIME_LIMIT`` Max age in seconds for CSRF tokens.
20
23
  Default is ``1800``.
21
- ``VERIFY_EMAIL_SENDER`` Email address used to send verification emails.
24
+ ``NOREPLY_EMAIL_SENDER`` Email address used to send emails.
22
25
  It is a dict for smtp with keys: host,port,user,password.
23
26
  Default is None.
24
27
  ========================== =====================================================================
@@ -69,28 +69,3 @@ pybabel
69
69
 
70
70
  $ pybabel compile -d src/flask_exts/translations -D messages
71
71
 
72
-
73
- tests
74
- -----
75
-
76
- .. code-block:: console
77
-
78
-
79
- cd tests/
80
-
81
- # extract messages from source files and generate a POT file
82
- pybabel extract -o translations/messages.pot .
83
-
84
- # create new message catalogs from a POT file
85
- pybabel init -i translations/messages.pot -d translations -l en
86
- pybabel init -i translations/messages.pot -d translations -l zh_CN
87
-
88
- # update existing message catalogs from a POT file
89
- pybabel update -i translations/messages.pot -d translations
90
-
91
- # edit
92
- # open the '.po' file
93
-
94
- # compile message catalogs to MO files
95
-
96
- pybabel compile -d translations
@@ -45,6 +45,17 @@ More examples, please click :doc:`examples`.
45
45
  examples
46
46
  changes
47
47
 
48
+ API Reference
49
+ -------------
50
+
51
+ If you are looking for information on a specific function, class or
52
+ method, this part of the documentation is for you.
53
+
54
+ .. toctree::
55
+ :maxdepth: 1
56
+
57
+ api
58
+
48
59
  Indices and tables
49
60
  ==================
50
61
 
@@ -20,61 +20,61 @@ Run the examples
20
20
 
21
21
  Type the command in the terminal, then go to http://localhost:5000.
22
22
 
23
- Start
24
- ----------
25
-
26
23
  simple
27
24
  ---------
28
25
 
29
- run only one file.
30
-
31
26
  .. code-block:: bash
32
27
 
33
28
  $ python simple.py
34
29
 
35
- demo
30
+ rediscli
36
31
  -----------------
37
32
 
38
- With sqlite db.
33
+ Use with mock redis server.
39
34
 
40
35
  .. code-block:: bash
41
36
 
42
- $ flask --app demo run --debug --port=5000
43
-
44
- fileadmin
45
- -----------------
37
+ $ python rediscli.py
46
38
 
47
- .. code-block:: bash
48
-
49
- $ flask --app fileadmin run
39
+ go to http://localhost:5000/admin/rediscli/
50
40
 
51
- rediscli
52
- -----------------
41
+ if you want to use real redis server, then do this:
53
42
 
54
- First install redis,
43
+ 1. First install redis,
55
44
 
56
45
  .. code-block:: bash
57
46
 
58
47
  $ pip install redis
59
48
 
60
- then run:
49
+ 2. Modify code in ``rediscli.py``
50
+
51
+ .. code-block:: python
52
+
53
+ # from flask_exts.views.rediscli.mock_redis import MockRedis as Redis
54
+ from redis import Redis
55
+
56
+ 3. At last, run ``python rediscli.py``
57
+
58
+ demo
59
+ -----------------
60
+
61
+ Default admin user is ``admin``, password is ``admin``.
61
62
 
62
63
  .. code-block:: bash
63
64
 
64
- $ flask --app rediscli run
65
+ $ flask --app demo run
65
66
 
66
- Bootstrap 4
67
+ fileadmin
67
68
  -----------------
68
69
 
69
70
  .. code-block:: bash
71
+
72
+ $ flask --app fileadmin run
70
73
 
71
- $ flask --app bootstrap4/app.py run
72
-
73
- Bootstrap 5
74
+ Bootstrap
74
75
  -----------------
75
76
 
76
77
  .. code-block:: bash
77
-
78
- $ flask --app bootstrap5/app.py run
79
78
 
79
+ $ flask --app bootstrap run
80
80
 
@@ -0,0 +1,113 @@
1
+ from wtforms.validators import DataRequired, Length, Regexp
2
+ from wtforms.fields import *
3
+ from flask_exts.template.fields import SwitchField
4
+ from flask_exts.template.form.flask_form import FlaskForm
5
+
6
+
7
+ class ExampleForm(FlaskForm):
8
+ """An example form that contains all the supported bootstrap style form fields."""
9
+
10
+ date = DateField(
11
+ description="We'll never share your email with anyone else."
12
+ ) # add help text with `description`
13
+ datetime = DateTimeField(
14
+ render_kw={"placeholder": "this is a placeholder"}
15
+ ) # add HTML attribute with `render_kw`
16
+ datetime_local = DateTimeLocalField()
17
+ time = TimeField()
18
+ month = MonthField()
19
+ color = ColorField()
20
+ floating = FloatField()
21
+ integer = IntegerField()
22
+ decimal_slider = DecimalRangeField()
23
+ integer_slider = IntegerRangeField(render_kw={"min": "0", "max": "4"})
24
+ email = EmailField()
25
+ url = URLField()
26
+ telephone = TelField()
27
+ image = FileField(
28
+ render_kw={"class": "my-class"}, validators=[Regexp(r".+\.jpg$")]
29
+ ) # add your class
30
+ option = RadioField(
31
+ choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
32
+ )
33
+ select = SelectField(
34
+ choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
35
+ )
36
+ select_multiple = SelectMultipleField(
37
+ choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
38
+ )
39
+ bio = TextAreaField()
40
+ search = SearchField() # will autocapitalize on mobile
41
+ title = StringField() # will not autocapitalize on mobile
42
+ secret = PasswordField()
43
+ remember = BooleanField("Remember me")
44
+ submit = SubmitField()
45
+
46
+
47
+ class HelloForm(FlaskForm):
48
+ username = StringField("Username", validators=[DataRequired(), Length(1, 20)])
49
+ password = PasswordField("Password", validators=[DataRequired(), Length(8, 150)])
50
+ remember = BooleanField("Remember me")
51
+ submit = SubmitField()
52
+
53
+
54
+ class ButtonForm(FlaskForm):
55
+ username = StringField("Username", validators=[DataRequired(), Length(1, 20)])
56
+ confirm = SwitchField("Confirmation")
57
+ submit = SubmitField()
58
+ delete = SubmitField()
59
+ cancel = SubmitField()
60
+
61
+
62
+ class TelephoneForm(FlaskForm):
63
+ country_code = IntegerField("Country Code")
64
+ area_code = IntegerField("Area Code/Exchange")
65
+ number = StringField("Number")
66
+
67
+
68
+ class IMForm(FlaskForm):
69
+ protocol = SelectField(choices=[("aim", "AIM"), ("msn", "MSN")])
70
+ username = StringField()
71
+
72
+
73
+ class ContactForm(FlaskForm):
74
+ first_name = StringField()
75
+ last_name = StringField()
76
+ mobile_phone = FormField(TelephoneForm)
77
+ office_phone = FormField(TelephoneForm)
78
+ emails = FieldList(StringField("Email"), min_entries=3)
79
+ im_accounts = FieldList(FormField(IMForm), min_entries=2)
80
+
81
+
82
+ class BootswatchForm(FlaskForm):
83
+ """Form to test Bootswatch."""
84
+
85
+ # DO NOT EDIT! Use list-bootswatch.py to generate the Radiofield below.
86
+ theme_name = RadioField(
87
+ default="default",
88
+ choices=[
89
+ ("default", "none"),
90
+ ("cerulean", "Cerulean 4.6.1"),
91
+ ("cosmo", "Cosmo 4.6.1"),
92
+ ("cyborg", "Cyborg 4.6.1"),
93
+ ("darkly", "Darkly 4.6.1"),
94
+ ("flatly", "Flatly 4.6.1"),
95
+ ("journal", "Journal 4.6.1"),
96
+ ("litera", "Litera 4.6.1"),
97
+ ("lumen", "Lumen 4.6.1"),
98
+ ("lux", "Lux 4.6.1"),
99
+ ("materia", "Materia 4.6.1"),
100
+ ("minty", "Minty 4.6.1"),
101
+ ("pulse", "Pulse 4.6.1"),
102
+ ("sandstone", "Sandstone 4.6.1"),
103
+ ("simplex", "Simplex 4.6.1"),
104
+ ("sketchy", "Sketchy 4.6.1"),
105
+ ("slate", "Slate 4.6.1"),
106
+ ("solar", "Solar 4.6.1"),
107
+ ("spacelab", "Spacelab 4.6.1"),
108
+ ("superhero", "Superhero 4.6.1"),
109
+ ("united", "United 4.6.1"),
110
+ ("yeti", "Yeti 4.6.1"),
111
+ ],
112
+ )
113
+ submit = SubmitField()
@@ -0,0 +1,46 @@
1
+ from flask import Flask
2
+ from flask_exts import Manager
3
+ from .models import db, Message, MyCategory
4
+ from .view import BootstrapView
5
+
6
+ def create_app():
7
+ app = Flask(__name__)
8
+ app.config["SECRET_KEY"] = "dev"
9
+ init_app(app)
10
+ return app
11
+
12
+
13
+ def init_app(app: Flask):
14
+ manager = Manager()
15
+ manager.init_app(app)
16
+ manager.admin.add_view(BootstrapView())
17
+
18
+ with app.app_context():
19
+ db.drop_all()
20
+ db.create_all()
21
+
22
+ for i in range(20):
23
+ url = 'mailto:x@t.me'
24
+ if i % 7 == 0:
25
+ url = 'www.t.me'
26
+ elif i % 7 == 1:
27
+ url = 'https://t.me'
28
+ elif i % 7 == 2:
29
+ url = 'http://t.me'
30
+ elif i % 7 == 3:
31
+ url = 'http://t'
32
+ elif i % 7 == 4:
33
+ url = 'http://'
34
+ elif i % 7 == 5:
35
+ url = 'x@t.me'
36
+ m = Message(
37
+ text=f'Message {i+1} {url}',
38
+ author=f'Author {i+1}',
39
+ create_time=4321*(i+1)
40
+ )
41
+ if i % 2:
42
+ m.category = MyCategory.CAT2
43
+ if i % 4:
44
+ m.draft = True
45
+ db.session.add(m)
46
+ db.session.commit()
@@ -0,0 +1,19 @@
1
+ from enum import Enum
2
+ from sqlalchemy.orm import Mapped
3
+ from sqlalchemy.orm import mapped_column
4
+ from flask_exts.datastore.sqla import db
5
+
6
+
7
+ class MyCategory(Enum):
8
+ CAT1 = "Category 1"
9
+ CAT2 = "Category 2"
10
+
11
+
12
+ class Message(db.Model):
13
+ id: Mapped[int] = mapped_column(primary_key=True)
14
+ text: Mapped[str] = mapped_column(nullable=False)
15
+ author: Mapped[str] = mapped_column(nullable=False)
16
+ category: Mapped[MyCategory] = mapped_column(default=MyCategory.CAT1, nullable=False)
17
+ draft: Mapped[bool] = mapped_column(default=False, nullable=False)
18
+ create_time: Mapped[int] = mapped_column(nullable=False, unique=True)
19
+
@@ -2,5 +2,5 @@
2
2
 
3
3
  {% block content %}
4
4
  The messages above were rendered with the following code:
5
- <pre>{% raw %}{{ render_messages(container=False, dismissible=True) }}{% endraw %}</pre>
5
+ <pre>{% raw %}{{ render_messages() }}{% endraw %}</pre>
6
6
  {% endblock %}
@@ -11,14 +11,14 @@ Output: {{ render_icon('heart-fill') }}
11
11
 
12
12
  <h2>Icon with custom size</h2>
13
13
  <pre>{% raw %}{{ render_icon('heart', 32) }}{% endraw %}</pre>
14
- Output: {{ render_icon('heart', 'h1', size=32) }}
14
+ Output: {{ render_icon('heart', size=32) }}
15
15
 
16
16
  <h2>Icon with custom size and Bootstrap color</h2>
17
17
  <pre>{% raw %}{{ render_icon('heart', 25, 'primary') }}{% endraw %}</pre>
18
- Output: {{ render_icon('heart', size=25, icon_class='text-primary') }}
18
+ Output: {{ render_icon('heart', size=25, color='primary') }}
19
19
 
20
- <pre>{% raw %}{{ render_icon('heart-fill', 25, icon_class='text-primary') }}{% endraw %}</pre>
21
- Output: {{ render_icon('heart-fill', size=25, icon_class='text-primary') }}
20
+ <pre>{% raw %}{{ render_icon('heart-fill', 25, color='primary') }}{% endraw %}</pre>
21
+ Output: {{ render_icon('heart-fill', size=25, color='primary') }}
22
22
 
23
23
  <h2>Icon with custom size and custom color</h2>
24
24
  <pre>{% raw %}{{ render_icon('heart', '2em', 'red') }}{% endraw %}</pre>