summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2015-02-22 15:14:44 -0500
committerSimo Sorce <simo@redhat.com>2015-02-24 10:24:44 -0500
commit8caec93106103fd604c4f70530f119a5be04c9ca (patch)
treef8027f9de6a08b36e4c53f3cc9f63c7e65eb263d
parent9309f2e568d33c0901d093f1afecc59c0b8aebc4 (diff)
downloadipsilon-8caec93106103fd604c4f70530f119a5be04c9ca.tar.gz
ipsilon-8caec93106103fd604c4f70530f119a5be04c9ca.tar.xz
ipsilon-8caec93106103fd604c4f70530f119a5be04c9ca.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>
-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