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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. flask_exts-0.2.8/.djlintrc +8 -0
  2. {flask_exts-0.2.6 → flask_exts-0.2.8}/.gitignore +4 -0
  3. {flask_exts-0.2.6 → flask_exts-0.2.8}/CHANGES.rst +15 -3
  4. {flask_exts-0.2.6 → flask_exts-0.2.8}/PKG-INFO +10 -17
  5. {flask_exts-0.2.6 → flask_exts-0.2.8}/README.rst +5 -8
  6. {flask_exts-0.2.6 → flask_exts-0.2.8}/babel/babel.sh +1 -1
  7. flask_exts-0.2.8/babel/messages.pot +346 -0
  8. flask_exts-0.2.8/docs/advanced/bootstrap5.rst +429 -0
  9. flask_exts-0.2.8/docs/advanced/custom_fields.rst +384 -0
  10. flask_exts-0.2.8/docs/advanced/custom_plugins.rst +247 -0
  11. flask_exts-0.2.8/docs/advanced/custom_validators.rst +4 -0
  12. flask_exts-0.2.8/docs/advanced/index.rst +16 -0
  13. flask_exts-0.2.8/docs/advanced/modelview.rst +337 -0
  14. flask_exts-0.2.8/docs/advanced/performance.rst +493 -0
  15. flask_exts-0.2.8/docs/advanced/security.rst +498 -0
  16. flask_exts-0.2.8/docs/advanced/theming.rst +401 -0
  17. flask_exts-0.2.8/docs/api.rst +17 -0
  18. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/conf.py +0 -1
  19. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/configure.rst +7 -10
  20. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/develop.rst +9 -15
  21. flask_exts-0.2.8/docs/examples.rst +6 -0
  22. flask_exts-0.2.8/docs/index.rst +44 -0
  23. flask_exts-0.2.8/docs/quickstart.rst +264 -0
  24. flask_exts-0.2.8/examples/README.rst +38 -0
  25. flask_exts-0.2.8/examples/demo/admin_views.py +12 -0
  26. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/build_sample.py +5 -29
  27. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/make_app.py +11 -14
  28. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/__init__.py +0 -3
  29. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/author.py +9 -4
  30. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/post.py +6 -0
  31. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/tag.py +2 -0
  32. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/tree.py +2 -0
  33. flask_exts-0.2.8/examples/demo/templates/field_list.html +12 -0
  34. flask_exts-0.2.8/examples/demo/templates/locations.html +10 -0
  35. flask_exts-0.2.8/examples/demo/templates/tree_list.html +14 -0
  36. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/views/author_view.py +34 -43
  37. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/views/post_view.py +44 -26
  38. flask_exts-0.2.8/examples/demo/views/tag_view.py +7 -0
  39. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/views/tree_view.py +2 -4
  40. flask_exts-0.2.8/examples/simple/__init__.py +43 -0
  41. flask_exts-0.2.8/package.json +22 -0
  42. {flask_exts-0.2.6 → flask_exts-0.2.8}/pyproject.toml +3 -8
  43. flask_exts-0.2.8/src/flask_exts/__about__.py +1 -0
  44. flask_exts-0.2.8/src/flask_exts/__init__.py +2 -0
  45. flask_exts-0.2.8/src/flask_exts/builtin_extensions/__init__.py +29 -0
  46. flask_exts-0.2.8/src/flask_exts/builtin_extensions/babel_ext.py +102 -0
  47. flask_exts-0.2.8/src/flask_exts/builtin_extensions/database_ext.py +15 -0
  48. flask_exts-0.2.8/src/flask_exts/builtin_extensions/email_ext.py +16 -0
  49. flask_exts-0.2.8/src/flask_exts/builtin_extensions/html_ext.py +45 -0
  50. flask_exts-0.2.8/src/flask_exts/builtin_extensions/login_ext.py +113 -0
  51. flask_exts-0.2.8/src/flask_exts/builtin_extensions/security_ext.py +23 -0
  52. flask_exts-0.2.8/src/flask_exts/builtin_extensions/startup_ext.py +41 -0
  53. flask_exts-0.2.8/src/flask_exts/builtin_extensions/usercenter_ext.py +20 -0
  54. flask_exts-0.2.8/src/flask_exts/builtin_extensions/userstore_ext.py +22 -0
  55. flask_exts-0.2.8/src/flask_exts/builtin_extensions/web_ext.py +19 -0
  56. flask_exts-0.2.8/src/flask_exts/commands.py +52 -0
  57. flask_exts-0.2.8/src/flask_exts/datastore/sqla/__init__.py +3 -0
  58. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query.py +338 -0
  59. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/__init__.py +24 -0
  60. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/filter_builder.py +50 -0
  61. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/join_builder.py +51 -0
  62. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/pagination_builder.py +41 -0
  63. flask_exts-0.2.8/src/flask_exts/datastore/sqla/query_builders/sort_builder.py +40 -0
  64. flask_exts-0.2.8/src/flask_exts/datastore/sqla/sqla_db.py +82 -0
  65. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/__init__.py +6 -0
  66. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/model_mapper.py +142 -0
  67. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/orm.py +40 -0
  68. flask_exts-0.2.8/src/flask_exts/datastore/sqla/utils/paginate.py +74 -0
  69. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/base.py +9 -8
  70. flask_exts-0.2.8/src/flask_exts/extension_core/base.py +127 -0
  71. flask_exts-0.2.8/src/flask_exts/extension_core/manager.py +143 -0
  72. flask_exts-0.2.8/src/flask_exts/extension_core/registry.py +263 -0
  73. flask_exts-0.2.8/src/flask_exts/forms/__init__.py +1 -0
  74. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/ajax_select.py +16 -15
  75. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/datetime.py +4 -4
  76. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/inline.py +4 -37
  77. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/json.py +1 -0
  78. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/select.py +9 -7
  79. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/sqla.py +32 -93
  80. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/__init__.py +39 -0
  81. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/checkbox_fields.py +9 -0
  82. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/inline_fields.py +10 -0
  83. flask_exts-0.2.8/src/flask_exts/forms/fields/sqla_fields/query_fields.py +11 -0
  84. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/taglist.py +3 -0
  85. flask_exts-0.2.8/src/flask_exts/forms/form/__init__.py +1 -0
  86. flask_exts-0.2.8/src/flask_exts/forms/form/base_form.py +24 -0
  87. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/form/csrf.py +12 -16
  88. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/form/meta.py +15 -5
  89. flask_exts-0.2.8/src/flask_exts/forms/form/utils.py +8 -0
  90. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/validators/sqla.py +11 -32
  91. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/__init__.py +1 -1
  92. flask_exts-0.2.6/src/flask_exts/template/widgets/xeditable.py → flask_exts-0.2.8/src/flask_exts/forms/widgets/editable.py +14 -23
  93. flask_exts-0.2.8/src/flask_exts/forms/widgets/inline.py +14 -0
  94. flask_exts-0.2.8/src/flask_exts/html/plugin_base.py +32 -0
  95. flask_exts-0.2.8/src/flask_exts/html/plugin_manager.py +85 -0
  96. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_detail_filter_plugin.py +11 -0
  97. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_filters_plugin.py +11 -0
  98. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_form_plugin.py +11 -0
  99. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_list_action_plugin.py +11 -0
  100. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_modal_plugin.py +11 -0
  101. flask_exts-0.2.8/src/flask_exts/html/plugins/admin_plugin.py +11 -0
  102. flask_exts-0.2.8/src/flask_exts/html/plugins/bootstrap4_plugin.py +19 -0
  103. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts/html}/plugins/bootstrap5_plugin.py +8 -6
  104. flask_exts-0.2.8/src/flask_exts/html/plugins/clipboard_plugin.py +11 -0
  105. flask_exts-0.2.8/src/flask_exts/html/plugins/copybutton_plugin.py +13 -0
  106. flask_exts-0.2.8/src/flask_exts/html/plugins/dayjs_plugin.py +73 -0
  107. flask_exts-0.2.8/src/flask_exts/html/plugins/editable_plugin.py +59 -0
  108. flask_exts-0.2.8/src/flask_exts/html/plugins/flatpickr_plugin.py +69 -0
  109. flask_exts-0.2.8/src/flask_exts/html/plugins/qrcode_plugin.py +11 -0
  110. flask_exts-0.2.8/src/flask_exts/html/plugins/rediscli_plugin.py +15 -0
  111. flask_exts-0.2.8/src/flask_exts/html/plugins/sphinx_copybutton_plugin.py +20 -0
  112. flask_exts-0.2.8/src/flask_exts/html/plugins/tom_select_plugin.py +68 -0
  113. flask_exts-0.2.8/src/flask_exts/html/template.py +18 -0
  114. flask_exts-0.2.8/src/flask_exts/html/theme.py +17 -0
  115. flask_exts-0.2.8/src/flask_exts/proxies.py +24 -0
  116. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/security/authorizer/base.py +0 -4
  117. flask_exts-0.2.8/src/flask_exts/security/authorizer/simple_authorizer.py +21 -0
  118. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/security/core.py +20 -20
  119. flask_exts-0.2.8/src/flask_exts/security/plugins/email_verification.py +48 -0
  120. flask_exts-0.2.8/src/flask_exts/security/plugins/reset_password.py +49 -0
  121. flask_exts-0.2.8/src/flask_exts/security/registry.py +34 -0
  122. flask_exts-0.2.8/src/flask_exts/security/token_action.py +138 -0
  123. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/signals.py +1 -1
  124. flask_exts-0.2.8/src/flask_exts/static/css/editable.css +13 -0
  125. flask_exts-0.2.8/src/flask_exts/static/js/editable.js +243 -0
  126. flask_exts-0.2.8/src/flask_exts/static/js/field-registry.js +241 -0
  127. flask_exts-0.2.8/src/flask_exts/static/js/filters.js +282 -0
  128. flask_exts-0.2.8/src/flask_exts/static/js/form.js +673 -0
  129. flask_exts-0.2.6/src/flask_exts/themes/static/js/model_action.js → flask_exts-0.2.8/src/flask_exts/static/js/list_action.js +10 -3
  130. flask_exts-0.2.8/src/flask_exts/static/js/modal.js +49 -0
  131. flask_exts-0.2.8/src/flask_exts/static/js/ui-factory.js +163 -0
  132. flask_exts-0.2.8/src/flask_exts/templates/admin/index.html +9 -0
  133. flask_exts-0.2.8/src/flask_exts/templates/admin/master.html +41 -0
  134. flask_exts-0.2.8/src/flask_exts/templates/admin/model/create.html +15 -0
  135. flask_exts-0.2.8/src/flask_exts/templates/admin/model/details.html +51 -0
  136. flask_exts-0.2.8/src/flask_exts/templates/admin/model/edit.html +24 -0
  137. flask_exts-0.2.8/src/flask_exts/templates/admin/model/list.html +220 -0
  138. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/create.html +5 -0
  139. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/details.html +37 -0
  140. flask_exts-0.2.8/src/flask_exts/templates/admin/model/modals/edit.html +5 -0
  141. flask_exts-0.2.8/src/flask_exts/templates/base.html +19 -0
  142. flask_exts-0.2.8/src/flask_exts/templates/index.html +44 -0
  143. flask_exts-0.2.8/src/flask_exts/templates/layout.html +7 -0
  144. flask_exts-0.2.8/src/flask_exts/templates/macro/form.html +83 -0
  145. flask_exts-0.2.8/src/flask_exts/templates/macro/icon.html +4 -0
  146. flask_exts-0.2.8/src/flask_exts/templates/macro/inline.html +44 -0
  147. flask_exts-0.2.8/src/flask_exts/templates/macro/layout.html +38 -0
  148. flask_exts-0.2.8/src/flask_exts/templates/macro/menu.html +85 -0
  149. flask_exts-0.2.8/src/flask_exts/templates/macro/message.html +22 -0
  150. flask_exts-0.2.8/src/flask_exts/templates/macro/modal.html +13 -0
  151. flask_exts-0.2.8/src/flask_exts/templates/macro/nav.html +18 -0
  152. flask_exts-0.2.8/src/flask_exts/templates/macro/pagination.html +90 -0
  153. flask_exts-0.2.8/src/flask_exts/templates/user/change_password.html +10 -0
  154. flask_exts-0.2.8/src/flask_exts/templates/user/forgot_password.html +10 -0
  155. flask_exts-0.2.8/src/flask_exts/templates/user/index.html +53 -0
  156. flask_exts-0.2.8/src/flask_exts/templates/user/list.html +5 -0
  157. flask_exts-0.2.8/src/flask_exts/templates/user/login.html +29 -0
  158. flask_exts-0.2.8/src/flask_exts/templates/user/recovery.html +11 -0
  159. flask_exts-0.2.8/src/flask_exts/templates/user/recovery_codes.html +46 -0
  160. flask_exts-0.2.8/src/flask_exts/templates/user/register.html +11 -0
  161. flask_exts-0.2.8/src/flask_exts/templates/user/reset_password.html +11 -0
  162. flask_exts-0.2.8/src/flask_exts/templates/user/setup_tfa.html +38 -0
  163. flask_exts-0.2.8/src/flask_exts/templates/user/show_tfa.html +23 -0
  164. flask_exts-0.2.8/src/flask_exts/templates/user/verify_email.html +5 -0
  165. flask_exts-0.2.8/src/flask_exts/templates/user/verify_tfa.html +14 -0
  166. flask_exts-0.2.8/src/flask_exts/templates/user/verify_tfa_modal.html +13 -0
  167. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
  168. flask_exts-0.2.8/src/flask_exts/translations/en/LC_MESSAGES/messages.po +347 -0
  169. flask_exts-0.2.8/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  170. flask_exts-0.2.8/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +345 -0
  171. flask_exts-0.2.6/src/flask_exts/utils/decorators.py → flask_exts-0.2.8/src/flask_exts/usercenter/auth_requires.py +5 -13
  172. flask_exts-0.2.8/src/flask_exts/usercenter/core.py +9 -0
  173. flask_exts-0.2.8/src/flask_exts/usercenter/forms/__init__.py +1 -0
  174. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/change_password.py +2 -2
  175. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/forgot_password.py +4 -4
  176. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/login.py +2 -2
  177. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/profile.py +3 -3
  178. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/recovery.py +5 -3
  179. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/register.py +2 -2
  180. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/reset_password.py +2 -2
  181. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/usercenter}/forms/two_factor.py +2 -2
  182. flask_exts-0.2.6/src/flask_exts/usercenter/base_user.py → flask_exts-0.2.8/src/flask_exts/usercenter/user.py +2 -2
  183. flask_exts-0.2.6/src/flask_exts/views/user/view.py → flask_exts-0.2.8/src/flask_exts/usercenter/user_view.py +89 -93
  184. flask_exts-0.2.8/src/flask_exts/userstore/models/__init__.py +1 -0
  185. {flask_exts-0.2.6/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/role.py +6 -4
  186. {flask_exts-0.2.6/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/user.py +18 -34
  187. {flask_exts-0.2.6/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/models/user_profile.py +7 -8
  188. flask_exts-0.2.8/src/flask_exts/userstore/models/user_role.py +11 -0
  189. {flask_exts-0.2.6/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/userstore}/sqla_user_store.py +13 -11
  190. flask_exts-0.2.8/src/flask_exts/userstore/store.py +50 -0
  191. flask_exts-0.2.8/src/flask_exts/web/__init__.py +3 -0
  192. {flask_exts-0.2.6/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/admin.py +27 -8
  193. flask_exts-0.2.6/src/flask_exts/views/index/view.py → flask_exts-0.2.8/src/flask_exts/web/default_views/index_view.py +7 -8
  194. flask_exts-0.2.8/src/flask_exts/web/exposer.py +36 -0
  195. {flask_exts-0.2.6/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/menu.py +12 -4
  196. flask_exts-0.2.8/src/flask_exts/web/model/__init__.py +65 -0
  197. flask_exts-0.2.8/src/flask_exts/web/model/actions_mixin.py +126 -0
  198. {flask_exts-0.2.6/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/model/ajax.py +0 -2
  199. flask_exts-0.2.8/src/flask_exts/web/model/base.py +469 -0
  200. flask_exts-0.2.8/src/flask_exts/web/model/core/__init__.py +13 -0
  201. flask_exts-0.2.8/src/flask_exts/web/model/core/columns.py +169 -0
  202. flask_exts-0.2.8/src/flask_exts/web/model/core/forms.py +227 -0
  203. flask_exts-0.2.8/src/flask_exts/web/model/core/pagination.py +125 -0
  204. flask_exts-0.2.8/src/flask_exts/web/model/core/sorting.py +79 -0
  205. flask_exts-0.2.8/src/flask_exts/web/model/core/values.py +170 -0
  206. flask_exts-0.2.6/src/flask_exts/admin/model/filters.py → flask_exts-0.2.8/src/flask_exts/web/model/filter.py +71 -109
  207. flask_exts-0.2.8/src/flask_exts/web/model/filter_mixin.py +190 -0
  208. flask_exts-0.2.8/src/flask_exts/web/model/operations/__init__.py +19 -0
  209. flask_exts-0.2.8/src/flask_exts/web/model/operations/create.py +34 -0
  210. flask_exts-0.2.8/src/flask_exts/web/model/operations/delete.py +31 -0
  211. flask_exts-0.2.8/src/flask_exts/web/model/operations/export.py +179 -0
  212. flask_exts-0.2.8/src/flask_exts/web/model/operations/read.py +57 -0
  213. flask_exts-0.2.8/src/flask_exts/web/model/operations/update.py +31 -0
  214. flask_exts-0.2.8/src/flask_exts/web/model/row_actions.py +104 -0
  215. flask_exts-0.2.6/src/flask_exts/admin/model/typefmt.py → flask_exts-0.2.8/src/flask_exts/web/model/type_formatters.py +27 -28
  216. flask_exts-0.2.8/src/flask_exts/web/model/types.py +4 -0
  217. flask_exts-0.2.8/src/flask_exts/web/model/view.py +464 -0
  218. flask_exts-0.2.8/src/flask_exts/web/sqla/ajax.py +78 -0
  219. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/__init__.py +1 -0
  220. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/filter_converter.py +221 -0
  221. flask_exts-0.2.8/src/flask_exts/web/sqla/filter/filters.py +391 -0
  222. flask_exts-0.2.8/src/flask_exts/web/sqla/form/__init__.py +1 -0
  223. flask_exts-0.2.8/src/flask_exts/web/sqla/form/field_converters.py +177 -0
  224. flask_exts-0.2.8/src/flask_exts/web/sqla/form/inline_form.py +32 -0
  225. flask_exts-0.2.8/src/flask_exts/web/sqla/form/inline_model_convert.py +347 -0
  226. flask_exts-0.2.8/src/flask_exts/web/sqla/form/model_field_convert.py +218 -0
  227. flask_exts-0.2.8/src/flask_exts/web/sqla/form/utils.py +79 -0
  228. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/__init__.py +24 -0
  229. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/pagination_handler.py +22 -0
  230. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/query_handler.py +29 -0
  231. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/relationships_handler.py +41 -0
  232. flask_exts-0.2.8/src/flask_exts/web/sqla/sqla_view/sorting_handler.py +23 -0
  233. flask_exts-0.2.6/src/flask_exts/admin/sqla/typefmt.py → flask_exts-0.2.8/src/flask_exts/web/sqla/type_formatters.py +2 -6
  234. flask_exts-0.2.8/src/flask_exts/web/sqla/view.py +504 -0
  235. {flask_exts-0.2.6/src/flask_exts/admin → flask_exts-0.2.8/src/flask_exts/web}/view.py +81 -102
  236. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/conftest.py +11 -10
  237. flask_exts-0.2.8/tests/datastore/sqla/test_db.py +82 -0
  238. flask_exts-0.2.8/tests/datastore/sqla/test_query.py +175 -0
  239. flask_exts-0.2.8/tests/forms/common.py +6 -0
  240. flask_exts-0.2.8/tests/forms/fields/test_datetime.py +26 -0
  241. {flask_exts-0.2.6/tests/template/forms → flask_exts-0.2.8/tests/forms/fields}/test_filefield.py +1 -1
  242. flask_exts-0.2.8/tests/forms/fields/test_json.py +34 -0
  243. {flask_exts-0.2.6/tests/template/forms → flask_exts-0.2.8/tests/forms/fields}/test_uploadfile.py +3 -3
  244. flask_exts-0.2.8/tests/forms/fields/test_wtforms.py +127 -0
  245. flask_exts-0.2.8/tests/forms/form/test_form.py +46 -0
  246. {flask_exts-0.2.6/tests/template → flask_exts-0.2.8/tests/html}/conftest.py +1 -1
  247. {flask_exts-0.2.6/tests/template → flask_exts-0.2.8/tests/html}/macros/test_render_breadcrumb_item.py +3 -3
  248. flask_exts-0.2.8/tests/html/macros/test_render_nav_item.py +30 -0
  249. flask_exts-0.2.8/tests/html/test_base.py +28 -0
  250. flask_exts-0.2.8/tests/models/__init__.py +16 -0
  251. flask_exts-0.2.8/tests/models/demo.py +140 -0
  252. flask_exts-0.2.8/tests/models/multpk.py +16 -0
  253. flask_exts-0.2.8/tests/models/primary_string_model.py +10 -0
  254. flask_exts-0.2.8/tests/models/relations.py +144 -0
  255. flask_exts-0.2.8/tests/models/simple.py +10 -0
  256. flask_exts-0.2.8/tests/models/tree.py +21 -0
  257. flask_exts-0.2.8/tests/models/unique.py +9 -0
  258. flask_exts-0.2.8/tests/security/test_authorizer.py +116 -0
  259. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/security/test_core.py +13 -11
  260. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/security/test_tfa.py +1 -1
  261. flask_exts-0.2.8/tests/templates/method.html +1 -0
  262. flask_exts-0.2.8/tests/templates/mock.html +5 -0
  263. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/test_babel.py +51 -14
  264. flask_exts-0.2.8/tests/test_base.py +9 -0
  265. flask_exts-0.2.8/tests/test_db.py +19 -0
  266. flask_exts-0.2.8/tests/test_exts_base.py +38 -0
  267. flask_exts-0.2.6/tests/utils/test_request_user.py → flask_exts-0.2.8/tests/test_login.py +42 -38
  268. flask_exts-0.2.8/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  269. flask_exts-0.2.8/tests/translations/en/LC_MESSAGES/messages.po +38 -0
  270. flask_exts-0.2.8/tests/translations/messages.pot +32 -0
  271. flask_exts-0.2.8/tests/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  272. flask_exts-0.2.8/tests/translations/zh_CN/LC_MESSAGES/messages.po +31 -0
  273. flask_exts-0.2.8/tests/usercenter/test_sqla_usercenter.py +50 -0
  274. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/views/test_user_view.py +32 -25
  275. flask_exts-0.2.8/tests/web/model/core/test_columns.py +19 -0
  276. flask_exts-0.2.8/tests/web/model/test_action_mixin.py +36 -0
  277. flask_exts-0.2.6/tests/admin/test_model.py → flask_exts-0.2.8/tests/web/model/test_model_view.py +187 -310
  278. flask_exts-0.2.8/tests/web/model/test_model_view_csrf.py +168 -0
  279. flask_exts-0.2.8/tests/web/sqla/__init__.py +1 -0
  280. flask_exts-0.2.8/tests/web/sqla/custom_sqla_model_view.py +18 -0
  281. {flask_exts-0.2.6/tests/admin → flask_exts-0.2.8/tests/web}/sqla/templates/another_macro.html +1 -1
  282. {flask_exts-0.2.6/tests/admin → flask_exts-0.2.8/tests/web}/sqla/templates/macro.html +3 -5
  283. flask_exts-0.2.8/tests/web/sqla/test_basic.py +1151 -0
  284. flask_exts-0.2.8/tests/web/sqla/test_filter.py +172 -0
  285. flask_exts-0.2.8/tests/web/sqla/test_form.py +96 -0
  286. flask_exts-0.2.8/tests/web/sqla/test_inline_model.py +288 -0
  287. flask_exts-0.2.8/tests/web/sqla/test_multi_pk.py +39 -0
  288. flask_exts-0.2.8/tests/web/sqla/test_primary_string.py +24 -0
  289. {flask_exts-0.2.6/tests/admin → flask_exts-0.2.8/tests/web}/sqla/test_translation.py +19 -24
  290. flask_exts-0.2.6/tests/admin/test_base.py → flask_exts-0.2.8/tests/web/test_admin.py +74 -36
  291. flask_exts-0.2.8/tests/web/test_view.py +30 -0
  292. flask_exts-0.2.6/babel/messages.pot +0 -567
  293. flask_exts-0.2.6/docs/api.rst +0 -9
  294. flask_exts-0.2.6/docs/examples.rst +0 -1
  295. flask_exts-0.2.6/docs/index.rst +0 -65
  296. flask_exts-0.2.6/examples/README.rst +0 -80
  297. flask_exts-0.2.6/examples/bootstrap/forms.py +0 -113
  298. flask_exts-0.2.6/examples/bootstrap/make_app.py +0 -46
  299. flask_exts-0.2.6/examples/bootstrap/models.py +0 -19
  300. flask_exts-0.2.6/examples/bootstrap/static/favicon.ico +0 -0
  301. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/bootswatch.html +0 -7
  302. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/flash.html +0 -6
  303. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/form.html +0 -91
  304. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/icon.html +0 -34
  305. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/icons.html +0 -16411
  306. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/index.html +0 -16
  307. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/nav.html +0 -43
  308. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/pagination.html +0 -17
  309. flask_exts-0.2.6/examples/bootstrap/templates/bootstrap/table.html +0 -51
  310. flask_exts-0.2.6/examples/bootstrap/templates/mybase.html +0 -34
  311. flask_exts-0.2.6/examples/bootstrap/view.py +0 -151
  312. flask_exts-0.2.6/examples/bootstrap5/static/favicon.ico +0 -0
  313. flask_exts-0.2.6/examples/bootstrap5/templates/bootswatch.html +0 -7
  314. flask_exts-0.2.6/examples/bootstrap5/templates/flash.html +0 -6
  315. flask_exts-0.2.6/examples/bootstrap5/templates/form.html +0 -91
  316. flask_exts-0.2.6/examples/bootstrap5/templates/icon.html +0 -28
  317. flask_exts-0.2.6/examples/bootstrap5/templates/icons.html +0 -16411
  318. flask_exts-0.2.6/examples/bootstrap5/templates/index.html +0 -16
  319. flask_exts-0.2.6/examples/bootstrap5/templates/mybase.html +0 -59
  320. flask_exts-0.2.6/examples/bootstrap5/templates/nav.html +0 -43
  321. flask_exts-0.2.6/examples/bootstrap5/templates/pagination.html +0 -17
  322. flask_exts-0.2.6/examples/bootstrap5/templates/table.html +0 -51
  323. flask_exts-0.2.6/examples/demo/__init__.py +0 -1
  324. flask_exts-0.2.6/examples/demo/admin_views.py +0 -31
  325. flask_exts-0.2.6/examples/demo/models/keyword.py +0 -15
  326. flask_exts-0.2.6/examples/demo/models/location_image.py +0 -58
  327. flask_exts-0.2.6/examples/demo/models/user.py +0 -38
  328. flask_exts-0.2.6/examples/demo/models/user_keyword.py +0 -26
  329. flask_exts-0.2.6/examples/demo/templates/field_list.html +0 -13
  330. flask_exts-0.2.6/examples/demo/templates/locations.html +0 -14
  331. flask_exts-0.2.6/examples/demo/templates/my/index.html +0 -7
  332. flask_exts-0.2.6/examples/demo/templates/tree_list.html +0 -14
  333. flask_exts-0.2.6/examples/demo/views/keyword_view.py +0 -9
  334. flask_exts-0.2.6/examples/demo/views/location_image_view.py +0 -77
  335. flask_exts-0.2.6/examples/demo/views/my_view.py +0 -10
  336. flask_exts-0.2.6/examples/demo/views/tag_view.py +0 -4
  337. flask_exts-0.2.6/examples/demo/views/user_view.py +0 -13
  338. flask_exts-0.2.6/examples/fileadmin/__init__.py +0 -1
  339. flask_exts-0.2.6/examples/fileadmin/file_view.py +0 -12
  340. flask_exts-0.2.6/examples/fileadmin/make_app.py +0 -23
  341. flask_exts-0.2.6/examples/instance/config.py +0 -3
  342. flask_exts-0.2.6/examples/rediscli.py +0 -26
  343. flask_exts-0.2.6/examples/simple.py +0 -32
  344. flask_exts-0.2.6/src/flask_exts/__about__.py +0 -1
  345. flask_exts-0.2.6/src/flask_exts/__init__.py +0 -1
  346. flask_exts-0.2.6/src/flask_exts/admin/__init__.py +0 -2
  347. flask_exts-0.2.6/src/flask_exts/admin/actions.py +0 -117
  348. flask_exts-0.2.6/src/flask_exts/admin/model/__init__.py +0 -2
  349. flask_exts-0.2.6/src/flask_exts/admin/model/form.py +0 -251
  350. flask_exts-0.2.6/src/flask_exts/admin/model/view.py +0 -2494
  351. flask_exts-0.2.6/src/flask_exts/admin/row_action.py +0 -67
  352. flask_exts-0.2.6/src/flask_exts/admin/sqla/__init__.py +0 -1
  353. flask_exts-0.2.6/src/flask_exts/admin/sqla/ajax.py +0 -126
  354. flask_exts-0.2.6/src/flask_exts/admin/sqla/filters.py +0 -625
  355. flask_exts-0.2.6/src/flask_exts/admin/sqla/form.py +0 -884
  356. flask_exts-0.2.6/src/flask_exts/admin/sqla/view.py +0 -1323
  357. flask_exts-0.2.6/src/flask_exts/babel/__init__.py +0 -44
  358. flask_exts-0.2.6/src/flask_exts/babel/selector.py +0 -35
  359. flask_exts-0.2.6/src/flask_exts/commands.py +0 -34
  360. flask_exts-0.2.6/src/flask_exts/datastore/sqla/__init__.py +0 -9
  361. flask_exts-0.2.6/src/flask_exts/datastore/sqla/orm.py +0 -11
  362. flask_exts-0.2.6/src/flask_exts/exts.py +0 -70
  363. flask_exts-0.2.6/src/flask_exts/proxies.py +0 -19
  364. flask_exts-0.2.6/src/flask_exts/security/__init__.py +0 -6
  365. flask_exts-0.2.6/src/flask_exts/security/authorizer/casbin_authorizer.py +0 -108
  366. flask_exts-0.2.6/src/flask_exts/security/authorizer/sqlalchemy_adapter.py +0 -245
  367. flask_exts-0.2.6/src/flask_exts/security/email_verification.py +0 -84
  368. flask_exts-0.2.6/src/flask_exts/security/principal/identity.py +0 -37
  369. flask_exts-0.2.6/src/flask_exts/security/principal/identity_context.py +0 -52
  370. flask_exts-0.2.6/src/flask_exts/security/principal/permission.py +0 -297
  371. flask_exts-0.2.6/src/flask_exts/security/principal/principal.py +0 -197
  372. flask_exts-0.2.6/src/flask_exts/security/reset_password.py +0 -78
  373. flask_exts-0.2.6/src/flask_exts/template/base.py +0 -18
  374. flask_exts-0.2.6/src/flask_exts/template/form/base_form.py +0 -16
  375. flask_exts-0.2.6/src/flask_exts/template/form/form_opts.py +0 -6
  376. flask_exts-0.2.6/src/flask_exts/template/form/utils.py +0 -48
  377. flask_exts-0.2.6/src/flask_exts/template/funcs.py +0 -39
  378. flask_exts-0.2.6/src/flask_exts/template/rules.py +0 -396
  379. flask_exts-0.2.6/src/flask_exts/template/widgets/inline.py +0 -15
  380. flask_exts-0.2.6/src/flask_exts/template/widgets/render_template.py +0 -25
  381. flask_exts-0.2.6/src/flask_exts/themes/plugins/base_plugin.py +0 -9
  382. flask_exts-0.2.6/src/flask_exts/themes/plugins/bootstrap4_plugin.py +0 -17
  383. flask_exts-0.2.6/src/flask_exts/themes/plugins/clipboard_plugin.py +0 -10
  384. flask_exts-0.2.6/src/flask_exts/themes/plugins/copybutton_plugin.py +0 -12
  385. flask_exts-0.2.6/src/flask_exts/themes/plugins/detail_filter_plugin.py +0 -10
  386. flask_exts-0.2.6/src/flask_exts/themes/plugins/jquery_plugin.py +0 -10
  387. flask_exts-0.2.6/src/flask_exts/themes/plugins/list_action_plugin.py +0 -10
  388. flask_exts-0.2.6/src/flask_exts/themes/plugins/plugin_manager.py +0 -83
  389. flask_exts-0.2.6/src/flask_exts/themes/plugins/qrcode_plugin.py +0 -10
  390. flask_exts-0.2.6/src/flask_exts/themes/plugins/rediscli_plugin.py +0 -13
  391. flask_exts-0.2.6/src/flask_exts/themes/plugins/sphinx_copybutton_plugin.py +0 -13
  392. flask_exts-0.2.6/src/flask_exts/themes/static/js/filters.js +0 -205
  393. flask_exts-0.2.6/src/flask_exts/themes/static/js/form.js +0 -680
  394. flask_exts-0.2.6/src/flask_exts/themes/static/js/modal.js +0 -8
  395. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/bootstrap-icons.svg +0 -1
  396. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.css +0 -2078
  397. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.json +0 -2052
  398. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.min.css +0 -5
  399. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/bootstrap-icons.scss +0 -2090
  400. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
  401. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
  402. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap4/bootstrap.bundle.min.js +0 -7
  403. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap4/bootstrap.min.css +0 -7
  404. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap5/bootstrap.bundle.min.js +0 -7
  405. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/bootstrap5/bootstrap.min.css +0 -6
  406. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/clipboard/clipboard.min.js +0 -7
  407. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/daterangepicker/daterangepicker.css +0 -410
  408. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/daterangepicker/daterangepicker.js +0 -1578
  409. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/jquery/jquery.min.js +0 -2
  410. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/moment.min.js +0 -1
  411. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/select2/select2.min.css +0 -1
  412. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/select2/select2.min.js +0 -2
  413. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/vanilla-editor/css/bootstrap-editable.css +0 -670
  414. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/vanilla-editor/img/clear.png +0 -0
  415. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/vanilla-editor/img/loading.gif +0 -0
  416. flask_exts-0.2.6/src/flask_exts/themes/static/vendor/vanilla-editor/js/bootstrap-editable.min.js +0 -1
  417. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/index.html +0 -11
  418. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/master.html +0 -47
  419. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/create.html +0 -31
  420. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/details.html +0 -57
  421. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/edit.html +0 -41
  422. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/list.html +0 -205
  423. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/modals/create.html +0 -12
  424. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/modals/details.html +0 -42
  425. flask_exts-0.2.6/src/flask_exts/themes/templates/default/admin/model/modals/edit.html +0 -14
  426. flask_exts-0.2.6/src/flask_exts/themes/templates/default/base.html +0 -15
  427. flask_exts-0.2.6/src/flask_exts/themes/templates/default/bootstrap4/form.html +0 -313
  428. flask_exts-0.2.6/src/flask_exts/themes/templates/default/bootstrap4/message.html +0 -37
  429. flask_exts-0.2.6/src/flask_exts/themes/templates/default/bootstrap4/pagination.html +0 -79
  430. flask_exts-0.2.6/src/flask_exts/themes/templates/default/bootstrap5/form.html +0 -303
  431. flask_exts-0.2.6/src/flask_exts/themes/templates/default/bootstrap5/message.html +0 -38
  432. flask_exts-0.2.6/src/flask_exts/themes/templates/default/index.html +0 -22
  433. flask_exts-0.2.6/src/flask_exts/themes/templates/default/layout.html +0 -11
  434. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/actions.html +0 -42
  435. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/form.html +0 -168
  436. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/icon.html +0 -16
  437. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/inline.html +0 -45
  438. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/layout.html +0 -107
  439. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/menu.html +0 -98
  440. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/message.html +0 -17
  441. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/nav.html +0 -17
  442. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/pagination.html +0 -95
  443. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/row_actions.html +0 -40
  444. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/table.html +0 -141
  445. flask_exts-0.2.6/src/flask_exts/themes/templates/default/macro/vendor.html +0 -17
  446. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/file/form.html +0 -9
  447. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/file/list.html +0 -202
  448. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/file/modals/form.html +0 -9
  449. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/rediscli/console.html +0 -29
  450. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/rediscli/response.html +0 -32
  451. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/change_password.html +0 -11
  452. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/forgot_password.html +0 -11
  453. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/index.html +0 -24
  454. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/list.html +0 -7
  455. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/login.html +0 -14
  456. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/recovery.html +0 -10
  457. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/recovery_codes.html +0 -50
  458. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/register.html +0 -14
  459. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/reset_password.html +0 -11
  460. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/setup_tfa.html +0 -45
  461. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/show_tfa.html +0 -18
  462. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/verify_email.html +0 -9
  463. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/verify_tfa.html +0 -11
  464. flask_exts-0.2.6/src/flask_exts/themes/templates/default/views/user/verify_tfa_modal.html +0 -17
  465. flask_exts-0.2.6/src/flask_exts/themes/templates/default/widgets/inline_field_list.html +0 -4
  466. flask_exts-0.2.6/src/flask_exts/themes/templates/default/widgets/inline_form.html +0 -5
  467. flask_exts-0.2.6/src/flask_exts/themes/theme.py +0 -49
  468. flask_exts-0.2.6/src/flask_exts/translations/en/LC_MESSAGES/messages.po +0 -577
  469. flask_exts-0.2.6/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  470. flask_exts-0.2.6/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +0 -564
  471. flask_exts-0.2.6/src/flask_exts/types.py +0 -8
  472. flask_exts-0.2.6/src/flask_exts/usercenter/base_user_store.py +0 -29
  473. flask_exts-0.2.6/src/flask_exts/usercenter/core.py +0 -43
  474. flask_exts-0.2.6/src/flask_exts/usercenter/models/webauthn.py +0 -41
  475. flask_exts-0.2.6/src/flask_exts/utils/__init__.py +0 -5
  476. flask_exts-0.2.6/src/flask_exts/utils/flask.py +0 -16
  477. flask_exts-0.2.6/src/flask_exts/utils/image.py +0 -12
  478. flask_exts-0.2.6/src/flask_exts/utils/jwt.py +0 -34
  479. flask_exts-0.2.6/src/flask_exts/utils/request_user.py +0 -64
  480. flask_exts-0.2.6/src/flask_exts/utils/sqla.py +0 -220
  481. flask_exts-0.2.6/src/flask_exts/utils/tools.py +0 -177
  482. flask_exts-0.2.6/src/flask_exts/utils/url.py +0 -38
  483. flask_exts-0.2.6/src/flask_exts/views/file/__init__.py +0 -1
  484. flask_exts-0.2.6/src/flask_exts/views/file/base_file_view.py +0 -1161
  485. flask_exts-0.2.6/src/flask_exts/views/file/local_file_storage.py +0 -122
  486. flask_exts-0.2.6/src/flask_exts/views/file/local_file_view.py +0 -15
  487. flask_exts-0.2.6/src/flask_exts/views/rediscli/mock_redis.py +0 -155
  488. flask_exts-0.2.6/src/flask_exts/views/rediscli/view.py +0 -185
  489. flask_exts-0.2.6/tests/__init__.py +0 -1
  490. flask_exts-0.2.6/tests/admin/customer/conftest.py +0 -37
  491. flask_exts-0.2.6/tests/admin/customer/templates/mock.html +0 -1
  492. flask_exts-0.2.6/tests/admin/customer/test_admin.py +0 -96
  493. flask_exts-0.2.6/tests/admin/sqla/__init__.py +0 -0
  494. flask_exts-0.2.6/tests/admin/sqla/test_basic.py +0 -2511
  495. flask_exts-0.2.6/tests/admin/sqla/test_form_rules.py +0 -86
  496. flask_exts-0.2.6/tests/admin/sqla/test_inlineform.py +0 -196
  497. flask_exts-0.2.6/tests/admin/sqla/test_multi_pk.py +0 -132
  498. flask_exts-0.2.6/tests/models/__init__.py +0 -6
  499. flask_exts-0.2.6/tests/models/message.py +0 -15
  500. flask_exts-0.2.6/tests/models/model1.py +0 -175
  501. flask_exts-0.2.6/tests/models/multpk.py +0 -7
  502. flask_exts-0.2.6/tests/models/polymorphic.py +0 -35
  503. flask_exts-0.2.6/tests/models/tree.py +0 -7
  504. flask_exts-0.2.6/tests/models/user.py +0 -41
  505. flask_exts-0.2.6/tests/security/authorizer/__init__.py +0 -0
  506. flask_exts-0.2.6/tests/security/authorizer/casbin_adapter/rbac_model.conf +0 -14
  507. flask_exts-0.2.6/tests/security/authorizer/casbin_adapter/rbac_policy.csv +0 -6
  508. flask_exts-0.2.6/tests/security/authorizer/casbin_adapter/test_sqlalchemy_adapter.py +0 -392
  509. flask_exts-0.2.6/tests/security/authorizer/casbin_files/authz_policy.csv +0 -11
  510. flask_exts-0.2.6/tests/security/authorizer/casbin_files/rbac_model.conf +0 -14
  511. flask_exts-0.2.6/tests/security/authorizer/casbin_files/rbac_policy.csv +0 -8
  512. flask_exts-0.2.6/tests/security/authorizer/test_casbin_auth.py +0 -148
  513. flask_exts-0.2.6/tests/security/test_principal.py +0 -705
  514. flask_exts-0.2.6/tests/template/__init__.py +0 -0
  515. flask_exts-0.2.6/tests/template/bootstrap4/__init__.py +0 -0
  516. flask_exts-0.2.6/tests/template/bootstrap4/test_render_field.py +0 -94
  517. flask_exts-0.2.6/tests/template/bootstrap4/test_render_form.py +0 -241
  518. flask_exts-0.2.6/tests/template/bootstrap4/test_render_form_row.py +0 -67
  519. flask_exts-0.2.6/tests/template/bootstrap4/test_render_hidden_errors.py +0 -30
  520. flask_exts-0.2.6/tests/template/bootstrap4/test_render_icon.py +0 -88
  521. flask_exts-0.2.6/tests/template/bootstrap4/test_render_messages.py +0 -59
  522. flask_exts-0.2.6/tests/template/bootstrap4/test_render_pager.py +0 -35
  523. flask_exts-0.2.6/tests/template/bootstrap4/test_render_pagination.py +0 -35
  524. flask_exts-0.2.6/tests/template/bootstrap4/test_render_table.py +0 -334
  525. flask_exts-0.2.6/tests/template/bootstrap5/__init__.py +0 -0
  526. flask_exts-0.2.6/tests/template/bootstrap5/_test_base.py +0 -16
  527. flask_exts-0.2.6/tests/template/bootstrap5/_test_render_form.py +0 -152
  528. flask_exts-0.2.6/tests/template/bootstrap5/_test_render_form_row.py +0 -19
  529. flask_exts-0.2.6/tests/template/bootstrap5/_test_render_messages.py +0 -16
  530. flask_exts-0.2.6/tests/template/bootstrap5/_test_render_pagination.py +0 -33
  531. flask_exts-0.2.6/tests/template/bootstrap5/conftest.py +0 -15
  532. flask_exts-0.2.6/tests/template/forms/test_csrf.py +0 -38
  533. flask_exts-0.2.6/tests/template/forms/test_fields.py +0 -76
  534. flask_exts-0.2.6/tests/template/macros/test_render_nav_item.py +0 -22
  535. flask_exts-0.2.6/tests/template/test_base.py +0 -16
  536. flask_exts-0.2.6/tests/templates/method.html +0 -1
  537. flask_exts-0.2.6/tests/templates/mock.html +0 -1
  538. flask_exts-0.2.6/tests/test_base.py +0 -29
  539. flask_exts-0.2.6/tests/test_flask.py +0 -34
  540. flask_exts-0.2.6/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
  541. flask_exts-0.2.6/tests/translations/en/LC_MESSAGES/messages.po +0 -24
  542. flask_exts-0.2.6/tests/translations/zh_CN/LC_MESSAGES/messages.po +0 -24
  543. flask_exts-0.2.6/tests/usercenter/test_sqla_usercenter.py +0 -34
  544. flask_exts-0.2.6/tests/utils/test_image.py +0 -7
  545. flask_exts-0.2.6/tests/utils/test_url.py +0 -19
  546. flask_exts-0.2.6/tests/views/files/dummy.txt +0 -0
  547. flask_exts-0.2.6/tests/views/test_file_view.py +0 -219
  548. flask_exts-0.2.6/tests/views/test_rediscli_view.py +0 -12
  549. {flask_exts-0.2.6 → flask_exts-0.2.8}/.github/workflows/release.yml +0 -0
  550. {flask_exts-0.2.6 → flask_exts-0.2.8}/.readthedocs.yaml +0 -0
  551. {flask_exts-0.2.6 → flask_exts-0.2.8}/LICENSE.rst +0 -0
  552. {flask_exts-0.2.6 → flask_exts-0.2.8}/babel/babel.cfg +0 -0
  553. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/Makefile +0 -0
  554. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/_static/logo.png +0 -0
  555. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/changes.rst +0 -0
  556. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/make.bat +0 -0
  557. {flask_exts-0.2.6 → flask_exts-0.2.8}/docs/requirements.txt +0 -0
  558. {flask_exts-0.2.6/examples/bootstrap → flask_exts-0.2.8/examples/demo}/__init__.py +0 -0
  559. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/file_op.py +0 -0
  560. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/models/post_tag.py +0 -0
  561. {flask_exts-0.2.6 → flask_exts-0.2.8}/examples/demo/static/favicon.ico +0 -0
  562. {flask_exts-0.2.6 → flask_exts-0.2.8}/requirements/build.in +0 -0
  563. {flask_exts-0.2.6 → flask_exts-0.2.8}/requirements/test.in +0 -0
  564. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/constants.py +0 -0
  565. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/datastore/__init__.py +0 -0
  566. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/__init__.py +0 -0
  567. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/reset_password_sender.py +0 -0
  568. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/sender.py +0 -0
  569. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/smtp.py +0 -0
  570. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/email/verify_email_sender.py +0 -0
  571. {flask_exts-0.2.6/src/flask_exts/security/authorizer → flask_exts-0.2.8/src/flask_exts/extension_core}/__init__.py +0 -0
  572. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/__init__.py +0 -0
  573. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/file.py +0 -0
  574. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/recaptcha.py +0 -0
  575. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/fields/switch.py +0 -0
  576. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/form/flask_form.py +0 -0
  577. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/form/session_csrf.py +0 -0
  578. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/validators/__init__.py +0 -0
  579. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/validators/field_list.py +0 -0
  580. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/validators/file.py +0 -0
  581. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/validators/recaptcha.py +0 -0
  582. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/checkbox.py +0 -0
  583. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/datetime.py +0 -0
  584. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/file.py +0 -0
  585. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/recaptcha.py +0 -0
  586. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/src/flask_exts/forms}/widgets/select.py +0 -0
  587. {flask_exts-0.2.6/src/flask_exts/template/form → flask_exts-0.2.8/src/flask_exts/html}/__init__.py +0 -0
  588. {flask_exts-0.2.6/src/flask_exts/template/forms → flask_exts-0.2.8/src/flask_exts/html/plugins}/__init__.py +0 -0
  589. {flask_exts-0.2.6/src/flask_exts/themes/plugins → flask_exts-0.2.8/src/flask_exts/security}/__init__.py +0 -0
  590. {flask_exts-0.2.6/src/flask_exts/translations → flask_exts-0.2.8/src/flask_exts/security/authorizer}/__init__.py +0 -0
  591. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/security/hasher.py +0 -0
  592. {flask_exts-0.2.6/src/flask_exts/security → flask_exts-0.2.8/src/flask_exts/security/plugins}/two_factor_authentication.py +0 -0
  593. {flask_exts-0.2.6 → flask_exts-0.2.8}/src/flask_exts/security/serializer.py +0 -0
  594. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/css/admin.css +0 -0
  595. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/css/rediscli.css +0 -0
  596. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/copybutton.js +0 -0
  597. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/detail_filter.js +0 -0
  598. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/qrcode.js +0 -0
  599. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/rediscli.js +0 -0
  600. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/security/base64.js +0 -0
  601. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/js/security/webauthn.js +0 -0
  602. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/logo.png +0 -0
  603. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/vendor/sphinx-copybutton/sphinx-copybutton.css +0 -0
  604. {flask_exts-0.2.6/src/flask_exts/themes → flask_exts-0.2.8/src/flask_exts}/static/vendor/sphinx-copybutton/sphinx-copybutton.js +0 -0
  605. {flask_exts-0.2.6/src/flask_exts/usercenter → flask_exts-0.2.8/src/flask_exts/translations}/__init__.py +0 -0
  606. {flask_exts-0.2.6/src/flask_exts/usercenter/models → flask_exts-0.2.8/src/flask_exts/usercenter}/__init__.py +0 -0
  607. {flask_exts-0.2.6/src/flask_exts/views/index → flask_exts-0.2.8/src/flask_exts/web/default_views}/__init__.py +0 -0
  608. {flask_exts-0.2.6/src/flask_exts/views/rediscli → flask_exts-0.2.8/src/flask_exts/web/sqla}/__init__.py +0 -0
  609. {flask_exts-0.2.6/src/flask_exts/template → flask_exts-0.2.8/tests}/__init__.py +0 -0
  610. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/data/copyleft.gif +0 -0
  611. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/data/copyleft.jpeg +0 -0
  612. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/data/copyleft.jpg +0 -0
  613. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/data/copyleft.png +0 -0
  614. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/data/copyleft.tiff +0 -0
  615. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/email/test_base.py +0 -0
  616. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/email/test_smtp.py +0 -0
  617. /flask_exts-0.2.6/examples/fileadmin/tmp/bbb/a.txt → /flask_exts-0.2.8/tests/forms/fields/test_inline.py +0 -0
  618. {flask_exts-0.2.6 → flask_exts-0.2.8}/tests/helper.py +0 -0
  619. {flask_exts-0.2.6/src/flask_exts/views/user → flask_exts-0.2.8/tests/html}/__init__.py +0 -0
  620. {flask_exts-0.2.6/tests/admin → flask_exts-0.2.8/tests/web}/__init__.py +0 -0
@@ -0,0 +1,8 @@
1
+ {
2
+ "profile": "jinja",
3
+ "indent": 2,
4
+ "ignore": "T003",
5
+ "max_attribute_length": 180,
6
+ "max_line_length": 180,
7
+ "preserve_blank_lines": true
8
+ }
@@ -33,5 +33,9 @@ docs/_build/
33
33
  # sqlite db
34
34
  *.sqlite
35
35
 
36
+ # npm front-end deps (symlinked into src/flask_exts/static/vendor; install via `npm ci`)
37
+ node_modules/
38
+ package-lock.json
39
+
36
40
  # production config
37
41
  **/config_prod.py
@@ -1,3 +1,18 @@
1
+ v0.2.8
2
+ ------
3
+
4
+ Released 2026-09-27
5
+
6
+ - rewrite extension
7
+ - rewrite editable.js
8
+
9
+ v0.2.7
10
+ ------
11
+
12
+ Released 2026-08-14
13
+
14
+ - rewrite db
15
+
1
16
  v0.2.6
2
17
  ------
3
18
 
@@ -40,11 +55,8 @@ v0.2.2
40
55
  Released 2025-04-09
41
56
 
42
57
  - fix datetimepicker
43
- - set session = db.session as default if ModelView of sqla init session is None
44
- - set session = db.session as default if QueryAjaxModelLoader init session is None
45
58
  - fix select.ajax for select2@4.1.0
46
59
  - fix select in modal
47
- - add casbin
48
60
  - add module: security
49
61
 
50
62
  v0.2.1
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: Flask-Exts
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Summary: Flask extensions with admin, SQLAlchemy, babel, forms, fields, widgets, and so on.
5
5
  Project-URL: Documentation, https://flask-exts.readthedocs.io
6
6
  Project-URL: Source, https://github.com/ojso/flask-exts
@@ -39,22 +39,18 @@ Classifier: Programming Language :: Python
39
39
  Classifier: Programming Language :: Python :: 3
40
40
  Classifier: Programming Language :: Python :: 3.10
41
41
  Classifier: Programming Language :: Python :: 3.11
42
+ Classifier: Programming Language :: Python :: 3.12
43
+ Classifier: Programming Language :: Python :: 3.13
42
44
  Classifier: Topic :: Software Development :: Build Tools
43
45
  Requires-Python: >=3.10
44
- Requires-Dist: casbin>=1.0
45
46
  Requires-Dist: flask-babel>=4.0
46
47
  Requires-Dist: flask-login>=0.6
47
- Requires-Dist: flask-sqlalchemy>=3.0
48
48
  Requires-Dist: flask>=3.0
49
- Requires-Dist: pillow>=11.0
50
49
  Requires-Dist: pyjwt>=2.0
51
50
  Requires-Dist: pyotp>=2.0
52
- Requires-Dist: qrcode>=8.0
51
+ Requires-Dist: sqlalchemy>=2.0
53
52
  Requires-Dist: tablib>=3.0
54
- Requires-Dist: webauthn>=2.0
55
53
  Requires-Dist: wtforms>=3.0
56
- Provides-Extra: rediscli
57
- Requires-Dist: redis>=4.0.0; extra == 'rediscli'
58
54
  Description-Content-Type: text/x-rst
59
55
 
60
56
  Flask Exts
@@ -62,11 +58,10 @@ Flask Exts
62
58
 
63
59
  Flask-Exts is mainly inspired by:
64
60
 
65
- - `Bootstrap <https://getbootstrap.com/>`_
66
61
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
67
- - `Flask-Security <https://github.com/pallets-eco/flask-security/>`_
62
+ - `Bootstrap <https://getbootstrap.com/>`_
68
63
 
69
- Flask-Exts is partially rewrited from above and well tested.
64
+ Flask-Exts is a Flask extension toolkit that combines SQLAlchemy, forms, Babel, and admin features to help developers build modern web applications quickly.
70
65
 
71
66
  License
72
67
  -------
@@ -81,7 +76,7 @@ Install and update using pip:
81
76
 
82
77
  .. code-block:: console
83
78
 
84
- $ pip install -U Flask-Exts
79
+ $ pip install Flask-Exts
85
80
 
86
81
  Examples
87
82
  ----------
@@ -89,14 +84,12 @@ Examples
89
84
  .. code-block:: python
90
85
 
91
86
  from flask import Flask
92
- from flask_exts import Exts
87
+ from flask_exts import ExtensionManager
93
88
 
94
89
  app = Flask(__name__)
95
90
  app.config["SECRET_KEY"] = "dev"
96
- # Exts init
97
- exts = Exts()
91
+ exts = ExtensionManager()
98
92
  exts.init_app(app)
99
93
 
100
94
  if __name__ == "__main__":
101
95
  app.run(debug=True)
102
-
@@ -3,11 +3,10 @@ Flask Exts
3
3
 
4
4
  Flask-Exts is mainly inspired by:
5
5
 
6
- - `Bootstrap <https://getbootstrap.com/>`_
7
6
  - `Flask-Admin <https://github.com/pallets-eco/flask-admin/>`_
8
- - `Flask-Security <https://github.com/pallets-eco/flask-security/>`_
7
+ - `Bootstrap <https://getbootstrap.com/>`_
9
8
 
10
- Flask-Exts is partially rewrited from above and well tested.
9
+ Flask-Exts is a Flask extension toolkit that combines SQLAlchemy, forms, Babel, and admin features to help developers build modern web applications quickly.
11
10
 
12
11
  License
13
12
  -------
@@ -22,7 +21,7 @@ Install and update using pip:
22
21
 
23
22
  .. code-block:: console
24
23
 
25
- $ pip install -U Flask-Exts
24
+ $ pip install Flask-Exts
26
25
 
27
26
  Examples
28
27
  ----------
@@ -30,14 +29,12 @@ Examples
30
29
  .. code-block:: python
31
30
 
32
31
  from flask import Flask
33
- from flask_exts import Exts
32
+ from flask_exts import ExtensionManager
34
33
 
35
34
  app = Flask(__name__)
36
35
  app.config["SECRET_KEY"] = "dev"
37
- # Exts init
38
- exts = Exts()
36
+ exts = ExtensionManager()
39
37
  exts.init_app(app)
40
38
 
41
39
  if __name__ == "__main__":
42
40
  app.run(debug=True)
43
-
@@ -1,5 +1,5 @@
1
1
  # extract messages from source files and generate a POT file
2
- pybabel extract -F babel/babel.cfg -k lazy_gettext -o babel/messages.pot --project Flask-Exts src/flask_exts/ tests/
2
+ pybabel extract -F babel/babel.cfg -k lazy_gettext -o babel/messages.pot --project Flask-Exts src/flask_exts/
3
3
 
4
4
  # update PO files from a POT file
5
5
  pybabel update -i babel/messages.pot -d src/flask_exts/translations -D messages
@@ -0,0 +1,346 @@
1
+ # Translations template for Flask-Exts.
2
+ # Copyright (C) 2026 ORGANIZATION
3
+ # This file is distributed under the same license as the Flask-Exts project.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2026.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: Flask-Exts VERSION\n"
10
+ "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
+ "POT-Creation-Date: 2026-05-24 22:01+0800\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=utf-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Generated-By: Babel 2.17.0\n"
19
+
20
+ #: src/flask_exts/admin/model/actions.py:114
21
+ msgid "Delete"
22
+ msgstr ""
23
+
24
+ #: src/flask_exts/admin/model/actions.py:115
25
+ msgid "Are you sure you want to delete selected records?"
26
+ msgstr ""
27
+
28
+ #: src/flask_exts/admin/model/actions.py:121
29
+ #: src/flask_exts/admin/model/view.py:1417
30
+ #, python-format
31
+ msgid "Record was successfully deleted."
32
+ msgid_plural "%(count)s records were successfully deleted."
33
+ msgstr[0] ""
34
+ msgstr[1] ""
35
+
36
+ #: src/flask_exts/admin/model/filter.py:88
37
+ #: src/flask_exts/template/forms/widgets/xeditable.py:53
38
+ msgid "Yes"
39
+ msgstr ""
40
+
41
+ #: src/flask_exts/admin/model/filter.py:88
42
+ #: src/flask_exts/template/forms/widgets/xeditable.py:52
43
+ msgid "No"
44
+ msgstr ""
45
+
46
+ #: src/flask_exts/admin/model/filter.py:178
47
+ msgid "between"
48
+ msgstr ""
49
+
50
+ #: src/flask_exts/admin/model/filter_mixin.py:182
51
+ #, python-format
52
+ msgid "Invalid Filter Value: %(value)s"
53
+ msgstr ""
54
+
55
+ #: src/flask_exts/admin/model/rowaction.py:15
56
+ #: src/flask_exts/admin/model/rowaction.py:22
57
+ msgid "View Record"
58
+ msgstr ""
59
+
60
+ #: src/flask_exts/admin/model/rowaction.py:29
61
+ #: src/flask_exts/admin/model/rowaction.py:36
62
+ #: src/flask_exts/templates/admin/model/modals/edit.html:2
63
+ msgid "Edit Record"
64
+ msgstr ""
65
+
66
+ #: src/flask_exts/admin/model/rowaction.py:43
67
+ msgid "Delete Record"
68
+ msgstr ""
69
+
70
+ #: src/flask_exts/admin/model/rowaction.py:45
71
+ msgid "Are you sure you want to delete this record?"
72
+ msgstr ""
73
+
74
+ #: src/flask_exts/admin/model/view.py:1295
75
+ msgid "Record was successfully created."
76
+ msgstr ""
77
+
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
82
+ msgid "Record does not exist."
83
+ msgstr ""
84
+
85
+ #: src/flask_exts/admin/model/view.py:1347
86
+ #: src/flask_exts/admin/model/view.py:1599
87
+ msgid "Record was successfully saved."
88
+ msgstr ""
89
+
90
+ #: src/flask_exts/admin/model/view.py:1470
91
+ msgid "Permission denied."
92
+ msgstr ""
93
+
94
+ #: src/flask_exts/admin/model/view.py:1549
95
+ #, python-format
96
+ msgid "Export type \"%(type)s not supported."
97
+ msgstr ""
98
+
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
103
+ #, python-format
104
+ msgid "Failed to update record. %(error)s"
105
+ msgstr ""
106
+
107
+ #: src/flask_exts/admin/sqla/filter.py:43
108
+ msgid "equals"
109
+ msgstr ""
110
+
111
+ #: src/flask_exts/admin/sqla/filter.py:51
112
+ msgid "not equal"
113
+ msgstr ""
114
+
115
+ #: src/flask_exts/admin/sqla/filter.py:59
116
+ msgid "greater than"
117
+ msgstr ""
118
+
119
+ #: src/flask_exts/admin/sqla/filter.py:67
120
+ msgid "smaller than"
121
+ msgstr ""
122
+
123
+ #: src/flask_exts/admin/sqla/filter.py:75
124
+ msgid "contains"
125
+ msgstr ""
126
+
127
+ #: src/flask_exts/admin/sqla/filter.py:83
128
+ msgid "not contains"
129
+ msgstr ""
130
+
131
+ #: src/flask_exts/admin/sqla/filter.py:91
132
+ msgid "empty"
133
+ msgstr ""
134
+
135
+ #: src/flask_exts/admin/sqla/filter.py:105
136
+ msgid "in list"
137
+ msgstr ""
138
+
139
+ #: src/flask_exts/admin/sqla/filter.py:116
140
+ msgid "not in list"
141
+ msgstr ""
142
+
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
146
+ msgid "not between"
147
+ msgstr ""
148
+
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
164
+ msgid "Not a valid choice"
165
+ msgstr ""
166
+
167
+ #: src/flask_exts/template/forms/fields/datetime.py:102
168
+ msgid "Invalid time format"
169
+ msgstr ""
170
+
171
+ #: src/flask_exts/template/forms/fields/file.py:66
172
+ #: src/flask_exts/template/forms/fields/file.py:76
173
+ #, python-format
174
+ msgid "File \"%s\" already exists."
175
+ msgstr ""
176
+
177
+ #: src/flask_exts/template/forms/fields/json.py:13
178
+ msgid "Invalid JSON"
179
+ msgstr ""
180
+
181
+ #: src/flask_exts/template/forms/fields/select.py:62
182
+ msgid "Invalid Choice: could not coerce"
183
+ msgstr ""
184
+
185
+ #: src/flask_exts/template/forms/form/csrf.py:57
186
+ msgid "CSRF token expired."
187
+ msgstr ""
188
+
189
+ #: src/flask_exts/template/forms/validators/field_list.py:11
190
+ msgid "This field requires at least one item."
191
+ msgstr ""
192
+
193
+ #: src/flask_exts/template/forms/validators/file.py:18
194
+ msgid "This field is required."
195
+ msgstr ""
196
+
197
+ #: src/flask_exts/template/forms/validators/file.py:50
198
+ #, python-brace-format
199
+ msgid "File does not have an approved extension: {extensions}"
200
+ msgstr ""
201
+
202
+ #: src/flask_exts/template/forms/validators/file.py:85
203
+ #, python-brace-format
204
+ msgid "File must be between {min_size} and {max_size} bytes."
205
+ msgstr ""
206
+
207
+ #: src/flask_exts/template/forms/validators/sqla.py:38
208
+ msgid "Already exists."
209
+ msgstr ""
210
+
211
+ #: src/flask_exts/template/forms/validators/sqla.py:56
212
+ #, python-format
213
+ msgid "At least %(num)d item is required"
214
+ msgid_plural "At least %(num)d items are required"
215
+ msgstr[0] ""
216
+ msgstr[1] ""
217
+
218
+ #: src/flask_exts/template/forms/widgets/select.py:72
219
+ msgid "Please select model"
220
+ msgstr ""
221
+
222
+ #: src/flask_exts/templates/admin/model/create.html:8
223
+ #: src/flask_exts/templates/admin/model/edit.html:7
224
+ msgid "List"
225
+ msgstr ""
226
+
227
+ #: src/flask_exts/templates/admin/model/create.html:11
228
+ #: src/flask_exts/templates/admin/model/edit.html:11
229
+ msgid "Create"
230
+ msgstr ""
231
+
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
+ #: src/flask_exts/templates/admin/model/modals/create.html:2
241
+ msgid "Create New Record"
242
+ msgstr ""
243
+
244
+ #: src/flask_exts/templates/macro/form.html:62
245
+ #: src/flask_exts/templates/macro/form.html:75
246
+ msgid "Save"
247
+ msgstr ""
248
+
249
+ #: src/flask_exts/templates/macro/form.html:74
250
+ msgid "Cancel"
251
+ msgstr ""
252
+
253
+ #: src/flask_exts/templates/macro/form.html:81
254
+ msgid "Save and Add Another"
255
+ msgstr ""
256
+
257
+ #: src/flask_exts/templates/macro/form.html:82
258
+ msgid "Save and Continue Editing"
259
+ msgstr ""
260
+
261
+ #: src/flask_exts/templates/macro/layout.html:4
262
+ #: src/flask_exts/templates/macro/layout.html:7
263
+ #: src/flask_exts/templates/macro/layout.html:13
264
+ msgid "Export"
265
+ msgstr ""
266
+
267
+ #: src/flask_exts/templates/macro/layout.html:20
268
+ msgid "Add Filter"
269
+ msgstr ""
270
+
271
+ #: src/flask_exts/templates/macro/layout.html:29
272
+ msgid "items"
273
+ msgstr ""
274
+
275
+ #: src/flask_exts/templates/user/index.html:10
276
+ msgid "User ID"
277
+ msgstr ""
278
+
279
+ #: src/flask_exts/templates/user/index.html:11
280
+ msgid "Account Name"
281
+ msgstr ""
282
+
283
+ #: src/flask_exts/templates/user/index.html:12
284
+ msgid "Email Address"
285
+ msgstr ""
286
+
287
+ #: src/flask_exts/templates/user/index.html:14
288
+ msgid "Security Status"
289
+ msgstr ""
290
+
291
+ #: src/flask_exts/templates/user/index.html:15
292
+ msgid "Verified"
293
+ msgstr ""
294
+
295
+ #: src/flask_exts/templates/user/index.html:15
296
+ msgid "Pending Verification"
297
+ msgstr ""
298
+
299
+ #: src/flask_exts/templates/user/index.html:26
300
+ msgid "Action Required"
301
+ msgstr ""
302
+
303
+ #: src/flask_exts/templates/user/index.html:27
304
+ msgid "Verify Now"
305
+ msgstr ""
306
+
307
+ #: src/flask_exts/templates/user/index.html:33
308
+ msgid "Password Management"
309
+ msgstr ""
310
+
311
+ #: src/flask_exts/templates/user/index.html:34
312
+ msgid "Change Password"
313
+ msgstr ""
314
+
315
+ #: src/flask_exts/templates/user/index.html:39
316
+ msgid "Two-Factor Auth"
317
+ msgstr ""
318
+
319
+ #: src/flask_exts/templates/user/index.html:40
320
+ msgid "Set Up 2FA"
321
+ msgstr ""
322
+
323
+ #: src/flask_exts/templates/user/index.html:45
324
+ msgid "Session Control"
325
+ msgstr ""
326
+
327
+ #: src/flask_exts/templates/user/index.html:46
328
+ msgid "Log Out"
329
+ msgstr ""
330
+
331
+ #: src/flask_exts/templates/user/login.html:18
332
+ msgid "Don't have an account?"
333
+ msgstr ""
334
+
335
+ #: src/flask_exts/templates/user/login.html:19
336
+ msgid "Sign Up"
337
+ msgstr ""
338
+
339
+ #: src/flask_exts/templates/user/login.html:22
340
+ msgid "Forgot your password?"
341
+ msgstr ""
342
+
343
+ #: src/flask_exts/templates/user/login.html:23
344
+ msgid "Reset It"
345
+ msgstr ""
346
+