meerschaum 2.9.0rc2__tar.gz → 2.9.1__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 (284) hide show
  1. {meerschaum-2.9.0rc2/meerschaum.egg-info → meerschaum-2.9.1}/PKG-INFO +14 -9
  2. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/__init__.py +5 -2
  3. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/custom.py +17 -25
  4. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/dashboard.py +5 -21
  5. meerschaum-2.9.1/meerschaum/api/dash/callbacks/settings/__init__.py +8 -0
  6. meerschaum-2.9.1/meerschaum/api/dash/callbacks/settings/password_reset.py +76 -0
  7. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/components.py +110 -7
  8. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/__init__.py +1 -0
  9. meerschaum-2.9.1/meerschaum/api/dash/pages/settings/__init__.py +8 -0
  10. meerschaum-2.9.1/meerschaum/api/dash/pages/settings/password_reset.py +63 -0
  11. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/dash.css +7 -0
  12. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_pipes.py +76 -36
  13. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_version.py +1 -1
  14. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/__init__.py +1 -0
  15. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_pipes.py +79 -30
  16. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_pipes.py +38 -5
  17. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_ValkeyConnector.py +2 -0
  18. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_pipes.py +51 -39
  19. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/__init__.py +1 -0
  20. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_sync.py +64 -4
  21. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/__init__.py +26 -4
  22. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dataframe.py +58 -3
  23. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dtypes/__init__.py +45 -17
  24. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dtypes/sql.py +182 -3
  25. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/misc.py +1 -1
  26. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/_packages.py +6 -3
  27. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/sql.py +122 -6
  28. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/venv/__init__.py +4 -1
  29. {meerschaum-2.9.0rc2 → meerschaum-2.9.1/meerschaum.egg-info}/PKG-INFO +14 -9
  30. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/SOURCES.txt +4 -5
  31. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/requires.txt +14 -8
  32. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_pipes_dtypes.py +10 -6
  33. meerschaum-2.9.0rc2/meerschaum/_internal/gui/__init__.py +0 -43
  34. meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/__init__.py +0 -50
  35. meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/_windows.py +0 -74
  36. meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/actions.py +0 -30
  37. meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/pipes.py +0 -47
  38. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/LICENSE +0 -0
  39. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/NOTICE +0 -0
  40. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/README.md +0 -0
  41. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/__init__.py +0 -0
  42. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/__main__.py +0 -0
  43. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/__init__.py +0 -0
  44. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/__init__.py +0 -0
  45. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  46. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/_parser.py +0 -0
  47. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/docs/__init__.py +0 -0
  48. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/docs/index.py +0 -0
  49. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/entry.py +0 -0
  50. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/Shell.py +0 -0
  51. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  52. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  53. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/__init__.py +0 -0
  54. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  55. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/updates.py +0 -0
  56. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  57. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/__init__.py +0 -0
  58. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/tools.py +0 -0
  59. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/__init__.py +0 -0
  60. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/api.py +0 -0
  61. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/attach.py +0 -0
  62. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/bootstrap.py +0 -0
  63. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/clear.py +0 -0
  64. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/copy.py +0 -0
  65. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/deduplicate.py +0 -0
  66. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/delete.py +0 -0
  67. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/drop.py +0 -0
  68. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/edit.py +0 -0
  69. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/index.py +0 -0
  70. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/install.py +0 -0
  71. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/login.py +0 -0
  72. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/os.py +0 -0
  73. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/pause.py +0 -0
  74. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/python.py +0 -0
  75. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/register.py +0 -0
  76. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/reload.py +0 -0
  77. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/restart.py +0 -0
  78. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/setup.py +0 -0
  79. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sh.py +0 -0
  80. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/show.py +0 -0
  81. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sql.py +0 -0
  82. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/stack.py +0 -0
  83. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/start.py +0 -0
  84. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/stop.py +0 -0
  85. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sync.py +0 -0
  86. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/tag.py +0 -0
  87. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/uninstall.py +0 -0
  88. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/upgrade.py +0 -0
  89. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/verify.py +0 -0
  90. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/__init__.py +0 -0
  91. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_chain.py +0 -0
  92. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_chunks.py +0 -0
  93. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_events.py +0 -0
  94. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_exceptions.py +0 -0
  95. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_oauth2.py +0 -0
  96. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_websockets.py +0 -0
  97. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/__init__.py +0 -0
  98. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/__init__.py +0 -0
  99. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  100. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  101. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  102. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  103. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  104. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  105. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/login.py +0 -0
  106. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  107. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  108. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/register.py +0 -0
  109. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/connectors.py +0 -0
  110. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/graphs.py +0 -0
  111. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/jobs.py +0 -0
  112. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/keys.py +0 -0
  113. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/dashboard.py +0 -0
  114. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/error.py +0 -0
  115. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/job.py +0 -0
  116. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/login.py +0 -0
  117. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/pipes.py +0 -0
  118. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/plugins.py +0 -0
  119. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/register.py +0 -0
  120. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pipes.py +0 -0
  121. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/plugins.py +0 -0
  122. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/sessions.py +0 -0
  123. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/sync.py +0 -0
  124. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/users.py +0 -0
  125. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/websockets.py +0 -0
  126. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/webterm.py +0 -0
  127. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/__init__.py +0 -0
  128. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_interfaces.py +0 -0
  129. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_locations.py +0 -0
  130. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_metrics.py +0 -0
  131. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_pipes.py +0 -0
  132. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/__init__.py +0 -0
  133. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/__init__.py +0 -0
  134. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  135. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  136. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  137. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/styles.css +0 -0
  138. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  139. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  140. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  141. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  142. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  143. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/main.js +0 -0
  144. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  145. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  146. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  147. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/__init__.py +0 -0
  148. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/index.html +0 -0
  149. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/old_index.html +0 -0
  150. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/secret.html +0 -0
  151. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/termpage.html +0 -0
  152. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/__init__.py +0 -0
  153. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_actions.py +0 -0
  154. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_connectors.py +0 -0
  155. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_index.py +0 -0
  156. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_jobs.py +0 -0
  157. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_login.py +0 -0
  158. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_misc.py +0 -0
  159. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_plugins.py +0 -0
  160. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_users.py +0 -0
  161. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_version.py +0 -0
  162. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_webterm.py +0 -0
  163. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/tables/__init__.py +0 -0
  164. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/__init__.py +0 -0
  165. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_dash.py +0 -0
  166. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_default.py +0 -0
  167. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_edit.py +0 -0
  168. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_environment.py +0 -0
  169. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_formatting.py +0 -0
  170. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_jobs.py +0 -0
  171. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_patch.py +0 -0
  172. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_paths.py +0 -0
  173. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_preprocess.py +0 -0
  174. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_read_config.py +0 -0
  175. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_shell.py +0 -0
  176. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_sync.py +0 -0
  177. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/paths.py +0 -0
  178. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/resources/__init__.py +0 -0
  179. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/__init__.py +0 -0
  180. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  181. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  182. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  183. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/resources/__init__.py +0 -0
  184. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/static/__init__.py +0 -0
  185. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/_Connector.py +0 -0
  186. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_APIConnector.py +0 -0
  187. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/__init__.py +0 -0
  188. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_actions.py +0 -0
  189. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_fetch.py +0 -0
  190. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_jobs.py +0 -0
  191. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_login.py +0 -0
  192. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_misc.py +0 -0
  193. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_plugins.py +0 -0
  194. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_request.py +0 -0
  195. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_uri.py +0 -0
  196. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_users.py +0 -0
  197. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/parse.py +0 -0
  198. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  199. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/plugin/__init__.py +0 -0
  200. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/poll.py +0 -0
  201. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  202. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/__init__.py +0 -0
  203. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_cli.py +0 -0
  204. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_create_engine.py +0 -0
  205. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_fetch.py +0 -0
  206. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_instance.py +0 -0
  207. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_plugins.py +0 -0
  208. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_sql.py +0 -0
  209. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_uri.py +0 -0
  210. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_users.py +0 -0
  211. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  212. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tables/types.py +0 -0
  213. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tools.py +0 -0
  214. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/__init__.py +0 -0
  215. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_fetch.py +0 -0
  216. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_plugins.py +0 -0
  217. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_users.py +0 -0
  218. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_attributes.py +0 -0
  219. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  220. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_clear.py +0 -0
  221. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_copy.py +0 -0
  222. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_data.py +0 -0
  223. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  224. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_delete.py +0 -0
  225. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_drop.py +0 -0
  226. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_dtypes.py +0 -0
  227. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_edit.py +0 -0
  228. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_fetch.py +0 -0
  229. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_index.py +0 -0
  230. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_register.py +0 -0
  231. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_show.py +0 -0
  232. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_verify.py +0 -0
  233. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Plugin/__init__.py +0 -0
  234. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/User/_User.py +0 -0
  235. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/User/__init__.py +0 -0
  236. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/__init__.py +0 -0
  237. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/_Executor.py +0 -0
  238. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/_Job.py +0 -0
  239. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/__init__.py +0 -0
  240. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/systemd.py +0 -0
  241. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/_Plugin.py +0 -0
  242. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/bootstrap.py +0 -0
  243. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/__init__.py +0 -0
  244. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/_get_pipes.py +0 -0
  245. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/Daemon.py +0 -0
  246. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  247. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  248. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/StdinFile.py +0 -0
  249. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/__init__.py +0 -0
  250. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/_names.py +0 -0
  251. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/debug.py +0 -0
  252. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/__init__.py +0 -0
  253. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_jobs.py +0 -0
  254. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_pipes.py +0 -0
  255. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_pprint.py +0 -0
  256. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_shell.py +0 -0
  257. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/interactive.py +0 -0
  258. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/networking.py +0 -0
  259. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/__init__.py +0 -0
  260. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  261. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/pool.py +0 -0
  262. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/process.py +0 -0
  263. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/prompt.py +0 -0
  264. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/schedule.py +0 -0
  265. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/threading.py +0 -0
  266. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/typing.py +0 -0
  267. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/venv/_Venv.py +0 -0
  268. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/warnings.py +0 -0
  269. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/yaml.py +0 -0
  270. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/dependency_links.txt +0 -0
  271. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/entry_points.txt +0 -0
  272. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/top_level.txt +0 -0
  273. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/zip-safe +0 -0
  274. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/setup.cfg +0 -0
  275. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/setup.py +0 -0
  276. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_actions.py +0 -0
  277. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_arguments.py +0 -0
  278. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_deduplicate.py +0 -0
  279. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_jobs.py +0 -0
  280. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_pipe_data.py +0 -0
  281. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_sql.py +0 -0
  282. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_sync.py +0 -0
  283. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_users.py +0 -0
  284. {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: meerschaum
3
- Version: 2.9.0rc2
3
+ Version: 2.9.1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -87,6 +87,10 @@ Requires-Dist: mycli>=1.23.2; extra == "cli"
87
87
  Requires-Dist: litecli>=1.5.0; extra == "cli"
88
88
  Requires-Dist: mssql-cli>=1.0.0; extra == "cli"
89
89
  Requires-Dist: gadwall>=0.2.0; extra == "cli"
90
+ Provides-Extra: gis
91
+ Requires-Dist: pyproj>=3.7.1; extra == "gis"
92
+ Requires-Dist: geopandas>=1.0.1; extra == "gis"
93
+ Requires-Dist: shapely>=2.0.7; extra == "gis"
90
94
  Provides-Extra: stack
91
95
  Requires-Dist: docker-compose>=1.29.2; extra == "stack"
92
96
  Provides-Extra: build
@@ -114,7 +118,6 @@ Requires-Dist: mkdocs-linkcheck>=1.0.6; extra == "docs"
114
118
  Requires-Dist: mkdocs-redirects>=1.0.4; extra == "docs"
115
119
  Requires-Dist: jinja2==3.0.3; extra == "docs"
116
120
  Provides-Extra: gui
117
- Requires-Dist: toga>=0.3.0-dev29; extra == "gui"
118
121
  Requires-Dist: pywebview>=3.6.3; extra == "gui"
119
122
  Requires-Dist: pycparser>=2.21.0; extra == "gui"
120
123
  Provides-Extra: extras
@@ -126,8 +129,6 @@ Requires-Dist: importlib-metadata>=4.12.0; extra == "extras"
126
129
  Provides-Extra: sql
127
130
  Requires-Dist: numpy>=1.18.5; extra == "sql"
128
131
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "sql"
129
- Requires-Dist: geopandas>=1.0.1; extra == "sql"
130
- Requires-Dist: shapely>=2.0.7; extra == "sql"
131
132
  Requires-Dist: pyarrow>=16.1.0; extra == "sql"
132
133
  Requires-Dist: dask[complete]>=2024.12.1; extra == "sql"
133
134
  Requires-Dist: partd>=1.4.2; extra == "sql"
@@ -167,6 +168,9 @@ Requires-Dist: fasteners>=0.19.0; extra == "sql"
167
168
  Requires-Dist: virtualenv>=20.1.0; extra == "sql"
168
169
  Requires-Dist: attrs>=24.2.0; extra == "sql"
169
170
  Requires-Dist: uv>=0.2.11; extra == "sql"
171
+ Requires-Dist: pyproj>=3.7.1; extra == "sql"
172
+ Requires-Dist: geopandas>=1.0.1; extra == "sql"
173
+ Requires-Dist: shapely>=2.0.7; extra == "sql"
170
174
  Provides-Extra: dash
171
175
  Requires-Dist: Flask-Compress>=1.10.1; extra == "dash"
172
176
  Requires-Dist: dash>=2.6.2; extra == "dash"
@@ -189,8 +193,6 @@ Requires-Dist: httpcore>=1.0.6; extra == "api"
189
193
  Requires-Dist: valkey>=6.0.0; extra == "api"
190
194
  Requires-Dist: numpy>=1.18.5; extra == "api"
191
195
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "api"
192
- Requires-Dist: geopandas>=1.0.1; extra == "api"
193
- Requires-Dist: shapely>=2.0.7; extra == "api"
194
196
  Requires-Dist: pyarrow>=16.1.0; extra == "api"
195
197
  Requires-Dist: dask[complete]>=2024.12.1; extra == "api"
196
198
  Requires-Dist: partd>=1.4.2; extra == "api"
@@ -230,6 +232,9 @@ Requires-Dist: fasteners>=0.19.0; extra == "api"
230
232
  Requires-Dist: virtualenv>=20.1.0; extra == "api"
231
233
  Requires-Dist: attrs>=24.2.0; extra == "api"
232
234
  Requires-Dist: uv>=0.2.11; extra == "api"
235
+ Requires-Dist: pyproj>=3.7.1; extra == "api"
236
+ Requires-Dist: geopandas>=1.0.1; extra == "api"
237
+ Requires-Dist: shapely>=2.0.7; extra == "api"
233
238
  Requires-Dist: pprintpp>=0.4.0; extra == "api"
234
239
  Requires-Dist: asciitree>=0.3.3; extra == "api"
235
240
  Requires-Dist: typing-extensions>=4.7.1; extra == "api"
@@ -292,13 +297,13 @@ Requires-Dist: aiomysql>=0.0.21; extra == "full"
292
297
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
293
298
  Requires-Dist: duckdb>=1.0.0; extra == "full"
294
299
  Requires-Dist: duckdb-engine>=0.13.0; extra == "full"
295
- Requires-Dist: toga>=0.3.0-dev29; extra == "full"
300
+ Requires-Dist: pyproj>=3.7.1; extra == "full"
301
+ Requires-Dist: geopandas>=1.0.1; extra == "full"
302
+ Requires-Dist: shapely>=2.0.7; extra == "full"
296
303
  Requires-Dist: pywebview>=3.6.3; extra == "full"
297
304
  Requires-Dist: pycparser>=2.21.0; extra == "full"
298
305
  Requires-Dist: numpy>=1.18.5; extra == "full"
299
306
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "full"
300
- Requires-Dist: geopandas>=1.0.1; extra == "full"
301
- Requires-Dist: shapely>=2.0.7; extra == "full"
302
307
  Requires-Dist: pyarrow>=16.1.0; extra == "full"
303
308
  Requires-Dist: dask[complete]>=2024.12.1; extra == "full"
304
309
  Requires-Dist: partd>=1.4.2; extra == "full"
@@ -6,13 +6,16 @@
6
6
  Define callbacks for pages.
7
7
  """
8
8
 
9
+ from meerschaum.api import debug as _debug
9
10
  import meerschaum.api.dash.callbacks.dashboard
10
11
  import meerschaum.api.dash.callbacks.login
11
12
  import meerschaum.api.dash.callbacks.plugins
12
13
  import meerschaum.api.dash.callbacks.jobs
13
14
  import meerschaum.api.dash.callbacks.register
14
15
  import meerschaum.api.dash.callbacks.pipes
16
+ import meerschaum.api.dash.callbacks.settings
15
17
  from meerschaum.api.dash.callbacks.custom import init_dash_plugins, add_plugin_pages
16
18
 
17
- init_dash_plugins()
18
- add_plugin_pages()
19
+ init_dash_plugins(debug=_debug)
20
+ add_plugin_pages(debug=_debug)
21
+
@@ -11,12 +11,12 @@ from typing import Any, Dict
11
11
 
12
12
  from meerschaum.api.dash import dash_app
13
13
  from meerschaum.plugins import _dash_plugins, _plugin_endpoints_to_pages
14
- from meerschaum.utils.warnings import warn
14
+ from meerschaum.utils.warnings import warn, dprint
15
15
  from meerschaum.api.dash.callbacks.dashboard import _paths, _required_login, _pages
16
16
  from meerschaum.api.dash.components import pages_navbar
17
17
 
18
18
 
19
- def init_dash_plugins():
19
+ def init_dash_plugins(debug: bool = False):
20
20
  """
21
21
  Fire the initial callbacks for Dash plugins.
22
22
  """
@@ -32,29 +32,21 @@ def init_dash_plugins():
32
32
  )
33
33
 
34
34
 
35
- def add_plugin_pages():
35
+ def add_plugin_pages(debug: bool = False):
36
36
  """
37
37
  Allow users to add pages via the `@web_page` decorator.
38
38
  """
39
- for _endpoint, _page_dict in _plugin_endpoints_to_pages.items():
40
- page_layout = _page_dict['function']()
41
- if not _page_dict['skip_navbar']:
42
- if isinstance(page_layout, list):
43
- page_layout = [pages_navbar] + page_layout
44
- else:
45
- page_layout = [pages_navbar, page_layout]
46
- page_key = (
47
- ' '.join(
48
- [
49
- word.capitalize()
50
- for word in (
51
- _endpoint.replace('/dash', '').lstrip('/').rstrip('/').strip()
52
- .replace('-', ' ').replace('_', ' ').split(' ')
53
- )
54
- ]
55
- )
56
- )
57
- _pages[page_key] = _endpoint
58
- _paths[_endpoint] = page_layout
59
- if _page_dict['login_required']:
60
- _required_login.add(_endpoint)
39
+ for plugin_name, pages_dicts in _plugin_endpoints_to_pages.items():
40
+ if debug:
41
+ dprint(f"Adding pages from plugin '{plugin_name}'...")
42
+ for _endpoint, _page_dict in pages_dicts.items():
43
+ page_layout = _page_dict['function']()
44
+ if not _page_dict['skip_navbar']:
45
+ if isinstance(page_layout, list):
46
+ page_layout = [pages_navbar] + page_layout
47
+ else:
48
+ page_layout = [pages_navbar, page_layout]
49
+ _pages[_page_dict['page_key']] = _endpoint
50
+ _paths[_endpoint] = page_layout
51
+ if _page_dict['login_required']:
52
+ _required_login.add(_endpoint)
@@ -33,7 +33,10 @@ from meerschaum.api.dash.users import get_users_cards
33
33
  from meerschaum.api.dash.graphs import get_graphs_cards
34
34
  from meerschaum.api.dash.webterm import get_webterm
35
35
  from meerschaum.api.dash.components import (
36
- alert_from_success_tuple, console_div, build_cards_grid,
36
+ alert_from_success_tuple,
37
+ console_div,
38
+ build_cards_grid,
39
+ build_pages_offcanvas_children,
37
40
  )
38
41
  from meerschaum.api.dash import pages
39
42
  from meerschaum.utils.typing import Dict
@@ -1093,26 +1096,7 @@ def toggle_pages_offcanvas(n_clicks: Optional[int], is_open: bool):
1093
1096
  """
1094
1097
  Toggle the pages sidebar.
1095
1098
  """
1096
- pages_children = dbc.Card(
1097
- dbc.ListGroup(
1098
- [
1099
- dbc.ListGroupItem(
1100
- dbc.Button(
1101
- html.P(
1102
- ' '.join([word.capitalize() for word in page_key.split(' ')]),
1103
- style={'text-decoration': 'none', 'fontSize': '18px'},
1104
- ),
1105
- style={'width': '100%', 'text-align': 'left'},
1106
- href=page_href,
1107
- color='dark',
1108
- )
1109
- )
1110
- for page_key, page_href in _pages.items()
1111
- ],
1112
- flush=True,
1113
- ),
1114
- outline=True,
1115
- )
1099
+ pages_children = build_pages_offcanvas_children()
1116
1100
  if n_clicks:
1117
1101
  return not is_open, pages_children
1118
1102
  return is_open, pages_children
@@ -0,0 +1,8 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define the callbacks for the settings pages.
6
+ """
7
+
8
+ import meerschaum.api.dash.callbacks.settings.password_reset
@@ -0,0 +1,76 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define the callbacks for the password reset page.
6
+ """
7
+
8
+ import dash
9
+ from dash.exceptions import PreventUpdate
10
+ from dash.dependencies import Input, Output, State
11
+ import dash_bootstrap_components as dbc
12
+
13
+ from meerschaum.core.User import User
14
+ from meerschaum.config.static import STATIC_CONFIG
15
+ from meerschaum.api import get_api_connector, debug
16
+ from meerschaum.api.dash import dash_app
17
+ from meerschaum.api.dash.components import alert_from_success_tuple
18
+ from meerschaum.api.dash.sessions import get_username_from_session
19
+
20
+
21
+ @dash_app.callback(
22
+ Output('password-reset-alert-div', 'children'),
23
+ Input('password-reset-button', 'n_clicks'),
24
+ State('password-reset-input', 'value',),
25
+ State('session-store', 'data'),
26
+ )
27
+ def password_reset_button_click(n_clicks, new_password_value, session_store_data):
28
+ """
29
+ Attempt the password reset with the form data.
30
+ """
31
+ if not n_clicks:
32
+ raise PreventUpdate
33
+
34
+ session_id = session_store_data.get('session-id', None)
35
+ username = get_username_from_session(session_id)
36
+ if not username:
37
+ return alert_from_success_tuple(
38
+ (False, "Invalid session. Are you logged in correctly?")
39
+ )
40
+
41
+ instance_connector = get_api_connector()
42
+ user = User(username, new_password_value)
43
+ success, msg = instance_connector.edit_user(user, debug=debug)
44
+ return alert_from_success_tuple((success, msg))
45
+
46
+
47
+ @dash_app.callback(
48
+ Output('password-reset-input', 'valid'),
49
+ Output('password-reset-input', 'invalid'),
50
+ Input('password-reset-input', 'value'),
51
+ )
52
+ def validate_new_password(new_password_value):
53
+ if not new_password_value:
54
+ raise PreventUpdate
55
+
56
+ valid = (len(new_password_value) >= STATIC_CONFIG['users']['min_password_length'])
57
+ return valid, not valid
58
+
59
+
60
+ @dash_app.callback(
61
+ Output("password-reset-confirm-input", "valid"),
62
+ Output("password-reset-confirm-input", "invalid"),
63
+ Output("password-reset-button", 'disabled'),
64
+ Input("password-reset-confirm-input", "value"),
65
+ State("password-reset-input", "value"),
66
+ )
67
+ def validate_new_passwords_match(confirm_password_value, new_password_value):
68
+ if not confirm_password_value:
69
+ raise PreventUpdate
70
+
71
+ new_password_is_valid, _ = validate_new_password(new_password_value)
72
+ if not new_password_is_valid:
73
+ raise PreventUpdate
74
+
75
+ valid = confirm_password_value == new_password_value
76
+ return valid, not valid, not valid
@@ -110,6 +110,13 @@ instance_select = dbc.Select(
110
110
  class_name='dbc_dark custom-select custom-select-sm',
111
111
  )
112
112
 
113
+ sign_out_button = dbc.Button(
114
+ "Sign out",
115
+ color='link',
116
+ style={'margin-left': '30px'},
117
+ id='sign-out-button',
118
+ )
119
+
113
120
  logo_row = dbc.Row(
114
121
  [
115
122
  dbc.Col(
@@ -128,7 +135,30 @@ logo_row = dbc.Row(
128
135
  pages_navbar = html.Div(
129
136
  [
130
137
  pages_offcanvas,
131
- dbc.Navbar(dbc.Container(logo_row), dark=True, color='dark'),
138
+ dbc.Navbar(
139
+ dbc.Container(
140
+ [
141
+ logo_row,
142
+ dbc.NavbarToggler(id="navbar-toggler", n_clicks=0),
143
+ dbc.Collapse(
144
+ dbc.Row(
145
+ [
146
+ dbc.Col(
147
+ sign_out_button,
148
+ className="ms-auto",
149
+ ),
150
+ ],
151
+ className="g-0 ms-auto flex-nowrap mt-3 mt-md-0",
152
+ ),
153
+ id='navbar-collapse',
154
+ is_open=False,
155
+ navbar=True,
156
+ ),
157
+ ]
158
+ ),
159
+ dark=True,
160
+ color='dark'
161
+ ),
132
162
  ],
133
163
  id='pages-navbar-div',
134
164
  )
@@ -143,12 +173,7 @@ navbar = dbc.Navbar(
143
173
  [
144
174
  dbc.Col(instance_select),
145
175
  dbc.Col(
146
- dbc.Button(
147
- "Sign out",
148
- color='link',
149
- style={'margin-left': '30px'},
150
- id='sign-out-button',
151
- ),
176
+ sign_out_button,
152
177
  className="ms-auto",
153
178
  ),
154
179
  ],
@@ -207,3 +232,81 @@ def build_cards_grid(cards: List[dbc.Card], num_columns: int = 3) -> html.Div:
207
232
  rows.append(r)
208
233
  rows.append(html.Br())
209
234
  return html.Div(rows)
235
+
236
+
237
+ def build_pages_offcanvas_children():
238
+ """
239
+ Return the contents of the pages offcanvas.
240
+ """
241
+ from meerschaum.api.dash.callbacks.dashboard import _pages
242
+ from meerschaum.api.dash.callbacks.custom import _plugin_endpoints_to_pages
243
+ pages_listgroup_items = []
244
+ custom_pages = []
245
+ for pages_dicts in _plugin_endpoints_to_pages.values():
246
+ for page_dict in pages_dicts.values():
247
+ custom_pages.append(page_dict['page_key'])
248
+
249
+ for page_key, page_href in _pages.items():
250
+ if page_key in custom_pages:
251
+ continue
252
+ pages_listgroup_items.append(
253
+ dbc.ListGroupItem(
254
+ dbc.Button(
255
+ ' '.join([word.capitalize() for word in page_key.split(' ')]),
256
+ style={
257
+ 'width': '100%',
258
+ 'text-align': 'left',
259
+ 'text-decoration': 'none',
260
+ 'padding-left': '0',
261
+ },
262
+ href=page_href,
263
+ color='dark',
264
+ )
265
+ )
266
+ )
267
+
268
+ plugins_accordion_items = []
269
+ for page_group, pages_dicts in _plugin_endpoints_to_pages.items():
270
+ plugin_listgroup_items = [
271
+ dbc.ListGroupItem(
272
+ dbc.Button(
273
+ ' '.join([word.capitalize() for word in page_dict['page_key'].split(' ')]),
274
+ style={
275
+ 'width': '100%',
276
+ 'text-align': 'left',
277
+ 'text-decoration': 'none',
278
+ 'padding-left': '0',
279
+ },
280
+ href=page_href,
281
+ color='dark',
282
+ )
283
+ )
284
+ for page_href, page_dict in pages_dicts.items()
285
+ ]
286
+ plugin_listgroup = dbc.ListGroup(plugin_listgroup_items, flush=True)
287
+ plugin_accordion_item = dbc.AccordionItem(
288
+ plugin_listgroup,
289
+ title=(
290
+ page_group.capitalize()
291
+ if page_group and not page_group[0].isupper()
292
+ else page_group
293
+ ),
294
+ class_name='pages-offcanvas-accordion',
295
+ )
296
+ plugins_accordion_items.append(plugin_accordion_item)
297
+ plugins_accordion = dbc.Accordion(
298
+ plugins_accordion_items,
299
+ start_collapsed=True,
300
+ flush=True,
301
+ always_open=True,
302
+ )
303
+ pages_listgroup_items.append(plugins_accordion)
304
+
305
+ pages_children = dbc.Card(
306
+ dbc.ListGroup(
307
+ pages_listgroup_items,
308
+ flush=True,
309
+ ),
310
+ outline=True,
311
+ )
312
+ return pages_children
@@ -12,3 +12,4 @@ import meerschaum.api.dash.pages.plugins
12
12
  import meerschaum.api.dash.pages.register
13
13
  import meerschaum.api.dash.pages.pipes
14
14
  import meerschaum.api.dash.pages.job
15
+ import meerschaum.api.dash.pages.settings
@@ -0,0 +1,8 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define the layouts for the `settings` pages.
6
+ """
7
+
8
+ import meerschaum.api.dash.pages.settings.password_reset
@@ -0,0 +1,63 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define the password reset page layout.
6
+ """
7
+
8
+ import dash_bootstrap_components as dbc
9
+ import dash.html as html
10
+ import dash.dcc as dcc
11
+ from meerschaum.plugins import web_page
12
+
13
+
14
+ @web_page('password-reset', login_required=True, page_group='Settings')
15
+ def page_layout():
16
+ """
17
+ Return the layout for this page.
18
+ """
19
+ return dbc.Container([
20
+ html.Br(),
21
+ html.H3('Password Reset'),
22
+ html.Br(),
23
+ html.Div(id="password-reset-alert-div"),
24
+ dbc.Form([
25
+ dbc.Row(
26
+ [
27
+ dbc.Label("New Password", html_for="password-reset-input", width=2),
28
+ dbc.Col(
29
+ dbc.Input(
30
+ type="password",
31
+ id="password-reset-input",
32
+ placeholder="Enter new password",
33
+ ),
34
+ width=10,
35
+ ),
36
+ ],
37
+ className="mb-3",
38
+ ),
39
+ dbc.Row(
40
+ [
41
+ dbc.Label("Confirm Password", html_for="password-reset-confirm-input", width=2),
42
+ dbc.Col(
43
+ dbc.Input(
44
+ type="password",
45
+ id="password-reset-confirm-input",
46
+ placeholder="Confirm new password",
47
+ ),
48
+ width=10,
49
+ ),
50
+ ],
51
+ className="mb-3",
52
+ ),
53
+ dbc.Row(
54
+ [
55
+ dbc.Col(
56
+ dbc.Button("Submit", id="password-reset-button", disabled=True),
57
+ ),
58
+ ],
59
+ justify="end",
60
+ className="mb-3",
61
+ ),
62
+ ]),
63
+ ])
@@ -73,3 +73,10 @@ a {
73
73
  .input-text {
74
74
  font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif !important;
75
75
  }
76
+ .pages-offcanvas-accordion button {
77
+ background-color: var(--bs-dark) !important;
78
+ color: white !important;
79
+ }
80
+ .pages-offcanvas-accordion div {
81
+ padding: 0 !important;
82
+ }