Flask-Exts 0.2.3__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flask_exts-0.2.3 → flask_exts-0.2.5}/CHANGES.rst +20 -2
- {flask_exts-0.2.3 → flask_exts-0.2.5}/PKG-INFO +4 -1
- flask_exts-0.2.5/docs/api.rst +9 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/configure.rst +4 -1
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/develop.rst +0 -25
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/index.rst +11 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/README.rst +25 -25
- flask_exts-0.2.5/examples/bootstrap/forms.py +113 -0
- flask_exts-0.2.5/examples/bootstrap/make_app.py +46 -0
- flask_exts-0.2.5/examples/bootstrap/models.py +19 -0
- flask_exts-0.2.5/examples/bootstrap/static/favicon.ico +0 -0
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/flash.html +1 -1
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/icon.html +4 -4
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/icons.html +2050 -2050
- flask_exts-0.2.5/examples/bootstrap/templates/bootstrap/index.html +16 -0
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/nav.html +8 -8
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/table.html +6 -6
- flask_exts-0.2.5/examples/bootstrap/templates/mybase.html +34 -0
- flask_exts-0.2.5/examples/bootstrap/view.py +151 -0
- flask_exts-0.2.5/examples/bootstrap5/static/favicon.ico +0 -0
- flask_exts-0.2.5/examples/demo/__init__.py +1 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/build_sample.py +4 -4
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/make_app.py +2 -6
- flask_exts-0.2.5/examples/demo/templates/my/index.html +7 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/file_view.py +1 -1
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/make_app.py +6 -9
- flask_exts-0.2.5/examples/rediscli.py +26 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/simple.py +9 -4
- {flask_exts-0.2.3 → flask_exts-0.2.5}/pyproject.toml +4 -1
- flask_exts-0.2.5/src/flask_exts/__about__.py +1 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/actions.py +0 -1
- flask_exts-0.2.3/src/flask_exts/admin/base_admin.py → flask_exts-0.2.5/src/flask_exts/admin/admin.py +20 -10
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/view.py +4 -12
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/form.py +3 -7
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/view.py +17 -3
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/commands.py +5 -5
- flask_exts-0.2.5/src/flask_exts/constants.py +6 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/sqla/orm.py +2 -3
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/base.py +33 -10
- flask_exts-0.2.5/src/flask_exts/email/reset_password_sender.py +12 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/manager.py +12 -25
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/proxies.py +2 -5
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/casbin_authorizer.py +1 -4
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/core.py +25 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/email_verification.py +6 -5
- flask_exts-0.2.5/src/flask_exts/security/reset_password.py +78 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/serializer.py +2 -2
- flask_exts-0.2.5/src/flask_exts/security/two_factor_authentication.py +38 -0
- flask_exts-0.2.5/src/flask_exts/template/base.py +18 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/flask_form.py +1 -6
- flask_exts-0.2.5/src/flask_exts/template/forms/change_password.py +28 -0
- flask_exts-0.2.5/src/flask_exts/template/forms/forgot_password.py +19 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/login.py +1 -1
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/profile.py +1 -1
- flask_exts-0.2.5/src/flask_exts/template/forms/recovery.py +10 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/template}/forms/register.py +1 -1
- flask_exts-0.2.5/src/flask_exts/template/forms/reset_password.py +16 -0
- flask_exts-0.2.5/src/flask_exts/template/forms/two_factor.py +10 -0
- flask_exts-0.2.5/src/flask_exts/template/funcs.py +39 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/base_plugin.py +9 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/bootstrap4_plugin.py +17 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/bootstrap5_plugin.py +17 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/clipboard_plugin.py +10 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/copybutton_plugin.py +12 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/jquery_plugin.py +10 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/plugin_manager.py +55 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/qrcode_plugin.py +10 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/rediscli_plugin.py +13 -0
- flask_exts-0.2.5/src/flask_exts/themes/plugins/sphinx_copybutton_plugin.py +13 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/css/rediscli.css +0 -2
- flask_exts-0.2.5/src/flask_exts/themes/static/js/copybutton.js +45 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/modal.js +1 -1
- flask_exts-0.2.5/src/flask_exts/themes/static/js/qrcode.js +1945 -0
- flask_exts-0.2.5/src/flask_exts/themes/static/js/rediscli.js +142 -0
- flask_exts-0.2.5/src/flask_exts/themes/static/vendor/clipboard/clipboard.min.js +7 -0
- flask_exts-0.2.5/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.css +97 -0
- flask_exts-0.2.5/src/flask_exts/themes/static/vendor/sphinx-copybutton/sphinx-copybutton.js +247 -0
- flask_exts-0.2.3/src/flask_exts/templates/admin/base.html → flask_exts-0.2.5/src/flask_exts/themes/templates/default/admin/master.html +6 -5
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/details.html +1 -1
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/list.html +4 -4
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/details.html +1 -1
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/base.html +3 -7
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/form.html +6 -6
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/pagination.html +3 -3
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap5/form.html +9 -9
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/layout.html +11 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/actions.html +4 -6
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/form.html +5 -5
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/icon.html +1 -10
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/macro/javascript.html +10 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/menu.html +2 -5
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/row_actions.html +2 -2
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/table.html +13 -12
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/macro/vendor.html +17 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/rediscli/console.html +34 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/rediscli/response.html +1 -1
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/change_password.html +11 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/forgot_password.html +11 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/index.html +24 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/login.html +4 -3
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/recovery.html +10 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/recovery_codes.html +50 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/register.html +1 -1
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/reset_password.html +11 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/setup_tfa.html +49 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/show_tfa.html +18 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/verify_tfa.html +11 -0
- flask_exts-0.2.5/src/flask_exts/themes/templates/default/views/user/verify_tfa_modal.html +17 -0
- flask_exts-0.2.5/src/flask_exts/themes/theme.py +49 -0
- flask_exts-0.2.5/src/flask_exts/usercenter/base_user.py +14 -0
- flask_exts-0.2.5/src/flask_exts/usercenter/base_user_store.py +29 -0
- flask_exts-0.2.5/src/flask_exts/usercenter/core.py +43 -0
- {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/role.py +3 -3
- {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/user.py +18 -13
- {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/user_profile.py +8 -10
- {flask_exts-0.2.3/src/flask_exts/datastore/sqla → flask_exts-0.2.5/src/flask_exts/usercenter}/models/webauthn.py +11 -8
- flask_exts-0.2.3/src/flask_exts/usercenter/sqla_usercenter.py → flask_exts-0.2.5/src/flask_exts/usercenter/sqla_user_store.py +11 -11
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/__init__.py +0 -2
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/decorators.py +3 -3
- flask_exts-0.2.5/src/flask_exts/utils/image.py +12 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/request_user.py +4 -4
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/tools.py +19 -35
- {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/base_file_view.py +1 -1
- flask_exts-0.2.5/src/flask_exts/views/index/view.py +26 -0
- flask_exts-0.2.5/src/flask_exts/views/rediscli/mock_redis.py +155 -0
- flask_exts-0.2.3/src/flask_exts/views/rediscli_view.py → flask_exts-0.2.5/src/flask_exts/views/rediscli/view.py +2 -7
- flask_exts-0.2.5/src/flask_exts/views/user/view.py +295 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/conftest.py +2 -9
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/test_admin.py +1 -2
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/test_base.py +5 -12
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/test_sqlalchemy_adapter.py +3 -3
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/test_casbin_auth.py +14 -14
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/test_core.py +11 -3
- flask_exts-0.2.5/tests/security/test_tfa.py +18 -0
- flask_exts-0.2.5/tests/template/__init__.py +0 -0
- flask_exts-0.2.5/tests/template/bootstrap4/__init__.py +0 -0
- flask_exts-0.2.3/tests/template/bootstrap4/test_render_icon_sprite.py → flask_exts-0.2.5/tests/template/bootstrap4/test_render_icon.py +12 -12
- flask_exts-0.2.5/tests/template/bootstrap5/__init__.py +0 -0
- flask_exts-0.2.5/tests/template/bootstrap5/conftest.py +15 -0
- flask_exts-0.2.5/tests/template/test_base.py +16 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_base.py +6 -4
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/zh_CN/LC_MESSAGES/messages.po +1 -1
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/usercenter/test_sqla_usercenter.py +3 -3
- flask_exts-0.2.5/tests/utils/test_image.py +7 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/utils/test_request_user.py +2 -2
- flask_exts-0.2.5/tests/views/files/dummy.txt +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/views/test_file_view.py +1 -1
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/views/test_rediscli_view.py +1 -1
- flask_exts-0.2.5/tests/views/test_user_view.py +481 -0
- flask_exts-0.2.3/examples/bootstrap4/app.py +0 -277
- flask_exts-0.2.3/examples/bootstrap4/templates/index.html +0 -16
- flask_exts-0.2.3/examples/bootstrap4/templates/mybase.html +0 -58
- flask_exts-0.2.3/examples/bootstrap5/app.py +0 -329
- flask_exts-0.2.3/examples/bootstrap5/static/favicon.ico +0 -0
- flask_exts-0.2.3/examples/demo/templates/my/index.html +0 -7
- flask_exts-0.2.3/examples/rediscli.py +0 -18
- flask_exts-0.2.3/src/flask_exts/__about__.py +0 -1
- flask_exts-0.2.3/src/flask_exts/admin/admin.py +0 -15
- flask_exts-0.2.3/src/flask_exts/static/js/rediscli.js +0 -121
- flask_exts-0.2.3/src/flask_exts/template/base.py +0 -48
- flask_exts-0.2.3/src/flask_exts/template/theme.py +0 -62
- flask_exts-0.2.3/src/flask_exts/template/utils.py +0 -35
- flask_exts-0.2.3/src/flask_exts/templates/admin/master.html +0 -1
- flask_exts-0.2.3/src/flask_exts/templates/layout.html +0 -21
- flask_exts-0.2.3/src/flask_exts/templates/macro/vendor.html +0 -20
- flask_exts-0.2.3/src/flask_exts/templates/views/rediscli/console.html +0 -27
- flask_exts-0.2.3/src/flask_exts/templates/views/user/index.html +0 -7
- flask_exts-0.2.3/src/flask_exts/usercenter/base_user.py +0 -7
- flask_exts-0.2.3/src/flask_exts/usercenter/base_usercenter.py +0 -40
- flask_exts-0.2.3/src/flask_exts/utils/authorize.py +0 -21
- flask_exts-0.2.3/src/flask_exts/views/index_view.py +0 -46
- flask_exts-0.2.3/src/flask_exts/views/user_view.py +0 -132
- flask_exts-0.2.3/tests/template/bootstrap5/conftest.py +0 -21
- flask_exts-0.2.3/tests/template/test_base.py +0 -16
- flask_exts-0.2.3/tests/views/test_user_view.py +0 -96
- {flask_exts-0.2.3 → flask_exts-0.2.5}/.github/workflows/release.yml +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/.gitignore +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/.readthedocs.yaml +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/LICENSE.rst +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/README.rst +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/babel.cfg +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/babel.sh +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/babel/messages.pot +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/Makefile +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/_static/logo.png +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/changes.rst +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/conf.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/examples.rst +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/make.bat +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/docs/requirements.txt +0 -0
- {flask_exts-0.2.3/examples/demo → flask_exts-0.2.5/examples/bootstrap}/__init__.py +0 -0
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/bootswatch.html +0 -0
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/form.html +0 -0
- {flask_exts-0.2.3/examples/bootstrap4/templates → flask_exts-0.2.5/examples/bootstrap/templates/bootstrap}/pagination.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/bootswatch.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/flash.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/form.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/icon.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/icons.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/index.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/mybase.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/nav.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/pagination.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/bootstrap5/templates/table.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/admin_views.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/file_op.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/author.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/keyword.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/location_image.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/post.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/post_tag.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/tag.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/tree.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/user.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/models/user_keyword.py +0 -0
- {flask_exts-0.2.3/examples/bootstrap4 → flask_exts-0.2.5/examples/demo}/static/favicon.ico +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/field_list.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/locations.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/templates/tree_list.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/author_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/keyword_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/location_image_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/my_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/post_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/tag_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/tree_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/demo/views/user_view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/fileadmin/tmp/bbb/a.txt +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/examples/instance/config.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/requirements/build.in +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/requirements/test.in +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/menu.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/ajax.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/filters.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/form.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/model/typefmt.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/row_action.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/ajax.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/filters.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/typefmt.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/admin/sqla/view.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/babel/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/babel/selector.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/datastore/sqla/__init__.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/datastore/sqla/models → flask_exts-0.2.5/src/flask_exts/email}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/sender.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/smtp.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/email/verify_email_sender.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/__init__.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/email → flask_exts-0.2.5/src/flask_exts/security/authorizer}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/base.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/authorizer/sqlalchemy_adapter.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/hasher.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/identity.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/identity_context.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/permission.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/security/principal/principal.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/signals.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/ajax_select.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/datetime.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/file.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/inline.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/json.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/recaptcha.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/select.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/sqla.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/switch.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/fields/taglist.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/forms → flask_exts-0.2.5/src/flask_exts/template/form}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/base_form.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/csrf.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/form_opts.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/meta.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/session_csrf.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/form/utils.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/security/authorizer → flask_exts-0.2.5/src/flask_exts/template/forms}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/rules.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/field_list.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/file.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/recaptcha.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/validators/sqla.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/checkbox.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/datetime.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/file.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/inline.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/recaptcha.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/render_template.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/select.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/template/widgets/xeditable.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/template/form → flask_exts-0.2.5/src/flask_exts/themes/plugins}/__init__.py +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/css/admin.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/actions.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/details_filter.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/filters.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/form.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/helper.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/security/base64.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/js/security/webauthn.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/logo.png +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/bootstrap-icons.svg +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.json +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.min.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/bootstrap-icons.scss +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap4/bootstrap.bundle.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap4/bootstrap.min.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap5/bootstrap.bundle.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/bootstrap5/bootstrap.min.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/daterangepicker/daterangepicker.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/daterangepicker/daterangepicker.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/jquery/jquery.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/moment.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/select2/select2.min.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/select2/select2.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/css/bootstrap-editable.css +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/img/clear.png +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/img/loading.gif +0 -0
- {flask_exts-0.2.3/src/flask_exts → flask_exts-0.2.5/src/flask_exts/themes}/static/vendor/vanilla-editor/js/bootstrap-editable.min.js +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/index.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/create.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/edit.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/create.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/admin/model/modals/edit.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap4/message.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/bootstrap5/message.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/index.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/inline.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/layout.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/message.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/nav.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/macro/pagination.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/form.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/list.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/file/modals/form.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/list.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/views/user/verify_email.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/widgets/inline_field_list.html +0 -0
- {flask_exts-0.2.3/src/flask_exts/templates → flask_exts-0.2.5/src/flask_exts/themes/templates/default}/widgets/inline_form.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/en/LC_MESSAGES/messages.mo +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/en/LC_MESSAGES/messages.po +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/types.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/usercenter/__init__.py +0 -0
- {flask_exts-0.2.3/tests/admin → flask_exts-0.2.5/src/flask_exts/usercenter/models}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/flask.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/jwt.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/sqla.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/src/flask_exts/utils/url.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/__init__.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/local_file_storage.py +0 -0
- {flask_exts-0.2.3/src/flask_exts/views/file_view → flask_exts-0.2.5/src/flask_exts/views/file}/local_file_view.py +0 -0
- {flask_exts-0.2.3/tests/admin/sqla → flask_exts-0.2.5/src/flask_exts/views/index}/__init__.py +0 -0
- {flask_exts-0.2.3/tests/security/authorizer → flask_exts-0.2.5/src/flask_exts/views/rediscli}/__init__.py +0 -0
- {flask_exts-0.2.3/tests/template → flask_exts-0.2.5/src/flask_exts/views/user}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/__init__.py +0 -0
- {flask_exts-0.2.3/tests/template/bootstrap4 → flask_exts-0.2.5/tests/admin}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/customer/templates/mock.html +0 -0
- {flask_exts-0.2.3/tests/template/bootstrap5 → flask_exts-0.2.5/tests/admin/sqla}/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/templates/another_macro.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/templates/macro.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_basic.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_form_rules.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_inlineform.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_multi_pk.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/sqla/test_translation.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/admin/test_model.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/conftest.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.gif +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.jpeg +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.jpg +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.png +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/data/copyleft.tiff +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/email/test_base.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/email/test_smtp.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/helper.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/message.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/model1.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/multpk.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/polymorphic.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/tree.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/models/user.py +0 -0
- /flask_exts-0.2.3/tests/views/files/dummy.txt → /flask_exts-0.2.5/tests/security/authorizer/__init__.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/rbac_model.conf +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_adapter/rbac_policy.csv +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/authz_policy.csv +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/rbac_model.conf +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/authorizer/casbin_files/rbac_policy.csv +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/security/test_principal.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_field.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_form.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_form_row.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_hidden_errors.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_messages.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_pager.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_pagination.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/bootstrap4/test_render_table.py +0 -0
- /flask_exts-0.2.3/tests/template/bootstrap5/test_base.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_base.py +0 -0
- /flask_exts-0.2.3/tests/template/bootstrap5/test_render_form.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_form.py +0 -0
- /flask_exts-0.2.3/tests/template/bootstrap5/test_render_form_row.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_form_row.py +0 -0
- /flask_exts-0.2.3/tests/template/bootstrap5/test_render_messages.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_messages.py +0 -0
- /flask_exts-0.2.3/tests/template/bootstrap5/test_render_pagination.py → /flask_exts-0.2.5/tests/template/bootstrap5/_test_render_pagination.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/conftest.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_csrf.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_fields.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_filefield.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/forms/test_uploadfile.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/macros/test_render_breadcrumb_item.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/template/macros/test_render_nav_item.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/templates/method.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/templates/mock.html +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_babel.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/test_flask.py +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/en/LC_MESSAGES/messages.mo +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/translations/en/LC_MESSAGES/messages.po +0 -0
- {flask_exts-0.2.3 → flask_exts-0.2.5}/tests/utils/test_url.py +0 -0
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
v0.2.5
|
|
2
|
+
------
|
|
3
|
+
|
|
4
|
+
Released 2025-10-24
|
|
5
|
+
|
|
6
|
+
- rewrite template structure
|
|
7
|
+
- rewrite user view, user authentication and authorization
|
|
8
|
+
|
|
9
|
+
v0.2.4
|
|
10
|
+
------
|
|
11
|
+
|
|
12
|
+
Released 2025-10-06
|
|
13
|
+
|
|
14
|
+
- user change password
|
|
15
|
+
- user forgot password
|
|
16
|
+
- user 2FA with TOTP
|
|
17
|
+
- user recovery codes
|
|
18
|
+
- user recovery
|
|
19
|
+
|
|
1
20
|
v0.2.3
|
|
2
21
|
------
|
|
3
22
|
|
|
@@ -7,7 +26,6 @@ Released 2025-08-28
|
|
|
7
26
|
- add folder email
|
|
8
27
|
- add security.email_verification
|
|
9
28
|
|
|
10
|
-
|
|
11
29
|
v0.2.2
|
|
12
30
|
------
|
|
13
31
|
|
|
@@ -64,7 +82,7 @@ Released 2024-09-14
|
|
|
64
82
|
|
|
65
83
|
- merge translations of wtforms, flask_exts and app into flask_babel.get_translations()
|
|
66
84
|
- update FileField and ImageField
|
|
67
|
-
- add url for
|
|
85
|
+
- add url for _template.static
|
|
68
86
|
|
|
69
87
|
v0.1.5
|
|
70
88
|
------
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Flask-Exts
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: Flask extensions with admin, SQLAlchemy, babel, forms, fields, widgets, and so on.
|
|
5
5
|
Project-URL: Documentation, https://flask-exts.readthedocs.io
|
|
6
6
|
Project-URL: Source, https://github.com/ojso/flask-exts
|
|
@@ -46,7 +46,10 @@ Requires-Dist: flask-babel>=4.0
|
|
|
46
46
|
Requires-Dist: flask-login>=0.6
|
|
47
47
|
Requires-Dist: flask-sqlalchemy>=3.0
|
|
48
48
|
Requires-Dist: flask>=3.0
|
|
49
|
+
Requires-Dist: pillow>=11.0
|
|
49
50
|
Requires-Dist: pyjwt>=2.0
|
|
51
|
+
Requires-Dist: pyotp>=2.0
|
|
52
|
+
Requires-Dist: qrcode>=8.0
|
|
50
53
|
Requires-Dist: tablib>=3.0
|
|
51
54
|
Requires-Dist: webauthn>=2.0
|
|
52
55
|
Requires-Dist: wtforms>=3.0
|
|
@@ -6,6 +6,9 @@ Configuration
|
|
|
6
6
|
==============
|
|
7
7
|
|
|
8
8
|
========================== =====================================================================
|
|
9
|
+
``ADMIN_ALL_ACCESSED`` Set to ``True`` to enable access within admin views for all users,
|
|
10
|
+
otherwise, only the users with access role can access admin views.
|
|
11
|
+
Default is ``False``.
|
|
9
12
|
``BABEL_ACCEPT_LANGUAGES`` Set to ``en;zh`` to bebel's accept languages.
|
|
10
13
|
Default is ``None``.
|
|
11
14
|
``BABEL_DEFAULT_TIMEZONE`` Set to ``Asia/Shanghai`` to babel's default timezone.
|
|
@@ -18,7 +21,7 @@ Configuration
|
|
|
18
21
|
Default is ``csrf_token``.
|
|
19
22
|
``CSRF_TIME_LIMIT`` Max age in seconds for CSRF tokens.
|
|
20
23
|
Default is ``1800``.
|
|
21
|
-
``
|
|
24
|
+
``NOREPLY_EMAIL_SENDER`` Email address used to send emails.
|
|
22
25
|
It is a dict for smtp with keys: host,port,user,password.
|
|
23
26
|
Default is None.
|
|
24
27
|
========================== =====================================================================
|
|
@@ -69,28 +69,3 @@ pybabel
|
|
|
69
69
|
|
|
70
70
|
$ pybabel compile -d src/flask_exts/translations -D messages
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
tests
|
|
74
|
-
-----
|
|
75
|
-
|
|
76
|
-
.. code-block:: console
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
cd tests/
|
|
80
|
-
|
|
81
|
-
# extract messages from source files and generate a POT file
|
|
82
|
-
pybabel extract -o translations/messages.pot .
|
|
83
|
-
|
|
84
|
-
# create new message catalogs from a POT file
|
|
85
|
-
pybabel init -i translations/messages.pot -d translations -l en
|
|
86
|
-
pybabel init -i translations/messages.pot -d translations -l zh_CN
|
|
87
|
-
|
|
88
|
-
# update existing message catalogs from a POT file
|
|
89
|
-
pybabel update -i translations/messages.pot -d translations
|
|
90
|
-
|
|
91
|
-
# edit
|
|
92
|
-
# open the '.po' file
|
|
93
|
-
|
|
94
|
-
# compile message catalogs to MO files
|
|
95
|
-
|
|
96
|
-
pybabel compile -d translations
|
|
@@ -45,6 +45,17 @@ More examples, please click :doc:`examples`.
|
|
|
45
45
|
examples
|
|
46
46
|
changes
|
|
47
47
|
|
|
48
|
+
API Reference
|
|
49
|
+
-------------
|
|
50
|
+
|
|
51
|
+
If you are looking for information on a specific function, class or
|
|
52
|
+
method, this part of the documentation is for you.
|
|
53
|
+
|
|
54
|
+
.. toctree::
|
|
55
|
+
:maxdepth: 1
|
|
56
|
+
|
|
57
|
+
api
|
|
58
|
+
|
|
48
59
|
Indices and tables
|
|
49
60
|
==================
|
|
50
61
|
|
|
@@ -20,61 +20,61 @@ Run the examples
|
|
|
20
20
|
|
|
21
21
|
Type the command in the terminal, then go to http://localhost:5000.
|
|
22
22
|
|
|
23
|
-
Start
|
|
24
|
-
----------
|
|
25
|
-
|
|
26
23
|
simple
|
|
27
24
|
---------
|
|
28
25
|
|
|
29
|
-
run only one file.
|
|
30
|
-
|
|
31
26
|
.. code-block:: bash
|
|
32
27
|
|
|
33
28
|
$ python simple.py
|
|
34
29
|
|
|
35
|
-
|
|
30
|
+
rediscli
|
|
36
31
|
-----------------
|
|
37
32
|
|
|
38
|
-
|
|
33
|
+
Use with mock redis server.
|
|
39
34
|
|
|
40
35
|
.. code-block:: bash
|
|
41
36
|
|
|
42
|
-
$
|
|
43
|
-
|
|
44
|
-
fileadmin
|
|
45
|
-
-----------------
|
|
37
|
+
$ python rediscli.py
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
$ flask --app fileadmin run
|
|
39
|
+
go to http://localhost:5000/admin/rediscli/
|
|
50
40
|
|
|
51
|
-
|
|
52
|
-
-----------------
|
|
41
|
+
if you want to use real redis server, then do this:
|
|
53
42
|
|
|
54
|
-
First install redis,
|
|
43
|
+
1. First install redis,
|
|
55
44
|
|
|
56
45
|
.. code-block:: bash
|
|
57
46
|
|
|
58
47
|
$ pip install redis
|
|
59
48
|
|
|
60
|
-
|
|
49
|
+
2. Modify code in ``rediscli.py``
|
|
50
|
+
|
|
51
|
+
.. code-block:: python
|
|
52
|
+
|
|
53
|
+
# from flask_exts.views.rediscli.mock_redis import MockRedis as Redis
|
|
54
|
+
from redis import Redis
|
|
55
|
+
|
|
56
|
+
3. At last, run ``python rediscli.py``
|
|
57
|
+
|
|
58
|
+
demo
|
|
59
|
+
-----------------
|
|
60
|
+
|
|
61
|
+
Default admin user is ``admin``, password is ``admin``.
|
|
61
62
|
|
|
62
63
|
.. code-block:: bash
|
|
63
64
|
|
|
64
|
-
$ flask --app
|
|
65
|
+
$ flask --app demo run
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
fileadmin
|
|
67
68
|
-----------------
|
|
68
69
|
|
|
69
70
|
.. code-block:: bash
|
|
71
|
+
|
|
72
|
+
$ flask --app fileadmin run
|
|
70
73
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Bootstrap 5
|
|
74
|
+
Bootstrap
|
|
74
75
|
-----------------
|
|
75
76
|
|
|
76
77
|
.. code-block:: bash
|
|
77
|
-
|
|
78
|
-
$ flask --app bootstrap5/app.py run
|
|
79
78
|
|
|
79
|
+
$ flask --app bootstrap run
|
|
80
80
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from wtforms.validators import DataRequired, Length, Regexp
|
|
2
|
+
from wtforms.fields import *
|
|
3
|
+
from flask_exts.template.fields import SwitchField
|
|
4
|
+
from flask_exts.template.form.flask_form import FlaskForm
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ExampleForm(FlaskForm):
|
|
8
|
+
"""An example form that contains all the supported bootstrap style form fields."""
|
|
9
|
+
|
|
10
|
+
date = DateField(
|
|
11
|
+
description="We'll never share your email with anyone else."
|
|
12
|
+
) # add help text with `description`
|
|
13
|
+
datetime = DateTimeField(
|
|
14
|
+
render_kw={"placeholder": "this is a placeholder"}
|
|
15
|
+
) # add HTML attribute with `render_kw`
|
|
16
|
+
datetime_local = DateTimeLocalField()
|
|
17
|
+
time = TimeField()
|
|
18
|
+
month = MonthField()
|
|
19
|
+
color = ColorField()
|
|
20
|
+
floating = FloatField()
|
|
21
|
+
integer = IntegerField()
|
|
22
|
+
decimal_slider = DecimalRangeField()
|
|
23
|
+
integer_slider = IntegerRangeField(render_kw={"min": "0", "max": "4"})
|
|
24
|
+
email = EmailField()
|
|
25
|
+
url = URLField()
|
|
26
|
+
telephone = TelField()
|
|
27
|
+
image = FileField(
|
|
28
|
+
render_kw={"class": "my-class"}, validators=[Regexp(r".+\.jpg$")]
|
|
29
|
+
) # add your class
|
|
30
|
+
option = RadioField(
|
|
31
|
+
choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
|
|
32
|
+
)
|
|
33
|
+
select = SelectField(
|
|
34
|
+
choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
|
|
35
|
+
)
|
|
36
|
+
select_multiple = SelectMultipleField(
|
|
37
|
+
choices=[("dog", "Dog"), ("cat", "Cat"), ("bird", "Bird"), ("alien", "Alien")]
|
|
38
|
+
)
|
|
39
|
+
bio = TextAreaField()
|
|
40
|
+
search = SearchField() # will autocapitalize on mobile
|
|
41
|
+
title = StringField() # will not autocapitalize on mobile
|
|
42
|
+
secret = PasswordField()
|
|
43
|
+
remember = BooleanField("Remember me")
|
|
44
|
+
submit = SubmitField()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class HelloForm(FlaskForm):
|
|
48
|
+
username = StringField("Username", validators=[DataRequired(), Length(1, 20)])
|
|
49
|
+
password = PasswordField("Password", validators=[DataRequired(), Length(8, 150)])
|
|
50
|
+
remember = BooleanField("Remember me")
|
|
51
|
+
submit = SubmitField()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ButtonForm(FlaskForm):
|
|
55
|
+
username = StringField("Username", validators=[DataRequired(), Length(1, 20)])
|
|
56
|
+
confirm = SwitchField("Confirmation")
|
|
57
|
+
submit = SubmitField()
|
|
58
|
+
delete = SubmitField()
|
|
59
|
+
cancel = SubmitField()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class TelephoneForm(FlaskForm):
|
|
63
|
+
country_code = IntegerField("Country Code")
|
|
64
|
+
area_code = IntegerField("Area Code/Exchange")
|
|
65
|
+
number = StringField("Number")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class IMForm(FlaskForm):
|
|
69
|
+
protocol = SelectField(choices=[("aim", "AIM"), ("msn", "MSN")])
|
|
70
|
+
username = StringField()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class ContactForm(FlaskForm):
|
|
74
|
+
first_name = StringField()
|
|
75
|
+
last_name = StringField()
|
|
76
|
+
mobile_phone = FormField(TelephoneForm)
|
|
77
|
+
office_phone = FormField(TelephoneForm)
|
|
78
|
+
emails = FieldList(StringField("Email"), min_entries=3)
|
|
79
|
+
im_accounts = FieldList(FormField(IMForm), min_entries=2)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class BootswatchForm(FlaskForm):
|
|
83
|
+
"""Form to test Bootswatch."""
|
|
84
|
+
|
|
85
|
+
# DO NOT EDIT! Use list-bootswatch.py to generate the Radiofield below.
|
|
86
|
+
theme_name = RadioField(
|
|
87
|
+
default="default",
|
|
88
|
+
choices=[
|
|
89
|
+
("default", "none"),
|
|
90
|
+
("cerulean", "Cerulean 4.6.1"),
|
|
91
|
+
("cosmo", "Cosmo 4.6.1"),
|
|
92
|
+
("cyborg", "Cyborg 4.6.1"),
|
|
93
|
+
("darkly", "Darkly 4.6.1"),
|
|
94
|
+
("flatly", "Flatly 4.6.1"),
|
|
95
|
+
("journal", "Journal 4.6.1"),
|
|
96
|
+
("litera", "Litera 4.6.1"),
|
|
97
|
+
("lumen", "Lumen 4.6.1"),
|
|
98
|
+
("lux", "Lux 4.6.1"),
|
|
99
|
+
("materia", "Materia 4.6.1"),
|
|
100
|
+
("minty", "Minty 4.6.1"),
|
|
101
|
+
("pulse", "Pulse 4.6.1"),
|
|
102
|
+
("sandstone", "Sandstone 4.6.1"),
|
|
103
|
+
("simplex", "Simplex 4.6.1"),
|
|
104
|
+
("sketchy", "Sketchy 4.6.1"),
|
|
105
|
+
("slate", "Slate 4.6.1"),
|
|
106
|
+
("solar", "Solar 4.6.1"),
|
|
107
|
+
("spacelab", "Spacelab 4.6.1"),
|
|
108
|
+
("superhero", "Superhero 4.6.1"),
|
|
109
|
+
("united", "United 4.6.1"),
|
|
110
|
+
("yeti", "Yeti 4.6.1"),
|
|
111
|
+
],
|
|
112
|
+
)
|
|
113
|
+
submit = SubmitField()
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from flask import Flask
|
|
2
|
+
from flask_exts import Manager
|
|
3
|
+
from .models import db, Message, MyCategory
|
|
4
|
+
from .view import BootstrapView
|
|
5
|
+
|
|
6
|
+
def create_app():
|
|
7
|
+
app = Flask(__name__)
|
|
8
|
+
app.config["SECRET_KEY"] = "dev"
|
|
9
|
+
init_app(app)
|
|
10
|
+
return app
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def init_app(app: Flask):
|
|
14
|
+
manager = Manager()
|
|
15
|
+
manager.init_app(app)
|
|
16
|
+
manager.admin.add_view(BootstrapView())
|
|
17
|
+
|
|
18
|
+
with app.app_context():
|
|
19
|
+
db.drop_all()
|
|
20
|
+
db.create_all()
|
|
21
|
+
|
|
22
|
+
for i in range(20):
|
|
23
|
+
url = 'mailto:x@t.me'
|
|
24
|
+
if i % 7 == 0:
|
|
25
|
+
url = 'www.t.me'
|
|
26
|
+
elif i % 7 == 1:
|
|
27
|
+
url = 'https://t.me'
|
|
28
|
+
elif i % 7 == 2:
|
|
29
|
+
url = 'http://t.me'
|
|
30
|
+
elif i % 7 == 3:
|
|
31
|
+
url = 'http://t'
|
|
32
|
+
elif i % 7 == 4:
|
|
33
|
+
url = 'http://'
|
|
34
|
+
elif i % 7 == 5:
|
|
35
|
+
url = 'x@t.me'
|
|
36
|
+
m = Message(
|
|
37
|
+
text=f'Message {i+1} {url}',
|
|
38
|
+
author=f'Author {i+1}',
|
|
39
|
+
create_time=4321*(i+1)
|
|
40
|
+
)
|
|
41
|
+
if i % 2:
|
|
42
|
+
m.category = MyCategory.CAT2
|
|
43
|
+
if i % 4:
|
|
44
|
+
m.draft = True
|
|
45
|
+
db.session.add(m)
|
|
46
|
+
db.session.commit()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from sqlalchemy.orm import Mapped
|
|
3
|
+
from sqlalchemy.orm import mapped_column
|
|
4
|
+
from flask_exts.datastore.sqla import db
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MyCategory(Enum):
|
|
8
|
+
CAT1 = "Category 1"
|
|
9
|
+
CAT2 = "Category 2"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Message(db.Model):
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True)
|
|
14
|
+
text: Mapped[str] = mapped_column(nullable=False)
|
|
15
|
+
author: Mapped[str] = mapped_column(nullable=False)
|
|
16
|
+
category: Mapped[MyCategory] = mapped_column(default=MyCategory.CAT1, nullable=False)
|
|
17
|
+
draft: Mapped[bool] = mapped_column(default=False, nullable=False)
|
|
18
|
+
create_time: Mapped[int] = mapped_column(nullable=False, unique=True)
|
|
19
|
+
|
|
Binary file
|
|
@@ -11,14 +11,14 @@ Output: {{ render_icon('heart-fill') }}
|
|
|
11
11
|
|
|
12
12
|
<h2>Icon with custom size</h2>
|
|
13
13
|
<pre>{% raw %}{{ render_icon('heart', 32) }}{% endraw %}</pre>
|
|
14
|
-
Output: {{ render_icon('heart',
|
|
14
|
+
Output: {{ render_icon('heart', size=32) }}
|
|
15
15
|
|
|
16
16
|
<h2>Icon with custom size and Bootstrap color</h2>
|
|
17
17
|
<pre>{% raw %}{{ render_icon('heart', 25, 'primary') }}{% endraw %}</pre>
|
|
18
|
-
Output: {{ render_icon('heart', size=25,
|
|
18
|
+
Output: {{ render_icon('heart', size=25, color='primary') }}
|
|
19
19
|
|
|
20
|
-
<pre>{% raw %}{{ render_icon('heart-fill', 25,
|
|
21
|
-
Output: {{ render_icon('heart-fill', size=25,
|
|
20
|
+
<pre>{% raw %}{{ render_icon('heart-fill', 25, color='primary') }}{% endraw %}</pre>
|
|
21
|
+
Output: {{ render_icon('heart-fill', size=25, color='primary') }}
|
|
22
22
|
|
|
23
23
|
<h2>Icon with custom size and custom color</h2>
|
|
24
24
|
<pre>{% raw %}{{ render_icon('heart', '2em', 'red') }}{% endraw %}</pre>
|