hide items not available for specific user role

This commit is contained in:
iLLiCiTiT 2020-11-17 15:45:17 +01:00
parent cfbe04d536
commit 6edabcb912
2 changed files with 86 additions and 13 deletions

View file

@ -100,6 +100,8 @@ class SettingObject:
self._is_nullable = False
self._as_widget = False
self._is_group = False
self._roles = None
self.hidden_by_role = False
# If value should be stored to environments
self._env_group_key = None
@ -125,6 +127,13 @@ class SettingObject:
# Only for develop mode
self.defaults_not_set = False
def available_for_role(self, role_name=None):
if not self._roles:
return True
if role_name is None:
role_name = self.user_role
return role_name in self._roles
def initial_attributes(self, input_data, parent, as_widget):
"""Prepare attributes based on entered arguments.
@ -136,10 +145,14 @@ class SettingObject:
self._parent = parent
self._as_widget = as_widget
self._roles = input_data.get("roles")
if self._roles is not None and not isinstance(self._roles, list):
self._roles = [self._roles]
self._is_group = input_data.get("is_group", False)
self._env_group_key = input_data.get("env_group_key")
# TODO not implemented yet
self._is_nullable = input_data.get("is_nullable", False)
self._env_group_key = input_data.get("env_group_key")
if self.is_environ:
if not self.allow_to_environment:
@ -166,15 +179,19 @@ class SettingObject:
self._any_parent_is_group = any_parent_is_group
if not self.available_for_role():
self.hide()
self.hidden_by_role = True
@property
def develop_mode(self):
"""Tool is in develop mode or not.
def user_role(self):
"""Tool is running with any user role.
Returns:
bool
str: user role as string.
"""
return self._parent.develop_mode
return self._parent.user_role
@property
def log(self):
@ -659,7 +676,7 @@ class InputObject(SettingObject):
value = parent_values.get(self.key, NOT_SET)
if value is NOT_SET:
if self.develop_mode:
if self.available_for_role("developer"):
self.defaults_not_set = True
value = self.default_input_value
if value is NOT_SET:
@ -1000,7 +1017,6 @@ class TextWidget(QtWidgets.QWidget, InputObject):
super(TextWidget, self).__init__(parent_widget)
self.initial_attributes(input_data, parent, as_widget)
self.multiline = input_data.get("multiline", False)
placeholder = input_data.get("placeholder")
@ -1319,6 +1335,7 @@ class RawJsonWidget(QtWidgets.QWidget, InputObject):
}
return {self.key: value}
class ListItem(QtWidgets.QWidget, SettingObject):
_btn_size = 20
value_changed = QtCore.Signal(object)
@ -2390,6 +2407,15 @@ class DictWidget(QtWidgets.QWidget, SettingObject):
else:
self._ui_as_item(input_data)
any_visible = False
for input_field in self.input_fields:
if not input_field.hidden_by_role:
any_visible = True
break
if not any_visible:
self.hide()
def _ui_as_item(self, input_data):
self.key = input_data["key"]
if input_data.get("highlight_content", False):
@ -2485,6 +2511,8 @@ class DictWidget(QtWidgets.QWidget, SettingObject):
item.value_changed.connect(self._on_value_change)
if label_widget:
if item.hidden_by_role:
label_widget.hide()
label_widget.input_field = item
self.content_layout.addWidget(item, row, 1, 1, 1)
else:
@ -2824,6 +2852,15 @@ class DictInvisible(QtWidgets.QWidget, SettingObject):
for child_data in input_data.get("children", []):
self.add_children_gui(child_data)
any_visible = False
for input_field in self.input_fields:
if not input_field.hidden_by_role:
any_visible = True
break
if not any_visible:
self.hide()
def add_children_gui(self, child_configuration):
item_type = child_configuration["type"]
klass = TypeToKlass.types.get(item_type)
@ -2845,6 +2882,8 @@ class DictInvisible(QtWidgets.QWidget, SettingObject):
item.value_changed.connect(self._on_value_change)
if label_widget:
if item.hidden_by_role:
label_widget.hide()
label_widget.input_field = item
self.content_layout.addWidget(item, row, 1, 1, 1)
else:
@ -3202,7 +3241,7 @@ class PathWidget(QtWidgets.QWidget, SettingObject):
value = parent_values.get(self.key, NOT_SET)
if value is NOT_SET:
if self.develop_mode:
if self.available_for_role("developer"):
self.defaults_not_set = True
value = self.default_input_value
if value is NOT_SET:
@ -3450,6 +3489,15 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject):
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
any_visible = False
for input_field in self.input_fields:
if not input_field.hidden_by_role:
any_visible = True
break
if not any_visible:
self.hide()
def add_children_gui(self, child_configuration):
item_type = child_configuration["type"]
# Pop label to not be set in child
@ -3462,6 +3510,9 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject):
item = klass(child_configuration, self, label_widget=label_widget)
label_widget.item = item
if item.hidden_by_role:
label_widget.hide()
item.value_changed.connect(self._on_value_change)
self.content_layout.addRow(label_widget, item)
self.input_fields.append(item)
@ -3636,7 +3687,7 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject):
class LabelWidget(QtWidgets.QWidget):
is_input_type = False
def __init__(self, configuration, parent=None):
def __init__(self, configuration, parent):
super(LabelWidget, self).__init__(parent)
self.setObjectName("LabelWidget")
@ -3647,12 +3698,23 @@ class LabelWidget(QtWidgets.QWidget):
label_widget = QtWidgets.QLabel(label, self)
layout.addWidget(label_widget)
# Role handling
roles = configuration.get("roles")
if roles is not None and not isinstance(roles, list):
roles = [roles]
if roles and parent.user_role not in roles:
self.hide()
self.hidden_by_role = True
else:
self.hidden_by_role = False
class SplitterWidget(QtWidgets.QWidget):
is_input_type = False
_height = 2
def __init__(self, configuration, parent=None):
def __init__(self, configuration, parent):
super(SplitterWidget, self).__init__(parent)
layout = QtWidgets.QHBoxLayout(self)
@ -3663,6 +3725,17 @@ class SplitterWidget(QtWidgets.QWidget):
splitter_item.setMaximumHeight(self._height)
layout.addWidget(splitter_item)
# Role handling
roles = configuration.get("roles")
if roles is not None and not isinstance(roles, list):
roles = [roles]
if roles and parent.user_role not in roles:
self.hide()
self.hidden_by_role = True
else:
self.hidden_by_role = False
TypeToKlass.types["boolean"] = BooleanWidget
TypeToKlass.types["number"] = NumberWidget

View file

@ -6,7 +6,7 @@ class MainWidget(QtWidgets.QWidget):
widget_width = 1000
widget_height = 600
def __init__(self, develop, parent=None):
def __init__(self, user_role, parent=None):
super(MainWidget, self).__init__(parent)
self.setObjectName("MainWidget")
self.setWindowTitle("Pype Settings")
@ -15,8 +15,8 @@ class MainWidget(QtWidgets.QWidget):
header_tab_widget = QtWidgets.QTabWidget(parent=self)
studio_widget = SystemWidget(develop, header_tab_widget)
project_widget = ProjectWidget(develop, header_tab_widget)
studio_widget = SystemWidget(user_role, header_tab_widget)
project_widget = ProjectWidget(user_role, header_tab_widget)
header_tab_widget.addTab(studio_widget, "System")
header_tab_widget.addTab(project_widget, "Project")