Handle changing MappingList options
authorSimo Sorce <simo@redhat.com>
Sun, 22 Feb 2015 20:14:44 +0000 (15:14 -0500)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Tue, 24 Feb 2015 15:58:25 +0000 (16:58 +0100)
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>
ipsilon/admin/common.py

index 4e92d1f..fd20077 100644 (file)
@@ -127,6 +127,85 @@ class AdminPluginConfig(AdminPage):
             value = None
         return value
 
             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()
     @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
                                                         **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
 
                 else:
                     continue