diff options
author | Simo Sorce <simo@redhat.com> | 2015-02-22 15:14:44 -0500 |
---|---|---|
committer | Patrick Uiterwijk <puiterwijk@redhat.com> | 2015-02-24 16:58:25 +0100 |
commit | 48541ed04194c8eaa194ba323b8baf0eb5f074ad (patch) | |
tree | b4aa220b8c94b0f3c964194cd5b3b56f94edfa38 /ipsilon/admin/common.py | |
parent | 689ee7ae67f466ae8b73a9def7c64455ff945a0b (diff) | |
download | ipsilon-48541ed04194c8eaa194ba323b8baf0eb5f074ad.tar.gz ipsilon-48541ed04194c8eaa194ba323b8baf0eb5f074ad.tar.xz ipsilon-48541ed04194c8eaa194ba323b8baf0eb5f074ad.zip |
Handle changing MappingList options
Add admin function to handle getting a MappingList object in
form of key/value pair fields.
Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
Diffstat (limited to 'ipsilon/admin/common.py')
-rw-r--r-- | ipsilon/admin/common.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/ipsilon/admin/common.py b/ipsilon/admin/common.py index 4e92d1f..fd20077 100644 --- a/ipsilon/admin/common.py +++ b/ipsilon/admin/common.py @@ -127,6 +127,85 @@ class AdminPluginConfig(AdminPage): value = None return value + def get_mapping_list_value(self, name, old_value, **kwargs): + delete = list() + change = dict() + for key, val in kwargs.iteritems(): + if not key.startswith(name): + continue + n = key[len(name):] + if len(n) == 0 or n[0] != ' ': + continue + try: + index, field = n[1:].split('-') + except ValueError: + continue + if field == 'delete': + delete.append(int(index)) + else: + i = int(index) + if i not in change: + change[i] = dict() + change[i][field] = val + + if len(delete) == 0 and len(change) == 0: + return None + + value = old_value + + # remove unwanted changes + for i in delete: + if i in change: + del change[i] + + # perform requested changes + for index, fields in change.iteritems(): + for k in 'from', 'to': + if k in fields: + val = fields[k] + val_list = val.split('/') + stripped = list() + for v in val_list: + stripped.append(v.strip()) + if len(stripped) == 1: + stripped = stripped[0] + if len(value) <= index: + value.extend([None]*(index + 1 - len(value))) + if value[index] is None: + value[index] = [None, None] + if k == 'from': + i = 0 + else: + i = 1 + value[index][i] = stripped + + # eliminate incomplete/incorrect entries + if value[index] is not None: + if ((len(value[index]) != 2 or + value[index][0] is None or + len(value[index][0]) == 0 or + value[index][1] is None or + len(value[index][1]) == 0)): + value[index] = None + + # the previous loop may add 'None' entries + # if any still exists mark them to be deleted + for i in xrange(0, len(value)): + if value[i] is None: + delete.append(i) + + # remove duplicates and set in reverse order + delete = list(set(delete)) + delete.sort(reverse=True) + + for i in delete: + if len(value) > i: + del value[i] + + if len(value) == 0: + value = None + return value + @admin_protect def GET(self, *args, **kwargs): return self.root_with_msg() @@ -167,6 +246,12 @@ class AdminPluginConfig(AdminPage): **kwargs) if value is None: continue + elif type(option) is pconfig.MappingList: + value = self.get_mapping_list_value(name, + option.get_value(), + **kwargs) + if value is None: + continue else: continue |