Skip to content

Commit

Permalink
add AppSettingAPI.is_set() (#1450), fix #1452
Browse files Browse the repository at this point in the history
  • Loading branch information
mikkonie committed Jul 15, 2024
1 parent 7539714 commit 99e4ef3
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ Added
- ``UserDropdownContentAjaxView`` for user dropdown content retrieval (#1366, #1392)
- ``SODARUser.get_auth_type()`` helper (#1367)
- ``ProjectInvite.is_ldap()`` helper (#1367)
- ``AppSettingAPI.is_set()`` helper (#1450)
- **Timeline**
- ``sodar_uuid`` field in ``TimelineEventObjectRef`` model (#1415)
- REST API views (#1350)
Expand Down Expand Up @@ -122,6 +123,7 @@ Fixed
- ``RemoteSite.get_access_date()`` invalid date sorting (#1437)
- OpenAPI ``generateschema`` compatibility (#1440, #1442)
- ``ProjectCreateView`` allows ``POST`` with disabled target project creation (#1448)
- Plugin existence not explicitly checked in ``AppSettingAPI.set()`` update query (#1452)
- **Sodarcache**
- REST API set view ``app_name`` incorrectly set (#1405)
- **Timeline**
Expand Down
1 change: 1 addition & 0 deletions docs/source/major_changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Release Highlights
- Add checkusers management command
- Add Ajax views for sidebar, project dropdown and user dropdown retrieval
- Add CC and BCC field support in sending generic emails
- Add is_set() helper in AppSettingAPI
- Rewrite sodarcache REST API views
- Rewrite user additional email storing
- Rename AppSettingAPI "app_name" arguments to "plugin_name"
Expand Down
25 changes: 25 additions & 0 deletions projectroles/app_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,8 @@ def set(
q_kwargs = {'name': setting_name, 'project': project, 'user': user}
if not plugin_name == 'projectroles':
q_kwargs['app_plugin__name'] = plugin_name
else:
q_kwargs['app_plugin'] = None
setting = AppSetting.objects.get(**q_kwargs)
if cls._compare_value(setting, value):
return False
Expand Down Expand Up @@ -644,6 +646,29 @@ def set(
)
return True

@classmethod
def is_set(cls, plugin_name, setting_name, project=None, user=None):
"""
Return True if the setting has been set, instead of retrieving the
default value from the definition.
NOTE: Also returns True if the current set value equals the default.
:param plugin_name: App plugin name (string, equals "name" in plugin)
:param setting_name: Setting name (string)
:param project: Project object (optional)
:param user: User object (optional)
:return: Boolean
"""
s_def = cls.get_definition(name=setting_name, plugin_name=plugin_name)
cls._check_project_and_user(s_def.get('scope', None), project, user)
q_kwargs = {'name': setting_name, 'project': project, 'user': user}
if not plugin_name == 'projectroles':
q_kwargs['app_plugin__name'] = plugin_name
else:
q_kwargs['app_plugin'] = None
return AppSetting.objects.filter(**q_kwargs).exists()

@classmethod
def delete(cls, plugin_name, setting_name, project=None, user=None):
"""
Expand Down
71 changes: 71 additions & 0 deletions projectroles/tests/test_app_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,77 @@ def test_get_with_post_safe(self):
)
self.assertEqual(type(val), str)

def test_is_set_no_object(self):
"""Test is_set() with no setting object set"""
n = 'project_star'
kw = {'project': self.project, 'user': self.user}
self.assertFalse(
AppSetting.objects.filter(app_plugin=None, name=n, **kw).exists()
)
self.assertFalse(
app_settings.is_set(
plugin_name='projectroles', setting_name=n, **kw
)
)

def test_is_set_object_exists(self):
"""Test is_set() with existing setting object"""
n = 'project_star'
kw = {'project': self.project, 'user': self.user}
app_settings.set(
plugin_name='projectroles', setting_name=n, value=True, **kw
)
self.assertTrue(
AppSetting.objects.filter(app_plugin=None, name=n, **kw).exists()
)
self.assertTrue(
app_settings.is_set(
plugin_name='projectroles', setting_name=n, **kw
)
)

def test_is_set_default_value(self):
"""Test is_set() with existing setting object and default value"""
n = 'project_star'
kw = {'project': self.project, 'user': self.user}
app_settings.set(
plugin_name='projectroles', setting_name=n, value=False, **kw
)
self.assertTrue(
AppSetting.objects.filter(app_plugin=None, name=n, **kw).exists()
)
self.assertTrue(
app_settings.is_set(
plugin_name='projectroles', setting_name=n, **kw
)
)

def test_is_set_plugin(self):
"""Test is_set() with plugin setting"""
n = 'project_str_setting'
kw = {'project': self.project}
# NOTE: Already created in setUp()
self.assertTrue(
AppSetting.objects.filter(
app_plugin__name=EXAMPLE_APP_NAME, name=n, **kw
).exists()
)
self.assertTrue(
app_settings.is_set(
plugin_name=EXAMPLE_APP_NAME, setting_name=n, **kw
)
)

def test_is_set_invalid_user(self):
"""Test is_set() with invalid user arg"""
with self.assertRaises(ValueError):
app_settings.is_set(
plugin_name='projectroles',
setting_name='project_star',
project=self.project,
user=None,
)

def test_set(self):
"""Test set()"""
for setting in self.settings:
Expand Down

0 comments on commit 99e4ef3

Please sign in to comment.