diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c01c2411..49236ef4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Added - **Projectroles** - ``SODARUser.get_display_name()`` helper (#1487) + - App setting type constants (#1458) Changed ------- diff --git a/adminalerts/plugins.py b/adminalerts/plugins.py index 0e48682e..40be4917 100644 --- a/adminalerts/plugins.py +++ b/adminalerts/plugins.py @@ -13,6 +13,7 @@ # SODAR constants APP_SETTING_SCOPE_USER = SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] class SiteAppPlugin(SiteAppPluginPoint): @@ -31,7 +32,7 @@ class SiteAppPlugin(SiteAppPluginPoint): app_settings = { 'notify_email_alert': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': True, 'label': 'Receive email for admin alerts', 'description': ( diff --git a/docs/source/major_changes.rst b/docs/source/major_changes.rst index e423e811..fb39baec 100644 --- a/docs/source/major_changes.rst +++ b/docs/source/major_changes.rst @@ -16,6 +16,7 @@ v1.1.0 (WIP) Release Highlights ================== +- Add app setting type constants - Remove support for features deprecated in v1.0 - Remove squashed migrations diff --git a/example_project_app/plugins.py b/example_project_app/plugins.py index d6b7a4c4..dabb5a0f 100644 --- a/example_project_app/plugins.py +++ b/example_project_app/plugins.py @@ -21,6 +21,16 @@ # SODAR constants PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT'] PROJECT_TYPE_CATEGORY = SODAR_CONSTANTS['PROJECT_TYPE_CATEGORY'] +APP_SETTING_SCOPE_PROJECT = SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'] +APP_SETTING_SCOPE_USER = SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'] +APP_SETTING_SCOPE_PROJECT_USER = SODAR_CONSTANTS[ + 'APP_SETTING_SCOPE_PROJECT_USER' +] +APP_SETTING_SCOPE_SITE = SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants EXAMPLE_MODIFY_API_MSG = ( @@ -51,8 +61,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): # TODO: Unify naming app_settings = { 'project_str_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string project setting', @@ -60,8 +70,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'project_int_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting', 'default': 0, 'description': 'Example integer project setting', @@ -70,8 +80,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-success'}, }, 'project_str_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting with options', 'default': 'string1', 'description': 'Example string project setting with options', @@ -79,8 +89,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'project_int_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting with options', 'default': 0, 'description': 'Example integer project setting with options', @@ -89,16 +99,16 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-success'}, }, 'project_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Boolean setting', 'default': False, 'description': 'Example boolean project setting', 'user_modifiable': True, }, 'project_global_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Global boolean setting', 'default': False, 'description': 'Example global boolean project setting', @@ -106,8 +116,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'global': True, }, 'project_json_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'JSON', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_JSON, 'label': 'JSON setting', 'default': { 'Example': 'Value', @@ -119,23 +129,23 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-danger'}, }, 'project_hidden_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_STRING, 'label': 'Hidden setting', 'default': '', 'description': 'Example hidden project setting', 'user_modifiable': False, }, 'project_hidden_json_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'JSON', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_JSON, 'label': 'Hidden JSON setting', 'description': 'Example hidden JSON project setting', 'user_modifiable': False, }, 'user_str_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string user setting', @@ -143,8 +153,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'user_int_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting', 'default': 0, 'description': 'Example integer user setting', @@ -153,8 +163,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-success'}, }, 'user_str_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting with options', 'default': 'string1', 'options': ['string1', 'string2'], @@ -162,8 +172,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'user_int_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting with options', 'default': 0, 'options': [0, 1], @@ -172,16 +182,16 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-success'}, }, 'user_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Boolean setting', 'default': False, 'description': 'Example boolean user setting', 'user_modifiable': True, }, 'user_json_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'JSON', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_JSON, 'label': 'JSON setting', 'default': { 'Example': 'Value', @@ -193,33 +203,33 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'widget_attrs': {'class': 'text-danger'}, }, 'user_hidden_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': '', 'description': 'Example hidden user setting', 'user_modifiable': False, }, 'project_user_str_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': '', 'description': 'Example string project user setting', }, 'project_user_int_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_INTEGER, 'default': 0, 'description': 'Example int project user setting', }, 'project_user_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'description': 'Example bool project user setting', }, 'project_user_json_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'JSON', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_JSON, 'default': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -228,28 +238,28 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'description': 'Example json project user setting', }, 'project_callable_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable project setting', 'default': get_example_setting_default, 'description': 'Example callable project setting', }, 'user_callable_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable user setting', 'default': get_example_setting_default, 'description': 'Example callable user setting', }, 'project_user_callable_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': get_example_setting_default, 'description': 'Example callable project user setting', }, 'project_callable_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable setting with options', 'default': get_example_setting_default, 'options': get_example_setting_options, @@ -257,8 +267,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'user_callable_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable setting with options', 'default': get_example_setting_default, 'options': get_example_setting_options, @@ -266,15 +276,15 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'user_modifiable': True, }, 'project_user_callable_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': get_example_setting_default, 'options': get_example_setting_options, 'description': 'Example callable project user setting with options', }, 'category_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Category boolean setting', 'default': False, 'description': 'Example boolean project category setting', @@ -282,8 +292,8 @@ class ProjectAppPlugin(ProjectModifyPluginMixin, ProjectAppPluginPoint): 'project_types': [PROJECT_TYPE_CATEGORY], }, 'site_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_SITE, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Site boolean setting', 'default': False, 'description': 'Example boolean site setting', diff --git a/filesfolders/plugins.py b/filesfolders/plugins.py index 2398e9f4..7cb5d06d 100644 --- a/filesfolders/plugins.py +++ b/filesfolders/plugins.py @@ -15,6 +15,7 @@ # SODAR constants APP_SETTING_SCOPE_PROJECT = SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] # Local constants SHOW_LIST_COLUMNS = getattr(settings, 'FILESFOLDERS_SHOW_LIST_COLUMNS', False) @@ -40,7 +41,7 @@ class ProjectAppPlugin(ProjectAppPluginPoint): app_settings = { 'allow_public_links': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'label': 'Allow public links', 'description': 'Allow generation of public links for files', diff --git a/projectroles/app_settings.py b/projectroles/app_settings.py index 2449d711..4943083b 100644 --- a/projectroles/app_settings.py +++ b/projectroles/app_settings.py @@ -14,16 +14,20 @@ # SODAR constants +PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT'] +PROJECT_TYPE_CATEGORY = SODAR_CONSTANTS['PROJECT_TYPE_CATEGORY'] +SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] +SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] APP_SETTING_SCOPE_PROJECT = SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'] APP_SETTING_SCOPE_USER = SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'] APP_SETTING_SCOPE_PROJECT_USER = SODAR_CONSTANTS[ 'APP_SETTING_SCOPE_PROJECT_USER' ] APP_SETTING_SCOPE_SITE = SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'] -PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT'] -PROJECT_TYPE_CATEGORY = SODAR_CONSTANTS['PROJECT_TYPE_CATEGORY'] -SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] -SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants APP_SETTING_GLOBAL_DEFAULT = False @@ -34,10 +38,10 @@ APP_SETTING_SCOPE_SITE, ] APP_SETTING_DEFAULT_VALUES = { - 'STRING': '', - 'INTEGER': 0, - 'BOOLEAN': False, - 'JSON': {}, + APP_SETTING_TYPE_BOOLEAN: False, + APP_SETTING_TYPE_INTEGER: 0, + APP_SETTING_TYPE_JSON: {}, + APP_SETTING_TYPE_STRING: '', } APP_SETTING_SCOPE_ARGS = { APP_SETTING_SCOPE_PROJECT: {'project': True, 'user': False}, @@ -62,7 +66,7 @@ #: #: 'example_setting': { #: 'scope': 'PROJECT', # PROJECT/USER/PROJECT-USER/SITE - #: 'type': 'STRING', # STRING/INTEGER/BOOLEAN/JSON + #: 'type': APP_SETTING_TYPE_STRING, # STRING/INTEGER/BOOLEAN/JSON #: 'default': 'example', #: 'label': 'Project setting', # Optional, defaults to name/key #: 'placeholder': 'Enter example setting here', # Optional @@ -77,7 +81,7 @@ #: } 'ip_restrict': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'label': 'IP restrict', 'description': 'Restrict project access by an allowed IP list', @@ -86,7 +90,7 @@ }, 'ip_allowlist': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'default': [], 'label': 'IP allow list', 'description': 'List of allowed IPs for project access', @@ -95,14 +99,14 @@ }, 'project_star': { 'scope': APP_SETTING_SCOPE_PROJECT_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'global': False, 'project_types': [PROJECT_TYPE_PROJECT, PROJECT_TYPE_CATEGORY], }, 'notify_email_project': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': True, 'label': 'Receive email for {} updates'.format( get_display_name(PROJECT_TYPE_PROJECT) @@ -119,7 +123,7 @@ }, 'notify_email_role': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': True, 'label': 'Receive email for {} membership updates'.format( get_display_name(PROJECT_TYPE_PROJECT) @@ -188,7 +192,11 @@ def _check_type_options(cls, setting_type, setting_options): :param setting_options: List of options (Strings or Integers) :raise: ValueError if type is not recognized """ - if setting_type not in ['INTEGER', 'STRING'] and setting_options: + if ( + setting_type + not in [APP_SETTING_TYPE_INTEGER, APP_SETTING_TYPE_STRING] + and setting_options + ): raise ValueError( 'Options are only allowed for settings of type INTEGER and ' 'STRING' @@ -359,7 +367,7 @@ def get_default( return APP_SETTING_DEFAULT_VALUES[ app_settings[setting_name]['type'] ] - elif app_settings[setting_name]['type'] == 'JSON': + elif app_settings[setting_name]['type'] == APP_SETTING_TYPE_JSON: json_default = app_settings[setting_name].get('default') if not json_default: if isinstance(json_default, dict): @@ -560,7 +568,7 @@ def set( project=project, user=user, ) - if setting.type == 'JSON': + if setting.type == APP_SETTING_TYPE_JSON: setting.value_json = cls._get_json_value(value) else: setting.value = value @@ -578,7 +586,11 @@ def set( app_plugin = get_app_plugin(plugin_name) app_plugin_model = app_plugin.get_model() if validate: - v = cls._get_json_value(value) if s_type == 'JSON' else value + v = ( + cls._get_json_value(value) + if s_type == APP_SETTING_TYPE_JSON + else value + ) cls.validate( s_type, v, @@ -599,7 +611,7 @@ def set( 'type': s_type, 'user_modifiable': s_mod, } - if s_type == 'JSON': + if s_type == APP_SETTING_TYPE_JSON: s_vals['value_json'] = cls._get_json_value(value) else: s_vals['value'] = value @@ -732,14 +744,14 @@ def validate( if callable(setting_value): setting_value(project, user) - if setting_type == 'BOOLEAN': + if setting_type == APP_SETTING_TYPE_BOOLEAN: if not isinstance(setting_value, bool): raise ValueError( 'Please enter a valid boolean value ({})'.format( setting_value ) ) - elif setting_type == 'INTEGER': + elif setting_type == APP_SETTING_TYPE_INTEGER: if ( not isinstance(setting_value, int) and not str(setting_value).isdigit() @@ -749,7 +761,7 @@ def validate( setting_value ) ) - elif setting_type == 'JSON': + elif setting_type == APP_SETTING_TYPE_JSON: try: json.dumps(setting_value) except TypeError: @@ -882,11 +894,11 @@ def compare_value(cls, obj, input_value): :param input_value: Input value (string, int, bool or dict) :return: Bool """ - if obj.type == 'JSON': + if obj.type == APP_SETTING_TYPE_JSON: return ( not obj.value_json and not input_value ) or obj.value_json == cls._get_json_value(input_value) - elif obj.type == 'BOOLEAN': + elif obj.type == APP_SETTING_TYPE_BOOLEAN: if isinstance(input_value, str): input_value = bool(int(input_value)) return bool(int(obj.value)) == input_value diff --git a/projectroles/constants.py b/projectroles/constants.py index 156a4d3e..bf86b687 100644 --- a/projectroles/constants.py +++ b/projectroles/constants.py @@ -16,6 +16,10 @@ 'APP_SETTING_SCOPE_USER': 'USER', 'APP_SETTING_SCOPE_PROJECT_USER': 'PROJECT_USER', 'APP_SETTING_SCOPE_SITE': 'SITE', + 'APP_SETTING_TYPE_BOOLEAN': 'BOOLEAN', + 'APP_SETTING_TYPE_INTEGER': 'INTEGER', + 'APP_SETTING_TYPE_JSON': 'JSON', + 'APP_SETTING_TYPE_STRING': 'STRING', # RemoteSite mode 'SITE_MODE_SOURCE': 'SOURCE', 'SITE_MODE_TARGET': 'TARGET', diff --git a/projectroles/forms.py b/projectroles/forms.py index c38b87d3..eafe0dfd 100644 --- a/projectroles/forms.py +++ b/projectroles/forms.py @@ -46,6 +46,10 @@ SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] APP_SETTING_SCOPE_PROJECT = SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] REMOTE_LEVEL_READ_ROLES = SODAR_CONSTANTS['REMOTE_LEVEL_READ_ROLES'] # Local constants @@ -443,7 +447,7 @@ def _set_app_setting_field(self, plugin_name, s_field, s_key, s_val): choices=[ ( (int(option), int(option)) - if s_val['type'] == 'INTEGER' + if s_val['type'] == APP_SETTING_TYPE_INTEGER else (option, option) ) for option in s_val['options'] @@ -451,18 +455,18 @@ def _set_app_setting_field(self, plugin_name, s_field, s_key, s_val): **setting_kwargs ) # Other types - elif s_val['type'] == 'STRING': + elif s_val['type'] == APP_SETTING_TYPE_STRING: self.fields[s_field] = forms.CharField( widget=forms.TextInput(attrs=s_widget_attrs), **setting_kwargs ) - elif s_val['type'] == 'INTEGER': + elif s_val['type'] == APP_SETTING_TYPE_INTEGER: self.fields[s_field] = forms.IntegerField( widget=forms.NumberInput(attrs=s_widget_attrs), **setting_kwargs ) - elif s_val['type'] == 'BOOLEAN': + elif s_val['type'] == APP_SETTING_TYPE_BOOLEAN: self.fields[s_field] = forms.BooleanField(**setting_kwargs) # JSON - elif s_val['type'] == 'JSON': + elif s_val['type'] == APP_SETTING_TYPE_JSON: # NOTE: Attrs MUST be supplied here (#404) if 'class' in s_widget_attrs: s_widget_attrs['class'] += ' sodar-json-input' @@ -481,7 +485,7 @@ def _set_app_setting_field(self, plugin_name, s_field, s_key, s_val): setting_name=s_key, project=self.instance if self.instance.pk else None, ) - if s_val['type'] == 'JSON': + if s_val['type'] == APP_SETTING_TYPE_JSON: value = json.dumps(value) self.initial[s_field] = value @@ -567,7 +571,7 @@ def _validate_app_settings( s_field = '.'.join(['settings', p_name, s_key]) p_settings[s_key] = cleaned_data.get(s_field) - if s_val['type'] == 'JSON': + if s_val['type'] == APP_SETTING_TYPE_JSON: if not p_settings[s_key]: cleaned_data[s_field] = '{}' try: @@ -576,7 +580,7 @@ def _validate_app_settings( ) except json.JSONDecodeError as err: errors.append((s_field, 'Invalid JSON\n' + str(err))) - elif s_val['type'] == 'INTEGER': + elif s_val['type'] == APP_SETTING_TYPE_INTEGER: # Convert integers from select fields cleaned_data[s_field] = int(cleaned_data[s_field]) diff --git a/projectroles/models.py b/projectroles/models.py index f985418a..0f8b9c86 100644 --- a/projectroles/models.py +++ b/projectroles/models.py @@ -34,6 +34,10 @@ PROJECT_ROLE_GUEST = SODAR_CONSTANTS['PROJECT_ROLE_GUEST'] PROJECT_ROLE_FINDER = SODAR_CONSTANTS['PROJECT_ROLE_FINDER'] APP_SETTING_SCOPE_SITE = SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] AUTH_TYPE_LOCAL = SODAR_CONSTANTS['AUTH_TYPE_LOCAL'] AUTH_TYPE_LDAP = SODAR_CONSTANTS['AUTH_TYPE_LDAP'] AUTH_TYPE_OIDC = SODAR_CONSTANTS['AUTH_TYPE_OIDC'] @@ -47,12 +51,11 @@ PROJECT_ROLE_FINDER: 50, } PROJECT_TYPE_CHOICES = [('CATEGORY', 'Category'), ('PROJECT', 'Project')] -APP_SETTING_TYPES = ['BOOLEAN', 'INTEGER', 'STRING', 'JSON'] -APP_SETTING_TYPE_CHOICES = [ - ('BOOLEAN', 'Boolean'), - ('INTEGER', 'Integer'), - ('STRING', 'String'), - ('JSON', 'Json'), +APP_SETTING_TYPES = [ + APP_SETTING_TYPE_BOOLEAN, + APP_SETTING_TYPE_INTEGER, + APP_SETTING_TYPE_STRING, + APP_SETTING_TYPE_JSON, ] PROJECT_SEARCH_TYPES = ['project'] PROJECT_TAG_STARRED = 'STARRED' @@ -989,9 +992,9 @@ def __repr__(self): def save(self, *args, **kwargs): """Version of save() to convert 'value' data according to 'type'""" - if self.type == 'BOOLEAN': + if self.type == APP_SETTING_TYPE_BOOLEAN: self.value = str(int(self.value)) - elif self.type == 'INTEGER': + elif self.type == APP_SETTING_TYPE_INTEGER: self.value = str(self.value) super().save(*args, **kwargs) @@ -999,11 +1002,11 @@ def save(self, *args, **kwargs): def get_value(self): """Return value of the setting in the format specified in 'type'""" - if self.type == 'INTEGER': + if self.type == APP_SETTING_TYPE_INTEGER: return int(self.value) - elif self.type == 'BOOLEAN': + elif self.type == APP_SETTING_TYPE_BOOLEAN: return bool(int(self.value)) - elif self.type == 'JSON': + elif self.type == APP_SETTING_TYPE_JSON: return self.value_json return self.value diff --git a/projectroles/plugins.py b/projectroles/plugins.py index 9c450250..687edce1 100644 --- a/projectroles/plugins.py +++ b/projectroles/plugins.py @@ -255,7 +255,7 @@ class ProjectAppPluginPoint(PluginPoint): #: app_settings = { #: 'example_setting': { #: 'scope': 'PROJECT', # PROJECT/USER/SITE - #: 'type': 'STRING', # STRING/INTEGER/BOOLEAN + #: 'type': APP_SETTING_TYPE_STRING, # STRING/INTEGER/BOOLEAN #: 'default': 'example', #: 'label': 'Project setting', # Optional, defaults to name/key #: 'placeholder': 'Enter example setting here', # Optional @@ -536,7 +536,7 @@ class SiteAppPluginPoint(PluginPoint): #: app_settings = { #: 'example_setting': { #: 'scope' : 'USER', # always USER - #: 'type': 'STRING', # STRING/INTEGER/BOOLEAN + #: 'type': APP_SETTING_TYPE_STRING, # STRING/INTEGER/BOOLEAN #: 'default': 'example', #: 'placeholder': 'Enter example setting here', # Optional #: 'description': 'Example user setting', # Optional diff --git a/projectroles/remote_projects.py b/projectroles/remote_projects.py index 4f0dac21..924f1788 100644 --- a/projectroles/remote_projects.py +++ b/projectroles/remote_projects.py @@ -51,6 +51,10 @@ REMOTE_LEVEL_READ_INFO = SODAR_CONSTANTS['REMOTE_LEVEL_READ_INFO'] REMOTE_LEVEL_READ_ROLES = SODAR_CONSTANTS['REMOTE_LEVEL_READ_ROLES'] SYSTEM_USER_GROUP = SODAR_CONSTANTS['SYSTEM_USER_GROUP'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants APP_NAME = 'projectroles' @@ -1173,7 +1177,12 @@ def _sync_app_setting(self, uuid, set_data): return # Skip if value is identical if app_settings.compare_value( - obj, ad['value_json'] if obj.type == 'JSON' else ad['value'] + obj, + ( + ad['value_json'] + if obj.type == APP_SETTING_TYPE_JSON + else ad['value'] + ), ): logger.info( 'Skipping setting {}: value unchanged'.format(str(obj)) diff --git a/projectroles/tests/test_app_settings.py b/projectroles/tests/test_app_settings.py index 575bdc53..9c48eeb2 100644 --- a/projectroles/tests/test_app_settings.py +++ b/projectroles/tests/test_app_settings.py @@ -39,6 +39,10 @@ 'APP_SETTING_SCOPE_PROJECT_USER' ] APP_SETTING_SCOPE_SITE = SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants EXISTING_SETTING = 'project_bool_setting' @@ -48,7 +52,7 @@ APP_SETTINGS_TEST = { 'project_star': { 'scope': APP_SETTING_SCOPE_PROJECT_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'local': True, # Deprecated 'project_types': [PROJECT_TYPE_PROJECT, PROJECT_TYPE_CATEGORY], @@ -67,7 +71,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_str_setting', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'test', 'update_value': 'better test', 'non_valid_value': False, @@ -76,7 +80,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_int_setting', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'update_value': 170, 'non_valid_value': 'Nan', @@ -85,7 +89,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_str_setting_options', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'string1', 'options': ['string1', 'string2'], 'update_value': 'string2', @@ -95,7 +99,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_int_setting_options', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'options': [0, 1], 'update_value': 1, @@ -105,7 +109,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_bool_setting', - 'setting_type': 'BOOLEAN', + 'setting_type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'update_value': True, 'non_valid_value': 170, @@ -114,7 +118,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_json_setting', - 'setting_type': 'JSON', + 'setting_type': APP_SETTING_TYPE_JSON, 'value': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -128,7 +132,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_str_setting', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'test', 'update_value': 'better test', 'non_valid_value': False, @@ -137,7 +141,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_int_setting', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'update_value': 170, 'non_valid_value': 'Nan', @@ -146,7 +150,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_str_setting_options', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'string1', 'update_value': 'string2', 'options': ['string1', 'string2'], @@ -156,7 +160,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_int_setting_options', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'update_value': 1, 'options': [0, 1], @@ -166,7 +170,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_bool_setting', - 'setting_type': 'BOOLEAN', + 'setting_type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'update_value': True, 'non_valid_value': 170, @@ -175,7 +179,7 @@ def init_app_settings(self): 'plugin_name': EXAMPLE_APP_NAME, 'user': self.user, 'name': 'user_json_setting', - 'setting_type': 'JSON', + 'setting_type': APP_SETTING_TYPE_JSON, 'value': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -190,7 +194,7 @@ def init_app_settings(self): 'project': self.project, 'user': self.user, 'name': 'project_user_str_setting', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'test', 'update_value': 'better test', 'non_valid_value': False, @@ -200,7 +204,7 @@ def init_app_settings(self): 'project': self.project, 'user': self.user, 'name': 'project_user_int_setting', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'update_value': 170, 'non_valid_value': 'Nan', @@ -210,7 +214,7 @@ def init_app_settings(self): 'project': self.project, 'user': self.user, 'name': 'project_user_bool_setting', - 'setting_type': 'BOOLEAN', + 'setting_type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'update_value': True, 'non_valid_value': 170, @@ -220,7 +224,7 @@ def init_app_settings(self): 'project': self.project, 'user': self.user, 'name': 'project_user_json_setting', - 'setting_type': 'JSON', + 'setting_type': APP_SETTING_TYPE_JSON, 'value': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -253,8 +257,16 @@ def init_app_settings(self): 'plugin_name': s['plugin_name'], 'name': s['name'], 'setting_type': s['setting_type'], - 'value': s['value'] if s['setting_type'] != 'JSON' else '', - 'value_json': s['value'] if s['setting_type'] == 'JSON' else {}, + 'value': ( + s['value'] + if s['setting_type'] != APP_SETTING_TYPE_JSON + else '' + ), + 'value_json': ( + s['value'] + if s['setting_type'] == APP_SETTING_TYPE_JSON + else {} + ), } if 'project' in s: kwargs['project'] = s['project'] @@ -615,7 +627,7 @@ def test_validate_boolean(self): ), True, ) - if setting['setting_type'] == 'STRING': + if setting['setting_type'] == APP_SETTING_TYPE_STRING: continue with self.assertRaises(ValueError): app_settings.validate( @@ -626,11 +638,17 @@ def test_validate_boolean(self): def test_validate_int(self): """Test validate() with type INTEGER""" - self.assertEqual(app_settings.validate('INTEGER', 170, None), True) + self.assertEqual( + app_settings.validate(APP_SETTING_TYPE_INTEGER, 170, None), True + ) # NOTE: String is also OK if it corresponds to an int - self.assertEqual(app_settings.validate('INTEGER', '170', None), True) + self.assertEqual( + app_settings.validate(APP_SETTING_TYPE_INTEGER, '170', None), True + ) with self.assertRaises(ValueError): - app_settings.validate('INTEGER', 'not an integer', None) + app_settings.validate( + APP_SETTING_TYPE_INTEGER, 'not an integer', None + ) def test_validate_invalid(self): """Test validate() with invalid type""" @@ -642,7 +660,7 @@ def test_get_definition_plugin(self): app_plugin = get_app_plugin(EXAMPLE_APP_NAME) expected = { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string project setting', @@ -658,7 +676,7 @@ def test_get_definition_app_name(self): """Test get_definition() with app name""" expected = { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string project setting', @@ -674,7 +692,7 @@ def test_get_definition_user(self): """Test get_definition() with user setting""" expected = { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string user setting', @@ -705,7 +723,7 @@ def test_get_definitions_project(self): expected = { 'project_str_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string project setting', @@ -714,7 +732,7 @@ def test_get_definitions_project(self): }, 'project_int_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting', 'default': 0, 'description': 'Example integer project setting', @@ -724,7 +742,7 @@ def test_get_definitions_project(self): }, 'project_str_setting_options': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting with options', 'default': 'string1', 'options': ['string1', 'string2'], @@ -733,7 +751,7 @@ def test_get_definitions_project(self): }, 'project_int_setting_options': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting with options', 'default': 0, 'options': [0, 1], @@ -743,15 +761,15 @@ def test_get_definitions_project(self): }, 'project_bool_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Boolean setting', 'default': False, 'description': 'Example boolean project setting', 'user_modifiable': True, }, 'project_global_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Global boolean setting', 'default': False, 'description': 'Example global boolean project setting', @@ -760,7 +778,7 @@ def test_get_definitions_project(self): }, 'project_json_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'label': 'JSON setting', 'default': { 'Example': 'Value', @@ -773,7 +791,7 @@ def test_get_definitions_project(self): }, 'project_hidden_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'Hidden setting', 'default': '', 'description': 'Example hidden project setting', @@ -781,21 +799,21 @@ def test_get_definitions_project(self): }, 'project_hidden_json_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'label': 'Hidden JSON setting', 'description': 'Example hidden JSON project setting', 'user_modifiable': False, }, 'project_callable_setting': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable project setting', 'default': get_example_setting_default, 'description': 'Example callable project setting', }, 'project_callable_setting_options': { 'scope': APP_SETTING_SCOPE_PROJECT, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable setting with options', 'default': get_example_setting_default, 'options': get_example_setting_options, @@ -803,8 +821,8 @@ def test_get_definitions_project(self): 'user_modifiable': True, }, 'category_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Category boolean setting', 'default': False, 'description': 'Example boolean project category setting', @@ -822,7 +840,7 @@ def test_get_definitions_user(self): expected = { 'user_str_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting', 'default': '', 'description': 'Example string user setting', @@ -831,7 +849,7 @@ def test_get_definitions_user(self): }, 'user_int_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting', 'default': 0, 'description': 'Example integer user setting', @@ -841,7 +859,7 @@ def test_get_definitions_user(self): }, 'user_str_setting_options': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'String setting with options', 'default': 'string1', 'options': ['string1', 'string2'], @@ -850,7 +868,7 @@ def test_get_definitions_user(self): }, 'user_int_setting_options': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'label': 'Integer setting with options', 'default': 0, 'options': [0, 1], @@ -860,7 +878,7 @@ def test_get_definitions_user(self): }, 'user_bool_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Boolean setting', 'default': False, 'description': 'Example boolean user setting', @@ -868,7 +886,7 @@ def test_get_definitions_user(self): }, 'user_json_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'label': 'JSON setting', 'default': { 'Example': 'Value', @@ -881,21 +899,21 @@ def test_get_definitions_user(self): }, 'user_hidden_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'default': '', 'description': 'Example hidden user setting', 'user_modifiable': False, }, 'user_callable_setting': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable user setting', 'default': get_example_setting_default, 'description': 'Example callable user setting', }, 'user_callable_setting_options': { 'scope': APP_SETTING_SCOPE_USER, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'label': 'Callable setting with options', 'default': get_example_setting_default, 'options': get_example_setting_options, @@ -912,26 +930,26 @@ def test_get_definitions_project_user(self): """Test get_definitions() with PROJECT_USER scope""" expected = { 'project_user_str_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': '', 'description': 'Example string project user setting', }, 'project_user_int_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'INTEGER', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_INTEGER, 'default': 0, 'description': 'Example int project user setting', }, 'project_user_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'description': 'Example bool project user setting', }, 'project_user_json_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'JSON', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_JSON, 'default': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -940,14 +958,14 @@ def test_get_definitions_project_user(self): 'description': 'Example json project user setting', }, 'project_user_callable_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': get_example_setting_default, 'description': 'Example callable project user setting', }, 'project_user_callable_setting_options': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_PROJECT_USER'], - 'type': 'STRING', + 'scope': APP_SETTING_SCOPE_PROJECT_USER, + 'type': APP_SETTING_TYPE_STRING, 'default': get_example_setting_default, 'options': get_example_setting_options, 'description': 'Example callable project user setting with ' @@ -963,9 +981,9 @@ def test_get_definitions_site(self): """Test get_definitions() with SITE scope""" expected = { 'site_bool_setting': { - 'scope': SODAR_CONSTANTS['APP_SETTING_SCOPE_SITE'], + 'scope': APP_SETTING_SCOPE_SITE, 'label': 'Site boolean setting', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'description': 'Example boolean site setting', 'user_modifiable': True, diff --git a/projectroles/tests/test_commands.py b/projectroles/tests/test_commands.py index acf90166..e903cf4e 100644 --- a/projectroles/tests/test_commands.py +++ b/projectroles/tests/test_commands.py @@ -72,6 +72,10 @@ SITE_MODE_PEER = SODAR_CONSTANTS['SITE_MODE_PEER'] SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] SYSTEM_USER_GROUP = SODAR_CONSTANTS['SYSTEM_USER_GROUP'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants EXAMPLE_APP_NAME = 'example_project_app' @@ -709,7 +713,7 @@ def setUp(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_str_setting', - 'setting_type': 'STRING', + 'setting_type': APP_SETTING_TYPE_STRING, 'value': 'test', 'update_value': 'better test', 'non_valid_value': False, @@ -718,7 +722,7 @@ def setUp(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_int_setting', - 'setting_type': 'INTEGER', + 'setting_type': APP_SETTING_TYPE_INTEGER, 'value': 0, 'update_value': 170, 'non_valid_value': 'Nan', @@ -727,7 +731,7 @@ def setUp(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_bool_setting', - 'setting_type': 'BOOLEAN', + 'setting_type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'update_value': True, 'non_valid_value': 170, @@ -736,7 +740,7 @@ def setUp(self): 'plugin_name': EXAMPLE_APP_NAME, 'project': self.project, 'name': 'project_json_setting', - 'setting_type': 'JSON', + 'setting_type': APP_SETTING_TYPE_JSON, 'value': { 'Example': 'Value', 'list': [1, 2, 3, 4, 5], @@ -749,7 +753,7 @@ def setUp(self): 'plugin_name': 'projectroles', 'project': self.project, 'name': 'ip_restrict', - 'setting_type': 'BOOLEAN', + 'setting_type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'update_value': True, 'non_valid_value': 170, @@ -766,8 +770,16 @@ def setUp(self): plugin_name=s['plugin_name'], name=s['name'], setting_type=s['setting_type'], - value=s['value'] if s['setting_type'] != 'JSON' else '', - value_json=s['value'] if s['setting_type'] == 'JSON' else {}, + value=( + s['value'] + if s['setting_type'] != APP_SETTING_TYPE_JSON + else '' + ), + value_json=( + s['value'] + if s['setting_type'] == APP_SETTING_TYPE_JSON + else {} + ), project=s['project'], ) @@ -779,7 +791,7 @@ def test_command_undefined_project(self): self.make_setting( plugin_name=self.plugin.name, name='undefined', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) @@ -811,7 +823,7 @@ def test_command_undefined_user(self): self.make_setting( plugin_name=self.plugin.name, name='undefined', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, user=self.user_owner, ) @@ -824,7 +836,7 @@ def test_command_undefined_project_user(self): self.make_setting( plugin_name=self.plugin.name, name='undefined', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=self.user_owner, @@ -838,7 +850,7 @@ def test_command_invalid_project_type(self): self.make_setting( plugin_name=self.plugin.name, name='project_user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.category, ) @@ -873,7 +885,7 @@ def test_command_project_user_scope_no_role(self): self.make_setting( plugin_name=self.plugin.name, name='project_user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=user_new, @@ -908,7 +920,7 @@ def test_command_project_user_scope_role(self): self.make_setting( plugin_name=self.plugin.name, name='project_user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=user_new, @@ -923,21 +935,21 @@ def test_command_check(self): self.make_setting( plugin_name=self.plugin.name, name='undefined', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) self.make_setting( plugin_name=self.plugin.name, name='project_user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.category, ) self.make_setting( plugin_name=self.plugin.name, name='project_user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=user_new, diff --git a/projectroles/tests/test_models.py b/projectroles/tests/test_models.py index 71aaca58..032befdd 100644 --- a/projectroles/tests/test_models.py +++ b/projectroles/tests/test_models.py @@ -45,6 +45,10 @@ AUTH_TYPE_LDAP = SODAR_CONSTANTS['AUTH_TYPE_LDAP'] AUTH_TYPE_OIDC = SODAR_CONSTANTS['AUTH_TYPE_OIDC'] OIDC_USER_GROUP = SODAR_CONSTANTS['OIDC_USER_GROUP'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants SECRET = 'rsd886hi8276nypuvw066sbvv0rb2a6x' @@ -1129,7 +1133,7 @@ def setUp(self): self.setting_str = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='str_setting', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='test', project=self.project, ) @@ -1137,7 +1141,7 @@ def setUp(self): self.setting_int = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='int_setting', - setting_type='INTEGER', + setting_type=APP_SETTING_TYPE_INTEGER, value=170, project=self.project, ) @@ -1145,7 +1149,7 @@ def setUp(self): self.setting_bool = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) @@ -1153,7 +1157,7 @@ def setUp(self): self.setting_json = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='json_setting', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json={'Testing': 'good'}, project=self.project, @@ -1166,7 +1170,7 @@ def test_initialization(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': self.project.pk, 'name': 'str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'user': None, 'value': 'test', 'value_json': {}, @@ -1182,7 +1186,7 @@ def test_initialization_integer(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': self.project.pk, 'name': 'int_setting', - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'user': None, 'value': '170', 'value_json': {}, @@ -1198,7 +1202,7 @@ def test_initialization_json(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': self.project.pk, 'name': 'json_setting', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'user': None, 'value': None, 'value_json': {'Testing': 'good'}, @@ -1257,28 +1261,28 @@ def setUp(self): self.setting_str = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='str_setting', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='test', user=self.user, ) self.setting_int = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='int_setting', - setting_type='INTEGER', + setting_type=APP_SETTING_TYPE_INTEGER, value=170, user=self.user, ) self.setting_bool = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, user=self.user, ) self.setting_json = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='json_setting', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json={'Testing': 'good'}, user=self.user, @@ -1291,7 +1295,7 @@ def test_initialization(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': None, 'name': 'str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'user': self.user.pk, 'value': 'test', 'value_json': {}, @@ -1307,7 +1311,7 @@ def test_initialization_integer(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': None, 'name': 'int_setting', - 'type': 'INTEGER', + 'type': APP_SETTING_TYPE_INTEGER, 'user': self.user.pk, 'value': '170', 'value_json': {}, @@ -1323,7 +1327,7 @@ def test_initialization_json(self): 'app_plugin': get_app_plugin(EXAMPLE_APP_NAME).get_model().pk, 'project': None, 'name': 'json_setting', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'user': self.user.pk, 'value': None, 'value_json': {'Testing': 'good'}, diff --git a/projectroles/tests/test_permissions.py b/projectroles/tests/test_permissions.py index d64309ad..31180c1b 100644 --- a/projectroles/tests/test_permissions.py +++ b/projectroles/tests/test_permissions.py @@ -30,6 +30,10 @@ PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT'] SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants REMOTE_SITE_NAME = 'Test site' @@ -119,7 +123,7 @@ def setup_ip_allowing(self, ip_list): self.make_setting( plugin_name='projectroles', name='ip_restrict', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) @@ -127,7 +131,7 @@ def setup_ip_allowing(self, ip_list): self.make_setting( plugin_name='projectroles', name='ip_allowlist', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json=ip_list, project=self.project, diff --git a/projectroles/tests/test_remote_project_api.py b/projectroles/tests/test_remote_project_api.py index bf85126f..c0258f2e 100644 --- a/projectroles/tests/test_remote_project_api.py +++ b/projectroles/tests/test_remote_project_api.py @@ -54,6 +54,10 @@ REMOTE_LEVEL_READ_ROLES = SODAR_CONSTANTS['REMOTE_LEVEL_READ_ROLES'] REMOTE_LEVEL_REVOKED = SODAR_CONSTANTS['REMOTE_LEVEL_REVOKED'] SYSTEM_USER_GROUP = SODAR_CONSTANTS['SYSTEM_USER_GROUP'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants SOURCE_SITE_NAME = 'Test source site' @@ -460,14 +464,14 @@ def test_get_settings(self): set_ip_restrict = self.make_setting( plugin_name='projectroles', name='ip_restrict', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) set_ip_allowlist = self.make_setting( plugin_name='projectroles', name='ip_allowlist', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json=['127.0.0.1'], project=self.project, @@ -475,7 +479,7 @@ def test_get_settings(self): set_star = self.make_setting( plugin_name='projectroles', name='project_star', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=self.user_source, @@ -484,7 +488,7 @@ def test_get_settings(self): set_local = self.make_setting( plugin_name='projectroles', name='project_star', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=local_project, user=self.user_source, @@ -538,14 +542,14 @@ def test_get_settings_user(self): user_global_setting = self.make_setting( plugin_name='projectroles', name='notify_email_project', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=False, user=self.user_source, ) user_local_setting = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_str_setting', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='Local value', user=self.user_source, ) @@ -559,7 +563,7 @@ def test_get_settings_user(self): self.assertEqual(len(sync_data['app_settings']), 2) expected = { 'name': 'notify_email_project', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'app_plugin': None, @@ -574,7 +578,7 @@ def test_get_settings_user(self): ) expected = { 'name': 'user_str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': 'Local value', 'value_json': {}, 'app_plugin': EXAMPLE_APP_NAME, @@ -743,7 +747,7 @@ def setUp(self): 'app_settings': { SET_IP_RESTRICT_UUID: { 'name': 'ip_restrict', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'value_json': {}, 'app_plugin': None, # None is for 'projectroles' app @@ -753,7 +757,7 @@ def setUp(self): }, SET_IP_ALLOWLIST_UUID: { 'name': 'ip_allowlist', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'value': '', 'value_json': [], 'app_plugin': None, # None is for 'projectroles' app @@ -763,7 +767,7 @@ def setUp(self): }, SET_STAR_UUID: { 'name': 'project_star', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '1', 'value_json': {}, 'app_plugin': None, @@ -1057,7 +1061,7 @@ def test_create(self): # Assert app settings expected = { 'name': 'ip_restrict', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'project': project_obj.id, @@ -1068,7 +1072,7 @@ def test_create(self): self.assert_app_setting(SET_IP_RESTRICT_UUID, expected) expected = { 'name': 'ip_allowlist', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'value': '', 'value_json': [], 'project': project_obj.id, @@ -1079,7 +1083,7 @@ def test_create(self): self.assert_app_setting(SET_IP_ALLOWLIST_UUID, expected) expected = { 'name': 'project_star', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '1', 'value_json': {}, 'app_plugin': None, @@ -1501,7 +1505,7 @@ def test_create_settings_user(self): local_set_uuid = str(uuid.uuid4()) remote_data['app_settings'][global_set_uuid] = { 'name': 'notify_email_project', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'app_plugin': None, @@ -1512,7 +1516,7 @@ def test_create_settings_user(self): } remote_data['app_settings'][local_set_uuid] = { 'name': 'user_str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': 'Local value', 'value_json': {}, 'app_plugin': EXAMPLE_APP_NAME, @@ -1534,7 +1538,7 @@ def test_create_settings_user(self): 'app_plugin': None, 'project': None, 'name': 'notify_email_project', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'user': target_user.pk, 'value': '0', 'value_json': {}, @@ -1552,7 +1556,7 @@ def test_create_settings_user(self): 'app_plugin': app_plugin.pk, 'project': None, 'name': 'user_str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'user': target_user.pk, 'value': 'Local value', 'value_json': {}, @@ -1663,7 +1667,7 @@ def setUp(self): self.make_setting( plugin_name='projectroles', name='ip_restrict', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=False, project=self.project_obj, sodar_uuid=SET_IP_RESTRICT_UUID, @@ -1671,7 +1675,7 @@ def setUp(self): self.make_setting( plugin_name='projectroles', name='ip_allowlist', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json=[], project=self.project_obj, @@ -1680,7 +1684,7 @@ def setUp(self): self.make_setting( plugin_name='projectroles', name='project_star', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=False, project=self.project_obj, user=self.user_target, @@ -1874,7 +1878,7 @@ def test_update(self): # NOTE: Global app settings should not be updated expected = { 'name': 'ip_restrict', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '1', 'value_json': {}, 'project': self.project_obj.id, @@ -1885,7 +1889,7 @@ def test_update(self): self.assert_app_setting(SET_IP_RESTRICT_UUID, expected) expected = { 'name': 'ip_allowlist', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'value': '', 'value_json': ['192.168.1.1'], 'project': self.project_obj.id, @@ -1896,7 +1900,7 @@ def test_update(self): self.assert_app_setting(SET_IP_ALLOWLIST_UUID, expected) expected = { 'name': 'project_star', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'app_plugin': None, @@ -2039,7 +2043,7 @@ def test_update_settings_local(self): expected = { 'name': 'ip_restrict', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'project': self.project_obj.id, @@ -2050,7 +2054,7 @@ def test_update_settings_local(self): self.assert_app_setting(SET_IP_RESTRICT_UUID, expected) expected = { 'name': 'ip_allowlist', - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'value': None, 'value_json': [], 'project': self.project_obj.id, @@ -2061,7 +2065,7 @@ def test_update_settings_local(self): self.assert_app_setting(SET_IP_ALLOWLIST_UUID, expected) expected = { 'name': 'project_star', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'app_plugin': None, @@ -2088,7 +2092,7 @@ def test_update_settings_no_app(self): # Change projectroles app settings remote_data['app_settings'][setting_uuid] = { 'name': setting_name, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': False, 'value_json': {}, 'app_plugin': 'NOT_A_VALID_APP', @@ -2106,14 +2110,14 @@ def test_update_settings_user(self): target_global_setting = self.make_setting( plugin_name='projectroles', name='notify_email_project', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, user=self.user_target, ) target_local_setting = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_str_setting', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='Target value', user=self.user_target, ) @@ -2124,7 +2128,7 @@ def test_update_settings_user(self): local_set_uuid = str(uuid.uuid4()) remote_data['app_settings'][global_set_uuid] = { 'name': 'notify_email_project', - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'value': '0', 'value_json': {}, 'app_plugin': None, @@ -2135,7 +2139,7 @@ def test_update_settings_user(self): } remote_data['app_settings'][local_set_uuid] = { 'name': 'user_str_setting', - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': 'Source value', 'value_json': {}, 'app_plugin': EXAMPLE_APP_NAME, diff --git a/projectroles/tests/test_views.py b/projectroles/tests/test_views.py index ea408b28..29f5bb91 100644 --- a/projectroles/tests/test_views.py +++ b/projectroles/tests/test_views.py @@ -105,6 +105,10 @@ APP_SETTING_SCOPE_PROJECT_USER = SODAR_CONSTANTS[ 'APP_SETTING_SCOPE_PROJECT_USER' ] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants APP_NAME = 'projectroles' @@ -137,26 +141,26 @@ APP_SETTINGS_TEST = { 'test_setting': { - 'scope': APP_SETTING_SCOPE_PROJECT, # PROJECT/USER - 'type': 'BOOLEAN', # STRING/INTEGER/BOOLEAN + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, - 'label': 'Test setting', # Optional, defaults to name/key - 'description': 'Test setting', # Optional - 'user_modifiable': True, # Optional, show/hide in forms + 'label': 'Test setting', + 'description': 'Test setting', + 'user_modifiable': True, 'global': True, }, 'test_setting_local': { - 'scope': APP_SETTING_SCOPE_PROJECT, # PROJECT/USER - 'type': 'BOOLEAN', # STRING/INTEGER/BOOLEAN + 'scope': APP_SETTING_SCOPE_PROJECT, + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, - 'label': 'Test setting', # Optional, defaults to name/key - 'description': 'Test setting', # Optional - 'user_modifiable': True, # Optional, show/hide in forms + 'label': 'Test setting', + 'description': 'Test setting', + 'user_modifiable': True, 'global': False, }, 'project_star': { # NOTE: We have to include this for view tests 'scope': APP_SETTING_SCOPE_PROJECT_USER, - 'type': 'BOOLEAN', + 'type': APP_SETTING_TYPE_BOOLEAN, 'default': False, 'global': True, }, diff --git a/projectroles/tests/test_views_api.py b/projectroles/tests/test_views_api.py index faebfcfc..daa486d6 100644 --- a/projectroles/tests/test_views_api.py +++ b/projectroles/tests/test_views_api.py @@ -65,6 +65,10 @@ PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT'] SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants CORE_API_MEDIA_TYPE_LEGACY = 'application/vnd.bihealth.sodar-core+json' @@ -2722,7 +2726,7 @@ def test_get_project(self): 'project': str(self.project.sodar_uuid), 'user': None, 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': self.project_str_setting['value'], 'user_modifiable': True, } @@ -2748,7 +2752,7 @@ def test_get_project_unset(self): 'project': str(self.project.sodar_uuid), 'user': None, 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': default_value, 'user_modifiable': True, } @@ -2772,7 +2776,7 @@ def test_get_project_user(self): 'project': str(self.project.sodar_uuid), 'user': self.get_serialized_user(self.user), 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': self.project_user_str_setting['value'], 'user_modifiable': True, } @@ -2803,7 +2807,7 @@ def test_get_project_user_unset(self): 'project': str(self.project.sodar_uuid), 'user': self.get_serialized_user(self.user), 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': default_value, 'user_modifiable': True, } @@ -2830,7 +2834,7 @@ def test_get_json(self): 'project': str(self.project.sodar_uuid), 'user': None, 'name': setting_name, - 'type': 'JSON', + 'type': APP_SETTING_TYPE_JSON, 'value': self.project_json_setting['value'], 'user_modifiable': True, } @@ -2848,7 +2852,7 @@ def test_get_non_modifiable(self): 'project': str(self.project.sodar_uuid), 'user': None, 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': '', 'user_modifiable': False, } @@ -3062,7 +3066,7 @@ def test_get(self): 'project': None, 'user': self.get_serialized_user(self.user), 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': self.user_str_setting['value'], 'user_modifiable': True, } @@ -3087,7 +3091,7 @@ def test_get_unset(self): 'project': None, 'user': self.get_serialized_user(self.user), 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': default_value, 'user_modifiable': True, } @@ -3106,7 +3110,7 @@ def test_get_non_modifiable(self): 'project': None, 'user': self.get_serialized_user(self.user), 'name': setting_name, - 'type': 'STRING', + 'type': APP_SETTING_TYPE_STRING, 'value': '', 'user_modifiable': False, } @@ -3449,7 +3453,7 @@ def test_get_legacy_version(self): set_star = self.make_setting( plugin_name='projectroles', name='project_star', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, user=self.user, @@ -3510,7 +3514,7 @@ def _setup_ip_allowing(self, ip_list, role_suffix): self.make_setting( plugin_name='projectroles', name='ip_restrict', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, project=self.project, ) @@ -3518,7 +3522,7 @@ def _setup_ip_allowing(self, ip_list, role_suffix): self.make_setting( plugin_name='projectroles', name='ip_allowlist', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json=ip_list, project=self.project, diff --git a/projectroles/views.py b/projectroles/views.py index ce065eb7..1fdbee3e 100644 --- a/projectroles/views.py +++ b/projectroles/views.py @@ -86,6 +86,7 @@ APP_SETTING_SCOPE_PROJECT_USER = SODAR_CONSTANTS[ 'APP_SETTING_SCOPE_PROJECT_USER' ] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] PROJECT_ACTION_CREATE = SODAR_CONSTANTS['PROJECT_ACTION_CREATE'] PROJECT_ACTION_UPDATE = SODAR_CONSTANTS['PROJECT_ACTION_UPDATE'] @@ -988,7 +989,7 @@ def _get_app_settings(data, instance, user): continue if s_data is None and not instance: s_data = app_settings.get_default(name, s_key) - if s_val['type'] == 'JSON': + if s_val['type'] == APP_SETTING_TYPE_JSON: if s_data is None: s_data = {} project_settings[s_name] = json.dumps(s_data) @@ -1038,7 +1039,7 @@ def _get_project_update_data( s_name = k.split('.')[2] s_def = app_settings.get_definition(s_name, plugin_name=p_name) old_v = app_settings.get(p_name, s_name, project) - if s_def['type'] == 'JSON': + if s_def['type'] == APP_SETTING_TYPE_JSON: v = json.loads(v) if old_v != v: extra_data[k] = v @@ -1142,7 +1143,7 @@ def _create_timeline_event( p_name = k.split('.')[1] s_name = k.split('.')[2] s_def = app_settings.get_definition(s_name, plugin_name=p_name) - if s_def['type'] == 'JSON': + if s_def['type'] == APP_SETTING_TYPE_JSON: v = json.loads(v) extra_data[k] = v diff --git a/userprofile/forms.py b/userprofile/forms.py index 6b3be21a..83039c0b 100644 --- a/userprofile/forms.py +++ b/userprofile/forms.py @@ -28,6 +28,10 @@ SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE'] SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] APP_SETTING_SCOPE_USER = SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] class UserSettingsForm(SODARForm): @@ -76,26 +80,26 @@ def _set_app_setting_field(self, plugin_name, s_field, s_key, s_val): choices=[ ( (int(option), int(option)) - if s_val['type'] == 'INTEGER' + if s_val['type'] == APP_SETTING_TYPE_INTEGER else (option, option) ) for option in s_val['options'] ], **setting_kwargs, ) - elif s_val['type'] == 'STRING': + elif s_val['type'] == APP_SETTING_TYPE_STRING: self.fields[s_field] = forms.CharField( widget=forms.TextInput(attrs=s_widget_attrs), **setting_kwargs, ) - elif s_val['type'] == 'INTEGER': + elif s_val['type'] == APP_SETTING_TYPE_INTEGER: self.fields[s_field] = forms.IntegerField( widget=forms.NumberInput(attrs=s_widget_attrs), **setting_kwargs, ) - elif s_val['type'] == 'BOOLEAN': + elif s_val['type'] == APP_SETTING_TYPE_BOOLEAN: self.fields[s_field] = forms.BooleanField(**setting_kwargs) - elif s_val['type'] == 'JSON': + elif s_val['type'] == APP_SETTING_TYPE_JSON: # NOTE: Attrs MUST be supplied here (#404) if 'class' in s_widget_attrs: s_widget_attrs['class'] += ' sodar-json-input' @@ -111,7 +115,7 @@ def _set_app_setting_field(self, plugin_name, s_field, s_key, s_val): value = app_settings.get( plugin_name=plugin_name, setting_name=s_key, user=self.user ) - if s_val['type'] == 'JSON': + if s_val['type'] == APP_SETTING_TYPE_JSON: value = json.dumps(value) self.initial[s_field] = value @@ -162,7 +166,7 @@ def clean(self): s_field = '.'.join(['settings', p_name, s_key]) p_settings[s_key] = self.cleaned_data.get(s_field) - if s_val['type'] == 'JSON': + if s_val['type'] == APP_SETTING_TYPE_JSON: if not self.cleaned_data.get(s_field): self.cleaned_data[s_field] = '{}' try: @@ -171,7 +175,7 @@ def clean(self): ) except json.JSONDecodeError as err: self.add_error(s_field, 'Invalid JSON\n' + str(err)) - elif s_val['type'] == 'INTEGER': + elif s_val['type'] == APP_SETTING_TYPE_INTEGER: # Convert integers from select fields self.cleaned_data[s_field] = int(self.cleaned_data[s_field]) diff --git a/userprofile/plugins.py b/userprofile/plugins.py index 96080b4c..a43dc2d0 100644 --- a/userprofile/plugins.py +++ b/userprofile/plugins.py @@ -1,9 +1,15 @@ # Projectroles dependency +from projectroles.models import SODAR_CONSTANTS from projectroles.plugins import SiteAppPluginPoint from userprofile.urls import urlpatterns +# SODAR constants +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_SCOPE_USER = SODAR_CONSTANTS['APP_SETTING_SCOPE_USER'] + + class SiteAppPlugin(SiteAppPluginPoint): """Projectroles plugin for registering the app""" @@ -30,8 +36,8 @@ class SiteAppPlugin(SiteAppPluginPoint): app_settings = { 'enable_project_uuid_copy': { - 'scope': 'USER', - 'type': 'BOOLEAN', + 'scope': APP_SETTING_SCOPE_USER, + 'type': APP_SETTING_TYPE_BOOLEAN, 'label': 'Display project UUID copying link', 'default': False, 'user_modifiable': True, diff --git a/userprofile/tests/test_views.py b/userprofile/tests/test_views.py index 4ec1e532..b5bdb1ac 100644 --- a/userprofile/tests/test_views.py +++ b/userprofile/tests/test_views.py @@ -40,6 +40,10 @@ # SODAR constants SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET'] +APP_SETTING_TYPE_BOOLEAN = SODAR_CONSTANTS['APP_SETTING_TYPE_BOOLEAN'] +APP_SETTING_TYPE_INTEGER = SODAR_CONSTANTS['APP_SETTING_TYPE_INTEGER'] +APP_SETTING_TYPE_JSON = SODAR_CONSTANTS['APP_SETTING_TYPE_JSON'] +APP_SETTING_TYPE_STRING = SODAR_CONSTANTS['APP_SETTING_TYPE_STRING'] # Local constants INVALID_VALUE = 'INVALID VALUE' @@ -96,7 +100,7 @@ def setUp(self): self.setting_str = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_str_setting', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='test', user=self.user, ) @@ -104,7 +108,7 @@ def setUp(self): self.setting_int = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_int_setting', - setting_type='INTEGER', + setting_type=APP_SETTING_TYPE_INTEGER, value=170, user=self.user, ) @@ -112,7 +116,7 @@ def setUp(self): self.setting_str_options = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_str_setting_options', - setting_type='STRING', + setting_type=APP_SETTING_TYPE_STRING, value='string1', user=self.user, ) @@ -120,7 +124,7 @@ def setUp(self): self.setting_int_options = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_int_setting_options', - setting_type='INTEGER', + setting_type=APP_SETTING_TYPE_INTEGER, value=0, user=self.user, ) @@ -128,7 +132,7 @@ def setUp(self): self.setting_bool = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_bool_setting', - setting_type='BOOLEAN', + setting_type=APP_SETTING_TYPE_BOOLEAN, value=True, user=self.user, ) @@ -136,7 +140,7 @@ def setUp(self): self.setting_json = self.make_setting( plugin_name=EXAMPLE_APP_NAME, name='user_json_setting', - setting_type='JSON', + setting_type=APP_SETTING_TYPE_JSON, value=None, value_json={'Test': 'More'}, user=self.user,