mainsequence 3.18.1__tar.gz → 3.18.2__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.
- {mainsequence-3.18.1 → mainsequence-3.18.2}/PKG-INFO +1 -1
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/models_user.py +69 -1
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-3.18.1 → mainsequence-3.18.2}/pyproject.toml +1 -1
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_models_user_request_bound_auth.py +35 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/LICENSE +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/README.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/__main__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/bootstrap.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/api.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/cli.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/config.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/cli/ui.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/agent.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/base.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/client.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/models_simple_tables.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/models_tdag.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/models_vam.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/compute_validation.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/data_interface/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/data_interface/data_interface.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/base_instrument.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/bond.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/callability.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/json_codec.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/position.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/ql_fields.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/indices.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/settings.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/logconf.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/__main__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/base_persist_managers.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/config.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/configuration_models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/filters.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/filters.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/future_registry.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/pydantic_metadata.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/filters.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/schema.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/enums.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/utils.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/setup.cfg +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_auth_precedence.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_cli.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_client.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_command_center_models.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_dependency_extras.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_filter_normalization.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_instruments.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_logconf.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_logged_user_components.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_run_configuration.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_simple_tables_configuration_hashing.py +0 -0
- {mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_simple_tables_persistence.py +0 -0
|
@@ -976,6 +976,53 @@ class User(UserApiBaseObjectOrm, BasePydanticModel):
|
|
|
976
976
|
def effective_plan(self) -> Any | None:
|
|
977
977
|
return self.plan if self.plan is not None else self.active_plan_type
|
|
978
978
|
|
|
979
|
+
@classmethod
|
|
980
|
+
def _build_request_bound_identity_user(
|
|
981
|
+
cls,
|
|
982
|
+
*,
|
|
983
|
+
normalized_headers: Mapping[str, Any],
|
|
984
|
+
user_id: int,
|
|
985
|
+
):
|
|
986
|
+
username = str(
|
|
987
|
+
normalized_headers.get("X-Username")
|
|
988
|
+
or normalized_headers.get("x-username")
|
|
989
|
+
or normalized_headers.get("X-User-Email")
|
|
990
|
+
or normalized_headers.get("x-user-email")
|
|
991
|
+
or f"user-{user_id}"
|
|
992
|
+
).strip() or f"user-{user_id}"
|
|
993
|
+
email = str(
|
|
994
|
+
normalized_headers.get("X-User-Email")
|
|
995
|
+
or normalized_headers.get("x-user-email")
|
|
996
|
+
or username
|
|
997
|
+
).strip() or username
|
|
998
|
+
|
|
999
|
+
payload = {
|
|
1000
|
+
"id": user_id,
|
|
1001
|
+
"username": username,
|
|
1002
|
+
"email": email,
|
|
1003
|
+
"date_joined": None,
|
|
1004
|
+
"is_active": True,
|
|
1005
|
+
"last_login": None,
|
|
1006
|
+
"api_request_limit": None,
|
|
1007
|
+
"mfa_enabled": False,
|
|
1008
|
+
"organization": None,
|
|
1009
|
+
"phone_number": None,
|
|
1010
|
+
"plan": None,
|
|
1011
|
+
"active_plan_type": None,
|
|
1012
|
+
"groups": [],
|
|
1013
|
+
"user_permissions": [],
|
|
1014
|
+
"organization_teams": [],
|
|
1015
|
+
"is_verified": None,
|
|
1016
|
+
"blocked_access": None,
|
|
1017
|
+
"requires_password_change": None,
|
|
1018
|
+
"identity_platform_uid": None,
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
model_construct = getattr(cls, "model_construct", None)
|
|
1022
|
+
if callable(model_construct):
|
|
1023
|
+
return model_construct(**payload)
|
|
1024
|
+
return cls.construct(**payload)
|
|
1025
|
+
|
|
979
1026
|
@classmethod
|
|
980
1027
|
def get_authenticated_user_details(cls):
|
|
981
1028
|
"""
|
|
@@ -1082,6 +1129,15 @@ class User(UserApiBaseObjectOrm, BasePydanticModel):
|
|
|
1082
1129
|
normalized_headers[key_str] = value
|
|
1083
1130
|
normalized_headers[key_str.lower()] = value
|
|
1084
1131
|
|
|
1132
|
+
authorization_value = (
|
|
1133
|
+
normalized_headers.get("Authorization")
|
|
1134
|
+
or normalized_headers.get("authorization")
|
|
1135
|
+
)
|
|
1136
|
+
has_bearer_authorization = bool(
|
|
1137
|
+
authorization_value
|
|
1138
|
+
and str(authorization_value).split(" ", 1)[0].lower() == "bearer"
|
|
1139
|
+
)
|
|
1140
|
+
|
|
1085
1141
|
user_id_raw = (
|
|
1086
1142
|
normalized_headers.get("X-User-ID")
|
|
1087
1143
|
or normalized_headers.get("x-user-id")
|
|
@@ -1090,7 +1146,7 @@ class User(UserApiBaseObjectOrm, BasePydanticModel):
|
|
|
1090
1146
|
)
|
|
1091
1147
|
|
|
1092
1148
|
if user_id_raw in (None, ""):
|
|
1093
|
-
if
|
|
1149
|
+
if has_bearer_authorization:
|
|
1094
1150
|
outgoing_authorization = None
|
|
1095
1151
|
outgoing_authorization_scheme = None
|
|
1096
1152
|
try:
|
|
@@ -1163,6 +1219,18 @@ class User(UserApiBaseObjectOrm, BasePydanticModel):
|
|
|
1163
1219
|
)
|
|
1164
1220
|
raise RuntimeError(f"Invalid X-User-ID value: {user_id_raw!r}") from exc
|
|
1165
1221
|
|
|
1222
|
+
if not has_bearer_authorization:
|
|
1223
|
+
user = cls._build_request_bound_identity_user(
|
|
1224
|
+
normalized_headers=normalized_headers,
|
|
1225
|
+
user_id=user_id,
|
|
1226
|
+
)
|
|
1227
|
+
_CURRENT_USER.set(user)
|
|
1228
|
+
logger.info(
|
|
1229
|
+
"User.get_logged_user resolved user_id=%s via request identity headers without backend auth",
|
|
1230
|
+
user.id,
|
|
1231
|
+
)
|
|
1232
|
+
return user
|
|
1233
|
+
|
|
1166
1234
|
user = cls._get_request_bound_user(headers=headers, user_id=user_id)
|
|
1167
1235
|
_CURRENT_USER.set(user)
|
|
1168
1236
|
logger.info(
|
|
@@ -73,6 +73,41 @@ def test_get_logged_user_uses_request_bound_headers_for_user_lookup(monkeypatch)
|
|
|
73
73
|
assert "Host" not in captured["headers"]
|
|
74
74
|
|
|
75
75
|
|
|
76
|
+
def test_get_logged_user_returns_header_identity_without_backend_auth(monkeypatch):
|
|
77
|
+
monkeypatch.delenv("MAINSEQUENCE_ACCESS_TOKEN", raising=False)
|
|
78
|
+
monkeypatch.delenv("MAINSEQUENCE_REFRESH_TOKEN", raising=False)
|
|
79
|
+
|
|
80
|
+
class _FakeSession:
|
|
81
|
+
def get(self, url, *, headers=None, params=None, timeout=None):
|
|
82
|
+
raise AssertionError("header-only identity should not trigger backend lookup")
|
|
83
|
+
|
|
84
|
+
monkeypatch.setattr(
|
|
85
|
+
models_user_mod.User,
|
|
86
|
+
"build_session",
|
|
87
|
+
classmethod(lambda cls: _FakeSession()),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
auth_token = models_user_mod._CURRENT_AUTH_HEADERS.set(
|
|
91
|
+
{
|
|
92
|
+
"X-User-ID": "4",
|
|
93
|
+
"X-Username": "dashboard-user",
|
|
94
|
+
"X-Dashboard-ID": "dashboard-7",
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
user_token = models_user_mod._CURRENT_USER.set(None)
|
|
98
|
+
try:
|
|
99
|
+
user = models_user_mod.User.get_logged_user()
|
|
100
|
+
finally:
|
|
101
|
+
models_user_mod._CURRENT_USER.reset(user_token)
|
|
102
|
+
models_user_mod._CURRENT_AUTH_HEADERS.reset(auth_token)
|
|
103
|
+
|
|
104
|
+
assert user.id == 4
|
|
105
|
+
assert user.username == "dashboard-user"
|
|
106
|
+
assert user.email == "dashboard-user"
|
|
107
|
+
assert user.date_joined is None
|
|
108
|
+
assert user.api_request_limit is None
|
|
109
|
+
|
|
110
|
+
|
|
76
111
|
def test_get_logged_user_bearer_fallback_uses_request_bound_headers(monkeypatch):
|
|
77
112
|
monkeypatch.delenv("MAINSEQUENCE_ACCESS_TOKEN", raising=False)
|
|
78
113
|
monkeypatch.delenv("MAINSEQUENCE_REFRESH_TOKEN", raising=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/dashboards/streamlit/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/agent_scaffold/skills/maintenance/local_journal/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/app_component.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/data_models.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/command_center/workspace_snapshot.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/duckdb.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/client/data_sources_interfaces/timescale.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/config.toml
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/favicon.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/assets/logo.png
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/components/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/dashboards/streamlit/pages/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/data_interface/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/base_instrument.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/callability.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/json_codec.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/position.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/instruments/ql_fields.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/nodes.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/interest_rates/etl/registry.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/__init__.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/bond_pricer.py
RENAMED
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/indices.py
RENAMED
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/instruments/pricing_models/swap_pricer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/build_operations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/data_nodes/persist_managers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/tdag/simple_tables/persist_managers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/contrib/prices/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/mainsequence/virtualfundbuilder/portfolio_nodes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_command_center_app_component_models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.1 → mainsequence-3.18.2}/tests/test_simple_tables_configuration_hashing.py
RENAMED
|
File without changes
|
|
File without changes
|