diff --git a/web/pgadmin/browser/server_groups/__init__.py b/web/pgadmin/browser/server_groups/__init__.py index 561772636..1cedc9c5d 100644 --- a/web/pgadmin/browser/server_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/__init__.py @@ -177,7 +177,7 @@ class ServerGroupView(NodeView): # if server group id is 1 we won't delete it. sg = groups.first() - shared_servers = Server.query.filter_by(servergroup_id=sg.id, + shared_servers = Server.query.filter_by(servergroup_id=gid, shared=True).all() if shared_servers: return make_json_response( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py index 75a91c6b3..4c078043d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py @@ -249,7 +249,7 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): rset['rows'][0]['oid'], tid, rset['rows'][0]['name'], - icon="icon-rule" + icon="icon-rule" if rset['rows'][0]['enabled'] else "icon-rule-bad" ) return make_json_response( @@ -276,7 +276,7 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): row['oid'], tid, row['name'], - icon="icon-rule" + icon="icon-rule" if row['enabled'] else "icon-rule-bad" )) return make_json_response( @@ -385,7 +385,9 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): rid, tid, name, - icon="icon-%s" % self.node_type + icon="icon-%s" % self.node_type if 'enabled' in data and + data['enabled'] + else "icon-%s-bad" % self.node_type ) ) except Exception as e: diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/img/rule-bad.svg b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/img/rule-bad.svg new file mode 100644 index 000000000..a1b4aef87 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/img/rule-bad.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js index 48f055b41..db29fedbf 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js @@ -12,8 +12,8 @@ import RuleSchema from './rule.ui'; define('pgadmin.node.rule', [ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform', - 'pgadmin.node.schema.dir/schema_child_tree_node', -], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, SchemaChildTreeNode) { + 'pgadmin.node.schema.dir/schema_child_tree_node', 'pgadmin.alertifyjs', +], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, SchemaChildTreeNode, alertify) { /** Create and add a rule collection into nodes @@ -112,8 +112,93 @@ define('pgadmin.node.rule', [ icon: 'wcTabIcon icon-rule', data: {action: 'create', check: true}, enable: 'canCreate', }, + { + name: 'enable_rule', node: 'rule', module: this, + applies: ['object', 'context'], callback: 'enable_rule', + category: 'connect', priority: 3, label: gettext('Enable rule'), + icon: 'fa fa-check', enable: 'canCreate_with_rule_enable', + },{ + name: 'disable_rule', node: 'rule', module: this, + applies: ['object', 'context'], callback: 'disable_rule', + category: 'drop', priority: 3, label: gettext('Disable rule'), + icon: 'fa fa-times', enable: 'canCreate_with_rule_disable' + } ]); }, + callbacks: { + /* Enable rule */ + enable_rule: function(args) { + var input = args || {}, + obj = this, + t = pgBrowser.tree, + i = input.item || t.selected(), + d = i ? t.itemData(i) : undefined; + + if (!d) + return false; + + var data = d; + $.ajax({ + url: obj.generate_url(i, 'obj' , d, true), + type:'PUT', + data: {'enabled' : 'true'}, + dataType: 'json', + }) + .done(function() { + alertify.success('Rule updated.'); + t.removeIcon(i); + data.icon = 'icon-rule'; + t.addIcon(i, {icon: data.icon}); + t.unload(i); + t.setInode(false); + t.deselect(i); + // Fetch updated data from server + setTimeout(function() { + t.select(i); + }, 10); + }) + .fail(function(xhr, status, error) { + alertify.pgRespErrorNotify(xhr, error); + t.unload(i); + }); + }, + /* Disable rule */ + disable_rule: function(args) { + var input = args || {}, + obj = this, + t = pgBrowser.tree, + i = input.item || t.selected(), + d = i ? t.itemData(i) : undefined; + + if (!d) + return false; + + var data = d; + $.ajax({ + url: obj.generate_url(i, 'obj' , d, true), + type:'PUT', + data: {'enabled' : 'false'}, + dataType: 'json', + }) + .done(function() { + alertify.success('Rule updated'); + t.removeIcon(i); + data.icon = 'icon-rule-bad'; + t.addIcon(i, {icon: data.icon}); + t.unload(i); + t.setInode(false); + t.deselect(i); + // Fetch updated data from server + setTimeout(function() { + t.select(i); + }, 10); + }) + .fail(function(xhr, status, error) { + alertify.pgRespErrorNotify(xhr, error, gettext('Disable rule failed')); + t.unload(i); + }); + }, + }, getSchema: function(treeNodeInfo, itemNodeData) { return new RuleSchema( { @@ -216,6 +301,26 @@ define('pgadmin.node.rule', [ }, + canCreate_with_rule_enable: function(itemData, item, data) { + var treeData = pgBrowser.tree.getTreeNodeHierarchy(item); + if ('view' in treeData) { + return false; + } + + return itemData.icon === 'icon-rule-bad' && + this.canCreate.apply(this,[itemData, item, data]); + }, + // Check to whether rule is enable ? + canCreate_with_rule_disable: function(itemData, item, data) { + var treeData = pgBrowser.tree.getTreeNodeHierarchy(item); + if ('view' in treeData) { + return false; + } + + return itemData.icon === 'icon-rule' && + this.canCreate.apply(itemData, item, data); + }, + }); } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.ui.js index 777de8b17..80a33778f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.ui.js @@ -66,6 +66,11 @@ export default class RuleSchema extends BaseUISchema { state.view = obj.fieldOptions.nodeData.label; }, }, + { + id: 'enabled', label: gettext('Enabled?'), + type: 'switch', mode: ['properties', 'edit'], + group: gettext('Definition'), + }, { id: 'event', label: gettext('Event'), control: 'select2', group: gettext('Definition'), type: 'select', @@ -94,10 +99,6 @@ export default class RuleSchema extends BaseUISchema { id: 'system_rule', label: gettext('System rule?'), type: 'switch', mode: ['properties'], }, - { - id: 'enabled', label: gettext('Enabled?'), - type: 'switch', mode: ['properties'], - }, { id: 'comment', label: gettext('Comment'), cell: 'text', type: 'multiline', }, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/css/rule.css b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/css/rule.css index 0d7339cf8..63f4ecbce 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/css/rule.css +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/css/rule.css @@ -7,3 +7,14 @@ vertical-align: middle; height: 1.3em; } + + +.icon-rule-bad{ + background-image: url('{{ url_for('NODE-rule.static', filename='img/rule-bad.svg') }}') !important; + border-radius: 10px; + background-size: 20px !important; + background-repeat: no-repeat; + align-content: center; + vertical-align: middle; + height: 1.3em; +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/nodes.sql index 67ddae002..2019197a1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/nodes.sql @@ -1,6 +1,7 @@ SELECT rw.oid AS oid, - rw.rulename AS name + rw.rulename AS name, + CASE WHEN rw.ev_enabled != 'D' THEN True ELSE False END AS enabled FROM pg_catalog.pg_rewrite rw WHERE diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/update.sql index e033af7b8..81c961d8f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/update.sql @@ -35,3 +35,7 @@ CREATE OR REPLACE RULE {{ conn|qtIdent(rule_name) }} AS {% set old_comment = o_data.comment|default('', true) %} {% if (data.comment is defined and (data.comment != old_comment)) %} COMMENT ON RULE {{ conn|qtIdent(rule_name) }} ON {{ conn|qtIdent(o_data.schema, o_data.view) }} IS {{ data.comment|qtLiteral }};{% endif %} + +{% if data.enabled is defined and o_data.enabled != data.enabled %} +ALTER TABLE {{ conn|qtIdent(o_data.schema, o_data.view) }} {% if (data.enabled in ['false', False]) %}DISABLE{% endif %}{% if (data.enabled in ['true', True]) %}ENABLE{% endif %} RULE {{ conn|qtIdent(o_data.name) }}; +{% endif %}