Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/lib/postgres_db.py
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/lib/postgres_db.py	(revision 2567)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/lib/postgres_db.py	(working copy)
@@ -139,6 +139,7 @@
                             ALTER TABLE device ADD COLUMN IF NOT EXISTS enable_password varchar(32) DEFAULT NULL;
                             ALTER TABLE device ADD COLUMN IF NOT EXISTS create_time varchar(40) DEFAULT (now());
                             ALTER TABLE device ADD COLUMN IF NOT EXISTS protocol varchar(16) DEFAULT 'restapi';
+                            ALTER TABLE device ALTER COLUMN license_key TYPE varchar(256);
         '''
         self.execute_sql(create_table_sql)
 
@@ -203,7 +204,7 @@
     def create_table_config_template(self):
         print('Creating table config_template...')
         create_table_sql = ''' CREATE TABLE IF NOT EXISTS config_template(
-                                key varchar(128) primary key, 
+                                key varchar(128) primary key,
                                 default_value varchar(128) NOT NULL,
                                 description varchar(256)
                         );
@@ -293,7 +294,7 @@
         print('Creating table file_list...')
         # when type is backup or device , use 'modify_time' to save device name.
         create_table_sql = ''' CREATE TABLE IF NOT EXISTS file_list(
-                            name varchar(128) primary key, 
+                            name varchar(128) primary key,
                             create_time varchar(64) NOT NULL,
                             modify_time varchar(64) DEFAULT NULL,
                             type varchar(32) NOT NULL,
@@ -319,7 +320,7 @@
         create_table_sql = '''CREATE TABLE IF NOT EXISTS proxy_cm (
                               name varchar(32) NOT NULL,
                               ip varchar(64) NOT NULL,
-                               PRIMARY KEY (name), 
+                               PRIMARY KEY (name),
                                extend jsonb
                             )'''
         self.execute_sql(create_table_sql)
@@ -336,7 +337,7 @@
 
     def create_table_cm_role(self):
         print('Creating table role...')
-        create_table_sql = ''' 
+        create_table_sql = '''
                                 CREATE TABLE IF NOT EXISTS cm_role (
                                     name varchar(64) primary key,
                                     description varchar(32) NOT NULL,
@@ -367,12 +368,12 @@
 
     def create_table_cm_vpn_resource(self):
         print('Creating table vpn resource...')
-        create_table_sql = ''' 
+        create_table_sql = '''
                               CREATE TABLE IF NOT EXISTS cm_vpn_resource (
                                   id serial primary key ,
                                   group_name varchar(64) NOT NULL,
                                   resource varchar(128) NOT NULL,
-                                  type integer default 1, 
+                                  type integer default 1,
                                   group_type varchar(32) DEFAULT 'included',
                                   description varchar(32) NOT NULL,
                                   status integer DEFAULT 0,
@@ -385,7 +386,7 @@
 
     def create_table_audit_user(self):
         print('Creating table audit_user...')
-        create_table_sql = ''' 
+        create_table_sql = '''
                               CREATE TABLE IF NOT EXISTS audit_user(
                                   id serial primary key ,
                                   user_name varchar(16) NOT NULL,
@@ -399,7 +400,7 @@
 
     def create_table_system_user(self):
         print('Creating table system_user...')
-        create_table_sql = ''' 
+        create_table_sql = '''
                               CREATE TABLE IF NOT EXISTS system_user(
                                   name_name varchar(64) primary key,
                                   level varchar(16) NOT NULL,
@@ -459,7 +460,7 @@
                             ALTER TABLE user_authorization ADD COLUMN IF NOT EXISTS role_id INTEGER;
                             ALTER TABLE user_authorization ADD COLUMN IF NOT EXISTS user_type varchar(32);
                             ALTER TABLE user_authorization DROP CONSTRAINT IF EXISTS role_foreign_key;
-                            ALTER TABLE user_authorization ADD CONSTRAINT role_foreign_key FOREIGN KEY 
+                            ALTER TABLE user_authorization ADD CONSTRAINT role_foreign_key FOREIGN KEY
                             (role_id) REFERENCES role (id);
                             UPDATE user_authorization set user_type='Super Admin' where id=1;
                             '''
@@ -491,7 +492,7 @@
     def create_log_settings_table(self):
         print('Creating table log_settings...')
         create_table_sql = ''' CREATE TABLE IF NOT EXISTS log_settings(
-                            enable integer default 1, 
+                            enable integer default 1,
                             level INTEGER default 2
         )'''
         self.execute_sql(create_table_sql)
@@ -500,9 +501,9 @@
         print('Creating table log_host...')
         # protocol: 0 - TCP, 1 - UDP
         create_table_sql = ''' CREATE TABLE IF NOT EXISTS log_host(
-                            host varchar(128), 
+                            host varchar(128),
                             port integer NOT NULL,
-                            protocol integer default 1, 
+                            protocol integer default 1,
                             PRIMARY KEY (host, port, protocol)
         )'''
         self.execute_sql(create_table_sql)
@@ -534,7 +535,7 @@
 
     def create_table_backup_schedule(self):
         print('Creating table backup_schedule...')
-        create_table_sql = ''' 
+        create_table_sql = '''
         CREATE TABLE IF NOT EXISTS backup_schedule (
             id SERIAL PRIMARY KEY,
             frequency varchar(64) NOT NULL,
@@ -549,7 +550,7 @@
 
     def create_table_remote_storage(self):
         print('Creating table remote_storage...')
-        create_table_sql = ''' 
+        create_table_sql = '''
         CREATE TABLE IF NOT EXISTS remote_storage (
             id SERIAL PRIMARY KEY,
             ip varchar(64) NOT NULL,
@@ -562,7 +563,7 @@
 
     def create_table_backups(self):
         print('Creating table backups...')
-        create_table_sql = ''' 
+        create_table_sql = '''
         CREATE TABLE IF NOT EXISTS backups (
             id SERIAL PRIMARY KEY,
             filename varchar(64) NOT NULL,
@@ -607,4 +608,5 @@
     db.create_table_backup_schedule()
     db.create_table_remote_storage()
     db.create_table_backups()
-    db.close()
\ No newline at end of file
+    db.close()
+
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py	(revision 2567)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/models/device_mgmt/device/__init__.py	(working copy)
@@ -63,7 +63,7 @@
 
 class IPPools(ANModel):
     #index = IntegerField(hidden=True, primary_key=True)
-    asso = AssoField2(verbose_name=_('Device'), tgt='device_mgmt.device.Device.asso_ip_pool', 
+    asso = AssoField2(verbose_name=_('Device'), tgt='device_mgmt.device.Device.asso_ip_pool',
         mul='*', pos='right', optional=True, hidden=True)
     ip_pool_range = CharField(verbose_name=_('IP Pool Range'), primary_key=True)
 
@@ -114,13 +114,13 @@
             }),
         'connection' : BooleanField(verbose_name='Connection', editable=False, configurable=False, display=('connection', 'unconnection'), optional=True),
         'status' : BooleanField(verbose_name='Status', configurable=False, editable=False, display=('new', 'active'), optional=True),
-        'log_enable' : BooleanField(verbose_name='Collection Log', display=('enable', 'disable'), default=False), 
-        # 'snmp_enable' : BooleanField(verbose_name='Collection SNMP', display=('enable', 'disable'), default=False), 
+        'log_enable' : BooleanField(verbose_name='Collection Log', display=('enable', 'disable'), default=False),
+        # 'snmp_enable' : BooleanField(verbose_name='Collection SNMP', display=('enable', 'disable'), default=False),
         'snmp_general' : GroupField(verbose_name='SNMP General', optional=True, editable=True, fields={
             'snmp_enable' : BooleanField(verbose_name='SNMP Enable'),
             'community' : CharField(verbose_name='Community', optional=True)
             }),
-        'license_key' : CharField(verbose_name='License Key', editable=False, configurable=False, optional=True, length='1..128'),
+        'license_key' : CharField(verbose_name='License Key', editable=False, configurable=False, optional=True, length='1..256'),
         'webui_port' : PortField(verbose_name='Webui Port', default=8888, editable=True),
         'enable_password' : PasswordField(verbose_name='Enable Password', length='1..32', optional=True),
         'backup_enable' : BooleanField(verbose_name='Backup Configuraion', display=('enable', 'disable'), default=False, optional=True),
@@ -151,7 +151,7 @@
         'license_limit' : CharField(verbose_name="License Limit"),
     })
     ip_pools = FieldGroup(writable=False, verbose_name=_('IP Pools'), level=BASIC, fields={
-        'asso_ip_pool' : AssoField2(verbose_name='IP Pools', 
+        'asso_ip_pool' : AssoField2(verbose_name='IP Pools',
         tgt='device_mgmt.device.IPPools.asso', mul='1', pos='left', optional=True),
         })
     device_group = AssoField2(verbose_name=_('Device Group'), tgt='device_mgmt.device_group.DeviceGroup.device_list',  mul='*', pos='right')
@@ -216,7 +216,7 @@
         process_title = ""
         forever = False
         config_change = True
-        instance_mul = '1'    
+        instance_mul = '1'
 
     class Refresh(Action):
         verbose_name = _('Refresh')
@@ -376,7 +376,7 @@
         def _filter(self, filter_dict):
             if 'device_group' in filter_dict:
                 return self.all().filter(filter_dict)
-            return self.all() 
+            return self.all()
 
         def _get_stats(self):
             return self._get_query_set()
@@ -391,7 +391,7 @@
         #         data = {"cmd" : "show running"}
         #         new_url = '/rest/%s/cli_extend' % get_device_type(device_info[0]['type'].lower())
         #     running_params = json.dumps(data)
-            
+
         #     try:
         #         rest_response_data = send_https_rest_request('POST', new_url, running_params, ip, port, username, password)
         #     except:
@@ -400,7 +400,7 @@
         #         config_result = json.loads(rest_response_data['body'])['contents']
         #     else:
         #         raise ModelQueryException(CLICmdError(__("The request is not found!")))
-            
+
         #     device_path = os.path.join(DEFAULT_CONFIG_FILE_PATH, 'device')
         #     if not os.path.isdir(device_path):
         #         os.makedirs(device_path)
@@ -467,7 +467,7 @@
                 res_data = db.fetchall(fetchall_sql)
                 if res_data and res_data[0]:
                     raise ModelQueryException(CLICmdError(__('Device Group "%s" is exist.' % data['device_group'])))
-                
+
                 insert_sql = "INSERT INTO device_group(name) values ('%s')" % data['device_group']
                 db.execute_sql(insert_sql)
                 db.close()
@@ -854,7 +854,7 @@
             update_sql = "UPDATE device SET own='%s' WHERE id='%s'" % (instance.own, device_id)
             db.execute_sql(update_sql)
             db.close()
-            return            
+            return
 
         def _update_location(self, instance):
             device_id = instance.id
@@ -894,7 +894,7 @@
             update_sql = "UPDATE device SET restapi_username='%s', restapi_password='%s' WHERE id='%s'" % (instance.restapi_account['restapi_username'], instance.restapi_account['restapi_password'], device_id)
             db.execute_sql(update_sql)
             db.close()
-            return            
+            return
 
         def _update_console_account(self, instance):
             device_id = instance.id
@@ -902,7 +902,7 @@
             update_sql = "UPDATE device SET console_username='%s', console_password='%s' WHERE id='%s'" % (instance.console_account['console_username'], instance.console_account['console_password'], device_id)
             db.execute_sql(update_sql)
             db.close()
-            return   
+            return
 
         def _update_enable_password(self, instance):
             db = DB.get_connected_db()
@@ -921,9 +921,9 @@
 
         def _delete_instance(self, instance):
             data = instance.get_field_dict()
-            #check the task 
+            #check the task
             db = DB.get_connected_db()
-            select_sql = 'SELECT name, state, device_list from task;' 
+            select_sql = 'SELECT name, state, device_list from task;'
             select_data = db.fetchall(select_sql)
             key = ['name', 'state', 'device_list']
             result = [dict(zip(key, each)) for each in select_data]
@@ -941,7 +941,7 @@
             db.execute_sql(delete_sql)
 
             L.remove_lock(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']
             db.execute_sql(delete_sql)
@@ -964,7 +964,7 @@
             delete_sql = "DELETE FROM vsite_list WHERE device_name='%s'" % data['name']
             db.execute_sql(delete_sql)
             db.close()
-            
+
             #remove the vsite config file
             for item in result:
                 vsite_path = DEFAULT_VSITE_PATH + data['name'] + '-' + item['vs_name']
@@ -1020,7 +1020,7 @@
                         raise ModelQueryException(CLICmdError(__('Refresh Failed! Please make sure the RESTful API username/password is correct!')))
                     else:
                         raise ModelQueryException(CLICmdError(__('Refresh Version Failed!')))
-                
+
                 rtn = cli_parse(data['version'], [
                                 RegexParser('License Key : (.+?)\n', MATCHONE),
                             ])
@@ -1041,9 +1041,9 @@
                 db = DB.get_connected_db()
                 update_sql = "UPDATE device SET connection='%s' WHERE id='%s'" % ('unconnected', device_id)
                 db.execute_sql(update_sql)
-                db.close()              
+                db.close()
 
-            def refresh_ip_pool(item):               
+            def refresh_ip_pool(item):
                 response_data = send_cli_to_device(item[0], 'show running all "iprange dynamic"', mode='enable')
                 if response_data['message'] == 'requestfailed':
                     update_device_connected(item[0]['id'])
@@ -1062,7 +1062,7 @@
                         db.execute_sql(save_sql)
                     db.close()
                 else:
-                    raise ModelQueryException(CLICmdError(__('Activation Failed')))                    
+                    raise ModelQueryException(CLICmdError(__('Activation Failed')))
                 return
             pk_list = options['__pk_list']
             device_id_list = [each['id'] for each in pk_list]
@@ -1082,7 +1082,7 @@
                 if get_device_type(item[0]['type'].lower()) in VPN_TYPE_LIST:
                     refresh_ip_pool(item)
             mark_expire_all(get_model('cm', ['device_mgmt', 'device', 'Device']))
-            
+
         def _perform_Activate(self, options):
             def update_device_status(device_id, status, license_name):
                 db = DB.get_connected_db()
@@ -1131,11 +1131,11 @@
                 mark_expire_all(get_model('cm', ['device_mgmt', 'device', 'Device']))
                 raise ModelQueryException(CLICmdError(__('Internal error.')))
         # def send_command_to_device(self, device_info, url, running_params):
-        #     try: 
+        #     try:
         #         rest_response_data = send_https_rest_request('POST', url, running_params, device_info['ip_address'], device_info['restapi_port'], device_info['restapi_username'], device_info['restapi_password'])
         #     except Exception as e:
         #         return 'failed'
-        #     if rest_response_data['status'] == 200: 
+        #     if rest_response_data['status'] == 200:
         #         contents = json.loads(rest_response_data['body'])['contents']
         #         return contents
         #     else:
@@ -1202,7 +1202,7 @@
             try:
                 es = get_elk()
                 res = es._search_index(device_ip, doc_type="syslog", body=json.loads(body_device_vsite))
-            except elasticsearch.TransportError as e:    
+            except elasticsearch.TransportError as e:
                 raise ModelQueryException(CLICmdError(__(e.info["error"]["reason"])))
             except Exception as e:
                 raise ModelQueryException(CLICmdError(__(str(e))))
@@ -1220,7 +1220,7 @@
             data = [dict(zip(key, each)) for each in result]
             service_list = {}
             for item in data:
-                service_list[item["device_ip"]] = item 
+                service_list[item["device_ip"]] = item
             return service_list
 
         def _perform_GetDeviceIpAndVsite(self, options):
@@ -1241,3 +1241,4 @@
                     index = service_list[device.ip]["vsite"].index(vsite)
                     result.append({"device_name":device.name, "device_ip":device.ip, "vsite":vsite, "service_name":service_list[device.ip]["service_name"][index]})
             return {"result":result}
+
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/upgrade/3_7_1/update_db_schema.py
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/upgrade/3_7_1/update_db_schema.py	(revision 2567)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/cm/upgrade/3_7_1/update_db_schema.py	(working copy)
@@ -94,9 +94,21 @@
     finally:
         db.close()
 
+def alter_table_device():
+    db = DB.get_connected_db()
+    update_device_query = '''ALTER TABLE device ALTER COLUMN license_key TYPE varchar(256);'''
+
+    try:
+        db.execute_sql(update_device_query)
+    except Exception as e:
+        print('Exception while executing update queries(alter_table_schedule_backup): {}'.format(e.message))
+    finally:
+        db.close()
 
 if __name__ == '__main__':
     alter_table_file_type_list()
     alter_table_log_host()
     alter_table_proxy_cm()
     alter_table_schedule_backup()
+    alter_table_device()
+
