Hi Hackers, Please find the attached patch with below fixes: - Index dropdown should have existing indexes while creating unique constraint - On selecting index from index dropdown, other fields( should be empty and disabled (Applicable for Primary and unique key constraint) - Added test cases
Please review. Regards, Ganesh Jaybhay
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js index 8126184..5ff6b30 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js @@ -368,6 +368,14 @@ define('pgadmin.node.primary_key', [ Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments); } }, + render: function() { + var index = this.model.get('index'); + if(!_.isUndefined(index) && index != '') { + var col = this.model.get('columns'); + col.reset([], {silent: true}); + } + return Backform.Select2Control.prototype.render.apply(this, arguments); + }, }), deps: ['index'], node: 'column', model: pgBrowser.Node.Model.extend({ @@ -408,8 +416,6 @@ define('pgadmin.node.primary_key', [ if(_.isUndefined(index) || index == '') { return false; } else { - var col = m.get('columns'); - col.reset(); return true; } }, @@ -507,8 +513,9 @@ define('pgadmin.node.primary_key', [ if(_.isUndefined(index) || index == '') { return false; } else { - var col = m.get('columns'); - col.reset(); + setTimeout(function(){ + m.set('include', []); + },10); return true; } }, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js index cc7472e..c23fc05 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js @@ -354,6 +354,14 @@ define('pgadmin.node.unique_constraint', [ Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments); } }, + render: function() { + var index = this.model.get('index'); + if(!_.isUndefined(index) && index != '') { + var col = this.model.get('columns'); + col.reset([], {silent: true}); + } + return Backform.Select2Control.prototype.render.apply(this, arguments); + }, }), deps: ['index'], node: 'column', model: pgBrowser.Node.Model.extend({ @@ -394,8 +402,6 @@ define('pgadmin.node.unique_constraint', [ if(_.isUndefined(index) || index == '') { return false; } else { - var col = m.get('columns'); - col.reset(); return true; } }, @@ -493,8 +499,9 @@ define('pgadmin.node.unique_constraint', [ if(_.isUndefined(index) || index == '') { return false; } else { - var col = m.get('columns'); - col.reset(); + setTimeout(function(){ + m.set('include', []); + },10); return true; } }, @@ -527,11 +534,7 @@ define('pgadmin.node.unique_constraint', [ type: 'text', group: gettext('Definition'), control: Backform.NodeListByNameControl.extend({ initialize:function() { - if (_.isUndefined(this.model.top)) { - Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments); - } else { - Backform.Control.prototype.initialize.apply(this,arguments); - } + Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments); }, }), select2:{allowClear:true}, node: 'index', diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py index 3cd6b3b..f127063 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py @@ -19,6 +19,7 @@ from pgadmin.browser.server_groups.servers.databases.tests import utils as \ from pgadmin.utils.route import BaseTestGenerator from regression import parent_node_dict from regression.python_test_utils import test_utils as utils +from . import utils as index_constraint_utils class IndexConstraintAddTestCase(BaseTestGenerator): @@ -84,3 +85,80 @@ class IndexConstraintAddTestCase(BaseTestGenerator): def tearDownClass(cls): # Disconnect the database database_utils.disconnect_database(cls, cls.server_id, cls.db_id) + + +class ConstraintsUsingIndexAddTestCase(BaseTestGenerator): + """This class will add the constraint(primary key or unique key) to the + table column using newly created index""" + skip_on_database = ['gpdb'] + + primary_key_name = "test_primarykey_add_%s" % (str(uuid.uuid4())[1:8]) + primary_index_name = "test_primaryindex_add_%s" % (str(uuid.uuid4())[1:8]) + primary_key_data = { + "name": primary_key_name, + "spcname": "pg_default", + "columns": [], + "index": primary_index_name + } + + unique_key_name = "test_uniquekey_add_%s" % (str(uuid.uuid4())[1:8]) + unique_index_name = "test_uniqueindex_add_%s" % (str(uuid.uuid4())[1:8]) + unique_key_data = { + "name": unique_key_name, + "spcname": "pg_default", + "columns": [], + "index": unique_index_name + } + + scenarios = [ + ('Add primary Key constraint to table using index', + dict(url='/browser/primary_key/obj/', data=primary_key_data)), + ('Add unique Key constraint to table using index', + dict(url='/browser/unique_constraint/obj/', data=unique_key_data)) + ] + + @classmethod + def setUpClass(cls): + cls.db_name = parent_node_dict["database"][-1]["db_name"] + schema_info = parent_node_dict["schema"][-1] + cls.server_id = schema_info["server_id"] + cls.db_id = schema_info["db_id"] + db_con = database_utils.connect_database(cls, utils.SERVER_GROUP, + cls.server_id, cls.db_id) + if not db_con['data']["connected"]: + raise Exception("Could not connect to database to add a " + "constraint using index.") + cls.schema_id = schema_info["schema_id"] + cls.schema_name = schema_info["schema_name"] + schema_response = schema_utils.verify_schemas(cls.server, + cls.db_name, + cls.schema_name) + if not schema_response: + raise Exception("Could not find the schema to add a index " + "constraint(primary key or unique key).") + cls.table_name = "table_constraint_%s" % (str(uuid.uuid4())[1:8]) + cls.table_id = tables_utils.create_table(cls.server, + cls.db_name, + cls.schema_name, + cls.table_name) + + def runTest(self): + """This function will add index constraint(primary key or unique key) + to table column.""" + self.index_id = \ + index_constraint_utils.create_unique_index( + self.server, self.db_name, self.schema_name, self.table_name, + self.data["index"], "name") + + response = self.tester.post( + self.url + str(utils.SERVER_GROUP) + '/' + + str(self.server_id) + '/' + str(self.db_id) + + '/' + str(self.schema_id) + '/' + str(self.table_id) + '/', + data=json.dumps(self.data), + content_type='html/json') + self.assertEquals(response.status_code, 200) + + @classmethod + def tearDownClass(cls): + # Disconnect the database + database_utils.disconnect_database(cls, cls.server_id, cls.db_id) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py index d175de5..11dafce 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py @@ -88,3 +88,40 @@ def verify_index_constraint(server, db_name, table_name): return index_constraint except Exception: traceback.print_exc(file=sys.stderr) + + +def create_unique_index(server, db_name, schema_name, table_name, + index_name, column_name): + """ + This function creates a unique index for provided table. + :param server: server details + :type server: dict + :param db_name: database name + :type db_name: str + :param schema_name: schema name + :type schema_name: str + :param table_name: table name + :type table_name: str + :param index_name: index name + :type index_name: str + :param column_name: column on which index to be created + :type column_name: str + """ + try: + connection = utils.get_db_connection(db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode']) + old_isolation_level = connection.isolation_level + connection.set_isolation_level(0) + pg_cursor = connection.cursor() + query = "CREATE UNIQUE INDEX CONCURRENTLY %s ON %s.%s (%s)" % \ + (index_name, schema_name, table_name, column_name) + pg_cursor.execute(query) + connection.set_isolation_level(old_isolation_level) + connection.commit() + connection.close() + except Exception: + traceback.print_exc(file=sys.stderr)