meerschaum 2.9.5__py3-none-any.whl → 3.0.0rc2__py3-none-any.whl

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 (158) hide show
  1. meerschaum/__init__.py +5 -2
  2. meerschaum/_internal/__init__.py +1 -0
  3. meerschaum/_internal/arguments/_parse_arguments.py +4 -4
  4. meerschaum/_internal/arguments/_parser.py +19 -2
  5. meerschaum/_internal/docs/index.py +49 -2
  6. meerschaum/_internal/entry.py +6 -6
  7. meerschaum/_internal/shell/Shell.py +1 -1
  8. meerschaum/_internal/static.py +356 -0
  9. meerschaum/actions/api.py +12 -2
  10. meerschaum/actions/bootstrap.py +7 -7
  11. meerschaum/actions/edit.py +142 -18
  12. meerschaum/actions/register.py +137 -6
  13. meerschaum/actions/show.py +117 -29
  14. meerschaum/actions/stop.py +4 -1
  15. meerschaum/actions/sync.py +1 -1
  16. meerschaum/actions/tag.py +9 -8
  17. meerschaum/actions/verify.py +5 -8
  18. meerschaum/api/__init__.py +11 -3
  19. meerschaum/api/_events.py +39 -2
  20. meerschaum/api/_oauth2.py +118 -8
  21. meerschaum/api/_tokens.py +102 -0
  22. meerschaum/api/dash/__init__.py +0 -3
  23. meerschaum/api/dash/callbacks/custom.py +2 -2
  24. meerschaum/api/dash/callbacks/dashboard.py +103 -19
  25. meerschaum/api/dash/callbacks/plugins.py +0 -1
  26. meerschaum/api/dash/callbacks/register.py +1 -1
  27. meerschaum/api/dash/callbacks/settings/__init__.py +1 -0
  28. meerschaum/api/dash/callbacks/settings/password_reset.py +2 -2
  29. meerschaum/api/dash/callbacks/settings/tokens.py +388 -0
  30. meerschaum/api/dash/components.py +30 -8
  31. meerschaum/api/dash/keys.py +19 -93
  32. meerschaum/api/dash/pages/dashboard.py +1 -20
  33. meerschaum/api/dash/pages/settings/__init__.py +1 -0
  34. meerschaum/api/dash/pages/settings/password_reset.py +1 -1
  35. meerschaum/api/dash/pages/settings/tokens.py +55 -0
  36. meerschaum/api/dash/pipes.py +94 -59
  37. meerschaum/api/dash/sessions.py +12 -0
  38. meerschaum/api/dash/tokens.py +606 -0
  39. meerschaum/api/dash/websockets.py +1 -1
  40. meerschaum/api/dash/webterm.py +4 -0
  41. meerschaum/api/models/__init__.py +23 -3
  42. meerschaum/api/models/_actions.py +22 -0
  43. meerschaum/api/models/_pipes.py +85 -7
  44. meerschaum/api/models/_tokens.py +81 -0
  45. meerschaum/api/resources/templates/termpage.html +12 -0
  46. meerschaum/api/routes/__init__.py +1 -0
  47. meerschaum/api/routes/_actions.py +3 -4
  48. meerschaum/api/routes/_connectors.py +3 -7
  49. meerschaum/api/routes/_jobs.py +14 -35
  50. meerschaum/api/routes/_login.py +49 -12
  51. meerschaum/api/routes/_misc.py +5 -10
  52. meerschaum/api/routes/_pipes.py +173 -140
  53. meerschaum/api/routes/_plugins.py +38 -28
  54. meerschaum/api/routes/_tokens.py +236 -0
  55. meerschaum/api/routes/_users.py +47 -35
  56. meerschaum/api/routes/_version.py +3 -3
  57. meerschaum/config/__init__.py +43 -20
  58. meerschaum/config/_default.py +43 -6
  59. meerschaum/config/_edit.py +28 -24
  60. meerschaum/config/_environment.py +1 -1
  61. meerschaum/config/_patch.py +6 -6
  62. meerschaum/config/_paths.py +5 -1
  63. meerschaum/config/_read_config.py +65 -34
  64. meerschaum/config/_sync.py +6 -3
  65. meerschaum/config/_version.py +1 -1
  66. meerschaum/config/stack/__init__.py +31 -11
  67. meerschaum/config/static.py +18 -0
  68. meerschaum/connectors/_Connector.py +10 -4
  69. meerschaum/connectors/__init__.py +4 -20
  70. meerschaum/connectors/api/_APIConnector.py +34 -6
  71. meerschaum/connectors/api/_actions.py +2 -2
  72. meerschaum/connectors/api/_jobs.py +1 -1
  73. meerschaum/connectors/api/_login.py +33 -7
  74. meerschaum/connectors/api/_misc.py +2 -2
  75. meerschaum/connectors/api/_pipes.py +16 -31
  76. meerschaum/connectors/api/_plugins.py +2 -2
  77. meerschaum/connectors/api/_request.py +1 -1
  78. meerschaum/connectors/api/_tokens.py +146 -0
  79. meerschaum/connectors/api/_users.py +70 -58
  80. meerschaum/connectors/instance/_InstanceConnector.py +83 -0
  81. meerschaum/connectors/instance/__init__.py +10 -0
  82. meerschaum/connectors/instance/_pipes.py +442 -0
  83. meerschaum/connectors/instance/_plugins.py +151 -0
  84. meerschaum/connectors/instance/_tokens.py +296 -0
  85. meerschaum/connectors/instance/_users.py +181 -0
  86. meerschaum/connectors/parse.py +4 -1
  87. meerschaum/connectors/sql/_SQLConnector.py +8 -5
  88. meerschaum/connectors/sql/_cli.py +12 -11
  89. meerschaum/connectors/sql/_create_engine.py +9 -168
  90. meerschaum/connectors/sql/_fetch.py +2 -18
  91. meerschaum/connectors/sql/_pipes.py +156 -190
  92. meerschaum/connectors/sql/_plugins.py +29 -0
  93. meerschaum/connectors/sql/_sql.py +46 -21
  94. meerschaum/connectors/sql/_users.py +29 -2
  95. meerschaum/connectors/sql/tables/__init__.py +1 -1
  96. meerschaum/connectors/valkey/_ValkeyConnector.py +2 -4
  97. meerschaum/connectors/valkey/_pipes.py +53 -26
  98. meerschaum/connectors/valkey/_plugins.py +2 -26
  99. meerschaum/core/Pipe/__init__.py +59 -19
  100. meerschaum/core/Pipe/_attributes.py +412 -90
  101. meerschaum/core/Pipe/_bootstrap.py +54 -24
  102. meerschaum/core/Pipe/_data.py +96 -18
  103. meerschaum/core/Pipe/_dtypes.py +48 -18
  104. meerschaum/core/Pipe/_edit.py +14 -4
  105. meerschaum/core/Pipe/_fetch.py +1 -1
  106. meerschaum/core/Pipe/_show.py +5 -5
  107. meerschaum/core/Pipe/_sync.py +118 -193
  108. meerschaum/core/Pipe/_verify.py +4 -4
  109. meerschaum/{plugins → core/Plugin}/_Plugin.py +9 -11
  110. meerschaum/core/Plugin/__init__.py +1 -1
  111. meerschaum/core/Token/_Token.py +220 -0
  112. meerschaum/core/Token/__init__.py +12 -0
  113. meerschaum/core/User/_User.py +34 -8
  114. meerschaum/core/User/__init__.py +9 -1
  115. meerschaum/core/__init__.py +1 -0
  116. meerschaum/jobs/_Job.py +3 -2
  117. meerschaum/jobs/__init__.py +3 -2
  118. meerschaum/jobs/systemd.py +1 -1
  119. meerschaum/models/__init__.py +35 -0
  120. meerschaum/models/pipes.py +247 -0
  121. meerschaum/models/tokens.py +38 -0
  122. meerschaum/models/users.py +26 -0
  123. meerschaum/plugins/__init__.py +22 -7
  124. meerschaum/plugins/bootstrap.py +2 -1
  125. meerschaum/utils/_get_pipes.py +68 -27
  126. meerschaum/utils/daemon/Daemon.py +2 -1
  127. meerschaum/utils/daemon/__init__.py +30 -2
  128. meerschaum/utils/dataframe.py +473 -81
  129. meerschaum/utils/debug.py +15 -15
  130. meerschaum/utils/dtypes/__init__.py +473 -34
  131. meerschaum/utils/dtypes/sql.py +368 -28
  132. meerschaum/utils/formatting/__init__.py +1 -1
  133. meerschaum/utils/formatting/_pipes.py +5 -4
  134. meerschaum/utils/formatting/_shell.py +11 -9
  135. meerschaum/utils/misc.py +246 -148
  136. meerschaum/utils/packages/__init__.py +10 -27
  137. meerschaum/utils/packages/_packages.py +41 -34
  138. meerschaum/utils/pipes.py +181 -0
  139. meerschaum/utils/process.py +1 -1
  140. meerschaum/utils/prompt.py +3 -1
  141. meerschaum/utils/schedule.py +2 -1
  142. meerschaum/utils/sql.py +121 -44
  143. meerschaum/utils/typing.py +1 -4
  144. meerschaum/utils/venv/_Venv.py +2 -2
  145. meerschaum/utils/venv/__init__.py +5 -7
  146. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/METADATA +92 -96
  147. meerschaum-3.0.0rc2.dist-info/RECORD +283 -0
  148. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/WHEEL +1 -1
  149. meerschaum-3.0.0rc2.dist-info/licenses/NOTICE +2 -0
  150. meerschaum/api/models/_interfaces.py +0 -15
  151. meerschaum/api/models/_locations.py +0 -15
  152. meerschaum/api/models/_metrics.py +0 -15
  153. meerschaum/config/static/__init__.py +0 -186
  154. meerschaum-2.9.5.dist-info/RECORD +0 -263
  155. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/entry_points.txt +0 -0
  156. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/licenses/LICENSE +0 -0
  157. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/top_level.txt +0 -0
  158. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/zip-safe +0 -0
@@ -11,10 +11,11 @@ from __future__ import annotations
11
11
  import textwrap
12
12
  import json
13
13
  import uuid
14
- from datetime import datetime, timezone
15
14
 
16
15
  from dash.dependencies import Input, Output, State, ALL, MATCH
17
16
  from dash.exceptions import PreventUpdate
17
+
18
+ import meerschaum as mrsm
18
19
  from meerschaum.utils.typing import List, Optional, Any, Tuple
19
20
  from meerschaum.api import get_api_connector, endpoints, no_auth, CHECK_UPDATE
20
21
  from meerschaum.api.dash import dash_app, debug
@@ -26,7 +27,12 @@ from meerschaum.api.dash.sessions import (
26
27
  from meerschaum.api.dash.sessions import is_session_authenticated
27
28
  from meerschaum.api.dash.connectors import get_web_connector
28
29
  from meerschaum.connectors.parse import parse_instance_keys
29
- from meerschaum.api.dash.pipes import get_pipes_cards, pipe_from_ctx, accordion_items_from_pipe
30
+ from meerschaum.api.dash.pipes import (
31
+ get_pipes_cards,
32
+ pipe_from_ctx,
33
+ accordion_items_from_pipe,
34
+ get_backtrack_text,
35
+ )
30
36
  from meerschaum.api.dash.jobs import get_jobs_cards
31
37
  from meerschaum.api.dash.plugins import get_plugins_cards
32
38
  from meerschaum.api.dash.users import get_users_cards
@@ -41,7 +47,7 @@ from meerschaum.api.dash.components import (
41
47
  from meerschaum.api.dash import pages
42
48
  from meerschaum.utils.typing import Dict
43
49
  from meerschaum.utils.packages import attempt_import, import_html, import_dcc
44
- from meerschaum.utils.misc import filter_keywords, flatten_list
50
+ from meerschaum.utils.misc import filter_keywords, flatten_list, string_to_dict
45
51
  from meerschaum.utils.yaml import yaml
46
52
  from meerschaum.actions import get_subactions, actions
47
53
  from meerschaum._internal.arguments._parser import parser
@@ -55,11 +61,8 @@ keys_state = (
55
61
  State('connector-keys-dropdown', 'value'),
56
62
  State('metric-keys-dropdown', 'value'),
57
63
  State('location-keys-dropdown', 'value'),
58
- State('connector-keys-input', 'value'),
59
- State('metric-keys-input', 'value'),
60
- State('location-keys-input', 'value'),
61
- State('search-parameters-editor', 'value'),
62
- State('pipes-filter-tabs', 'active_tab'),
64
+ State('tags-dropdown', 'value'),
65
+ State('tags-dropdown-div', 'style'),
63
66
  State('action-dropdown', 'value'),
64
67
  State('subaction-dropdown', 'value'),
65
68
  State('subaction-dropdown', 'options'),
@@ -295,6 +298,7 @@ dash_app.clientside_callback(
295
298
  connector_keys,
296
299
  metric_keys,
297
300
  location_keys,
301
+ tags,
298
302
  flags,
299
303
  input_flags,
300
304
  input_flags_texts,
@@ -317,6 +321,7 @@ dash_app.clientside_callback(
317
321
  connector_keys: connector_keys,
318
322
  metric_keys: metric_keys,
319
323
  location_keys: location_keys,
324
+ tags: tags,
320
325
  flags: flags,
321
326
  input_flags: input_flags,
322
327
  input_flags_texts: input_flags_texts,
@@ -333,6 +338,7 @@ dash_app.clientside_callback(
333
338
  State('connector-keys-dropdown', 'value'),
334
339
  State('metric-keys-dropdown', 'value'),
335
340
  State('location-keys-dropdown', 'value'),
341
+ State('tags-dropdown', 'value'),
336
342
  State('flags-dropdown', 'value'),
337
343
  State({'type': 'input-flags-dropdown', 'index': ALL}, 'value'),
338
344
  State({'type': 'input-flags-dropdown-text', 'index': ALL}, 'value'),
@@ -358,7 +364,7 @@ def update_actions(action: str, subaction: str):
358
364
  _actions_options = sorted([
359
365
  {
360
366
  'label': a.replace('_', ' '),
361
- 'value': a,
367
+ 'value': a.replace('_', ' '),
362
368
  'title': (textwrap.dedent(f.__doc__).lstrip() if f.__doc__ else 'No help available.'),
363
369
  }
364
370
  for a, f in actions.items() if a not in omit_actions
@@ -366,7 +372,7 @@ def update_actions(action: str, subaction: str):
366
372
  _subactions_options = sorted([
367
373
  {
368
374
  'label': sa.replace('_', ' '),
369
- 'value': sa,
375
+ 'value': sa.replace('_', ' '),
370
376
  'title': (textwrap.dedent(f.__doc__).lstrip() if f.__doc__ else 'No help available.'),
371
377
  }
372
378
  for sa, f in get_subactions(action).items()
@@ -497,11 +503,15 @@ def update_flags(input_flags_dropdown_values, n_clicks, input_flags_texts):
497
503
  Output('location-keys-dropdown', 'options'),
498
504
  Output('location-keys-list', 'children'),
499
505
  Output('location-keys-dropdown', 'value'),
506
+ Output('tags-dropdown', 'options'),
507
+ Output('tags-list', 'children'),
508
+ Output('tags-dropdown', 'value'),
500
509
  Output('instance-select', 'value'),
501
510
  Output('instance-alert-div', 'children'),
502
511
  Input('connector-keys-dropdown', 'value'),
503
512
  Input('metric-keys-dropdown', 'value'),
504
513
  Input('location-keys-dropdown', 'value'),
514
+ Input('tags-dropdown', 'value'),
505
515
  Input('instance-select', 'value'),
506
516
  *keys_state ### NOTE: Necessary for `ctx.states`.
507
517
  )
@@ -509,6 +519,7 @@ def update_keys_options(
509
519
  connector_keys: Optional[List[str]],
510
520
  metric_keys: Optional[List[str]],
511
521
  location_keys: Optional[List[str]],
522
+ tags: Optional[List[str]],
512
523
  instance_keys: Optional[str],
513
524
  *keys
514
525
  ):
@@ -543,6 +554,8 @@ def update_keys_options(
543
554
  metric_keys = []
544
555
  if location_keys is None:
545
556
  location_keys = []
557
+ if tags is None:
558
+ tags = []
546
559
  num_filter = 0
547
560
  if connector_keys:
548
561
  num_filter += 1
@@ -550,13 +563,17 @@ def update_keys_options(
550
563
  num_filter += 1
551
564
  if location_keys:
552
565
  num_filter += 1
566
+ if tags:
567
+ num_filter += 1
553
568
 
554
569
  _ck_filter = connector_keys
555
570
  _mk_filter = metric_keys
556
571
  _lk_filter = location_keys
572
+ _tags_filter = tags
557
573
  _ck_alone = (connector_keys and num_filter == 1) or instance_click
558
574
  _mk_alone = (metric_keys and num_filter == 1) or instance_click
559
575
  _lk_alone = (location_keys and num_filter == 1) or instance_click
576
+ _tags_alone = (tags and num_filter == 1) or instance_click
560
577
 
561
578
  from meerschaum.utils import fetch_pipes_keys
562
579
 
@@ -568,15 +585,31 @@ def update_keys_options(
568
585
  connector_keys=_ck_filter,
569
586
  metric_keys=_mk_filter,
570
587
  location_keys=_lk_filter,
588
+ tags=_tags_filter,
589
+ )
590
+ _tags_pipes = mrsm.get_pipes(
591
+ connector_keys=_ck_filter,
592
+ metric_keys=_mk_filter,
593
+ location_keys=_lk_filter,
594
+ tags=_tags_filter,
595
+ instance=get_web_connector(ctx.states),
596
+ as_tags_dict=True,
571
597
  )
598
+ _all_tags = list(
599
+ mrsm.get_pipes(
600
+ instance=get_web_connector(ctx.states),
601
+ as_tags_dict=True,
602
+ )
603
+ ) if _tags_alone else []
572
604
  except Exception as e:
573
605
  instance_alerts += [alert_from_success_tuple((False, str(e)))]
574
606
  _all_keys, _keys = [], []
575
607
  _connectors_options = []
576
608
  _metrics_options = []
577
609
  _locations_options = []
610
+ _tags_options = []
578
611
 
579
- _seen_keys = {'ck' : set(), 'mk' : set(), 'lk' : set()}
612
+ _seen_keys = {'ck' : set(), 'mk' : set(), 'lk' : set(), 'tags': set()}
580
613
 
581
614
  def add_options(options, keys, key_type):
582
615
  for ck, mk, lk in keys:
@@ -589,9 +622,16 @@ def update_keys_options(
589
622
  add_options(_connectors_options, _all_keys if _ck_alone else _keys, 'ck')
590
623
  add_options(_metrics_options, _all_keys if _mk_alone else _keys, 'mk')
591
624
  add_options(_locations_options, _all_keys if _lk_alone else _keys, 'lk')
625
+
626
+ _tags_options = [
627
+ {'label': tag, 'value': tag}
628
+ for tag in (_all_tags if _tags_alone else _tags_pipes)
629
+ ]
630
+
592
631
  _connectors_options.sort(key=lambda x: str(x).lower())
593
632
  _metrics_options.sort(key=lambda x: str(x).lower())
594
633
  _locations_options.sort(key=lambda x: str(x).lower())
634
+ _tags_options.sort(key=lambda x: str(x).lower())
595
635
  connector_keys = [
596
636
  ck
597
637
  for ck in connector_keys
@@ -616,9 +656,18 @@ def update_keys_options(
616
656
  for _lk in _locations_options
617
657
  ]
618
658
  ]
659
+ tags = [
660
+ tag
661
+ for tag in tags
662
+ if tag in [
663
+ _tag['value']
664
+ for _tag in _tags_options
665
+ ]
666
+ ]
619
667
  _connectors_datalist = [html.Option(value=o['value']) for o in _connectors_options]
620
668
  _metrics_datalist = [html.Option(value=o['value']) for o in _metrics_options]
621
669
  _locations_datalist = [html.Option(value=o['value']) for o in _locations_options]
670
+ _tags_datalist = [html.Option(value=o['value']) for o in _tags_options]
622
671
  return (
623
672
  _connectors_options,
624
673
  _connectors_datalist,
@@ -629,6 +678,9 @@ def update_keys_options(
629
678
  _locations_options,
630
679
  _locations_datalist,
631
680
  location_keys,
681
+ _tags_options,
682
+ _tags_datalist,
683
+ tags,
632
684
  (instance_keys if update_instance_keys else dash.no_update),
633
685
  instance_alerts,
634
686
  )
@@ -861,7 +913,6 @@ def update_pipe_accordion(item, session_store_data):
861
913
  def update_pipe_parameters_click(n_clicks, parameters_editor_text):
862
914
  if not n_clicks:
863
915
  raise PreventUpdate
864
- ctx = dash.callback_context
865
916
  triggered = dash.callback_context.triggered
866
917
  if triggered[0]['value'] is None:
867
918
  raise PreventUpdate
@@ -890,12 +941,11 @@ def update_pipe_parameters_click(n_clicks, parameters_editor_text):
890
941
  @dash_app.callback(
891
942
  Output({'type': 'update-sql-success-div', 'index': MATCH}, 'children'),
892
943
  Input({'type': 'update-sql-button', 'index': MATCH}, 'n_clicks'),
893
- State({'type': 'sql-editor', 'index': MATCH}, 'value')
944
+ State({'type': 'sql-editor', 'index': MATCH}, 'value'),
894
945
  )
895
946
  def update_pipe_sql_click(n_clicks, sql_editor_text):
896
947
  if not n_clicks:
897
948
  raise PreventUpdate
898
- ctx = dash.callback_context
899
949
  triggered = dash.callback_context.triggered
900
950
  if triggered[0]['value'] is None:
901
951
  raise PreventUpdate
@@ -923,7 +973,6 @@ def update_pipe_sql_click(n_clicks, sql_editor_text):
923
973
  def sync_documents_click(n_clicks, sync_editor_text):
924
974
  if not n_clicks:
925
975
  raise PreventUpdate
926
- ctx = dash.callback_context
927
976
  triggered = dash.callback_context.triggered
928
977
  if triggered[0]['value'] is None:
929
978
  raise PreventUpdate
@@ -937,6 +986,15 @@ def sync_documents_click(n_clicks, sync_editor_text):
937
986
  except Exception as e:
938
987
  docs = None
939
988
  msg = str(e)
989
+
990
+ if docs is None:
991
+ try:
992
+ lines = sync_editor_text.splitlines()
993
+ docs = [string_to_dict(line) for line in lines]
994
+ msg = '... '
995
+ except Exception:
996
+ docs = None
997
+
940
998
  if docs is None:
941
999
  success, msg = False, (msg + f"Unable to sync documents to {pipe}.")
942
1000
  else:
@@ -966,7 +1024,7 @@ def query_data_click(n_clicks, query_editor_text, limit_value, begin, end):
966
1024
  raise PreventUpdate
967
1025
 
968
1026
  try:
969
- params_query = json.loads(query_editor_text)
1027
+ params_query = string_to_dict(query_editor_text)
970
1028
  except Exception as e:
971
1029
  return alert_from_success_tuple((False, f"Invalid query:\n{e}"))
972
1030
 
@@ -1043,8 +1101,8 @@ dash_app.clientside_callback(
1043
1101
 
1044
1102
  @dash_app.callback(
1045
1103
  Output("navbar-collapse", "is_open"),
1046
- [Input("navbar-toggler", "n_clicks")],
1047
- [State("navbar-collapse", "is_open")],
1104
+ Input("navbar-toggler", "n_clicks"),
1105
+ State("navbar-collapse", "is_open"),
1048
1106
  )
1049
1107
  def toggle_navbar_collapse(n_clicks: Optional[int], is_open: bool) -> bool:
1050
1108
  """
@@ -1103,7 +1161,6 @@ def parameters_as_yaml_or_json_click(
1103
1161
  if not yaml_n_clicks and not json_n_clicks:
1104
1162
  raise PreventUpdate
1105
1163
 
1106
- ctx = dash.callback_context
1107
1164
  triggered = dash.callback_context.triggered
1108
1165
  if triggered[0]['value'] is None:
1109
1166
  raise PreventUpdate
@@ -1117,6 +1174,33 @@ def parameters_as_yaml_or_json_click(
1117
1174
  return json.dumps(pipe.parameters, indent=4, separators=(',', ': '), sort_keys=True)
1118
1175
 
1119
1176
 
1177
+ @dash_app.callback(
1178
+ Output({'type': 'sync-editor', 'index': MATCH}, 'value'),
1179
+ Input({'type': 'sync-as-json-button', 'index': MATCH}, 'n_clicks'),
1180
+ Input({'type': 'sync-as-lines-button', 'index': MATCH}, 'n_clicks'),
1181
+ )
1182
+ def sync_as_json_or_lines_click(
1183
+ json_n_clicks: Optional[int],
1184
+ lines_n_clicks: Optional[int],
1185
+ ):
1186
+ """
1187
+ When the `YAML` button is clicked under the parameters editor, switch the content to YAML.
1188
+ """
1189
+ if not json_n_clicks and not lines_n_clicks:
1190
+ raise PreventUpdate
1191
+
1192
+ triggered = dash.callback_context.triggered
1193
+ if triggered[0]['value'] is None:
1194
+ raise PreventUpdate
1195
+
1196
+ as_lines = 'lines' in triggered[0]['prop_id']
1197
+ pipe = pipe_from_ctx(triggered, 'n_clicks')
1198
+ if pipe is None:
1199
+ raise PreventUpdate
1200
+
1201
+ return get_backtrack_text(pipe, lines=as_lines)
1202
+
1203
+
1120
1204
  @dash_app.callback(
1121
1205
  Output('pages-offcanvas', 'is_open'),
1122
1206
  Output('pages-offcanvas', 'children'),
@@ -66,4 +66,3 @@ def edit_plugin_description(
66
66
  success, _msg = get_api_connector().register_plugin(plugin, debug=debug, force=True)
67
67
  msg = _msg if not success else "Successfully updated description."
68
68
  return [alert_from_success_tuple((success, msg))]
69
-
@@ -13,7 +13,7 @@ from meerschaum.api.dash.sessions import set_session
13
13
  from dash.dependencies import Input, Output, State, ALL, MATCH
14
14
  from dash.exceptions import PreventUpdate
15
15
  from meerschaum.core import User
16
- from meerschaum.config.static import STATIC_CONFIG
16
+ from meerschaum._internal.static import STATIC_CONFIG
17
17
  from meerschaum.utils.packages import attempt_import
18
18
  dash = attempt_import('dash', check_update=CHECK_UPDATE)
19
19
  from fastapi.exceptions import HTTPException
@@ -6,3 +6,4 @@ Define the callbacks for the settings pages.
6
6
  """
7
7
 
8
8
  import meerschaum.api.dash.callbacks.settings.password_reset
9
+ import meerschaum.api.dash.callbacks.settings.tokens
@@ -11,7 +11,7 @@ from dash.dependencies import Input, Output, State
11
11
  import dash_bootstrap_components as dbc
12
12
 
13
13
  from meerschaum.core.User import User
14
- from meerschaum.config.static import STATIC_CONFIG
14
+ from meerschaum._internal.static import STATIC_CONFIG
15
15
  from meerschaum.api import get_api_connector, debug
16
16
  from meerschaum.api.dash import dash_app
17
17
  from meerschaum.api.dash.components import alert_from_success_tuple
@@ -39,7 +39,7 @@ def password_reset_button_click(n_clicks, new_password_value, session_store_data
39
39
  )
40
40
 
41
41
  instance_connector = get_api_connector()
42
- user = User(username, new_password_value)
42
+ user = User(username, new_password_value, instance=instance_connector)
43
43
  success, msg = instance_connector.edit_user(user, debug=debug)
44
44
  return alert_from_success_tuple((success, msg))
45
45