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.
- {meerschaum-2.9.0rc2/meerschaum.egg-info → meerschaum-2.9.1}/PKG-INFO +14 -9
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/__init__.py +5 -2
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/custom.py +17 -25
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/dashboard.py +5 -21
- meerschaum-2.9.1/meerschaum/api/dash/callbacks/settings/__init__.py +8 -0
- meerschaum-2.9.1/meerschaum/api/dash/callbacks/settings/password_reset.py +76 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/components.py +110 -7
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/__init__.py +1 -0
- meerschaum-2.9.1/meerschaum/api/dash/pages/settings/__init__.py +8 -0
- meerschaum-2.9.1/meerschaum/api/dash/pages/settings/password_reset.py +63 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/dash.css +7 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_pipes.py +76 -36
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_version.py +1 -1
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/__init__.py +1 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_pipes.py +79 -30
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_pipes.py +38 -5
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_ValkeyConnector.py +2 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_pipes.py +51 -39
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/__init__.py +1 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_sync.py +64 -4
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/__init__.py +26 -4
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dataframe.py +58 -3
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dtypes/__init__.py +45 -17
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/dtypes/sql.py +182 -3
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/misc.py +1 -1
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/_packages.py +6 -3
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/sql.py +122 -6
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/venv/__init__.py +4 -1
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1/meerschaum.egg-info}/PKG-INFO +14 -9
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/SOURCES.txt +4 -5
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/requires.txt +14 -8
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_pipes_dtypes.py +10 -6
- meerschaum-2.9.0rc2/meerschaum/_internal/gui/__init__.py +0 -43
- meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/__init__.py +0 -50
- meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/_windows.py +0 -74
- meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/actions.py +0 -30
- meerschaum-2.9.0rc2/meerschaum/_internal/gui/app/pipes.py +0 -47
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/LICENSE +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/NOTICE +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/README.md +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/__main__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/entry.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/api.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/attach.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/clear.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/copy.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/delete.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/drop.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/edit.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/index.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/install.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/login.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/os.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/pause.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/python.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/register.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/reload.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/restart.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/setup.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sh.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/show.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sql.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/stack.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/start.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/stop.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/sync.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/tag.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/actions/verify.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_chain.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_chunks.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_events.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_exceptions.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/job.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/sessions.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_interfaces.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_locations.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_metrics.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_dash.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_default.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_edit.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_environment.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_patch.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_paths.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_shell.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/_sync.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/paths.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/config/static/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/_Connector.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_APIConnector.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_create_engine.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_instance.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_sql.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_fetch.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_plugins.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/connectors/valkey/_users.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_copy.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_index.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/core/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/_Executor.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/_Job.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/jobs/systemd.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/_Plugin.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/Daemon.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/StdinFile.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/debug.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/networking.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/__init__.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/pool.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/process.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/prompt.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/threading.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/typing.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/setup.cfg +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/setup.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_actions.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_arguments.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_deduplicate.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_jobs.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_pipe_data.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_sql.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_sync.py +0 -0
- {meerschaum-2.9.0rc2 → meerschaum-2.9.1}/tests/test_users.py +0 -0
- {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.
|
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:
|
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
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
page_layout
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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,
|
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 =
|
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,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(
|
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
|
-
|
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
|
@@ -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
|
+
}
|