flask-appbuilder 5.0.2rc2__tar.gz → 5.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/CHANGELOG.rst +7 -1
  2. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/PKG-INFO +2 -1
  3. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/SOURCES.txt +5 -0
  4. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/requires.txt +3 -0
  5. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/PKG-INFO +2 -1
  6. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/security.rst +142 -2
  7. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/__init__.py +1 -1
  8. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/const.py +1 -0
  9. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/manager.py +283 -2
  10. flask_appbuilder-5.1.0/flask_appbuilder/security/saml/metadata.py +26 -0
  11. flask_appbuilder-5.1.0/flask_appbuilder/security/saml/types.py +73 -0
  12. flask_appbuilder-5.1.0/flask_appbuilder/security/saml/utils.py +54 -0
  13. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/manager.py +11 -0
  14. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/views.py +205 -1
  15. flask_appbuilder-5.1.0/flask_appbuilder/templates/appbuilder/general/security/login_saml.html +45 -0
  16. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/setup.py +1 -0
  17. flask_appbuilder-5.1.0/tests/sqla/__init__.py +0 -0
  18. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.coveragerc +0 -0
  19. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.env +0 -0
  20. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/ISSUE_TEMPLATE.md +0 -0
  21. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  22. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/prlint.json +0 -0
  23. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/stale.yml +0 -0
  24. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/workflows/ci.yml +0 -0
  25. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.github/workflows/odbcinst.ini +0 -0
  26. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/.gitignore +0 -0
  27. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/CONTRIBUTING.rst +0 -0
  28. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/dependency_links.txt +0 -0
  29. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/entry_points.txt +0 -0
  30. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/not-zip-safe +0 -0
  31. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/Flask_AppBuilder.egg-info/top_level.txt +0 -0
  32. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/LICENSE +0 -0
  33. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/MANIFEST.in +0 -0
  34. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/README.rst +0 -0
  35. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/RELEASE.rst +0 -0
  36. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/babel/babel.cfg +0 -0
  37. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/babel/messages.pot +0 -0
  38. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/babel_extract.sh +0 -0
  39. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/babel_init.sh +0 -0
  40. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/bootswatch_update.sh +0 -0
  41. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/config.py +0 -0
  42. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/db_create.py +0 -0
  43. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/db_migrate.py +0 -0
  44. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/db_upgrade.py +0 -0
  45. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/hash_db_password.py +0 -0
  46. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/migrate_db_0.7.py +0 -0
  47. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/migrate_db_1.3.py +0 -0
  48. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/bin/sqlite_upgrade_1.3.sql +0 -0
  49. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docker-compose.yml +0 -0
  50. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/Makefile +0 -0
  51. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_static/Flask-AppBuilder.png +0 -0
  52. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_templates/layout.html +0 -0
  53. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/LICENSE +0 -0
  54. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/README +0 -0
  55. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask/layout.html +0 -0
  56. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask/relations.html +0 -0
  57. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask/static/Flask-AppBuilder.png +0 -0
  58. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask/static/flasky.css_t +0 -0
  59. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask/theme.conf +0 -0
  60. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask_small/layout.html +0 -0
  61. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask_small/static/flasky.css_t +0 -0
  62. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask_small/theme.conf +0 -0
  63. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/_themes/flask_theme_support.py +0 -0
  64. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/actions.rst +0 -0
  65. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/addons.rst +0 -0
  66. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/advanced.rst +0 -0
  67. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/api.rst +0 -0
  68. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/cli.rst +0 -0
  69. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/conf.py +0 -0
  70. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/config.rst +0 -0
  71. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/customizing.rst +0 -0
  72. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/diagrams.rst +0 -0
  73. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/generic_datasource.rst +0 -0
  74. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/i18n.rst +0 -0
  75. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/ListThumbnail.png +0 -0
  76. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/chart.png +0 -0
  77. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/chart_time1.png +0 -0
  78. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/chart_time2.png +0 -0
  79. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/charts.png +0 -0
  80. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/contact_list.png +0 -0
  81. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/contacts.png +0 -0
  82. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/direct_chart.png +0 -0
  83. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/fab.png +0 -0
  84. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/group_list.png +0 -0
  85. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/grouped_chart.png +0 -0
  86. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/groups.png +0 -0
  87. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/images_list.png +0 -0
  88. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/list_cascade.png +0 -0
  89. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/list_cascade_block.png +0 -0
  90. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/list_compact_inline.png +0 -0
  91. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/list_master_detail.png +0 -0
  92. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/login.png +0 -0
  93. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/login_db.png +0 -0
  94. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/oauth_login.png +0 -0
  95. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/oauth_login_one_provider.png +0 -0
  96. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/security.png +0 -0
  97. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/simpleview2.png +0 -0
  98. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/swagger001.png +0 -0
  99. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/images/swagger002.png +0 -0
  100. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/index.rst +0 -0
  101. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/installation.rst +0 -0
  102. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/intro.rst +0 -0
  103. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/make.bat +0 -0
  104. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/multipledbs.rst +0 -0
  105. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/quickcharts.rst +0 -0
  106. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/quickfiles.rst +0 -0
  107. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/quickhowto.rst +0 -0
  108. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/quickminimal.rst +0 -0
  109. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/relations.rst +0 -0
  110. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/rest_api.rst +0 -0
  111. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/templates.rst +0 -0
  112. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/user_registration.rst +0 -0
  113. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/versionmigration.rst +0 -0
  114. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/docs/views.rst +0 -0
  115. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/README.rst +0 -0
  116. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/base_api/README.rst +0 -0
  117. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/base_api/app/__init__.py +0 -0
  118. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/base_api/app/api.py +0 -0
  119. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/base_api/config.py +0 -0
  120. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/basefilter/babel/messages.pot~ +0 -0
  121. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/README.rst +0 -0
  122. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/app/__init__.py +0 -0
  123. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/app/models.py +0 -0
  124. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/app/views.py +0 -0
  125. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/config.py +0 -0
  126. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/composite_keys/testdata.py +0 -0
  127. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/NAMES.DIC +0 -0
  128. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/README.rst +0 -0
  129. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/app/__init__.py +0 -0
  130. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/app/api.py +0 -0
  131. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/app/models.py +0 -0
  132. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  133. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  134. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/babel/babel.cfg +0 -0
  135. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/babel/messages.pot +0 -0
  136. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/config.py +0 -0
  137. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/crud_rest_api/testdata.py +0 -0
  138. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/README.rst +0 -0
  139. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/app/__init__.py +0 -0
  140. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/app/models.py +0 -0
  141. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/app/security.py +0 -0
  142. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/app/views.py +0 -0
  143. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/babel/babel.cfg +0 -0
  144. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/employees/config.py +0 -0
  145. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/NAMES.DIC +0 -0
  146. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/README.rst +0 -0
  147. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/app/__init__.py +0 -0
  148. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/app/models.py +0 -0
  149. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  150. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  151. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/app/views.py +0 -0
  152. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/babel/babel.cfg +0 -0
  153. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/babel/messages.pot +0 -0
  154. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/config.py +0 -0
  155. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/enums/testdata.py +0 -0
  156. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/NAMES.DIC +0 -0
  157. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/README.rst +0 -0
  158. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/__init__.py +0 -0
  159. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/models.py +0 -0
  160. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/sec.py +0 -0
  161. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/sec_forms.py +0 -0
  162. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/sec_views.py +0 -0
  163. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  164. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  165. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/app/views.py +0 -0
  166. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/babel/babel.cfg +0 -0
  167. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/babel/messages.pot +0 -0
  168. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/babel/messages.pot~ +0 -0
  169. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/config.py +0 -0
  170. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity/testdata.py +0 -0
  171. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/NAMES.DIC +0 -0
  172. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/README.rst +0 -0
  173. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/__init__.py +0 -0
  174. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/models.py +0 -0
  175. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/sec.py +0 -0
  176. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/sec_forms.py +0 -0
  177. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/sec_views.py +0 -0
  178. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  179. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  180. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/app/views.py +0 -0
  181. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/babel/babel.cfg +0 -0
  182. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/babel/messages.pot +0 -0
  183. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/config.py +0 -0
  184. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/extendsecurity2/testdata.py +0 -0
  185. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/factoryapp/babel/messages.pot~ +0 -0
  186. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/NAMES.DIC +0 -0
  187. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/app/__init__.py +0 -0
  188. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/app/models.py +0 -0
  189. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  190. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  191. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/app/views.py +0 -0
  192. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/babel/babel.cfg +0 -0
  193. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/babel/messages.pot +0 -0
  194. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/babel/messages.pot~ +0 -0
  195. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/config.py +0 -0
  196. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/masterdetail/testdata.py +0 -0
  197. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/.gitignore +0 -0
  198. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/README.rst +0 -0
  199. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/app/__init__.py +0 -0
  200. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/app/forms.py +0 -0
  201. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/app/models.py +0 -0
  202. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/app/security.py +0 -0
  203. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/app/views.py +0 -0
  204. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/babel/babel.cfg +0 -0
  205. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/babel/messages.pot +0 -0
  206. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/config.py +0 -0
  207. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/oauth/run.py +0 -0
  208. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/README.rst +0 -0
  209. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/__init__.py +0 -0
  210. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/models.py +0 -0
  211. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/translations/es/LC_MESSAGES/messages.mo +0 -0
  212. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/translations/es/LC_MESSAGES/messages.po +0 -0
  213. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  214. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  215. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/app/views.py +0 -0
  216. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/babel/babel.cfg +0 -0
  217. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/config.py +0 -0
  218. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/productsale/run.py +0 -0
  219. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/__init__.py +0 -0
  220. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/models.py +0 -0
  221. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/translations/es/LC_MESSAGES/messages.mo +0 -0
  222. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/translations/es/LC_MESSAGES/messages.po +0 -0
  223. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  224. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  225. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/app/views.py +0 -0
  226. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/babel/babel.cfg +0 -0
  227. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/config.py +0 -0
  228. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/run.py +0 -0
  229. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickactions/testdata.py +0 -0
  230. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/README.rst +0 -0
  231. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/__init__.py +0 -0
  232. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/data.py +0 -0
  233. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/models.py +0 -0
  234. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  235. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  236. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/app/views.py +0 -0
  237. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/babel/babel.cfg +0 -0
  238. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/babel/messages.pot +0 -0
  239. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/babel/messages.pot~ +0 -0
  240. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts/config.py +0 -0
  241. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/app/__init__.py +0 -0
  242. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/app/models.py +0 -0
  243. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  244. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  245. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/app/views.py +0 -0
  246. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/babel/babel.cfg +0 -0
  247. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/babel/messages.pot +0 -0
  248. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/babel/messages.pot~ +0 -0
  249. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/bdist.linux-i686/egg/app/__init__.py +0 -0
  250. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/bdist.linux-i686/egg/app/models.py +0 -0
  251. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/bdist.linux-i686/egg/app/views.py +0 -0
  252. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/lib/app/__init__.py +0 -0
  253. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/lib/app/models.py +0 -0
  254. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/build/lib/app/views.py +0 -0
  255. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/config.py +0 -0
  256. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickcharts2/run.py +0 -0
  257. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/README.rst +0 -0
  258. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/__init__.py +0 -0
  259. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/models.py +0 -0
  260. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/__init__.py +0 -0
  261. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/es/LC_MESSAGES/messages.mo +0 -0
  262. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/es/LC_MESSAGES/messages.po +0 -0
  263. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/es/LC_MESSAGES/messages.po~ +0 -0
  264. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  265. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  266. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/translations/pt/LC_MESSAGES/messages.po~ +0 -0
  267. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/app/views.py +0 -0
  268. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/babel/babel.cfg +0 -0
  269. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/babel/messages.pot +0 -0
  270. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/config.py +0 -0
  271. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickfiles/run.py +0 -0
  272. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/NAMES.DIC +0 -0
  273. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/README.rst +0 -0
  274. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/app/__init__.py +0 -0
  275. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/app/models.py +0 -0
  276. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  277. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  278. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/app/views.py +0 -0
  279. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/babel/babel.cfg +0 -0
  280. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/babel/messages.pot +0 -0
  281. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/babel/messages.pot~ +0 -0
  282. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/config.py +0 -0
  283. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto/testdata.py +0 -0
  284. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/NAMES.DIC +0 -0
  285. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/__init__.py +0 -0
  286. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/forms.py +0 -0
  287. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/indexview.py +0 -0
  288. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/models.py +0 -0
  289. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/sec.py +0 -0
  290. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/sec_models.py +0 -0
  291. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/sec_views.py +0 -0
  292. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abBtnAdd.html +0 -0
  293. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abBtnDelete.html +0 -0
  294. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abBtnEdit.html +0 -0
  295. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abBtnShow.html +0 -0
  296. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abDate.html +0 -0
  297. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abMenuPageSize.html +0 -0
  298. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abModalOkCancel.html +0 -0
  299. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abModelSearch.html +0 -0
  300. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abModelTable.html +0 -0
  301. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abPagination.html +0 -0
  302. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/angularAssets/abSelect.html +0 -0
  303. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/css/clean-blog.min.css +0 -0
  304. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/css/scrolling-nav.css +0 -0
  305. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/img/brand.jpg +0 -0
  306. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/img/loading.gif +0 -0
  307. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Controllers/alertsCtrl.js +0 -0
  308. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Controllers/searchCtrl.js +0 -0
  309. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Controllers/tableCtrl.js +0 -0
  310. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Directives/bigDirectives.js +0 -0
  311. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Directives/btnDirectives.js +0 -0
  312. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/Services/apiService.js +0 -0
  313. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/angular.min.js +0 -0
  314. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/app.js +0 -0
  315. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/clean-blog.min.js +0 -0
  316. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/static/js/scrolling-nav.js +0 -0
  317. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/appbuilder/index.html +0 -0
  318. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/index.html +0 -0
  319. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/list_angulajs.html +0 -0
  320. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/list_contacts.html +0 -0
  321. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/list_json.html +0 -0
  322. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/mylist.html +0 -0
  323. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/new_base.html +0 -0
  324. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/show_contacts.html +0 -0
  325. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/widgets/list.html +0 -0
  326. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/templates/widgets/list_override.html +0 -0
  327. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  328. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  329. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/app/views.py +0 -0
  330. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/babel/babel.cfg +0 -0
  331. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/babel/messages.pot +0 -0
  332. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/babel/messages.pot~ +0 -0
  333. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/config.py +0 -0
  334. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/run.py +0 -0
  335. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto2/testdata.py +0 -0
  336. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/.coverage +0 -0
  337. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/NAMES.DIC +0 -0
  338. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/README.rst +0 -0
  339. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/app/__init__.py +0 -0
  340. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/app/models.py +0 -0
  341. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  342. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  343. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/app/views.py +0 -0
  344. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/babel/babel.cfg +0 -0
  345. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/babel/messages.pot +0 -0
  346. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/babel/messages.pot~ +0 -0
  347. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/config.py +0 -0
  348. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/migrate_db_0.7.py +0 -0
  349. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/run.py +0 -0
  350. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickhowto3/testdata.py +0 -0
  351. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/README.rst +0 -0
  352. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/__init__.py +0 -0
  353. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/models.py +0 -0
  354. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/translations/es/LC_MESSAGES/messages.mo +0 -0
  355. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/translations/es/LC_MESSAGES/messages.po +0 -0
  356. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  357. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  358. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/app/views.py +0 -0
  359. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/babel/babel.cfg +0 -0
  360. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickimages/config.py +0 -0
  361. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/NAMES.DIC +0 -0
  362. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/README.rst +0 -0
  363. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/app/__init__.py +0 -0
  364. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/app/models.py +0 -0
  365. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  366. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  367. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/app/views.py +0 -0
  368. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/babel/babel.cfg +0 -0
  369. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/babel/messages.pot +0 -0
  370. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/config.py +0 -0
  371. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickmigrate/testdata.py +0 -0
  372. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quickminimal/run.py +0 -0
  373. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/.idea/encodings.xml +0 -0
  374. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/.idea/misc.xml +0 -0
  375. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/.idea/modules.xml +0 -0
  376. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/.idea/quicksqlviews.iml +0 -0
  377. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/.idea/workspace.xml +0 -0
  378. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/NAMES.DIC +0 -0
  379. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/README.rst +0 -0
  380. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/app/__init__.py +0 -0
  381. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/app/models.py +0 -0
  382. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  383. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  384. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/app/views.py +0 -0
  385. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/babel/babel.cfg +0 -0
  386. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/babel/messages.pot +0 -0
  387. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/config.py +0 -0
  388. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicksqlviews/testdata.py +0 -0
  389. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/NAMES.DIC +0 -0
  390. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/README.rst +0 -0
  391. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/__init__.py +0 -0
  392. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/models.py +0 -0
  393. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/static/css/landing-page.css +0 -0
  394. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/templates/mybase.html +0 -0
  395. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  396. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  397. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/app/views.py +0 -0
  398. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/babel/babel.cfg +0 -0
  399. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/babel/messages.pot +0 -0
  400. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/babel/messages.pot~ +0 -0
  401. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/config.py +0 -0
  402. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/run.py +0 -0
  403. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/quicktemplates/testdata.py +0 -0
  404. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/NAMES.DIC +0 -0
  405. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/README.rst +0 -0
  406. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/__init__.py +0 -0
  407. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/api.py +0 -0
  408. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/models.py +0 -0
  409. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/.babelrc +0 -0
  410. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/README.md +0 -0
  411. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/package-lock.json +0 -0
  412. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/package.json +0 -0
  413. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/package.json.react-original +0 -0
  414. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/public/favicon.ico +0 -0
  415. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/public/index.html +0 -0
  416. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/public/manifest.json +0 -0
  417. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/App.js +0 -0
  418. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/api/Api.js +0 -0
  419. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/components/CRUDButtons.js +0 -0
  420. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/components/Forms.js +0 -0
  421. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/components/Table.js +0 -0
  422. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/src/index.js +0 -0
  423. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/static/webpack.config.js +0 -0
  424. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/templates/base.html +0 -0
  425. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/templates/react.html +0 -0
  426. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  427. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  428. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/babel/babel.cfg +0 -0
  429. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/babel/messages.pot +0 -0
  430. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/config.py +0 -0
  431. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/react-rest-api/testdata.py +0 -0
  432. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/NAMES.DIC +0 -0
  433. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/README.rst +0 -0
  434. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/app/__init__.py +0 -0
  435. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/app/models.py +0 -0
  436. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  437. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  438. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/app/views.py +0 -0
  439. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/babel/babel.cfg +0 -0
  440. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/babel/messages.pot +0 -0
  441. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/config.py +0 -0
  442. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/run.py +0 -0
  443. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/related_fields/testdata.py +0 -0
  444. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/.gitignore +0 -0
  445. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/README.rst +0 -0
  446. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/__init__.py +0 -0
  447. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/forms.py +0 -0
  448. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/templates/404.html +0 -0
  449. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  450. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  451. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/app/views.py +0 -0
  452. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/babel/babel.cfg +0 -0
  453. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/babel/messages.pot +0 -0
  454. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/config.py +0 -0
  455. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleform/run.py +0 -0
  456. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/README.rst +0 -0
  457. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/app/__init__.py +0 -0
  458. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/app/views.py +0 -0
  459. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/babel/babel.cfg +0 -0
  460. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/babel/messages.pot +0 -0
  461. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/config.py +0 -0
  462. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview1/run.py +0 -0
  463. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/app/__init__.py +0 -0
  464. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/app/templates/method3.html +0 -0
  465. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/app/views.py +0 -0
  466. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/babel/babel.cfg +0 -0
  467. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/babel/messages.pot +0 -0
  468. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/config.py +0 -0
  469. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/simpleview2/run.py +0 -0
  470. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/NAMES.DIC +0 -0
  471. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/README.rst +0 -0
  472. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/app/__init__.py +0 -0
  473. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/app/models.py +0 -0
  474. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  475. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  476. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/app/views.py +0 -0
  477. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/babel/babel.cfg +0 -0
  478. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/babel/messages.pot +0 -0
  479. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/babel/messages.pot~ +0 -0
  480. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/config.py +0 -0
  481. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/run.py +0 -0
  482. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/user_registration/testdata.py +0 -0
  483. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/NAMES.DIC +0 -0
  484. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/README.rst +0 -0
  485. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/app/__init__.py +0 -0
  486. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/app/models.py +0 -0
  487. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/app/translations/pt/LC_MESSAGES/messages.mo +0 -0
  488. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/app/translations/pt/LC_MESSAGES/messages.po +0 -0
  489. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/app/views.py +0 -0
  490. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/babel/babel.cfg +0 -0
  491. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/babel/messages.pot +0 -0
  492. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/babel/messages.pot~ +0 -0
  493. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/config.py +0 -0
  494. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/run.py +0 -0
  495. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/examples/widgets/testdata.py +0 -0
  496. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/_compat.py +0 -0
  497. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/actions.py +0 -0
  498. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/api/__init__.py +0 -0
  499. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/api/convert.py +0 -0
  500. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/api/manager.py +0 -0
  501. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/api/schemas.py +0 -0
  502. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/babel/__init__.py +0 -0
  503. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/babel/manager.py +0 -0
  504. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/babel/views.py +0 -0
  505. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/base.py +0 -0
  506. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/basemanager.py +0 -0
  507. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/baseviews.py +0 -0
  508. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/charts/__init__.py +0 -0
  509. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/charts/jsontools.py +0 -0
  510. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/charts/views.py +0 -0
  511. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/charts/widgets.py +0 -0
  512. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/cli.py +0 -0
  513. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/exceptions.py +0 -0
  514. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/fields.py +0 -0
  515. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/fieldwidgets.py +0 -0
  516. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/filemanager.py +0 -0
  517. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/filters.py +0 -0
  518. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/forms.py +0 -0
  519. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/hooks.py +0 -0
  520. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/menu.py +0 -0
  521. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/messages.py +0 -0
  522. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/__init__.py +0 -0
  523. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/base.py +0 -0
  524. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/decorators.py +0 -0
  525. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/filters.py +0 -0
  526. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/generic/__init__.py +0 -0
  527. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/generic/filters.py +0 -0
  528. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/generic/interface.py +0 -0
  529. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/group.py +0 -0
  530. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/mixins.py +0 -0
  531. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/sqla/__init__.py +0 -0
  532. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/sqla/base.py +0 -0
  533. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/sqla/base_legacy.py +0 -0
  534. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/sqla/filters.py +0 -0
  535. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/models/sqla/interface.py +0 -0
  536. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/__init__.py +0 -0
  537. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/api.py +0 -0
  538. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/decorators.py +0 -0
  539. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/forms.py +0 -0
  540. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/registerviews.py +0 -0
  541. {flask_appbuilder-5.0.2rc2/flask_appbuilder/security/sqla → flask_appbuilder-5.1.0/flask_appbuilder/security/saml}/__init__.py +0 -0
  542. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/schemas.py +0 -0
  543. {flask_appbuilder-5.0.2rc2/flask_appbuilder/translations → flask_appbuilder-5.1.0/flask_appbuilder/security/sqla}/__init__.py +0 -0
  544. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/__init__.py +0 -0
  545. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/group/__init__.py +0 -0
  546. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/group/api.py +0 -0
  547. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/group/schema.py +0 -0
  548. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/permission/__init__.py +0 -0
  549. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/permission/api.py +0 -0
  550. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/permission_view_menu/__init__.py +0 -0
  551. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/permission_view_menu/api.py +0 -0
  552. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/role/__init__.py +0 -0
  553. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/role/api.py +0 -0
  554. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/role/schema.py +0 -0
  555. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/user/__init__.py +0 -0
  556. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/user/api.py +0 -0
  557. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/user/schema.py +0 -0
  558. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/user/validator.py +0 -0
  559. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/view_menu/__init__.py +0 -0
  560. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/apis/view_menu/api.py +0 -0
  561. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/sqla/models.py +0 -0
  562. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/security/utils.py +0 -0
  563. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/.DS_Store +0 -0
  564. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/ab.css +0 -0
  565. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/bootstrap-datepicker/bootstrap-datepicker3.min.css +0 -0
  566. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/bootstrap.min.css +0 -0
  567. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/bootstrap.min.css.map +0 -0
  568. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/flags/flags16.css +0 -0
  569. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/all.min.css +0 -0
  570. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/brands.min.css +0 -0
  571. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/fontawesome.min.css +0 -0
  572. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/regular.min.css +0 -0
  573. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/solid.min.css +0 -0
  574. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/svg-with-js.min.css +0 -0
  575. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/v4-font-face.min.css +0 -0
  576. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/v4-shims.min.css +0 -0
  577. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/fontawesome/v5-font-face.min.css +0 -0
  578. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/images/flags16.png +0 -0
  579. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/select2/select2-bootstrap.min.css +0 -0
  580. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/select2/select2.min.css +0 -0
  581. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/swagger/swagger-ui.css +0 -0
  582. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/amelia.css +0 -0
  583. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/cerulean.css +0 -0
  584. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/cosmo.css +0 -0
  585. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/cyborg.css +0 -0
  586. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/darkly.css +0 -0
  587. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/flatly.css +0 -0
  588. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/journal.css +0 -0
  589. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/lumen.css +0 -0
  590. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/paper.css +0 -0
  591. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/readable.css +0 -0
  592. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/sandstone.css +0 -0
  593. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/simplex.css +0 -0
  594. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/slate.css +0 -0
  595. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/solar.css +0 -0
  596. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/spacelab.css +0 -0
  597. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/superhero.css +0 -0
  598. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/united.css +0 -0
  599. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/themes/yeti.css +0 -0
  600. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.ttf +0 -0
  601. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.woff2 +0 -0
  602. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.ttf +0 -0
  603. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.woff2 +0 -0
  604. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.ttf +0 -0
  605. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.woff2 +0 -0
  606. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.ttf +0 -0
  607. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.woff2 +0 -0
  608. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.eot +0 -0
  609. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.svg +0 -0
  610. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.ttf +0 -0
  611. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.woff +0 -0
  612. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.woff2 +0 -0
  613. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/img/fab.png +0 -0
  614. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/img/glyphicons-halflings-white.png +0 -0
  615. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/img/glyphicons-halflings.png +0 -0
  616. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/ab.js +0 -0
  617. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/ab_actions.js +0 -0
  618. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/ab_filters.js +0 -0
  619. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/ab_keep_tab.js +0 -0
  620. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/bootstrap-datepicker/bootstrap-datepicker.min.js +0 -0
  621. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/bootstrap.min.js +0 -0
  622. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/google_charts.js +0 -0
  623. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/jquery-latest.js +0 -0
  624. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/select2/select2.min.js +0 -0
  625. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/static/appbuilder/js/swagger-ui-bundle.js +0 -0
  626. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/_formhelpers.html +0 -0
  627. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/base.html +0 -0
  628. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/baselayout.html +0 -0
  629. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/baselib.html +0 -0
  630. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/flash.html +0 -0
  631. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/footer.html +0 -0
  632. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/alert.html +0 -0
  633. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/charts/chart.html +0 -0
  634. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/charts/chart_time.html +0 -0
  635. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/charts/jsonchart.html +0 -0
  636. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/confirm.html +0 -0
  637. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/lib.html +0 -0
  638. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/add.html +0 -0
  639. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/edit.html +0 -0
  640. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/edit_cascade.html +0 -0
  641. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/left_master_detail.html +0 -0
  642. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/list.html +0 -0
  643. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/multiple_views.html +0 -0
  644. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/search.html +0 -0
  645. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/show.html +0 -0
  646. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/model/show_cascade.html +0 -0
  647. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/activation.html +0 -0
  648. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/login_db.html +0 -0
  649. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/login_ldap.html +0 -0
  650. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/login_oauth.html +0 -0
  651. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/register_mail.html +0 -0
  652. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/security/register_oauth.html +0 -0
  653. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/base_list.html +0 -0
  654. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/chart.html +0 -0
  655. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/direct_chart.html +0 -0
  656. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/form.html +0 -0
  657. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/form_horizontal.html +0 -0
  658. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/form_inline.html +0 -0
  659. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/form_vertical.html +0 -0
  660. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/group_form_list.html +0 -0
  661. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list.html +0 -0
  662. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_block.html +0 -0
  663. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_carousel.html +0 -0
  664. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_item.html +0 -0
  665. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_link.html +0 -0
  666. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_master.html +0 -0
  667. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/list_thumbnail.html +0 -0
  668. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/multiple_chart.html +0 -0
  669. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/roles/list.html +0 -0
  670. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/roles/show.html +0 -0
  671. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/search.html +0 -0
  672. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/show.html +0 -0
  673. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/show_block.html +0 -0
  674. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/general/widgets/show_vertical.html +0 -0
  675. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/index.html +0 -0
  676. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/init.html +0 -0
  677. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/navbar.html +0 -0
  678. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/navbar_menu.html +0 -0
  679. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/navbar_right.html +0 -0
  680. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/templates/appbuilder/swagger/swagger.html +0 -0
  681. {flask_appbuilder-5.0.2rc2/flask_appbuilder/utils → flask_appbuilder-5.1.0/flask_appbuilder/translations}/__init__.py +0 -0
  682. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/de/LC_MESSAGES/messages.mo +0 -0
  683. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/de/LC_MESSAGES/messages.po +0 -0
  684. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/el/LC_MESSAGES/messages.mo +0 -0
  685. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/el/LC_MESSAGES/messages.po +0 -0
  686. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/es/LC_MESSAGES/messages.mo +0 -0
  687. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/es/LC_MESSAGES/messages.po +0 -0
  688. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/fa/LC_MESSAGES/messages.mo +0 -0
  689. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/fa/LC_MESSAGES/messages.po +0 -0
  690. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/fr/LC_MESSAGES/messages.mo +0 -0
  691. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/fr/LC_MESSAGES/messages.po +0 -0
  692. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/it/LC_MESSAGES/messages.mo +0 -0
  693. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/it/LC_MESSAGES/messages.po +0 -0
  694. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ja_JP/LC_MESSAGES/messages.mo +0 -0
  695. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ja_JP/LC_MESSAGES/messages.po +0 -0
  696. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ko/LC_MESSAGES/messages.mo +0 -0
  697. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ko/LC_MESSAGES/messages.po +0 -0
  698. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/nl/LC_MESSAGES/messages.mo +0 -0
  699. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/nl/LC_MESSAGES/messages.po +0 -0
  700. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pl/LC_MESSAGES/messages.mo +0 -0
  701. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pl/LC_MESSAGES/messages.po +0 -0
  702. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pt/LC_MESSAGES/messages.mo +0 -0
  703. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pt/LC_MESSAGES/messages.po +0 -0
  704. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pt/LC_MESSAGES/messages.po~ +0 -0
  705. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.mo +0 -0
  706. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.po +0 -0
  707. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ru/LC_MESSAGES/messages.mo +0 -0
  708. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/ru/LC_MESSAGES/messages.po +0 -0
  709. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/sl/LC_MESSAGES/messages.mo +0 -0
  710. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/sl/LC_MESSAGES/messages.po +0 -0
  711. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/tr/LC_MESSAGES/messages.mo +0 -0
  712. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/tr/LC_MESSAGES/messages.po +0 -0
  713. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/zh/LC_MESSAGES/messages.mo +0 -0
  714. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/zh/LC_MESSAGES/messages.po +0 -0
  715. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/zh_HK/LC_MESSAGES/messages.mo +0 -0
  716. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/translations/zh_HK/LC_MESSAGES/messages.po +0 -0
  717. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/upload.py +0 -0
  718. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/urltools.py +0 -0
  719. {flask_appbuilder-5.0.2rc2/tests → flask_appbuilder-5.1.0/flask_appbuilder/utils}/__init__.py +0 -0
  720. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/utils/base.py +0 -0
  721. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/utils/legacy.py +0 -0
  722. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/utils/limit.py +0 -0
  723. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/validators.py +0 -0
  724. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/views.py +0 -0
  725. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/flask_appbuilder/widgets.py +0 -0
  726. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/ListThumbnail.png +0 -0
  727. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/chart.png +0 -0
  728. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/chart_time1.png +0 -0
  729. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/chart_time2.png +0 -0
  730. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/charts.png +0 -0
  731. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/contact_list.png +0 -0
  732. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/contacts.png +0 -0
  733. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/direct_chart.png +0 -0
  734. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/fab.png +0 -0
  735. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/group_list.png +0 -0
  736. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/grouped_chart.png +0 -0
  737. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/groups.png +0 -0
  738. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/images_list.png +0 -0
  739. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/list_cascade.png +0 -0
  740. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/list_cascade_block.png +0 -0
  741. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/list_compact_inline.png +0 -0
  742. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/list_master_detail.png +0 -0
  743. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/login.png +0 -0
  744. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/login_db.png +0 -0
  745. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/login_oauth.png +0 -0
  746. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/login_oid.png +0 -0
  747. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/security.png +0 -0
  748. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/images/simpleview2.png +0 -0
  749. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/release.sh +0 -0
  750. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/scripts/babel_extract.sh +0 -0
  751. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/scripts/babel_init.sh +0 -0
  752. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/setup.cfg +0 -0
  753. {flask_appbuilder-5.0.2rc2/tests/fixtures → flask_appbuilder-5.1.0/tests}/__init__.py +0 -0
  754. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/base.py +0 -0
  755. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/config_api.py +0 -0
  756. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/config_oauth.py +0 -0
  757. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/config_security.py +0 -0
  758. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/config_security_api.py +0 -0
  759. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/const.py +0 -0
  760. {flask_appbuilder-5.0.2rc2/tests/security → flask_appbuilder-5.1.0/tests/fixtures}/__init__.py +0 -0
  761. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/fixtures/addon_manager.py +0 -0
  762. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/fixtures/data_models.py +0 -0
  763. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/fixtures/users.py +0 -0
  764. {flask_appbuilder-5.0.2rc2/tests/sqla → flask_appbuilder-5.1.0/tests/security}/__init__.py +0 -0
  765. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_auth_ldap.py +0 -0
  766. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_auth_oauth.py +0 -0
  767. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_base_security_manager.py +0 -0
  768. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_mvc_security.py +0 -0
  769. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_password_complexity.py +0 -0
  770. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/security/test_rate_limiter.py +0 -0
  771. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/sqla/models.py +0 -0
  772. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_addon.py +0 -0
  773. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_api.py +0 -0
  774. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_custom_indexview.py +0 -0
  775. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_fab_cli.py +0 -0
  776. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_menu.py +0 -0
  777. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_mvc.py +0 -0
  778. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_mvc_oauth.py +0 -0
  779. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_security_api.py +0 -0
  780. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_sqlalchemy.py +0 -0
  781. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tests/test_urltools.py +0 -0
  782. {flask_appbuilder-5.0.2rc2 → flask_appbuilder-5.1.0}/tox.ini +0 -0
@@ -1,7 +1,13 @@
1
1
  Flask-AppBuilder ChangeLog
2
2
  ==========================
3
3
 
4
- Improvements and Bug fixes on 5.0.2rc2
4
+ Improvements and Bug fixes on 5.1.0
5
+ -----------------------------------
6
+
7
+ - feat: SAML Authentication (#2426) [Daniel Vaz Gaspar]
8
+ - fix: update user.changed_on when roles are modified (#2423) [alok kumar priyadarshi]
9
+
10
+ Improvements and Bug fixes on 5.0.2
5
11
  -----------------------------------
6
12
 
7
13
  - fix: fix pkg name to comply with pypi (#2413) [Daniel Vaz Gaspar]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flask-appbuilder
3
- Version: 5.0.2rc2
3
+ Version: 5.1.0
4
4
  Summary: Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more.
5
5
  Home-page: https://github.com/dpgaspar/flask-appbuilder/
6
6
  Author: Daniel Vaz Gaspar
@@ -22,6 +22,7 @@ Requires-Python: ~=3.7
22
22
  Description-Content-Type: text/x-rst
23
23
  Provides-Extra: jmespath
24
24
  Provides-Extra: oauth
25
+ Provides-Extra: saml
25
26
  Provides-Extra: talisman
26
27
  License-File: LICENSE
27
28
 
@@ -559,6 +559,10 @@ flask_appbuilder/security/registerviews.py
559
559
  flask_appbuilder/security/schemas.py
560
560
  flask_appbuilder/security/utils.py
561
561
  flask_appbuilder/security/views.py
562
+ flask_appbuilder/security/saml/__init__.py
563
+ flask_appbuilder/security/saml/metadata.py
564
+ flask_appbuilder/security/saml/types.py
565
+ flask_appbuilder/security/saml/utils.py
562
566
  flask_appbuilder/security/sqla/__init__.py
563
567
  flask_appbuilder/security/sqla/manager.py
564
568
  flask_appbuilder/security/sqla/models.py
@@ -672,6 +676,7 @@ flask_appbuilder/templates/appbuilder/general/security/activation.html
672
676
  flask_appbuilder/templates/appbuilder/general/security/login_db.html
673
677
  flask_appbuilder/templates/appbuilder/general/security/login_ldap.html
674
678
  flask_appbuilder/templates/appbuilder/general/security/login_oauth.html
679
+ flask_appbuilder/templates/appbuilder/general/security/login_saml.html
675
680
  flask_appbuilder/templates/appbuilder/general/security/register_mail.html
676
681
  flask_appbuilder/templates/appbuilder/general/security/register_oauth.html
677
682
  flask_appbuilder/templates/appbuilder/general/widgets/base_list.html
@@ -26,5 +26,8 @@ jmespath>=0.9.5
26
26
  [oauth]
27
27
  Authlib<2.0.0,>=0.14
28
28
 
29
+ [saml]
30
+ python3-saml>=1.15.0
31
+
29
32
  [talisman]
30
33
  flask-talisman<2.0,>=1.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flask_appbuilder
3
- Version: 5.0.2rc2
3
+ Version: 5.1.0
4
4
  Summary: Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more.
5
5
  Home-page: https://github.com/dpgaspar/flask-appbuilder/
6
6
  Author: Daniel Vaz Gaspar
@@ -22,6 +22,7 @@ Requires-Python: ~=3.7
22
22
  Description-Content-Type: text/x-rst
23
23
  Provides-Extra: jmespath
24
24
  Provides-Extra: oauth
25
+ Provides-Extra: saml
25
26
  Provides-Extra: talisman
26
27
  License-File: LICENSE
27
28
 
@@ -16,6 +16,7 @@ Supported Authentication Types
16
16
  It's the web server responsibility to authenticate the user, useful for intranet sites, when the server (Apache, Nginx)
17
17
  is configured to use kerberos, no need for the user to login with username and password on F.A.B.
18
18
  :OAUTH: Authentication using OAUTH (v1 or v2). You need to install authlib.
19
+ :SAML: Authentication using SAML 2.0 (e.g., Microsoft Entra ID, Okta, OneLogin). You need to install python3-saml.
19
20
 
20
21
  .. note::
21
22
  **Deprecated Authentication Types (Removed in Flask-AppBuilder 5.0+)**
@@ -31,7 +32,7 @@ The session is preserved and encrypted using Flask-Login.
31
32
  Authentication Methods
32
33
  ----------------------
33
34
 
34
- You can choose one from 4 authentication methods. Configure the method to be used
35
+ You can choose one from 5 authentication methods. Configure the method to be used
35
36
  on the **config.py** (when using the create-app, or following the proposed app structure). First the
36
37
  configuration imports the constants for the authentication methods::
37
38
 
@@ -39,7 +40,8 @@ configuration imports the constants for the authentication methods::
39
40
  AUTH_DB,
40
41
  AUTH_LDAP,
41
42
  AUTH_OAUTH,
42
- AUTH_REMOTE_USER
43
+ AUTH_REMOTE_USER,
44
+ AUTH_SAML,
43
45
  )
44
46
 
45
47
  Next you will use the **AUTH_TYPE** key to choose the type::
@@ -437,6 +439,138 @@ Therefore, you can send tweets, post on the users Facebook, retrieve the user's
437
439
  Take a look at the `example <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples/oauth>`_
438
440
  to get an idea of a simple use for this.
439
441
 
442
+ Authentication: SAML
443
+ --------------------
444
+
445
+ This method will authenticate users via SAML 2.0 identity providers such as
446
+ Microsoft Entra ID (formerly Azure AD), Okta, OneLogin, etc.
447
+
448
+ .. note:: To use SAML you need to install `python3-saml <https://github.com/SAML-Toolkits/python3-saml>`_:
449
+ ``pip install flask-appbuilder[saml]``
450
+
451
+ Configure your SAML providers and SP settings in **config.py**::
452
+
453
+ AUTH_TYPE = AUTH_SAML
454
+
455
+ # registration configs
456
+ AUTH_USER_REGISTRATION = True
457
+ AUTH_USER_REGISTRATION_ROLE = "Public"
458
+
459
+ # Sync roles at login from SAML assertion
460
+ AUTH_ROLES_SYNC_AT_LOGIN = True
461
+
462
+ # Map SAML group names to FAB roles
463
+ AUTH_ROLES_MAPPING = {
464
+ "admins": ["Admin"],
465
+ "users": ["Public"],
466
+ }
467
+
468
+ # SAML Identity Providers
469
+ SAML_PROVIDERS = [
470
+ {
471
+ "name": "entra_id",
472
+ "icon": "fa-microsoft",
473
+ "idp": {
474
+ "entityId": "https://sts.windows.net/<TENANT_ID>/",
475
+ "singleSignOnService": {
476
+ "url": "https://login.microsoftonline.com/<TENANT_ID>/saml2",
477
+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
478
+ },
479
+ "singleLogoutService": {
480
+ "url": "https://login.microsoftonline.com/<TENANT_ID>/saml2",
481
+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
482
+ },
483
+ "x509cert": "<IDP_CERTIFICATE_BASE64>",
484
+ },
485
+ "attribute_mapping": {
486
+ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": "email",
487
+ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname": "first_name",
488
+ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname": "last_name",
489
+ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "username",
490
+ "http://schemas.microsoft.com/ws/2008/06/identity/claims/groups": "role_keys",
491
+ },
492
+ },
493
+ ]
494
+
495
+ # Global SAML Service Provider configuration
496
+ SAML_CONFIG = {
497
+ "strict": True,
498
+ "debug": False,
499
+ "sp": {
500
+ "entityId": "https://myapp.example.com/saml/metadata/",
501
+ "assertionConsumerService": {
502
+ "url": "https://myapp.example.com/saml/acs/",
503
+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
504
+ },
505
+ "singleLogoutService": {
506
+ "url": "https://myapp.example.com/saml/slo/",
507
+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
508
+ },
509
+ "NameIDFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
510
+ "x509cert": "",
511
+ # "privateKey": "",
512
+ },
513
+ "security": {
514
+ "nameIdEncrypted": False,
515
+ "authnRequestsSigned": False,
516
+ "logoutRequestSigned": False,
517
+ "logoutResponseSigned": False,
518
+ "signMetadata": False,
519
+ "wantMessagesSigned": False,
520
+ "wantAssertionsSigned": True,
521
+ "wantAssertionsEncrypted": False,
522
+ "wantNameId": True,
523
+ "wantNameIdEncrypted": False,
524
+ "wantAttributeStatement": True,
525
+ },
526
+ }
527
+
528
+ Each SAML provider entry has the following keys:
529
+
530
+ :name: A unique name for the identity provider.
531
+ :icon: A Font Awesome icon class for the login button.
532
+ :idp: The IdP SAML metadata (entityId, SSO/SLO URLs, and signing certificate).
533
+ :attribute_mapping: Maps SAML assertion attribute names (left) to FAB user fields (right).
534
+ Supported FAB fields: ``username``, ``email``, ``first_name``, ``last_name``, ``role_keys``.
535
+
536
+ The ``SAML_CONFIG`` dict holds the global Service Provider settings. The ``sp`` section defines
537
+ your application's SAML endpoints. These URLs must match what you configure on the IdP side.
538
+
539
+ SAML Endpoints
540
+ ~~~~~~~~~~~~~~
541
+
542
+ The following endpoints are automatically registered:
543
+
544
+ - ``/login/`` — Login page with IdP selection (or auto-redirect for single IdP)
545
+ - ``/login/<idp>`` — Initiate SSO with a specific IdP
546
+ - ``/saml/acs/`` — Assertion Consumer Service (receives SAML responses)
547
+ - ``/saml/slo/`` — Single Logout endpoint
548
+ - ``/saml/metadata/`` — SP metadata XML (configure this URL on your IdP)
549
+
550
+ SAML Role Mapping
551
+ ~~~~~~~~~~~~~~~~~
552
+
553
+ You can map SAML group claims to FAB roles, just like with OAuth and LDAP::
554
+
555
+ AUTH_ROLES_MAPPING = {
556
+ "admins": ["Admin"],
557
+ "users": ["User"],
558
+ }
559
+
560
+ AUTH_ROLES_SYNC_AT_LOGIN = True
561
+
562
+ PERMANENT_SESSION_LIFETIME = 1800
563
+
564
+ The ``role_keys`` field in ``attribute_mapping`` defines which SAML attribute contains the
565
+ user's group memberships.
566
+
567
+ You can also use JMESPath expressions for dynamic role assignment::
568
+
569
+ AUTH_USER_REGISTRATION_ROLE_JMESPATH = "role_keys[0]"
570
+
571
+ Take a look at the `SAML example <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples/saml>`_
572
+
573
+
440
574
  Authentication: Rate limiting
441
575
  -----------------------------
442
576
 
@@ -848,6 +982,9 @@ F.A.B. uses a different user view for each authentication method
848
982
 
849
983
  :UserDBModelView: For database auth method
850
984
  :UserLDAPModelView: For LDAP auth method
985
+ :UserOAuthModelView: For OAuth auth method
986
+ :UserRemoteUserModelView: For Remote User auth method
987
+ :UserSAMLModelView: For SAML auth method
851
988
 
852
989
  You can extend or create from scratch your own, and then tell F.A.B. to use them instead, by overriding their
853
990
  correspondent lower case properties on **SecurityManager** (just like on the given example).
@@ -881,6 +1018,7 @@ If you're using:
881
1018
  :AUTH_LDAP: Extend UserLDAPModelView
882
1019
  :AUTH_REMOTE_USER: Extend UserRemoteUserModelView
883
1020
  :AUTH_OAUTH: Extend UserOAuthModelView
1021
+ :AUTH_SAML: Extend UserSAMLModelView
884
1022
 
885
1023
  So using AUTH_DB::
886
1024
 
@@ -955,6 +1093,8 @@ Note that this is for AUTH_DB, so if you're using:
955
1093
  :AUTH_DB: Override userdbmodelview
956
1094
  :AUTH_LDAP: Override userldapmodelview
957
1095
  :AUTH_REMOTE_USER: Override userremoteusermodelview
1096
+ :AUTH_OAUTH: Override useroauthmodelview
1097
+ :AUTH_SAML: Override usersamlmodelview
958
1098
 
959
1099
  Finally (as shown on the previous example) tell F.A.B. to use your SecurityManager class, so when initializing
960
1100
  **AppBuilder** (on __init__.py)::
@@ -1,5 +1,5 @@
1
1
  __author__ = "Daniel Vaz Gaspar"
2
- __version__ = "5.0.2rc2"
2
+ __version__ = "5.1.0"
3
3
 
4
4
  from .actions import action # noqa: F401
5
5
  from .api import ModelRestApi # noqa: F401
@@ -130,6 +130,7 @@ AUTH_DB = 1
130
130
  AUTH_LDAP = 2
131
131
  AUTH_REMOTE_USER = 3
132
132
  AUTH_OAUTH = 4
133
+ AUTH_SAML = 5
133
134
  """ Constants for supported authentication types """
134
135
 
135
136
  # -----------------------------------
@@ -4,9 +4,9 @@ import datetime
4
4
  import importlib
5
5
  import logging
6
6
  import re
7
- from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
7
+ from typing import Any, Callable, Dict, List, Optional, Set, Tuple, TYPE_CHECKING, Union
8
8
 
9
- from flask import current_app, Flask, g, session, url_for
9
+ from flask import current_app, Flask, g, request, session, url_for
10
10
  from flask_appbuilder.exceptions import InvalidLoginAttempt, OAuthProviderUnknown
11
11
  from flask_babel import lazy_gettext as _
12
12
  from flask_jwt_extended import current_user as current_user_jwt
@@ -28,6 +28,7 @@ from .views import (
28
28
  AuthLDAPView,
29
29
  AuthOAuthView,
30
30
  AuthRemoteUserView,
31
+ AuthSAMLView,
31
32
  PermissionModelView,
32
33
  PermissionViewModelView,
33
34
  RegisterUserModelView,
@@ -40,6 +41,7 @@ from .views import (
40
41
  UserLDAPModelView,
41
42
  UserOAuthModelView,
42
43
  UserRemoteUserModelView,
44
+ UserSAMLModelView,
43
45
  UserStatsChartView,
44
46
  ViewMenuModelView,
45
47
  )
@@ -49,6 +51,7 @@ from ..const import (
49
51
  AUTH_LDAP,
50
52
  AUTH_OAUTH,
51
53
  AUTH_REMOTE_USER,
54
+ AUTH_SAML,
52
55
  LOGMSG_ERR_SEC_ADD_REGISTER_USER,
53
56
  LOGMSG_ERR_SEC_AUTH_LDAP,
54
57
  LOGMSG_ERR_SEC_AUTH_LDAP_TLS,
@@ -59,6 +62,9 @@ from ..const import (
59
62
  PERMISSION_PREFIX,
60
63
  )
61
64
 
65
+ if TYPE_CHECKING:
66
+ from flask_appbuilder.security.saml.types import SAMLConfig, SAMLProvider
67
+
62
68
  log = logging.getLogger(__name__)
63
69
 
64
70
 
@@ -186,6 +192,11 @@ class BaseSecurityManager(AbstractSecurityManager):
186
192
  """ Override if you want your own Authentication OAuth view """
187
193
  authremoteuserview = AuthRemoteUserView
188
194
  """ Override if you want your own Authentication REMOTE_USER view """
195
+ authsamlview = AuthSAMLView
196
+ """ Override if you want your own Authentication SAML view """
197
+
198
+ usersamlmodelview = UserSAMLModelView
199
+ """ Override if you want your own user SAML view """
189
200
 
190
201
  registeruserdbview = RegisterUserDBView
191
202
  """ Override if you want your own register user db view """
@@ -519,6 +530,41 @@ class BaseSecurityManager(AbstractSecurityManager):
519
530
  def oauth_providers(self):
520
531
  return current_app.config["OAUTH_PROVIDERS"]
521
532
 
533
+ @property
534
+ def saml_providers(self) -> List["SAMLProvider"]:
535
+ return current_app.config.get("SAML_PROVIDERS", [])
536
+
537
+ @property
538
+ def saml_config(self) -> "SAMLConfig":
539
+ return current_app.config.get("SAML_CONFIG", {})
540
+
541
+ def get_saml_provider(self, name: str) -> Optional["SAMLProvider"]:
542
+ """Return a specific SAML provider by name."""
543
+ for provider in self.saml_providers:
544
+ if provider["name"] == name:
545
+ return provider
546
+ return None
547
+
548
+ def get_saml_settings(self, provider_name: str) -> "SAMLConfig":
549
+ """Build the python3-saml settings dict for a given provider.
550
+
551
+ Merges the global SAML_CONFIG with the provider-specific IdP config.
552
+ """
553
+ import copy
554
+
555
+ provider = self.get_saml_provider(provider_name)
556
+ if not provider:
557
+ raise ValueError(
558
+ f"SAML provider '{provider_name}' not found in configuration"
559
+ )
560
+
561
+ base_config = copy.deepcopy(self.saml_config)
562
+
563
+ if "idp" in provider:
564
+ base_config["idp"] = provider["idp"]
565
+
566
+ return base_config
567
+
522
568
  @property
523
569
  def is_auth_limited(self) -> bool:
524
570
  return current_app.config["AUTH_RATE_LIMITED"]
@@ -807,6 +853,9 @@ class BaseSecurityManager(AbstractSecurityManager):
807
853
  elif self.auth_type == AUTH_REMOTE_USER:
808
854
  self.user_view = self.userremoteusermodelview
809
855
  self.auth_view = self.authremoteuserview()
856
+ elif self.auth_type == AUTH_SAML:
857
+ self.user_view = self.usersamlmodelview
858
+ self.auth_view = self.authsamlview()
810
859
  self.appbuilder.add_view_no_menu(self.auth_view)
811
860
 
812
861
  # this needs to be done after the view is added, otherwise the blueprint
@@ -1448,6 +1497,238 @@ class BaseSecurityManager(AbstractSecurityManager):
1448
1497
  else:
1449
1498
  return None
1450
1499
 
1500
+ @staticmethod
1501
+ def _prepare_saml_request() -> Dict[str, Any]:
1502
+ """Prepare Flask request data in the format expected by python3-saml."""
1503
+ return {
1504
+ "https": "on" if request.scheme == "https" else "off",
1505
+ "http_host": request.host,
1506
+ "server_port": request.environ.get("SERVER_PORT", "443"),
1507
+ "script_name": request.path,
1508
+ "get_data": request.args.copy(),
1509
+ "post_data": request.form.copy(),
1510
+ "query_string": request.query_string.decode("utf-8"),
1511
+ }
1512
+
1513
+ def _get_saml_auth(self, idp: str):
1514
+ """Create a OneLogin_Saml2_Auth instance for the given IdP."""
1515
+ from onelogin.saml2.auth import OneLogin_Saml2_Auth
1516
+
1517
+ return OneLogin_Saml2_Auth(
1518
+ self._prepare_saml_request(), self.get_saml_settings(idp)
1519
+ )
1520
+
1521
+ def get_saml_login_redirect_url(self, idp: str) -> str:
1522
+ """Create a SAML authentication request and return the redirect URL.
1523
+
1524
+ :param idp: The SAML identity provider name.
1525
+ :returns: The IdP redirect URL for SSO.
1526
+ """
1527
+ return self._get_saml_auth(idp).login()
1528
+
1529
+ def get_saml_userinfo(self, idp: str) -> Optional[Dict[str, Any]]:
1530
+ """Process a SAML ACS response and return mapped user info.
1531
+
1532
+ :param idp: The SAML identity provider name.
1533
+ :returns: A dict with mapped user info, session_index, and name_id,
1534
+ or None if authentication failed.
1535
+ """
1536
+ from flask_appbuilder.security.saml.utils import map_saml_attributes
1537
+
1538
+ auth = self._get_saml_auth(idp)
1539
+ auth.process_response()
1540
+ errors = auth.get_errors()
1541
+
1542
+ if errors:
1543
+ error_reason = auth.get_last_error_reason() or ""
1544
+ # Check for issuer mismatch (multi-tab / wrong IdP scenario)
1545
+ if "issuer" in error_reason.lower():
1546
+ log.error(
1547
+ "SAML Issuer mismatch for IdP '%s'. This may happen if you "
1548
+ "initiated login with a different IdP in another tab. "
1549
+ "Error: %s",
1550
+ idp,
1551
+ error_reason,
1552
+ )
1553
+ else:
1554
+ log.error(
1555
+ "SAML ACS errors for IdP '%s': %s (reason: %s)",
1556
+ idp,
1557
+ errors,
1558
+ error_reason,
1559
+ )
1560
+ return None
1561
+
1562
+ if not auth.is_authenticated():
1563
+ return None
1564
+
1565
+ saml_attributes = auth.get_attributes()
1566
+ name_id = auth.get_nameid()
1567
+ log.debug(
1568
+ "SAML attributes from IdP '%s': %s, NameID: %s",
1569
+ idp,
1570
+ saml_attributes,
1571
+ name_id,
1572
+ )
1573
+
1574
+ provider = self.get_saml_provider(idp)
1575
+ attribute_mapping = provider.get("attribute_mapping", {})
1576
+ userinfo = map_saml_attributes(saml_attributes, attribute_mapping, name_id)
1577
+
1578
+ # Include session data needed for SLO
1579
+ userinfo["saml_name_id"] = name_id
1580
+ userinfo["saml_session_index"] = auth.get_session_index()
1581
+
1582
+ log.debug("Mapped SAML userinfo: %s", userinfo)
1583
+ return userinfo
1584
+
1585
+ def get_saml_logout_redirect_url(
1586
+ self,
1587
+ idp: str,
1588
+ name_id: Optional[str] = None,
1589
+ session_index: Optional[str] = None,
1590
+ ) -> Tuple[Optional[str], bool]:
1591
+ """Process SAML SLO or initiate a logout request.
1592
+
1593
+ Handles three cases:
1594
+ - Incoming SLO request from IdP (SAMLRequest)
1595
+ - SLO response from IdP (SAMLResponse)
1596
+ - SP-initiated logout (returns redirect URL to IdP)
1597
+
1598
+ :param idp: The SAML identity provider name.
1599
+ :param name_id: The SAML NameID for the session.
1600
+ :param session_index: The SAML session index.
1601
+ :returns: Tuple of (redirect URL or None, should_logout flag).
1602
+ The caller should call logout_user() if should_logout is True.
1603
+ """
1604
+ auth = self._get_saml_auth(idp)
1605
+ should_logout = False
1606
+
1607
+ def mark_logout():
1608
+ nonlocal should_logout
1609
+ should_logout = True
1610
+
1611
+ # Incoming SLO request from IdP
1612
+ if "SAMLRequest" in request.form or "SAMLRequest" in request.args:
1613
+ url = auth.process_slo(delete_session_cb=mark_logout)
1614
+ return url, should_logout
1615
+
1616
+ # SLO response from IdP
1617
+ if "SAMLResponse" in request.form or "SAMLResponse" in request.args:
1618
+ auth.process_slo(delete_session_cb=mark_logout)
1619
+ return None, should_logout
1620
+
1621
+ # SP-initiated logout
1622
+ return auth.logout(name_id=name_id, session_index=session_index), True
1623
+
1624
+ def _saml_calculate_user_roles(self, userinfo) -> List[str]:
1625
+ user_role_objects = set()
1626
+
1627
+ # apply AUTH_ROLES_MAPPING
1628
+ if len(self.auth_roles_mapping) > 0:
1629
+ user_role_keys = userinfo.get("role_keys", [])
1630
+ user_role_objects.update(self.get_roles_from_keys(user_role_keys))
1631
+
1632
+ # apply AUTH_USER_REGISTRATION_ROLE
1633
+ if self.auth_user_registration:
1634
+ registration_role_name = self.auth_user_registration_role
1635
+
1636
+ if self.auth_user_registration_role_jmespath:
1637
+ import jmespath
1638
+
1639
+ registration_role_name = jmespath.search(
1640
+ self.auth_user_registration_role_jmespath, userinfo
1641
+ )
1642
+
1643
+ fab_role = self.find_role(registration_role_name)
1644
+ if fab_role:
1645
+ user_role_objects.add(fab_role)
1646
+ else:
1647
+ log.warning(
1648
+ "Can't find AUTH_USER_REGISTRATION role: %s", registration_role_name
1649
+ )
1650
+
1651
+ return list(user_role_objects)
1652
+
1653
+ def auth_user_saml(self, userinfo):
1654
+ """
1655
+ Method for authenticating user with SAML.
1656
+
1657
+ :param userinfo: dict with user information extracted from SAML assertion
1658
+ (keys are the same as User model columns)
1659
+ """
1660
+ # extract the username from userinfo
1661
+ if "username" in userinfo:
1662
+ username = userinfo["username"]
1663
+ elif "email" in userinfo:
1664
+ username = userinfo["email"]
1665
+ else:
1666
+ log.error("SAML userinfo does not have username or email %s", userinfo)
1667
+ return None
1668
+
1669
+ if (username is None) or username == "":
1670
+ return None
1671
+
1672
+ # Search the DB for this user by username or email
1673
+ user = self.find_user(username=username)
1674
+ if not user and userinfo.get("email"):
1675
+ user = self.find_user(email=userinfo["email"])
1676
+
1677
+ # If user is not active, go away
1678
+ if user and (not user.is_active):
1679
+ return None
1680
+
1681
+ # If user is not registered, and not self-registration, go away
1682
+ if (not user) and (not self.auth_user_registration):
1683
+ return None
1684
+
1685
+ # Sync the user's roles and info
1686
+ if user:
1687
+ updated = False
1688
+
1689
+ if self.auth_roles_sync_at_login:
1690
+ new_roles = self._saml_calculate_user_roles(userinfo)
1691
+ if new_roles:
1692
+ user.roles = new_roles
1693
+ updated = True
1694
+ log.debug(
1695
+ "Calculated new roles for user='%s' as: %s",
1696
+ username,
1697
+ user.roles,
1698
+ )
1699
+
1700
+ # Update user info from SAML assertion
1701
+ for field in ("first_name", "last_name", "email"):
1702
+ new_val = userinfo.get(field)
1703
+ if new_val and getattr(user, field) != new_val:
1704
+ setattr(user, field, new_val)
1705
+ updated = True
1706
+
1707
+ if updated:
1708
+ self.update_user(user)
1709
+
1710
+ # If the user is new, register them
1711
+ if (not user) and self.auth_user_registration:
1712
+ user = self.add_user(
1713
+ username=username,
1714
+ first_name=userinfo.get("first_name", ""),
1715
+ last_name=userinfo.get("last_name", ""),
1716
+ email=userinfo.get("email", "") or f"{username}@email.notfound",
1717
+ role=self._saml_calculate_user_roles(userinfo),
1718
+ )
1719
+ log.debug("New SAML user registered: %s", user)
1720
+
1721
+ if not user:
1722
+ log.error("Error creating a new SAML user %s", username)
1723
+ return None
1724
+
1725
+ # LOGIN SUCCESS
1726
+ if user:
1727
+ self.update_user_auth_stat(user)
1728
+ return user
1729
+ else:
1730
+ return None
1731
+
1451
1732
  """
1452
1733
  ----------------------------------------
1453
1734
  PERMISSION ACCESS CHECK
@@ -0,0 +1,26 @@
1
+ """SP metadata generation for SAML authentication."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from typing import Any, Dict
7
+
8
+ log = logging.getLogger(__name__)
9
+
10
+
11
+ def get_sp_metadata(saml_settings: Dict[str, Any]) -> str:
12
+ """
13
+ Generate SP metadata XML from SAML settings.
14
+
15
+ :param saml_settings: The python3-saml settings dict
16
+ :return: SP metadata XML string
17
+ """
18
+ from onelogin.saml2.settings import OneLogin_Saml2_Settings
19
+
20
+ settings = OneLogin_Saml2_Settings(saml_settings, sp_validation_only=True)
21
+ metadata = settings.get_sp_metadata()
22
+ errors = settings.validate_metadata(metadata)
23
+ if errors:
24
+ log.error("SP Metadata validation errors: %s", errors)
25
+ raise ValueError(f"SP Metadata validation errors: {errors}")
26
+ return metadata