From 7c8c85e435bd056c42dedf6939f0d262645eb710 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 24 Apr 2020 09:50:26 -0400 Subject: [PATCH] Add all() method to UserConfig --- netbox/users/models.py | 8 ++++++++ netbox/users/tests/test_models.py | 14 ++++++++++++++ netbox/utilities/utils.py | 18 ++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/netbox/users/models.py b/netbox/users/models.py index d401ad68e..c83de3f90 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -9,6 +9,8 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.utils import timezone +from utilities.utils import flatten_dict + __all__ = ( 'Token', @@ -54,6 +56,12 @@ class UserConfig(models.Model): return d + def all(self): + """ + Return a dictionary of all defined keys and their values. + """ + return flatten_dict(self.data) + def set(self, path, value, commit=False): """ Define or overwrite a configuration parameter. Example: diff --git a/netbox/users/tests/test_models.py b/netbox/users/tests/test_models.py index a6d0916ac..ec1a00326 100644 --- a/netbox/users/tests/test_models.py +++ b/netbox/users/tests/test_models.py @@ -45,6 +45,20 @@ class UserConfigTest(TestCase): self.assertIsNone(userconfig.get('b.foo.invalid')) self.assertIsNone(userconfig.get('b.foo.x.invalid')) + def test_all(self): + userconfig = self.userconfig + flattened_data = { + 'a': True, + 'b.foo': 101, + 'b.bar': 102, + 'c.foo.x': 201, + 'c.bar.y': 202, + 'c.baz.z': 203, + } + + # Retrieve a flattened dictionary containing all config data + self.assertEqual(userconfig.all(), flattened_data) + def test_set(self): userconfig = self.userconfig diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 446622118..351b1fd68 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -239,3 +239,21 @@ def shallow_compare_dict(source_dict, destination_dict, exclude=None): difference[key] = destination_dict[key] return difference + + +def flatten_dict(d, prefix='', separator='.'): + """ + Flatten netsted dictionaries into a single level by joining key names with a separator. + + :param d: The dictionary to be flattened + :param prefix: Initial prefix (if any) + :param separator: The character to use when concatenating key names + """ + ret = {} + for k, v in d.items(): + key = separator.join([prefix, k]) if prefix else k + if type(v) is dict: + ret.update(flatten_dict(v, prefix=key)) + else: + ret[key] = v + return ret