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

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