mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 05:14:40 +01:00
Merge pull request #3045 from pypeclub/feature/OP-3048_Local-overrides-for-environment-variables
General: Local overrides for environment variables
This commit is contained in:
commit
e2918195d6
7 changed files with 179 additions and 7 deletions
|
|
@ -13,7 +13,8 @@ import six
|
|||
|
||||
from openpype.settings import (
|
||||
get_system_settings,
|
||||
get_project_settings
|
||||
get_project_settings,
|
||||
get_local_settings
|
||||
)
|
||||
from openpype.settings.constants import (
|
||||
METADATA_KEYS,
|
||||
|
|
@ -1272,6 +1273,9 @@ class EnvironmentPrepData(dict):
|
|||
if data.get("env") is None:
|
||||
data["env"] = os.environ.copy()
|
||||
|
||||
if "system_settings" not in data:
|
||||
data["system_settings"] = get_system_settings()
|
||||
|
||||
super(EnvironmentPrepData, self).__init__(data)
|
||||
|
||||
|
||||
|
|
@ -1395,8 +1399,27 @@ def prepare_app_environments(data, env_group=None, implementation_envs=True):
|
|||
|
||||
app = data["app"]
|
||||
log = data["log"]
|
||||
source_env = data["env"].copy()
|
||||
|
||||
_add_python_version_paths(app, data["env"], log)
|
||||
_add_python_version_paths(app, source_env, log)
|
||||
|
||||
# Use environments from local settings
|
||||
filtered_local_envs = {}
|
||||
system_settings = data["system_settings"]
|
||||
whitelist_envs = system_settings["general"].get("local_env_white_list")
|
||||
if whitelist_envs:
|
||||
local_settings = get_local_settings()
|
||||
local_envs = local_settings.get("environments") or {}
|
||||
filtered_local_envs = {
|
||||
key: value
|
||||
for key, value in local_envs.items()
|
||||
if key in whitelist_envs
|
||||
}
|
||||
|
||||
# Apply local environment variables for already existing values
|
||||
for key, value in filtered_local_envs.items():
|
||||
if key in source_env:
|
||||
source_env[key] = value
|
||||
|
||||
# `added_env_keys` has debug purpose
|
||||
added_env_keys = {app.group.name, app.name}
|
||||
|
|
@ -1441,10 +1464,19 @@ def prepare_app_environments(data, env_group=None, implementation_envs=True):
|
|||
|
||||
# Choose right platform
|
||||
tool_env = parse_environments(_env_values, env_group)
|
||||
|
||||
# Apply local environment variables
|
||||
# - must happen between all values because they may be used during
|
||||
# merge
|
||||
for key, value in filtered_local_envs.items():
|
||||
if key in tool_env:
|
||||
tool_env[key] = value
|
||||
|
||||
# Merge dictionaries
|
||||
env_values = _merge_env(tool_env, env_values)
|
||||
|
||||
merged_env = _merge_env(env_values, data["env"])
|
||||
merged_env = _merge_env(env_values, source_env)
|
||||
|
||||
loaded_env = acre.compute(merged_env, cleanup=False)
|
||||
|
||||
final_env = None
|
||||
|
|
@ -1464,7 +1496,7 @@ def prepare_app_environments(data, env_group=None, implementation_envs=True):
|
|||
if final_env is None:
|
||||
final_env = loaded_env
|
||||
|
||||
keys_to_remove = set(data["env"].keys()) - set(final_env.keys())
|
||||
keys_to_remove = set(source_env.keys()) - set(final_env.keys())
|
||||
|
||||
# Update env
|
||||
data["env"].update(final_env)
|
||||
|
|
@ -1611,7 +1643,6 @@ def _prepare_last_workfile(data, workdir):
|
|||
result will be stored.
|
||||
workdir (str): Path to folder where workfiles should be stored.
|
||||
"""
|
||||
import avalon.api
|
||||
from openpype.pipeline import HOST_WORKFILE_EXTENSIONS
|
||||
|
||||
log = data["log"]
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
"linux": [],
|
||||
"darwin": []
|
||||
},
|
||||
"local_env_white_list": [],
|
||||
"openpype_path": {
|
||||
"windows": [],
|
||||
"darwin": [],
|
||||
|
|
|
|||
|
|
@ -110,6 +110,17 @@
|
|||
{
|
||||
"type": "splitter"
|
||||
},
|
||||
{
|
||||
"type": "list",
|
||||
"key": "local_env_white_list",
|
||||
"label": "Local overrides of environment variable keys",
|
||||
"tooltip": "Environment variable keys that can be changed per machine using Local settings UI.\nKey changes are applied only on applications and tools environments.",
|
||||
"use_label_wrap": true,
|
||||
"object_type": "text"
|
||||
},
|
||||
{
|
||||
"type": "splitter"
|
||||
},
|
||||
{
|
||||
"type": "collapsible-wrap",
|
||||
"label": "OpenPype deployment control",
|
||||
|
|
|
|||
|
|
@ -1113,6 +1113,14 @@ def get_general_environments():
|
|||
|
||||
clear_metadata_from_settings(environments)
|
||||
|
||||
whitelist_envs = result["general"].get("local_env_white_list")
|
||||
if whitelist_envs:
|
||||
local_settings = get_local_settings()
|
||||
local_envs = local_settings.get("environments") or {}
|
||||
for key, value in local_envs.items():
|
||||
if key in whitelist_envs and key in environments:
|
||||
environments[key] = value
|
||||
|
||||
return environments
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ LABEL_DISCARD_CHANGES = "Discard changes"
|
|||
# TODO move to settings constants
|
||||
LOCAL_GENERAL_KEY = "general"
|
||||
LOCAL_PROJECTS_KEY = "projects"
|
||||
LOCAL_ENV_KEY = "environments"
|
||||
LOCAL_APPS_KEY = "applications"
|
||||
|
||||
# Roots key constant
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
from Qt import QtWidgets
|
||||
|
||||
from openpype.tools.utils import PlaceholderLineEdit
|
||||
|
||||
|
||||
class LocalEnvironmentsWidgets(QtWidgets.QWidget):
|
||||
def __init__(self, system_settings_entity, parent):
|
||||
super(LocalEnvironmentsWidgets, self).__init__(parent)
|
||||
|
||||
self._widgets_by_env_key = {}
|
||||
self.system_settings_entity = system_settings_entity
|
||||
|
||||
content_widget = QtWidgets.QWidget(self)
|
||||
content_layout = QtWidgets.QGridLayout(content_widget)
|
||||
content_layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
layout = QtWidgets.QVBoxLayout(self)
|
||||
layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
self._layout = layout
|
||||
self._content_layout = content_layout
|
||||
self._content_widget = content_widget
|
||||
|
||||
def _clear_layout(self, layout):
|
||||
while layout.count() > 0:
|
||||
item = layout.itemAt(0)
|
||||
widget = item.widget()
|
||||
layout.removeItem(item)
|
||||
if widget is not None:
|
||||
widget.setVisible(False)
|
||||
widget.deleteLater()
|
||||
|
||||
def _reset_env_widgets(self):
|
||||
self._clear_layout(self._content_layout)
|
||||
self._clear_layout(self._layout)
|
||||
|
||||
content_widget = QtWidgets.QWidget(self)
|
||||
content_layout = QtWidgets.QGridLayout(content_widget)
|
||||
content_layout.setContentsMargins(0, 0, 0, 0)
|
||||
white_list_entity = (
|
||||
self.system_settings_entity["general"]["local_env_white_list"]
|
||||
)
|
||||
row = -1
|
||||
for row, item in enumerate(white_list_entity):
|
||||
key = item.value
|
||||
label_widget = QtWidgets.QLabel(key, self)
|
||||
input_widget = PlaceholderLineEdit(self)
|
||||
input_widget.setPlaceholderText("< Keep studio value >")
|
||||
|
||||
content_layout.addWidget(label_widget, row, 0)
|
||||
content_layout.addWidget(input_widget, row, 1)
|
||||
|
||||
self._widgets_by_env_key[key] = input_widget
|
||||
|
||||
if row < 0:
|
||||
label_widget = QtWidgets.QLabel(
|
||||
(
|
||||
"Your studio does not allow to change"
|
||||
" Environment variables locally."
|
||||
),
|
||||
self
|
||||
)
|
||||
content_layout.addWidget(label_widget, 0, 0)
|
||||
content_layout.setColumnStretch(0, 1)
|
||||
|
||||
else:
|
||||
content_layout.setColumnStretch(0, 0)
|
||||
content_layout.setColumnStretch(1, 1)
|
||||
|
||||
self._layout.addWidget(content_widget, 1)
|
||||
|
||||
self._content_layout = content_layout
|
||||
self._content_widget = content_widget
|
||||
|
||||
def update_local_settings(self, value):
|
||||
if not value:
|
||||
value = {}
|
||||
|
||||
self._reset_env_widgets()
|
||||
|
||||
for env_key, widget in self._widgets_by_env_key.items():
|
||||
env_value = value.get(env_key) or ""
|
||||
widget.setText(env_value)
|
||||
|
||||
def settings_value(self):
|
||||
output = {}
|
||||
for env_key, widget in self._widgets_by_env_key.items():
|
||||
value = widget.text()
|
||||
if value:
|
||||
output[env_key] = value
|
||||
if not output:
|
||||
return None
|
||||
return output
|
||||
|
|
@ -25,11 +25,13 @@ from .experimental_widget import (
|
|||
LOCAL_EXPERIMENTAL_KEY
|
||||
)
|
||||
from .apps_widget import LocalApplicationsWidgets
|
||||
from .environments_widget import LocalEnvironmentsWidgets
|
||||
from .projects_widget import ProjectSettingsWidget
|
||||
|
||||
from .constants import (
|
||||
LOCAL_GENERAL_KEY,
|
||||
LOCAL_PROJECTS_KEY,
|
||||
LOCAL_ENV_KEY,
|
||||
LOCAL_APPS_KEY
|
||||
)
|
||||
|
||||
|
|
@ -49,18 +51,20 @@ class LocalSettingsWidget(QtWidgets.QWidget):
|
|||
self.pype_mongo_widget = None
|
||||
self.general_widget = None
|
||||
self.experimental_widget = None
|
||||
self.envs_widget = None
|
||||
self.apps_widget = None
|
||||
self.projects_widget = None
|
||||
|
||||
self._create_pype_mongo_ui()
|
||||
self._create_mongo_url_ui()
|
||||
self._create_general_ui()
|
||||
self._create_experimental_ui()
|
||||
self._create_environments_ui()
|
||||
self._create_app_ui()
|
||||
self._create_project_ui()
|
||||
|
||||
self.main_layout.addStretch(1)
|
||||
|
||||
def _create_pype_mongo_ui(self):
|
||||
def _create_mongo_url_ui(self):
|
||||
pype_mongo_expand_widget = ExpandingWidget("OpenPype Mongo URL", self)
|
||||
pype_mongo_content = QtWidgets.QWidget(self)
|
||||
pype_mongo_layout = QtWidgets.QVBoxLayout(pype_mongo_content)
|
||||
|
|
@ -110,6 +114,22 @@ class LocalSettingsWidget(QtWidgets.QWidget):
|
|||
|
||||
self.experimental_widget = experimental_widget
|
||||
|
||||
def _create_environments_ui(self):
|
||||
envs_expand_widget = ExpandingWidget("Environments", self)
|
||||
envs_content = QtWidgets.QWidget(self)
|
||||
envs_layout = QtWidgets.QVBoxLayout(envs_content)
|
||||
envs_layout.setContentsMargins(CHILD_OFFSET, 5, 0, 0)
|
||||
envs_expand_widget.set_content_widget(envs_content)
|
||||
|
||||
envs_widget = LocalEnvironmentsWidgets(
|
||||
self.system_settings, envs_content
|
||||
)
|
||||
envs_layout.addWidget(envs_widget)
|
||||
|
||||
self.main_layout.addWidget(envs_expand_widget)
|
||||
|
||||
self.envs_widget = envs_widget
|
||||
|
||||
def _create_app_ui(self):
|
||||
# Applications
|
||||
app_expand_widget = ExpandingWidget("Applications", self)
|
||||
|
|
@ -154,6 +174,9 @@ class LocalSettingsWidget(QtWidgets.QWidget):
|
|||
self.general_widget.update_local_settings(
|
||||
value.get(LOCAL_GENERAL_KEY)
|
||||
)
|
||||
self.envs_widget.update_local_settings(
|
||||
value.get(LOCAL_ENV_KEY)
|
||||
)
|
||||
self.app_widget.update_local_settings(
|
||||
value.get(LOCAL_APPS_KEY)
|
||||
)
|
||||
|
|
@ -170,6 +193,10 @@ class LocalSettingsWidget(QtWidgets.QWidget):
|
|||
if general_value:
|
||||
output[LOCAL_GENERAL_KEY] = general_value
|
||||
|
||||
envs_value = self.envs_widget.settings_value()
|
||||
if envs_value:
|
||||
output[LOCAL_ENV_KEY] = envs_value
|
||||
|
||||
app_value = self.app_widget.settings_value()
|
||||
if app_value:
|
||||
output[LOCAL_APPS_KEY] = app_value
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue