Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/lib/communication.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/lib/communication.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/lib/communication.py	(working copy)
@@ -274,7 +274,9 @@
 # following is added by zhangjw, for avx using
 def call_restapi(method, url, params, ip, restapi_port, restapi_username, restapi_password, proto='http', cookie='',
                  save_cookie=False):
-    authorization = 'Basic %s' % (('%s:%s' % (restapi_username, restapi_password)).encode('base64').replace('\n', ''))
+    user_pass = f"{restapi_username}:{restapi_password}"
+    b64_bytes = base64.b64encode(user_pass.encode("utf-8"))
+    authorization = 'Basic ' + b64_bytes.decode('ascii')
     if not check_ipv4(ip):
         ip = "[%s]" % ip
     buffer = io.BytesIO()
@@ -298,16 +300,19 @@
         curl.perform()
         status = curl.getinfo(pycurl.RESPONSE_CODE)
         if status == 200:
-            cookie = buffer.getvalue().split("Set-Cookie: ")[1].split("\r\n")[0]
+            resp = buffer.getvalue()
+            # careful: buffer is bytes, so decode before split if needed
+            resp_str = resp.decode('utf-8', errors='replace')
+            cookie = resp_str.split("Set-Cookie: ")[1].split("\r\n")[0]
             data = {
                 'status': status,
-                'body': buffer.getvalue().split("\r\n\r\n")[1],
+                'body': resp_str.split("\r\n\r\n")[1],
                 'cookie': cookie,
             }
         else:
             data = {
                 'status': status,
-                'body': buffer.getvalue(),
+                'body': buffer.getvalue().decode('utf-8', errors='replace'),
             }
         curl.close()
         return data
@@ -325,7 +330,7 @@
         curl.perform()
         data = {
             'status': curl.getinfo(pycurl.RESPONSE_CODE),
-            'body': buffer.getvalue(),
+            'body': buffer.getvalue().decode('utf-8', errors='replace'),
         }
         curl.close()
         return data
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py	(working copy)
@@ -3,6 +3,9 @@
 import re
 import time
 import uuid
+import json
+import hashlib
+import os
 
 import elasticsearch
 from apscheduler.schedulers.background import BackgroundScheduler
@@ -23,7 +26,20 @@
 from hive.model.loading import get_model
 from hive.model.query import mark_expire_all
 from hive.utils import get_device_type, standard_model_type
+from hive.model.action import Action
+from hive.model.base import ANModel
+from hive.model.fields.builtin import (BooleanField, Uint64Field, StorableField, IntegerField, IPAddressField,
+                                       CLITextField, TextField, EnumField, AssoField2, CharField, PortField, GroupField,
+                                       PasswordField)
+from hive.model.manager import QueryingGroups, UpdatingFields, CLIManager
+from hive.model.fields import FieldGroup, BASIC, STATS
+from hive.model.legacycli import (RegexParser, cli_parse, CLICmdError, BlankParser, MATCHONE, EasyParser, MATCHALL,
+                                  CLICmdInfo)
+from djproject.an_settings import (ADC_TYPE_LIST, DEVICE_STD_LIST, VPN_TYPE_LIST, WAF_TYPE_LIST,
+                                   DEFAULT_CONFIG_FILE_PATH, DEFAULT_VSITE_PATH)
+from hive.exceptions import ModelQueryException
 
+
 __ = _
 
 
@@ -1007,10 +1023,10 @@
             delete_sql = "DELETE FROM device WHERE id = " + "'%s'" % data['id']
             db.execute_sql(delete_sql)
 
-            L.remove_lock(data['ip'].values()[0])
+            L.remove_lock(list(data['ip'].values())[0])
 
             # delete from file_list, delete device item and backup item
-            delete_sql = "DELETE FROM file_list WHERE modify_time= '%s'" % data['name']
+            delete_sql = "DELETE FROM file_list WHERE name= '%s'" % data['name']
             db.execute_sql(delete_sql)
 
             # remove the backup config file
@@ -1043,7 +1059,7 @@
                 os.remove(file_path)
 
             # remove all device template key-value by device ip
-            delete_all_tmpkey(data['ip'].values()[0])
+            delete_all_tmpkey(list(data['ip'].values())[0])
 
             """
             for item in result:
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device_group/__init__.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device_group/__init__.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device_group/__init__.py	(working copy)
@@ -3,14 +3,23 @@
 from django.db.models.query import QuerySet
 from django.utils.translation import gettext_lazy as _
 
+import os
+import re
+import json
+import time
+
 from cm.lib.communication import L
 from cm.lib.postgres_db import DB
-from hive.imports.model import *
-from hive.model.base import *
-from hive.model.fields.builtin import *
-from hive.model.action import Action
-from hive.model.fields import *
+from hive.model.base import ANModel
+from hive.model.fields.builtin import CharField, AssoField2
+from hive.model.action import Action
+from hive.model.fields import FieldGroup, BASIC
 from hive.model.manager import CLIManager
+from hive.exceptions import ModelQueryException
+from hive.model.legacycli import CLICmdError, cli_parse, RegexParser, MATCHONE
+from hive.model.query import mark_expire_all
+from hive.model.loading import get_model
+from djproject.an_settings import DEFAULT_CONFIG_FILE_PATH, VPN_TYPE_LIST, DEFAULT_VSITE_PATH, ADC_TYPE_LIST, WAF_TYPE_LIST
 
 __ = _
 
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_frontend.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_frontend.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_frontend.py	(working copy)
@@ -314,7 +314,7 @@
                 name2 = '.'.join(name_list)
         name_list_copy = name_list[:]
         widget = """<uib-tabset type="pills" justified="true">"""
-        for key, f in field.fields.iteritems():
+        for key, f in field.fields.items():
             if f.type_name in ['ipaddr', 'UnionField', 'GroupField']:
                 default = {}
             else:
\ No newline at end of file
@@ -353,7 +353,7 @@
     elif field.type_name == 'GroupField': 
         name_list_copy = name_list[:]
         widget = """"""
-        for key, f in field.fields.iteritems():
+        for key, f in field.fields.items():
             name_list = name_list_copy[:]
             name_list.append(field.name)
             if f.type_name in ['ipaddr', 'UnionField', 'GroupField']:
\ No newline at end of file
@@ -769,7 +769,7 @@
         for action in model_node.model._meta.actions:
             for field in action.option_fields:
                 if field.type_name in ['ipaddr', 'UnionField']:
-                    for f_name, f in field.fields.iteritems():
+                    for f_name, f in field.fields.items():
                         data[field.name] = {
                             f_name: f.get_default(None)
                         }
\ No newline at end of file
@@ -902,7 +902,7 @@
             else:
                 basic_fields.append(field)
             if field.type_name in ['ipaddr', 'UnionField']:
-                for f_name, f in field.fields.iteritems():
+                for f_name, f in field.fields.items():
                     data[field.name] = {
                         f_name: f.get_default(None)
                     }
\ No newline at end of file
@@ -974,7 +974,7 @@
                             data3 = {}
                             for field in action.option_fields:
                                 if field.type_name in ['ipaddr', 'UnionField']:
-                                    for f_name, f in field.fields.iteritems():
+                                    for f_name, f in field.fields.items():
                                         data3[field.name] = {
                                             f_name: f.get_default(None)
                                         }
\ No newline at end of file
@@ -1135,7 +1135,7 @@
             for action in field_grp_actions:
                 for field in action.option_fields:
                     if field.type_name in ['ipaddr', 'UnionField']:
-                        for f_name, f in field.fields.iteritems():
+                        for f_name, f in field.fields.items():
                             data[field.name] = {
                                 f_name: f.get_default(None)
                             }
\ No newline at end of file
@@ -1496,7 +1496,7 @@
                             else:
                                 d_basic_fields.append(field)
                             if d_f.type_name in ['ipaddr', 'UnionField']:
-                                for f_name, f in d_f.fields.iteritems():
+                                for f_name, f in d_f.fields.items():
                                     data[d_f.name] = {
                                         f_name: f.get_default(None)
                                     }
\ No newline at end of file
@@ -1704,7 +1704,7 @@
                                 elif f.visible_in_add():
                                     fields_for_adding.append(f)
                                     if f.type_name in ['ipaddr', 'UnionField']:
-                                        for sub_f_name, sub_f in f.fields.iteritems():
+                                        for sub_f_name, sub_f in f.fields.items():
                                             data[f.name] = {
                                                 sub_f_name: sub_f.get_default(None)
                                             }
\ No newline at end of file
@@ -1744,7 +1744,7 @@
                                     for ch_field in child_field_group.fields:
                                         if ch_field.visible_in_add():
                                             if ch_field.type_name in ['ipaddr', 'UnionField']:
-                                                for f_name, f in ch_field.fields.iteritems():
+                                                for f_name, f in ch_field.fields.items():
                                                     data2[ch_field.name] = {
                                                         f_name: f.get_default(None)
                                                     }
\ No newline at end of file
@@ -2091,7 +2091,7 @@
                     if field.visible_in_add():
                         fields_for_adding.append(field)
                         if field.type_name in ['ipaddr', 'UnionField']:
-                            for f_name, f in field.fields.iteritems():
+                            for f_name, f in field.fields.items():
                                 data[field.name] = {
                                     f_name: f.get_default(None)
                                 }
\ No newline at end of file
@@ -2137,7 +2137,7 @@
                         for ch_field in child_field_group.fields:
                             if ch_field.visible_in_add():
                                 if ch_field.type_name in ['ipaddr', 'UnionField']:
-                                    for f_name, f in ch_field.fields.iteritems():
+                                    for f_name, f in ch_field.fields.items():
                                         data2[ch_field.name] = {
                                             f_name: f.get_default(None)
                                         }
\ No newline at end of file
@@ -2549,7 +2549,7 @@
             data3 = {}
             for field in action.option_fields:
                 if field.type_name in ['ipaddr', 'UnionField']:
-                    for f_name, f in field.fields.iteritems():
+                    for f_name, f in field.fields.items():
                         data3[field.name] = {
                             f_name: f.get_default(None)
                         }
\ No newline at end of file
@@ -2819,7 +2819,7 @@
                 elif f.visible_in_add():
                     fields_for_adding.append(f)
                     if f.type_name in ['ipaddr', 'UnionField']:
-                        for sub_f_name, sub_f in f.fields.iteritems():
+                        for sub_f_name, sub_f in f.fields.items():
                             data[f.name] = {
                                 sub_f_name: sub_f.get_default(None)
                             }
\ No newline at end of file
@@ -2866,7 +2866,7 @@
                     for ch_field in child_field_group.fields:
                         if ch_field.visible_in_add():
                             if ch_field.type_name in ['ipaddr', 'UnionField']:
-                                for f_name, f in ch_field.fields.iteritems():
+                                for f_name, f in ch_field.fields.items():
                                     data2[ch_field.name] = {
                                         f_name: f.get_default(None)
                                     }
\ No newline at end of file
@@ -3210,7 +3210,7 @@
             else:
                 basic_fields.append(field)
             if field.type_name in ['ipaddr', 'UnionField']:
-                for f_name, f in field.fields.iteritems():
+                for f_name, f in field.fields.items():
                     data[field.name] = {
                         f_name: f.get_default(None)
                     }
\ No newline at end of file
@@ -3286,7 +3286,7 @@
                             data3 = {}
                             for field in action.option_fields:
                                 if field.type_name in ['ipaddr', 'UnionField']:
-                                    for f_name, f in field.fields.iteritems():
+                                    for f_name, f in field.fields.items():
                                         data3[field.name] = {
                                             f_name: f.get_default(None)
                                         }
\ No newline at end of file
@@ -3456,7 +3456,7 @@
             for action in field_grp_actions:
                 for field in action.option_fields:
                     if field.type_name in ['ipaddr', 'UnionField']:
-                        for f_name, f in field.fields.iteritems():
+                        for f_name, f in field.fields.items():
                             data[field.name] = {
                                 f_name: f.get_default(None)
                             }
\ No newline at end of file
@@ -3907,7 +3907,7 @@
                             else:
                                 d_basic_fields.append(field)
                             if d_f.type_name in ['ipaddr', 'UnionField']:
-                                for f_name, f in d_f.fields.iteritems():
+                                for f_name, f in d_f.fields.items():
                                     data[d_f.name] = {
                                         f_name: f.get_default(None)
                                     }
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_interface.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_interface.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gen_interface.py	(working copy)
@@ -94,24 +94,24 @@
             if '.'.join(path_list) not in ['admintools', 'ha.healthcheck', 'ha.synconfig', 'ha.units', 'lb.gslb.dps', 'lb.gslb.fulldns', 'lb.gslb.monitor', 'lb.gslb.snmp', 'lb.gslb.statistics', 'network.ippool', 'network.ipv6', 'network.ndp', 'network.tcp', 'proxy', 'routing.ipregion', 'routing.static', 'lb.slb.policy', 'nat.portfwd', 'network.arp']:
                 gen_str = '\napv.' + '.'.join(path_list) + " = new Object();\n"
                 self.filehandler_mod_apv_libustat_pre_js.write(gen_str)
-        for key, val in pkg.models.iteritems():
+        for key, val in pkg.models.items():
             if not self.check_model(val):
                 continue
             self.load_model(val)
               
         sub_pkg = pkg.sub_packages
         
-        for sn, s in sub_pkg.iteritems():
+        for sn, s in sub_pkg.items():
             self.load_package(s)
 
     def generate_enum_type(self, pkg):
-        for key, val in pkg.models.iteritems():
+        for key, val in pkg.models.items():
             if not self.check_model(val):
                 continue
             self.generate_enum_type_detail(val)
         sub_pkg = pkg.sub_packages
 
-        for sn, s in sub_pkg.iteritems():
+        for sn, s in sub_pkg.items():
             self.generate_enum_type(s)
 
     def load_model(self, model):
@@ -596,7 +596,7 @@
                             key_list[each_field.fields.get_attname()] = each_field.verbose_name
             cols = [OrderedDict([("name", "_origin_id"), ("verbose_name", "Origin"), ("type", "static")])]
             widgets = []
-            for fieldname, verbose_name in key_list.iteritems():
+            for fieldname, verbose_name in key_list.items():
                 cols.append(OrderedDict([("name", fieldname), ("verbose_name", verbose_name), ("type", "static")]))
                 widget = OrderedDict()
                 widget["name"] = fieldname
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/engineer.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/engineer.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/engineer.py	(working copy)
@@ -272,7 +272,7 @@
 
 def get_cache_list(request):
     result = []
-    for key, instance in manager_cache._cache_dict.iteritems():
+    for key, instance in manager_cache._cache_dict.items():
         data = {
             'key': str(key),
             'value': []
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/exceptions.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/exceptions.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/exceptions.py	(working copy)
@@ -26,7 +26,7 @@
         """
         if isinstance(message, dict):
             self.message_dict = copy.copy(message)
-            for key, value in self.message_dict.iteritems():
+            for key, value in self.message_dict.items():
                 self.message_dict[key] = ', '.join(value)
             # Reduce each list of messages into a single list.
             message = reduce(operator.add, message.values())
@@ -45,7 +45,7 @@
         # AttributeError: ValidationError instance has no attribute 'args'
         # See http://www.python.org/doc/current/tut/node10.html#handling
         if hasattr(self, 'message_dict'):
-            return '<br />'.join(['%s - %s' % (key, value) for key, value in self.message_dict.iteritems()])
+            return '<br />'.join(['%s - %s' % (key, value) for key, value in self.message_dict.items()])
         return '<br />'.join(self.messages)
 
     def __repr__(self):
@@ -98,7 +98,7 @@
         # AttributeError: ValidationError instance has no attribute 'args'
         # See http://www.python.org/doc/current/tut/node10.html#handling
         if hasattr(self, 'message_dict'):
-            return '<br />'.join(['%s - %s' % (key, value) for key, value in self.message_dict.iteritems()])
+            return '<br />'.join(['%s - %s' % (key, value) for key, value in self.message_dict.items()])
         return '<br />'.join(self.messages)
 
     def __repr__(self):
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/ajax.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/ajax.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/ajax.py	(working copy)
@@ -129,7 +129,7 @@
         # Check and process the filter
         # format of the filter should be {<field_name>:<value>, ...}
         def determine(instance, filters):
-            for field_name, value in filters.iteritems():
+            for field_name, value in filters.items():
                 if getattr(instance, field_name) != value:
                     return False
             return True
@@ -185,7 +185,11 @@
 
     def delete(self, **kwargs):
         try:
-            pk_str_list = kwargs['pk'].split('ÿÿÿÿÿ')
+            pk_value = kwargs['pk']
+            andebug('an.model.cli', f'pk_value: {pk_value}')
+            if isinstance(pk_value, list):
+                pk_value = pk_value[0]
+            pk_str_list = pk_value.split('ÿÿÿÿÿ')
             pk_list = [json.loads(pk_str) for pk_str in pk_str_list]
             if len(pk_list) == 1:
                 # first try to get the instance, so we can get the real instance model.
@@ -196,7 +200,7 @@
                 send_notification('info', '%d %s are deleted.' % (len(pk_list), self.model._meta.verbose_name))
             return self.manager.delete(pk_list)
         except KeyError as e:
-            return json.dumps([True, [['warning', 'Instance not found in system: ' + e.message]]])
+            return json.dumps([True, [['warning', 'Instance not found in system: ' + str(e)]]])
         except ModelQueryException as e:
             if e.has_error():
                 return json.dumps([False, str(e)])
@@ -393,7 +397,7 @@
             initial_filter = url2obj(kwargs["initial_filter"])
             has_init_filter = True
 
-        for key, value in initial_filter.iteritems():
+        for key, value in initial_filter.items():
             filter_dict[key] = value
 
         search_dict["search_fields"] = field_list
@@ -546,7 +550,7 @@
 
     def stat_fields(self, **kwargs):
         rtn = []
-        for group_name, field_group in self.model._meta.field_groups.iteritems():
+        for group_name, field_group in self.model._meta.field_groups.items():
             if field_group.isstats:
                 for field in field_group.fields:
                     if field.type_name == 'StorableField':
@@ -692,7 +696,7 @@
             raise Http404('no initial_filter provided')
 
         initial_filter = url2obj(initial_filter)
-        for key, value in initial_filter.iteritems():
+        for key, value in initial_filter.items():
             filter_dict[key] = value
 
         qs = self.manager.filter(filter_dict)
@@ -731,7 +735,7 @@
         qs_list = []
         flag_list = False
         initial_filter = url2obj(initial_filter)
-        for key, value in initial_filter.iteritems():
+        for key, value in initial_filter.items():
             if type(value) == list:
                 flag_list = True
                 for item in value:
@@ -830,7 +834,7 @@
         # if pk is not None
         if pk:
             # decode pk's each value from url encoding
-            for key, value in pk.iteritems():
+            for key, value in pk.items():
                 pk[key] = url2obj(value)
 
         # pk is None when it's a profile Model's object
@@ -1009,7 +1013,7 @@
             json_str = kwargs['post_data']
             json_dict = json.loads(json_str)
             old_value_dict = dict(self.object.get_field_dict(withstats=False))
-            for key, value in json_dict.iteritems():
+            for key, value in json_dict.items():
                 setattr(self.object, key, value)
         except KeyError:
             raise Http404
@@ -1017,7 +1021,7 @@
             self.object.clean_fields()
         except ValidationError as e:
             # roll back
-            for key, value in old_value_dict.iteritems():
+            for key, value in old_value_dict.items():
                 setattr(self.object, key, value)
             return json.dumps([False, str(e)])
         try:
@@ -1062,7 +1066,7 @@
 
     def stat_fields(self, **kwargs):
         rtn = []
-        for group_name, field_group in self.model._meta.field_groups.iteritems():
+        for group_name, field_group in self.model._meta.field_groups.items():
             if field_group.isstats:
                 for field in field_group.fields:
                     if field.type_name == 'StorableField':
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/fields/builtin.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/fields/builtin.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/fields/builtin.py	(working copy)
@@ -749,7 +749,7 @@
         # XXX should specially implement for UnionField
         # all fields should have the same unit_names
         try:
-            first_field = self.fields.itervalues().next()
+            first_field = self.fields.values().next()
             if hasattr(first_field, 'unit_name'):
                 return first_field.unit_name
             else:
@@ -763,7 +763,7 @@
         # XXX should specially implement for UnionField
         # all fields should have the same value_limit
         try:
-            first_field = self.fields.itervalues().next()
+            first_field = self.fields.values().next()
             if hasattr(first_field, 'value_limit'):
                 return first_field.value_limit
             else:
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/loading_bac.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/loading_bac.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/loading_bac.py	(working copy)
@@ -189,7 +189,7 @@
                 app_list = [self.app_models.get(app_label, {})
                             for app_label in self.app_labels.iterkeys()]
             else:
-                app_list = self.app_models.itervalues()
+                app_list = self.app_models.values()
         model_list = []
         for app in app_list:
             model_list.extend(
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/manager.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/manager.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/manager.py	(working copy)
@@ -1042,7 +1042,7 @@
         for ins in ins_list:
             if search:
                 no_found = True
-            for k, v in sh.iteritems():
+            for k, v in sh.items():
                 if k == '-' and ins.repr().find(v) > -1:
                     no_found = False
                 elif str(getattr(ins, k, '')).find(v) > -1:
@@ -1245,7 +1245,7 @@
         data = QuerySet(self._model)
         if not self._model._meta.children:
             raise ValueError("this is not a virtual class")
-        for key, val in self._model._meta.children.iteritems():
+        for key, val in self._model._meta.children.items():
             child_manager = key.get_manager(self._session)
             sub_data = None
             if hasattr(child_manager, '_shared_parsing'):
@@ -1266,7 +1266,7 @@
             # then loop all children and gather the results
             if not self._model._meta.children:
                 raise ValueError("this is not a virtual class")
-            for key, val in self._model._meta.children.iteritems():
+            for key, val in self._model._meta.children.items():
                 if check_expire_all(key, config=True):
                     child_manager = key.get_manager(self._session)
                     sub_data = None
@@ -1287,7 +1287,7 @@
         # using the ugly slow way
         data = QuerySet(self._model)
         if self._model._meta.children:
-            for key, val in self._model._meta.children.iteritems():
+            for key, val in self._model._meta.children.items():
                 child_manager = key.get_manager(self._session)
                 andebug('hive.debug', 'Using a child manager %s' % child_manager)
                 try:
@@ -1334,7 +1334,7 @@
         data = QuerySet(self._model)
         if self._model._meta.children:
             # if this is a virtual parent class, use children's manager
-            for key, val in self._model._meta.children.iteritems():
+            for key, val in self._model._meta.children.items():
                 child_manager = key.get_manager(self._session)
                 andebug('hive.debug', 'Using a child manager %s' % child_manager)
                 try:
@@ -1348,7 +1348,7 @@
         else:
             # get query sets from the shelf file
             if self._model._meta.children:
-                for key, val in self._model._meta.children.iteritems():
+                for key, val in self._model._meta.children.items():
                     child_manager = key.get_manager(self._session)
                     sub_data = child_manager.all()
                     if sub_data:
@@ -1427,7 +1427,7 @@
             assert type(pk) is dict
             if self._model._meta.children:
                 found_in_children = False
-                for sub_model, val in self._model._meta.children.iteritems():
+                for sub_model, val in self._model._meta.children.items():
                     sub_manager = sub_model.get_manager(self._session)
                     try:
                         sub_manager.delete([pk])
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/query.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/query.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/query.py	(working copy)
@@ -49,7 +49,7 @@
     def filter(self, filter_dict):
         def determine(instance, filters):
             if filters:
-                for field_name, value in filter_dict.iteritems():
+                for field_name, value in filter_dict.items():
                     field = instance._meta.get_field(field_name)
                     compare_left = getattr(instance, field_name)
                     try:
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/rest.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/rest.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/rest.py	(working copy)
@@ -96,7 +96,7 @@
             rtn['meta'] = {'abstract': self.model._meta.abstract, 'verbose_name': self.model._meta.verbose_name}
             # get field groups
             rtn['fieldgroups'] = []
-            for group_name, field_group in self.model._meta.field_groups.iteritems():
+            for group_name, field_group in self.model._meta.field_groups.items():
                 field_list = []
                 for field in field_group.fields:
                     field_list.append({'field_name': field.name, 'verbose_name': str(field.verbose_name)})
@@ -104,7 +104,7 @@
             # get subclasses
             if self.model._meta.children:
                 rtn['subclasses'] = []
-                for key, val in self.model._meta.children.iteritems():
+                for key, val in self.model._meta.children.items():
                     child_class_name = key.__name__
                     child_verbose_name = key._meta.verbose_name
                     rtn['subclasses'].append({'class_name': child_class_name, 'verbose_name': child_verbose_name})
@@ -465,7 +465,7 @@
                     update_dict[self.attribute] = instance_list
                     try:
                         old_value_dict = dict(self.object.get_field_dict(withstats=False))
-                        for key, value in update_dict.iteritems():
+                        for key, value in update_dict.items():
                             setattr(self.object, key, value)
                     except KeyError as e:
                         msg = {'msg': str(_('No such field: %s.')) % str(e)}
@@ -552,7 +552,7 @@
 
         try:
             old_value_dict = dict(self.object.get_field_dict(withstats=False))
-            for key, value in update_dict.iteritems():
+            for key, value in update_dict.items():
                 f = self.concrete_model._meta.get_field(key)
                 if f.editable:
                     setattr(self.object, key, value)
@@ -683,7 +683,7 @@
 
                     try:
                         old_value_dict = dict(self.object.get_field_dict(withstats=False))
-                        for key, value in update_dict.iteritems():
+                        for key, value in update_dict.items():
                             setattr(self.object, key, value)
                     except KeyError as e:
                         msg = {'msg': str(_('No such field: %s.')) % str(e)}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/utils.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/utils.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/model/utils.py	(working copy)
@@ -84,7 +84,7 @@
             for r in input_data:
                 vd = field.fields.value_to_num(val=r.get('value'))
                 i = 0
-                for n, v in vd.iteritems():
+                for n, v in vd.items():
                     data[i].append([time.strftime(TIMEFORMAT, time.localtime(r.get('time'))), v])
                     i += 1
         else:
@@ -121,7 +121,7 @@
             for r in input_data:
                 vd = field.fields.value_to_num(val=r.get('value'))
                 i = 0
-                for n, v in vd.iteritems():
+                for n, v in vd.items():
                     if preval[i] == 'NoPre':
                         preval[i] = v
                     data[i].append(
@@ -277,7 +277,7 @@
         del val_item['_asso_idx']
 
     if recursive:
-        for each_key, each_value in val_item.iteritems():
+        for each_key, each_value in val_item.items():
             if type(each_value) is list:  # this might be value of an AssoField
                 reduce_asso_value(each_value, recursive)
     return val_item
@@ -292,7 +292,7 @@
 def get_ajax_url_by_pk(model, pk_dict, action, param_dict=None):
     param_str = ''
     if param_dict:
-        param_str = '&'.join([str(key) + '=' + str(value) for key, value in param_dict.iteritems()])
+        param_str = '&'.join([str(key) + '=' + str(value) for key, value in param_dict.items()])
         if param_str != '':
             param_str = '?' + param_str
 
@@ -331,7 +331,7 @@
                     new_field_name = '-'.join(field_name_list[current_field_idx + 1:])
                     sub_ret = get_complex_field(target_instance, new_field_name, target_manager, value_type)
                     if sub_ret:
-                        for k, v in sub_ret.iteritems():
+                        for k, v in sub_ret.items():
                             if k in ret:
                                 ret[k] = smart_str(ret[k]) + ', ' + smart_str(v)
                                 ret[k] = smart_str(ret[k]) + ', ' + smart_str(v)
@@ -382,7 +382,7 @@
 
     def fun_search(value, search_dict, filter_dict):
         if filter_dict:
-            for field_name, field_value in filter_dict.iteritems():
+            for field_name, field_value in filter_dict.items():
                 if field_name in value:
                     compare_left = value[field_name + '__ori__']
                 else:
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/node/__init__.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/node/__init__.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/node/__init__.py	(working copy)
@@ -196,10 +196,10 @@
                             new_node._licensed = True
             else:
                 new_node = BaseNode(parent=parent_node, name=name, **new_params)
-            for key, value in sub_nodes.iteritems():
+            for key, value in sub_nodes.items():
                 load_one_node(new_node, key, value)
 
-        for key, value in tree_dict.iteritems():
+        for key, value in tree_dict.items():
             load_one_node(self, key, value)
 
     def get_node_by_path(self, path):
@@ -237,7 +237,7 @@
     def url(self):
         url = '#'
         # return the URL of first child that has page
-        for key, child in self.children.iteritems():
+        for key, child in self.children.items():
             if child.has_page():
                 url = child.url
                 break
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py	(working copy)
@@ -1279,7 +1279,7 @@
         field_list = []
         non_compo_asso_list = []
         composition_asso_model_list = []
-        for key, value in d.iteritems():
+        for key, value in d.items():
             field = model._meta.get_field(key)
             if value == 'CONDITIONAL_NONE':
                 setattr(instance, key, CONDITIONAL_NONE)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/session.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/session.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/session.py	(working copy)
@@ -138,7 +138,7 @@
 
     def reload_document(self):
         self._clear_eng_doc_cache()
-        for name, app in get_apps().iteritems():
+        for name, app in get_apps().items():
             app.reload_document()
 
 
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/utils.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/utils.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/utils.py	(working copy)
@@ -8,6 +8,8 @@
 import urllib
 import uuid
 from collections import OrderedDict
+import json
+import os
 
 from jinja2 import Environment
 
@@ -19,7 +21,7 @@
 import queue
 import time
 import hashlib
-from djproject.an_settings import *
+from djproject.an_settings import VPN_TYPE_LIST, ADC_TYPE_LIST, WAF_TYPE_LIST, DEVICE_STD_LIST, DEVICE_TYPE_LIST
 
 
 def get_current_request():
@@ -461,7 +463,7 @@
 
 
 def dict_combine(orig_dict, new_dict):
-    return dict(orig_dict.items() + new_dict.items())
+    return dict(list(orig_dict.items()) + list(new_dict.items()))
 
 
 def dict_reduce(orig_dict, keys):
@@ -506,9 +508,9 @@
 def convert_keys_to_string(data):
     if isinstance(data, str):
         return str(data)
-    elif isinstance(data, collections.abc.Mapping):  # FIXED HERE
-        return dict(map(convert_keys_to_string, data.items()))  # FIXED .iteritems() to .items()
-    elif isinstance(data, collections.abc.Iterable):  # FIXED HERE
+    elif isinstance(data, collections.abc.Mapping):
+        return dict(map(convert_keys_to_string, data.items()))
+    elif isinstance(data, collections.abc.Iterable):
         return type(data)(map(convert_keys_to_string, data))
     else:
         return data
@@ -644,11 +646,11 @@
     tzmap = [OrderedDict(sorted([
         ('GMT', {'parent': None, 'type': 'item'}),
     ])), OrderedDict([]), OrderedDict([])]
-    for continent_name, continent in tzmap_orig.iteritems():
+    for continent_name, continent in tzmap_orig.items():
         tzmap[0][continent_name] = {'parent': None, 'type': 'menu'}  # no other info for now
-        for country_name, country in continent.iteritems():
+        for country_name, country in continent.items():
             tzmap[1][country_name] = {'parent': continent_name, 'type': 'menu'}
-            for zone_name, zone in country.iteritems():
+            for zone_name, zone in country.items():
                 tzmap[2][zone_name] = {'parent': country_name, 'type': 'item'}
     _tzmap_cache = tzmap
     return tzmap
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/__init__.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/__init__.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/__init__.py	(working copy)
@@ -20,7 +20,7 @@
     @property
     def to_json(self):
         ret = {}
-        for k, v in self.__dict__.iteritems():
+        for k, v in self.__dict__.items():
             if isinstance(v, (str, int, float, bool, dict)):
                 ret[k] = v
         ret['id'] = self.id
@@ -46,7 +46,7 @@
     @property
     def to_json(self):
         ret = {}
-        for k, v in self.__dict__.iteritems():
+        for k, v in self.__dict__.items():
             if isinstance(v, (str, int, float, bool, dict, list)):
                 ret[k] = v
             elif k == 'help_text':
@@ -69,7 +69,7 @@
     @property
     def to_json(self):
         ret = {}
-        for k, v in self.__dict__.iteritems():
+        for k, v in self.__dict__.items():
             if isinstance(v, (str, int, float, bool)):
                 ret[k] = v
         ret['id'] = self.id
@@ -87,7 +87,7 @@
     @property
     def to_json(self):
         ret = {}
-        for k, v in self.__dict__.iteritems():
+        for k, v in self.__dict__.items():
             if isinstance(v, (str, int, float, bool, dict)):
                 ret[k] = v
         ret['id'] = self.id
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/form.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/form.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/form.py	(working copy)
@@ -109,7 +109,7 @@
 
     def __init__(self, name=None, label='', help_text='', value=None, editable=True, **kwargs):
         super(AssoBox, self).__init__(name, label, help_text, value=value, editable=editable)
-        for param_name, param_value in kwargs.iteritems():
+        for param_name, param_value in kwargs.items():
             setattr(self, param_name, param_value)
 
 
@@ -118,7 +118,7 @@
 
     def __init__(self, name=None, label='', help_text='', value=None, editable=True, **kwargs):
         super(AssoListBox, self).__init__(name, label, help_text, value=value, editable=editable)
-        for param_name, param_value in kwargs.iteritems():
+        for param_name, param_value in kwargs.items():
             setattr(self, param_name, param_value)
 
 
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/statistics.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/statistics.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/widgets/statistics.py	(working copy)
@@ -15,5 +15,5 @@
         self.options_json = json.dumps(options_json)
         self.unit_name = unit_name
         self.error = error
-        for param_name, param_value in kwargs.iteritems():
+        for param_name, param_value in kwargs.items():
             setattr(self, param_name, param_value)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/yaml/representer.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/yaml/representer.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/yaml/representer.py	(working copy)
@@ -9,6 +9,7 @@
 import datetime
 
 import copyreg, types
+import base64
 
 class RepresenterError(YAMLError):
     pass
@@ -164,7 +165,7 @@
                 data = str(data, 'utf-8')
                 tag = u'tag:yaml.org,2002:str'
             except UnicodeDecodeError:
-                data = data.encode('base64')
+                data = base64.b64encode(data.encode("utf-8"))
                 tag = u'tag:yaml.org,2002:binary'
                 style = '|'
         return self.represent_scalar(tag, data, style=style)
@@ -306,7 +307,7 @@
                 data = str(data, 'utf-8')
                 tag = u'tag:yaml.org,2002:python/str'
             except UnicodeDecodeError:
-                data = data.encode('base64')
+                data = base64.b64encode(data.encode("utf-8"))
                 tag = u'tag:yaml.org,2002:binary'
                 style = '|'
         return self.represent_scalar(tag, data, style=style)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/storemon.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/storemon.py	(revision 2667)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/storemon.py	(working copy)
@@ -121,11 +121,11 @@
                 self.model_ctrl_dict[model_name] = True
 
     def load_pkg(self, pkg):
-        for key, val in pkg.models.iteritems():
+        for key, val in pkg.models.items():
             self.load_model(val)
 
         sub_pkg = pkg.sub_packages
-        for sn, s in sub_pkg.iteritems():
+        for sn, s in sub_pkg.items():
             self.load_pkg(s)
 
     def load_schema(self, pkg=None):
@@ -272,12 +272,12 @@
         self.lock_count = self.lock_count + 1
         self.log_error(LOG_LEVEL.ENGINEER, "LOCK SUCCESSFULLY lock count is " + str(self.lock_count))
 
-        for id_time, trav_data in self.trav_dict.iteritems():
+        for id_time, trav_data in self.trav_dict.items():
             if self.trav_count >= MAX_FILES_COUNT:
                 break
             if new_time - trav_data['last_up_time'] >= int(id_time):
                 trav_data['last_up_time'] = new_time
-                for model_name, fields_list in trav_data.iteritems():
+                for model_name, fields_list in trav_data.items():
                     if self.trav_count >= MAX_FILES_COUNT:
                         break
                     if model_name == 'last_up_time':
@@ -364,16 +364,16 @@
                     if id_time in self.init_rrd_file_check:
                         self.init_rrd_file_check.remove(id_time)
                 if id_time in self.to_del_files_dict:
-                    for model_name, data in self.to_del_files_dict[id_time].iteritems():
+                    for model_name, data in self.to_del_files_dict[id_time].items():
                         if model_name in new_file_list:
-                            for pk, file_list in self.to_del_files_dict[id_time][model_name].iteritems():
+                            for pk, file_list in self.to_del_files_dict[id_time][model_name].items():
                                 if pk not in new_file_list[model_name]:
                                     for file in file_list:
                                         os.remove(file)
                                         self.file_list[file] = False
                                         self.file_num -= 1
                         else:
-                            for pk, file_list in self.to_del_files_dict[id_time][model_name].iteritems():
+                            for pk, file_list in self.to_del_files_dict[id_time][model_name].items():
                                 for file in file_list:
                                     os.remove(file)
                                     self.file_list[file] = False
