Flask-Exts 0.2.5__tar.gz → 0.2.6__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 (413) hide show
  1. {flask_exts-0.2.5 → flask_exts-0.2.6}/.readthedocs.yaml +2 -2
  2. {flask_exts-0.2.5 → flask_exts-0.2.6}/CHANGES.rst +8 -0
  3. {flask_exts-0.2.5 → flask_exts-0.2.6}/PKG-INFO +6 -5
  4. {flask_exts-0.2.5 → flask_exts-0.2.6}/README.rst +5 -4
  5. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/conf.py +6 -6
  6. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/index.rst +1 -0
  7. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/make_app.py +4 -4
  8. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/admin_views.py +1 -1
  9. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/make_app.py +3 -3
  10. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/fileadmin/make_app.py +4 -4
  11. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/rediscli.py +5 -5
  12. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/simple.py +4 -4
  13. flask_exts-0.2.6/src/flask_exts/__about__.py +1 -0
  14. flask_exts-0.2.6/src/flask_exts/__init__.py +1 -0
  15. flask_exts-0.2.5/src/flask_exts/manager.py → flask_exts-0.2.6/src/flask_exts/exts.py +4 -4
  16. flask_exts-0.2.6/src/flask_exts/proxies.py +19 -0
  17. flask_exts-0.2.6/src/flask_exts/themes/plugins/detail_filter_plugin.py +10 -0
  18. flask_exts-0.2.6/src/flask_exts/themes/plugins/list_action_plugin.py +10 -0
  19. flask_exts-0.2.6/src/flask_exts/themes/plugins/plugin_manager.py +83 -0
  20. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/css/admin.css +1 -1
  21. flask_exts-0.2.6/src/flask_exts/themes/static/js/detail_filter.js +55 -0
  22. flask_exts-0.2.6/src/flask_exts/themes/static/js/model_action.js +70 -0
  23. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/master.html +0 -5
  24. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/details.html +10 -4
  25. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/list.html +16 -3
  26. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/modals/details.html +10 -4
  27. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/actions.html +0 -6
  28. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/row_actions.html +1 -1
  29. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/file/list.html +14 -1
  30. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/rediscli/console.html +2 -7
  31. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/setup_tfa.html +2 -6
  32. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/customer/conftest.py +8 -8
  33. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/conftest.py +10 -10
  34. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/conftest.py +3 -3
  35. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/test_base.py +6 -6
  36. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/views/test_user_view.py +3 -3
  37. flask_exts-0.2.5/src/flask_exts/__about__.py +0 -1
  38. flask_exts-0.2.5/src/flask_exts/__init__.py +0 -1
  39. flask_exts-0.2.5/src/flask_exts/proxies.py +0 -19
  40. flask_exts-0.2.5/src/flask_exts/themes/plugins/plugin_manager.py +0 -55
  41. flask_exts-0.2.5/src/flask_exts/themes/static/js/actions.js +0 -51
  42. flask_exts-0.2.5/src/flask_exts/themes/static/js/details_filter.js +0 -10
  43. flask_exts-0.2.5/src/flask_exts/themes/static/js/helper.js +0 -7
  44. flask_exts-0.2.5/src/flask_exts/themes/templates/default/macro/javascript.html +0 -10
  45. {flask_exts-0.2.5 → flask_exts-0.2.6}/.github/workflows/release.yml +0 -0
  46. {flask_exts-0.2.5 → flask_exts-0.2.6}/.gitignore +0 -0
  47. {flask_exts-0.2.5 → flask_exts-0.2.6}/LICENSE.rst +0 -0
  48. {flask_exts-0.2.5 → flask_exts-0.2.6}/babel/babel.cfg +0 -0
  49. {flask_exts-0.2.5 → flask_exts-0.2.6}/babel/babel.sh +0 -0
  50. {flask_exts-0.2.5 → flask_exts-0.2.6}/babel/messages.pot +0 -0
  51. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/Makefile +0 -0
  52. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/_static/logo.png +0 -0
  53. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/api.rst +0 -0
  54. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/changes.rst +0 -0
  55. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/configure.rst +0 -0
  56. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/develop.rst +0 -0
  57. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/examples.rst +0 -0
  58. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/make.bat +0 -0
  59. {flask_exts-0.2.5 → flask_exts-0.2.6}/docs/requirements.txt +0 -0
  60. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/README.rst +0 -0
  61. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/__init__.py +0 -0
  62. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/forms.py +0 -0
  63. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/models.py +0 -0
  64. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/static/favicon.ico +0 -0
  65. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/bootswatch.html +0 -0
  66. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/flash.html +0 -0
  67. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/form.html +0 -0
  68. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/icon.html +0 -0
  69. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/icons.html +0 -0
  70. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/index.html +0 -0
  71. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/nav.html +0 -0
  72. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/pagination.html +0 -0
  73. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/bootstrap/table.html +0 -0
  74. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/templates/mybase.html +0 -0
  75. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap/view.py +0 -0
  76. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/static/favicon.ico +0 -0
  77. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/bootswatch.html +0 -0
  78. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/flash.html +0 -0
  79. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/form.html +0 -0
  80. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/icon.html +0 -0
  81. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/icons.html +0 -0
  82. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/index.html +0 -0
  83. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/mybase.html +0 -0
  84. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/nav.html +0 -0
  85. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/pagination.html +0 -0
  86. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/bootstrap5/templates/table.html +0 -0
  87. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/__init__.py +0 -0
  88. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/build_sample.py +0 -0
  89. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/file_op.py +0 -0
  90. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/__init__.py +0 -0
  91. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/author.py +0 -0
  92. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/keyword.py +0 -0
  93. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/location_image.py +0 -0
  94. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/post.py +0 -0
  95. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/post_tag.py +0 -0
  96. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/tag.py +0 -0
  97. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/tree.py +0 -0
  98. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/user.py +0 -0
  99. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/models/user_keyword.py +0 -0
  100. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/static/favicon.ico +0 -0
  101. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/templates/field_list.html +0 -0
  102. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/templates/locations.html +0 -0
  103. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/templates/my/index.html +0 -0
  104. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/templates/tree_list.html +0 -0
  105. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/author_view.py +0 -0
  106. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/keyword_view.py +0 -0
  107. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/location_image_view.py +0 -0
  108. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/my_view.py +0 -0
  109. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/post_view.py +0 -0
  110. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/tag_view.py +0 -0
  111. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/tree_view.py +0 -0
  112. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/demo/views/user_view.py +0 -0
  113. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/fileadmin/__init__.py +0 -0
  114. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/fileadmin/file_view.py +0 -0
  115. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/fileadmin/tmp/bbb/a.txt +0 -0
  116. {flask_exts-0.2.5 → flask_exts-0.2.6}/examples/instance/config.py +0 -0
  117. {flask_exts-0.2.5 → flask_exts-0.2.6}/pyproject.toml +0 -0
  118. {flask_exts-0.2.5 → flask_exts-0.2.6}/requirements/build.in +0 -0
  119. {flask_exts-0.2.5 → flask_exts-0.2.6}/requirements/test.in +0 -0
  120. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/__init__.py +0 -0
  121. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/actions.py +0 -0
  122. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/admin.py +0 -0
  123. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/menu.py +0 -0
  124. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/__init__.py +0 -0
  125. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/ajax.py +0 -0
  126. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/filters.py +0 -0
  127. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/form.py +0 -0
  128. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/typefmt.py +0 -0
  129. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/model/view.py +0 -0
  130. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/row_action.py +0 -0
  131. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/__init__.py +0 -0
  132. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/ajax.py +0 -0
  133. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/filters.py +0 -0
  134. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/form.py +0 -0
  135. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/typefmt.py +0 -0
  136. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/sqla/view.py +0 -0
  137. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/admin/view.py +0 -0
  138. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/babel/__init__.py +0 -0
  139. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/babel/selector.py +0 -0
  140. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/commands.py +0 -0
  141. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/constants.py +0 -0
  142. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/datastore/__init__.py +0 -0
  143. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/datastore/sqla/__init__.py +0 -0
  144. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/datastore/sqla/orm.py +0 -0
  145. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/__init__.py +0 -0
  146. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/base.py +0 -0
  147. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/reset_password_sender.py +0 -0
  148. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/sender.py +0 -0
  149. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/smtp.py +0 -0
  150. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/email/verify_email_sender.py +0 -0
  151. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/__init__.py +0 -0
  152. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/authorizer/__init__.py +0 -0
  153. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/authorizer/base.py +0 -0
  154. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/authorizer/casbin_authorizer.py +0 -0
  155. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/authorizer/sqlalchemy_adapter.py +0 -0
  156. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/core.py +0 -0
  157. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/email_verification.py +0 -0
  158. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/hasher.py +0 -0
  159. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/principal/identity.py +0 -0
  160. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/principal/identity_context.py +0 -0
  161. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/principal/permission.py +0 -0
  162. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/principal/principal.py +0 -0
  163. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/reset_password.py +0 -0
  164. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/serializer.py +0 -0
  165. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/security/two_factor_authentication.py +0 -0
  166. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/signals.py +0 -0
  167. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/__init__.py +0 -0
  168. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/base.py +0 -0
  169. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/__init__.py +0 -0
  170. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/ajax_select.py +0 -0
  171. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/datetime.py +0 -0
  172. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/file.py +0 -0
  173. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/inline.py +0 -0
  174. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/json.py +0 -0
  175. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/recaptcha.py +0 -0
  176. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/select.py +0 -0
  177. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/sqla.py +0 -0
  178. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/switch.py +0 -0
  179. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/fields/taglist.py +0 -0
  180. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/__init__.py +0 -0
  181. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/base_form.py +0 -0
  182. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/csrf.py +0 -0
  183. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/flask_form.py +0 -0
  184. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/form_opts.py +0 -0
  185. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/meta.py +0 -0
  186. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/session_csrf.py +0 -0
  187. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/form/utils.py +0 -0
  188. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/__init__.py +0 -0
  189. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/change_password.py +0 -0
  190. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/forgot_password.py +0 -0
  191. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/login.py +0 -0
  192. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/profile.py +0 -0
  193. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/recovery.py +0 -0
  194. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/register.py +0 -0
  195. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/reset_password.py +0 -0
  196. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/forms/two_factor.py +0 -0
  197. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/funcs.py +0 -0
  198. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/rules.py +0 -0
  199. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/validators/__init__.py +0 -0
  200. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/validators/field_list.py +0 -0
  201. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/validators/file.py +0 -0
  202. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/validators/recaptcha.py +0 -0
  203. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/validators/sqla.py +0 -0
  204. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/__init__.py +0 -0
  205. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/checkbox.py +0 -0
  206. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/datetime.py +0 -0
  207. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/file.py +0 -0
  208. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/inline.py +0 -0
  209. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/recaptcha.py +0 -0
  210. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/render_template.py +0 -0
  211. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/select.py +0 -0
  212. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/template/widgets/xeditable.py +0 -0
  213. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/__init__.py +0 -0
  214. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/base_plugin.py +0 -0
  215. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/bootstrap4_plugin.py +0 -0
  216. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/bootstrap5_plugin.py +0 -0
  217. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/clipboard_plugin.py +0 -0
  218. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/copybutton_plugin.py +0 -0
  219. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/jquery_plugin.py +0 -0
  220. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/qrcode_plugin.py +0 -0
  221. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/rediscli_plugin.py +0 -0
  222. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/plugins/sphinx_copybutton_plugin.py +0 -0
  223. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/css/rediscli.css +0 -0
  224. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/copybutton.js +0 -0
  225. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/filters.js +0 -0
  226. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/form.js +0 -0
  227. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/modal.js +0 -0
  228. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/qrcode.js +0 -0
  229. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/rediscli.js +0 -0
  230. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/security/base64.js +0 -0
  231. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/js/security/webauthn.js +0 -0
  232. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/logo.png +0 -0
  233. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/bootstrap-icons.svg +0 -0
  234. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.css +0 -0
  235. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.json +0 -0
  236. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.min.css +0 -0
  237. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.scss +0 -0
  238. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
  239. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
  240. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap4/bootstrap.bundle.min.js +0 -0
  241. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap4/bootstrap.min.css +0 -0
  242. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap5/bootstrap.bundle.min.js +0 -0
  243. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/bootstrap5/bootstrap.min.css +0 -0
  244. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/clipboard/clipboard.min.js +0 -0
  245. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/daterangepicker/daterangepicker.css +0 -0
  246. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/daterangepicker/daterangepicker.js +0 -0
  247. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/jquery/jquery.min.js +0 -0
  248. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/moment.min.js +0 -0
  249. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/select2/select2.min.css +0 -0
  250. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/select2/select2.min.js +0 -0
  251. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.css +0 -0
  252. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.js +0 -0
  253. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/vanilla-editor/css/bootstrap-editable.css +0 -0
  254. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/vanilla-editor/img/clear.png +0 -0
  255. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/vanilla-editor/img/loading.gif +0 -0
  256. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/static/vendor/vanilla-editor/js/bootstrap-editable.min.js +0 -0
  257. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/index.html +0 -0
  258. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/create.html +0 -0
  259. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/edit.html +0 -0
  260. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/modals/create.html +0 -0
  261. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/admin/model/modals/edit.html +0 -0
  262. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/base.html +0 -0
  263. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/bootstrap4/form.html +0 -0
  264. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/bootstrap4/message.html +0 -0
  265. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/bootstrap4/pagination.html +0 -0
  266. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/bootstrap5/form.html +0 -0
  267. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/bootstrap5/message.html +0 -0
  268. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/index.html +0 -0
  269. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/layout.html +0 -0
  270. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/form.html +0 -0
  271. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/icon.html +0 -0
  272. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/inline.html +0 -0
  273. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/layout.html +0 -0
  274. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/menu.html +0 -0
  275. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/message.html +0 -0
  276. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/nav.html +0 -0
  277. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/pagination.html +0 -0
  278. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/table.html +0 -0
  279. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/macro/vendor.html +0 -0
  280. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/file/form.html +0 -0
  281. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/file/modals/form.html +0 -0
  282. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/rediscli/response.html +0 -0
  283. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/change_password.html +0 -0
  284. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/forgot_password.html +0 -0
  285. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/index.html +0 -0
  286. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/list.html +0 -0
  287. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/login.html +0 -0
  288. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/recovery.html +0 -0
  289. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/recovery_codes.html +0 -0
  290. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/register.html +0 -0
  291. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/reset_password.html +0 -0
  292. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/show_tfa.html +0 -0
  293. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/verify_email.html +0 -0
  294. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/verify_tfa.html +0 -0
  295. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/views/user/verify_tfa_modal.html +0 -0
  296. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/widgets/inline_field_list.html +0 -0
  297. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/templates/default/widgets/inline_form.html +0 -0
  298. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/themes/theme.py +0 -0
  299. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/translations/__init__.py +0 -0
  300. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
  301. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/translations/en/LC_MESSAGES/messages.po +0 -0
  302. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  303. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  304. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/types.py +0 -0
  305. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/__init__.py +0 -0
  306. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/base_user.py +0 -0
  307. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/base_user_store.py +0 -0
  308. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/core.py +0 -0
  309. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/models/__init__.py +0 -0
  310. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/models/role.py +0 -0
  311. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/models/user.py +0 -0
  312. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/models/user_profile.py +0 -0
  313. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/models/webauthn.py +0 -0
  314. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/usercenter/sqla_user_store.py +0 -0
  315. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/__init__.py +0 -0
  316. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/decorators.py +0 -0
  317. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/flask.py +0 -0
  318. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/image.py +0 -0
  319. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/jwt.py +0 -0
  320. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/request_user.py +0 -0
  321. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/sqla.py +0 -0
  322. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/tools.py +0 -0
  323. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/utils/url.py +0 -0
  324. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/file/__init__.py +0 -0
  325. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/file/base_file_view.py +0 -0
  326. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/file/local_file_storage.py +0 -0
  327. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/file/local_file_view.py +0 -0
  328. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/index/__init__.py +0 -0
  329. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/index/view.py +0 -0
  330. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/rediscli/__init__.py +0 -0
  331. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/rediscli/mock_redis.py +0 -0
  332. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/rediscli/view.py +0 -0
  333. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/user/__init__.py +0 -0
  334. {flask_exts-0.2.5 → flask_exts-0.2.6}/src/flask_exts/views/user/view.py +0 -0
  335. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/__init__.py +0 -0
  336. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/__init__.py +0 -0
  337. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/customer/templates/mock.html +0 -0
  338. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/customer/test_admin.py +0 -0
  339. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/__init__.py +0 -0
  340. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/templates/another_macro.html +0 -0
  341. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/templates/macro.html +0 -0
  342. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/test_basic.py +0 -0
  343. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/test_form_rules.py +0 -0
  344. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/test_inlineform.py +0 -0
  345. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/test_multi_pk.py +0 -0
  346. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/sqla/test_translation.py +0 -0
  347. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/test_base.py +0 -0
  348. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/admin/test_model.py +0 -0
  349. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/data/copyleft.gif +0 -0
  350. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/data/copyleft.jpeg +0 -0
  351. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/data/copyleft.jpg +0 -0
  352. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/data/copyleft.png +0 -0
  353. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/data/copyleft.tiff +0 -0
  354. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/email/test_base.py +0 -0
  355. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/email/test_smtp.py +0 -0
  356. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/helper.py +0 -0
  357. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/__init__.py +0 -0
  358. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/message.py +0 -0
  359. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/model1.py +0 -0
  360. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/multpk.py +0 -0
  361. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/polymorphic.py +0 -0
  362. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/tree.py +0 -0
  363. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/models/user.py +0 -0
  364. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/__init__.py +0 -0
  365. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_adapter/rbac_model.conf +0 -0
  366. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_adapter/rbac_policy.csv +0 -0
  367. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_adapter/test_sqlalchemy_adapter.py +0 -0
  368. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_files/authz_policy.csv +0 -0
  369. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_files/rbac_model.conf +0 -0
  370. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/casbin_files/rbac_policy.csv +0 -0
  371. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/authorizer/test_casbin_auth.py +0 -0
  372. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/test_core.py +0 -0
  373. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/test_principal.py +0 -0
  374. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/security/test_tfa.py +0 -0
  375. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/__init__.py +0 -0
  376. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/__init__.py +0 -0
  377. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_field.py +0 -0
  378. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_form.py +0 -0
  379. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_form_row.py +0 -0
  380. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_hidden_errors.py +0 -0
  381. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_icon.py +0 -0
  382. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_messages.py +0 -0
  383. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_pager.py +0 -0
  384. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_pagination.py +0 -0
  385. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap4/test_render_table.py +0 -0
  386. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/__init__.py +0 -0
  387. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/_test_base.py +0 -0
  388. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/_test_render_form.py +0 -0
  389. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/_test_render_form_row.py +0 -0
  390. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/_test_render_messages.py +0 -0
  391. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/bootstrap5/_test_render_pagination.py +0 -0
  392. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/conftest.py +0 -0
  393. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/forms/test_csrf.py +0 -0
  394. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/forms/test_fields.py +0 -0
  395. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/forms/test_filefield.py +0 -0
  396. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/forms/test_uploadfile.py +0 -0
  397. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/macros/test_render_breadcrumb_item.py +0 -0
  398. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/macros/test_render_nav_item.py +0 -0
  399. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/template/test_base.py +0 -0
  400. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/templates/method.html +0 -0
  401. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/templates/mock.html +0 -0
  402. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/test_babel.py +0 -0
  403. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/test_flask.py +0 -0
  404. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  405. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/translations/en/LC_MESSAGES/messages.po +0 -0
  406. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  407. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/usercenter/test_sqla_usercenter.py +0 -0
  408. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/utils/test_image.py +0 -0
  409. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/utils/test_request_user.py +0 -0
  410. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/utils/test_url.py +0 -0
  411. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/views/files/dummy.txt +0 -0
  412. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/views/test_file_view.py +0 -0
  413. {flask_exts-0.2.5 → flask_exts-0.2.6}/tests/views/test_rediscli_view.py +0 -0
@@ -7,9 +7,9 @@ version: 2
7
7
 
8
8
  # Set the OS, Python version and other tools you might need
9
9
  build:
10
- os: "ubuntu-22.04"
10
+ os: "ubuntu-24.04"
11
11
  tools:
12
- python: "3.12"
12
+ python: "3.13"
13
13
  # You can also specify other tool versions:
14
14
  # nodejs: "19"
15
15
  # rust: "1.64"
@@ -1,3 +1,11 @@
1
+ v0.2.6
2
+ ------
3
+
4
+ Released 2025-11-16
5
+
6
+ - rename manager.py to exts.py
7
+ - rename Class Manager to Exts
8
+
1
9
  v0.2.5
2
10
  ------
3
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Flask-Exts
3
- Version: 0.2.5
3
+ Version: 0.2.6
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
@@ -62,6 +62,7 @@ Flask Exts
62
62
 
63
63
  Flask-Exts is mainly inspired by:
64
64
 
65
+ - `Bootstrap <https://getbootstrap.com/>`_
65
66
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
66
67
  - `Flask-Security <https://github.com/pallets-eco/flask-security/>`_
67
68
 
@@ -88,13 +89,13 @@ Examples
88
89
  .. code-block:: python
89
90
 
90
91
  from flask import Flask
91
- from flask_exts import Manager
92
+ from flask_exts import Exts
92
93
 
93
94
  app = Flask(__name__)
94
95
  app.config["SECRET_KEY"] = "dev"
95
- # Manager init
96
- manager = Manager()
97
- manager.init_app(app)
96
+ # Exts init
97
+ exts = Exts()
98
+ exts.init_app(app)
98
99
 
99
100
  if __name__ == "__main__":
100
101
  app.run(debug=True)
@@ -3,6 +3,7 @@ Flask Exts
3
3
 
4
4
  Flask-Exts is mainly inspired by:
5
5
 
6
+ - `Bootstrap <https://getbootstrap.com/>`_
6
7
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
7
8
  - `Flask-Security <https://github.com/pallets-eco/flask-security/>`_
8
9
 
@@ -29,13 +30,13 @@ Examples
29
30
  .. code-block:: python
30
31
 
31
32
  from flask import Flask
32
- from flask_exts import Manager
33
+ from flask_exts import Exts
33
34
 
34
35
  app = Flask(__name__)
35
36
  app.config["SECRET_KEY"] = "dev"
36
- # Manager init
37
- manager = Manager()
38
- manager.init_app(app)
37
+ # Exts init
38
+ exts = Exts()
39
+ exts.init_app(app)
39
40
 
40
41
  if __name__ == "__main__":
41
42
  app.run(debug=True)
@@ -32,12 +32,12 @@ extensions = [
32
32
  "sphinx.ext.intersphinx",
33
33
  ]
34
34
 
35
- intersphinx_mapping = {
36
- "rtd": ("https://docs.readthedocs.io/en/stable/", None),
37
- "python": ("https://docs.python.org/3/", None),
38
- "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
39
- }
40
- intersphinx_disabled_domains = ["std"]
35
+ # intersphinx_mapping = {
36
+ # "rtd": ("https://docs.readthedocs.io/en/stable/", None),
37
+ # "python": ("https://docs.python.org/3/", None),
38
+ # "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
39
+ # }
40
+ # intersphinx_disabled_domains = ["std"]
41
41
 
42
42
  templates_path = ["_templates"]
43
43
 
@@ -10,6 +10,7 @@ Welcome to Flask-Exts's documentation!
10
10
 
11
11
  Flask-Exts is mainly inspired by:
12
12
 
13
+ - `Bootstrap <https://getbootstrap.com/>`_
13
14
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
14
15
  - `Flask-Security <https://github.com/pallets-eco/flask-security/>`_
15
16
 
@@ -1,5 +1,5 @@
1
1
  from flask import Flask
2
- from flask_exts import Manager
2
+ from flask_exts import Exts
3
3
  from .models import db, Message, MyCategory
4
4
  from .view import BootstrapView
5
5
 
@@ -11,9 +11,9 @@ def create_app():
11
11
 
12
12
 
13
13
  def init_app(app: Flask):
14
- manager = Manager()
15
- manager.init_app(app)
16
- manager.admin.add_view(BootstrapView())
14
+ exts = Exts()
15
+ exts.init_app(app)
16
+ exts.admin.add_view(BootstrapView())
17
17
 
18
18
  with app.app_context():
19
19
  db.drop_all()
@@ -10,7 +10,7 @@ from flask_exts.admin.menu import MenuLink
10
10
 
11
11
 
12
12
  def add_views(app):
13
- admin = app.extensions["manager"].admin
13
+ admin = app.extensions["exts"].admin
14
14
 
15
15
  admin.add_view(myview)
16
16
  admin.add_view(userview)
@@ -1,6 +1,6 @@
1
1
  import os.path as op
2
2
  from flask import Flask
3
- from flask_exts import Manager
3
+ from flask_exts import Exts
4
4
 
5
5
 
6
6
  def get_sqlite_path():
@@ -25,8 +25,8 @@ def create_app():
25
25
 
26
26
 
27
27
  def init_app(app: Flask):
28
- manager = Manager()
29
- manager.init_app(app)
28
+ exts = Exts()
29
+ exts.init_app(app)
30
30
 
31
31
  from .models import init_models
32
32
 
@@ -1,5 +1,5 @@
1
1
  from flask import Flask
2
- from flask_exts import Manager
2
+ from flask_exts import Exts
3
3
  from .file_view import file_view
4
4
  from flask_exts.datastore.sqla import db
5
5
 
@@ -18,6 +18,6 @@ def create_app():
18
18
 
19
19
 
20
20
  def init_app(app: Flask):
21
- manager = Manager()
22
- manager.init_app(app)
23
- manager.admin.add_view(file_view)
21
+ exts = Exts()
22
+ exts.init_app(app)
23
+ exts.admin.add_view(file_view)
@@ -1,5 +1,5 @@
1
1
  from flask import Flask
2
- from flask_exts import Manager
2
+ from flask_exts import Exts
3
3
  from flask_exts.datastore.sqla import db
4
4
  from flask_exts.views.rediscli.view import RedisCli
5
5
 
@@ -9,14 +9,14 @@ from flask_exts.views.rediscli.mock_redis import MockRedis as Redis
9
9
  app = Flask(__name__)
10
10
  app.config["SECRET_KEY"] = "dev"
11
11
 
12
- # Manager init
13
- manager = Manager()
14
- manager.init_app(app)
12
+ # Exts init
13
+ exts = Exts()
14
+ exts.init_app(app)
15
15
 
16
16
  # add rediscli view
17
17
  # redis_view = RedisCli(Redis())
18
18
  redis_view = RedisCli(Redis())
19
- manager.admin.add_view(redis_view)
19
+ exts.admin.add_view(redis_view)
20
20
 
21
21
  with app.app_context():
22
22
  db.drop_all()
@@ -2,7 +2,7 @@
2
2
 
3
3
  from flask import Flask
4
4
  from flask import render_template_string
5
- from flask_exts import Manager
5
+ from flask_exts import Exts
6
6
  from flask_exts.admin import expose
7
7
  from flask_exts.admin import BaseView
8
8
  from flask_exts.datastore.sqla import db
@@ -19,10 +19,10 @@ class MockView(BaseView):
19
19
 
20
20
  app = Flask(__name__)
21
21
  app.config["SECRET_KEY"] = "dev"
22
- manager = Manager()
23
- manager.init_app(app)
22
+ exts = Exts()
23
+ exts.init_app(app)
24
24
  # Register a mock view
25
- manager.admin.add_view(MockView())
25
+ exts.admin.add_view(MockView())
26
26
 
27
27
  with app.app_context():
28
28
  db.drop_all()
@@ -0,0 +1 @@
1
+ __version__ = "0.2.6"
@@ -0,0 +1 @@
1
+ from .exts import Exts
@@ -9,7 +9,7 @@ from .views.index.view import IndexView
9
9
  from .views.user.view import UserView
10
10
 
11
11
 
12
- class Manager:
12
+ class Exts:
13
13
  """This is used to manager babel,template,admin, and so on..."""
14
14
 
15
15
  def __init__(self, app=None):
@@ -29,10 +29,10 @@ class Manager:
29
29
  if not hasattr(app, "extensions"):
30
30
  app.extensions = {}
31
31
 
32
- if "manager" in app.extensions:
33
- raise Exception("manager extension already exists in app.extensions.")
32
+ if "exts" in app.extensions:
33
+ raise Exception("exts extension already exists in app.extensions.")
34
34
 
35
- app.extensions["manager"] = self
35
+ app.extensions["exts"] = self
36
36
 
37
37
  # init sqlalchemy db
38
38
  if app.config.get("SQLALCHEMY_DATABASE_URI", None) is None:
@@ -0,0 +1,19 @@
1
+ import typing as t
2
+
3
+ from flask import current_app
4
+ from werkzeug.local import LocalProxy
5
+
6
+ if t.TYPE_CHECKING:
7
+ from .exts import Exts
8
+ from .template.base import Template
9
+ from .usercenter.base_user_store import BaseUserStore
10
+ from .security.core import Security
11
+
12
+
13
+ _exts: "Exts" = LocalProxy(lambda: current_app.extensions["exts"])
14
+
15
+ _template: "Template" = LocalProxy(lambda: _exts.template)
16
+
17
+ _userstore: "BaseUserStore" = LocalProxy(lambda: _exts.usercenter.userstore)
18
+
19
+ _security: "Security" = LocalProxy(lambda: _exts.security)
@@ -0,0 +1,10 @@
1
+ from flask import url_for
2
+ from .base_plugin import BasePlugin
3
+
4
+
5
+ class DetailFilterPlugin(BasePlugin):
6
+ def __init__(self):
7
+ super().__init__("detail_filter")
8
+
9
+ def js(self):
10
+ return url_for("_template.static", filename="js/detail_filter.js")
@@ -0,0 +1,10 @@
1
+ from flask import url_for
2
+ from .base_plugin import BasePlugin
3
+
4
+
5
+ class ListActionPlugin(BasePlugin):
6
+ def __init__(self):
7
+ super().__init__("model_action")
8
+
9
+ def js(self):
10
+ return url_for("_template.static", filename="js/model_action.js")
@@ -0,0 +1,83 @@
1
+ from markupsafe import Markup
2
+ import os
3
+ import sys
4
+ import importlib.util
5
+ import inspect
6
+ from .base_plugin import BasePlugin
7
+
8
+
9
+ class PluginManager:
10
+ def __init__(self):
11
+ self.registered_plugins = {}
12
+ self.enabled_plugins = []
13
+
14
+ def register_plugin(self, plugin):
15
+ self.registered_plugins[plugin.name] = plugin
16
+
17
+ def enable_plugin(self, names):
18
+ if isinstance(names, str):
19
+ names = [names]
20
+ for name in names:
21
+ if name not in self.enabled_plugins and name in self.registered_plugins:
22
+ self.enabled_plugins.append(name)
23
+
24
+ def init_app(self, app):
25
+ # Register plugins
26
+ plugins_directory = os.path.dirname(__file__)
27
+ self.load_plugins_in_directory(plugins_directory, BasePlugin)
28
+ # print("registered plugins:", [k for k in self.registered_plugins])
29
+
30
+ def load_css(self):
31
+ css_links = [
32
+ f'<link rel="stylesheet" href="{css}">'
33
+ for name in self.enabled_plugins
34
+ if (plugin := self.registered_plugins.get(name)) and (css := plugin.css())
35
+ ]
36
+ css = "\n".join(css_links)
37
+ return Markup(css)
38
+
39
+ def load_js(self):
40
+ js_links = [
41
+ f'<script src="{js}"></script>'
42
+ for name in self.enabled_plugins
43
+ if (plugin := self.registered_plugins.get(name)) and (js := plugin.js())
44
+ ]
45
+ js = "\n".join(js_links)
46
+ return Markup(js)
47
+
48
+ def load_plugins_in_directory(self, directory, base_class):
49
+ """
50
+ Scans the specified directory for Python files, imports them,
51
+ and returns a list of subclasses of the specified base class.
52
+
53
+ :param directory: The directory to scan for Python files.
54
+ :param base_class: The base class to find subclasses of.
55
+ :return: A list of subclasses of the specified base class.
56
+ """
57
+ subclasses = []
58
+
59
+ for filename in os.listdir(directory):
60
+ if (
61
+ filename.endswith("plugin.py")
62
+ and not filename.startswith("__")
63
+ and filename != "base_plugin.py"
64
+ ):
65
+ module_name = filename[:-3]
66
+ try:
67
+ module = importlib.import_module(f"{__package__}.{module_name}")
68
+ except:
69
+ module_path = os.path.join(directory, filename)
70
+ spec = importlib.util.spec_from_file_location(
71
+ module_name, module_path
72
+ )
73
+ module = importlib.util.module_from_spec(spec)
74
+ # sys.modules[module_name] = module
75
+ spec.loader.exec_module(module)
76
+
77
+ for name, obj in inspect.getmembers(module, inspect.isclass):
78
+ if issubclass(obj, base_class) and obj is not base_class:
79
+ subclasses.append((name, obj))
80
+ plugin_instance = obj()
81
+ self.register_plugin(plugin_instance)
82
+
83
+ # print(subclasses)
@@ -99,7 +99,7 @@ body.modal-open {
99
99
  }
100
100
 
101
101
  /* Details View - add space between navbar and results */
102
- .fa_filter_container {
102
+ .detail_filter_container {
103
103
  margin-top: 20px;
104
104
  margin-bottom: 10px;
105
105
  }
@@ -0,0 +1,55 @@
1
+ class SearchDetail {
2
+ constructor(searchId) {
3
+ this.searchInput = document.getElementById(searchId);
4
+ this.timeoutId = null;
5
+ this.delay = 500; // 500ms delay
6
+ this.lastValue = '';
7
+ this.searchableRows = null; // no query at constructor
8
+ if (this.searchInput) {
9
+ this.searchInput.addEventListener('input', this.handleInput);
10
+ }
11
+ }
12
+
13
+ handleInput = (event) => {
14
+ const value = event.target.value.trim();
15
+ if (value === this.lastValue) {
16
+ return;
17
+ }
18
+ this.clearTimeout();
19
+ this.timeoutId = setTimeout(() => {
20
+ this.lastValue = value;
21
+ this.performSearch(value);
22
+ }, this.delay);
23
+ }
24
+
25
+ clearTimeout() {
26
+ if (this.timeoutId) {
27
+ clearTimeout(this.timeoutId);
28
+ this.timeoutId = null;
29
+ }
30
+ }
31
+
32
+ performSearch(value) {
33
+ const rex = new RegExp(value, 'i');
34
+ if (this.searchableRows == null) {
35
+ this.searchableRows = document.querySelectorAll('.searchable tr');
36
+ }
37
+ this.searchableRows.forEach(function (row) {
38
+ const rowText = row.textContent;
39
+ if (rex.test(rowText)) {
40
+ row.style.display = '';
41
+ } else {
42
+ row.style.display = 'none';
43
+ }
44
+ })
45
+ }
46
+
47
+ destroy() {
48
+ this.clearTimeout();
49
+ if (this.searchInput) {
50
+ this.searchInput.removeEventListener('input', this.handleInput);
51
+ }
52
+ }
53
+
54
+ }
55
+
@@ -0,0 +1,70 @@
1
+ class ModelAction {
2
+ constructor(actionErrorMessage, actionConfirmations) {
3
+ this.actionErrorMessage = actionErrorMessage;
4
+ this.actionConfirmations = actionConfirmations;
5
+ this.init();
6
+ }
7
+
8
+ init = () => {
9
+ this.rowToggle = document.querySelector('.action-rowtoggle');
10
+ this.inputs = document.querySelectorAll('input.action-checkbox');
11
+ this.setupEventListeners();
12
+ }
13
+
14
+ setupEventListeners() {
15
+ // Master toggle functionality: when master checkbox changes
16
+ this.rowToggle.addEventListener('change', (event) => {
17
+ // Set all individual checkboxes to match master checkbox state
18
+ this.inputs.forEach(input => {
19
+ input.checked = event.target.checked;
20
+ });
21
+ });
22
+
23
+ // Individual checkbox functionality: when any individual checkbox changes
24
+ this.inputs.forEach(input => {
25
+ input.addEventListener('change', () => {
26
+ // Check if all individual checkboxes are checked
27
+ const allInputsChecked = Array.from(this.inputs).every(input => input.checked);
28
+ // Update master checkbox to reflect the overall state
29
+ this.rowToggle.checked = allInputsChecked;
30
+ });
31
+ });
32
+ }
33
+
34
+ execute(name) {
35
+ if (document.querySelectorAll('input.action-checkbox:checked').length === 0) {
36
+ alert(this.actionErrorMessage);
37
+ return false;
38
+ }
39
+
40
+ const msg = this.actionConfirmations[name];
41
+ if (msg) {
42
+ if (!confirm(msg)) {
43
+ return false;
44
+ }
45
+ }
46
+
47
+ // Update hidden form and submit it
48
+ const form = document.getElementById('action_form');
49
+
50
+ // Remove existing action checkboxes from form
51
+ const formCheckboxes = form.querySelectorAll('input.action-checkbox');
52
+ formCheckboxes.forEach(checkbox => {
53
+ checkbox.remove();
54
+ });
55
+
56
+ // Add cloned copies of checked checkboxes to form
57
+ const checkedCheckboxes = document.querySelectorAll('input.action-checkbox:checked');
58
+ checkedCheckboxes.forEach(checkbox => {
59
+ form.appendChild(checkbox.cloneNode(true));
60
+ });
61
+
62
+ // Set action value and submit form
63
+ form.querySelector('input[name="action"]').value = name;
64
+ form.submit();
65
+ return false;
66
+ };
67
+ }
68
+
69
+
70
+
@@ -45,8 +45,3 @@
45
45
  </div>
46
46
 
47
47
  {%- endblock -%}
48
-
49
- {% block tail %}
50
- {{ super() }}
51
- <script src="{{ url_for('_template.static',filename='js/helper.js') }}"></script>
52
- {% endblock %}
@@ -1,5 +1,7 @@
1
1
  {% extends 'admin/master.html' %}
2
2
 
3
+ {%- set _none = _template.theme.plugin.enable_plugin(['detail_filter']) -%}
4
+
3
5
  {% block main %}
4
6
  {% block navlinks %}
5
7
  <ul class="nav nav-tabs">
@@ -23,9 +25,9 @@
23
25
  {% endblock %}
24
26
 
25
27
  {% block details_search %}
26
- <div class="form-inline fa_filter_container col-lg-6">
27
- <label for="fa_filter">{{ gettext('Filter') }}</label>
28
- <input id="fa_filter" type="text" class="ml-3 form-control">
28
+ <div class="form-inline detail_filter_container col-lg-6">
29
+ <label for="detail_filter">{{ gettext('Filter') }}</label>
30
+ <input id="detail_filter" type="text" class="ml-3 form-control">
29
31
  </div>
30
32
  {% endblock %}
31
33
 
@@ -47,5 +49,9 @@
47
49
 
48
50
  {% block tail %}
49
51
  {{ super() }}
50
- <script src="{{ url_for('_template.static',filename='js/details_filter.js') }}"></script>
52
+ <script>
53
+ document.addEventListener("DOMContentLoaded",()=>{
54
+ new SearchDetail('detail_filter')
55
+ });
56
+ </script>
51
57
  {% endblock %}
@@ -6,6 +6,10 @@
6
6
  {% import 'macro/actions.html' as actionlib with context %}
7
7
  {% from 'macro/row_actions.html' import render_row_action with context %}
8
8
 
9
+ {% if actions %}
10
+ {%- set _none = _template.theme.plugin.enable_plugin(['model_action']) -%}
11
+ {% endif %}
12
+
9
13
  {% block styles -%}
10
14
  {{ super() }}
11
15
  {{ form_css(xeditable=editable_columns) }}
@@ -180,13 +184,22 @@
180
184
  {% block tail %}
181
185
  {{ super() }}
182
186
  {% if filter_groups %}
183
- <div id="filter-groups-data" class="d-none">{{ filter_groups|tojson|safe }}</div>
184
- <div id="active-filters-data" class="d-none">{{ active_filters|tojson|safe }}</div>
187
+ <div id="filter-groups-data" class="d-none">{{ filter_groups|tojson }}</div>
188
+ <div id="active-filters-data" class="d-none">{{ active_filters|tojson }}</div>
185
189
  {% endif %}
186
190
  {{ form_js(xeditable=editable_columns) }}
187
191
  <script src="{{ url_for('_template.static',filename='js/modal.js') }}"></script>
188
192
  <script src="{{ url_for('_template.static',filename='js/filters.js') }}"></script>
189
193
  {% if actions %}
190
- {{ actionlib.add_action_js(gettext('Please select at least one record.'), actions, actions_confirmation) }}
194
+ <script>
195
+ const actionErrorMessage = "{{ _('Please select at least one record.') }}";
196
+ const actionConfirmations = {{ actions_confirmation|tojson }};
197
+ let modelActions;
198
+ document.addEventListener("DOMContentLoaded",()=>{
199
+ modelActions = new ModelAction(actionErrorMessage, actionConfirmations);
200
+ });
201
+ </script>
191
202
  {% endif %}
203
+
204
+
192
205
  {% endblock %}
@@ -1,3 +1,5 @@
1
+ {%- set _none = _template.theme.plugin.enable_plugin(['detail_filter']) -%}
2
+
1
3
  {% block body %}
2
4
  <div class="modal-header">
3
5
  {% block header_text %}
@@ -7,9 +9,9 @@
7
9
  </div>
8
10
  <div class="modal-body">
9
11
  {% block details_search %}
10
- <div class="form-inline fa_filter_container col-lg-6">
11
- <label for="fa_filter">{{ gettext('Filter') }}</label>
12
- <input id="fa_filter" type="text" class="ml-3 form-control">
12
+ <div class="form-inline detail_filter_container col-lg-6">
13
+ <label for="detail_filter">{{ gettext('Filter') }}</label>
14
+ <input id="detail_filter" type="text" class="ml-3 form-control">
13
15
  </div>
14
16
  {% endblock %}
15
17
  {% block details_table %}
@@ -30,7 +32,11 @@
30
32
  {% endblock %}
31
33
 
32
34
  {% block tail %}
33
- <script src="{{ url_for('_template.static',filename='js/details_filter.js') }}"></script>
35
+ <script>
36
+ document.addEventListener("DOMContentLoaded",()=>{
37
+ new SearchDetail('detail_filter')
38
+ });
39
+ </script>
34
40
  {% endblock %}
35
41
 
36
42
 
@@ -20,12 +20,6 @@
20
20
  </form>
21
21
  {% endmacro %}
22
22
 
23
- {% macro add_action_js(message, actions, actions_confirmation) %}
24
- <div id="actions-confirmation-data" class="d-none">{{ actions_confirmation|tojson|safe }}</div>
25
- <div id="message-data" class="d-none">{{ message|tojson|safe }}</div>
26
- <script src="{{ url_for('_template.static',filename='js/actions.js') }}"></script>
27
- {% endmacro %}
28
-
29
23
  {# ---------------------- Modal Window ------------------- #}
30
24
 
31
25
  {% macro add_modal_button(url='', title='', content='', modal_window_id='fa_modal_window', btn_class='icon') %}
@@ -33,7 +33,7 @@
33
33
  {% elif _template.funcs.csrf_token %}
34
34
  <input type="hidden" name="csrf_token" value="{{ _template.funcs.csrf_token() }}"/>
35
35
  {% endif %}
36
- <button onclick="return formHelper.confirm('{{ gettext('Are you sure you want to delete this record?') }}');" title="{{ gettext('Delete Record') }}">
36
+ <button onclick="return confirm('{{ gettext('Are you sure you want to delete this record?') }}');" title="{{ gettext('Delete Record') }}">
37
37
  {{ render_icon(action.icon) }}
38
38
  </button>
39
39
  </form>