summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2015-02-22 15:14:44 -0500
committerPatrick Uiterwijk <puiterwijk@redhat.com>2015-02-24 16:58:25 +0100
commit48541ed04194c8eaa194ba323b8baf0eb5f074ad (patch)
treeb4aa220b8c94b0f3c964194cd5b3b56f94edfa38
parent689ee7ae67f466ae8b73a9def7c64455ff945a0b (diff)
downloadipsilon-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>
-rw-r--r--ipsilon/admin/common.py85
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