From 173cb60691d3b2217a19f17926e4deab04b2a87d Mon Sep 17 00:00:00 2001 From: Pradip Parkale Date: Thu, 14 Oct 2021 11:44:03 +0530 Subject: [PATCH] Added support to enable/disable rules. Fixes #6794 --- docs/en_US/images/rule_definition_enabled.png | Bin 0 -> 55235 bytes docs/en_US/release_notes_6_1.rst | 1 + docs/en_US/rule_dialog.rst | 7 ++ web/pgadmin/browser/server_groups/__init__.py | 2 +- .../schemas/tables/rules/__init__.py | 12 +- .../tables/rules/static/img/rule-bad.svg | 22 ++++ .../schemas/tables/rules/static/js/rule.js | 109 +++++++++++++++++- .../schemas/tables/rules/static/js/rule.ui.js | 22 +++- .../tables/rules/templates/rules/css/rule.css | 11 ++ .../tables/templates/rules/sql/nodes.sql | 5 +- .../tables/templates/rules/sql/properties.sql | 1 + .../tables/templates/rules/sql/update.sql | 10 ++ 12 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 docs/en_US/images/rule_definition_enabled.png create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/img/rule-bad.svg diff --git a/docs/en_US/images/rule_definition_enabled.png b/docs/en_US/images/rule_definition_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6764d8eda21927848c4a0cc41ee25c35b37314cb GIT binary patch literal 55235 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
vnN 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 Fe*r!X-^Ks{ literal 0 HcmV?d00001 diff --git a/docs/en_US/release_notes_6_1.rst b/docs/en_US/release_notes_6_1.rst index 9acad051b..7ee272597 100644 --- a/docs/en_US/release_notes_6_1.rst +++ b/docs/en_US/release_notes_6_1.rst @@ -13,6 +13,7 @@ New features | `Issue #6081 `_ - Added support for advanced table fields like the foreign key, primary key in the ERD tool. | `Issue #6529 `_ - Added index creation when generating SQL in the ERD tool. | `Issue #6657 `_ - Added support for authentication via the webserver (REMOTE_USER). +| `Issue #6794 `_ - Added support to enable/disable rules. Housekeeping ************ diff --git a/docs/en_US/rule_dialog.rst b/docs/en_US/rule_dialog.rst index 2baebe662..152107cfe 100644 --- a/docs/en_US/rule_dialog.rst +++ b/docs/en_US/rule_dialog.rst @@ -37,6 +37,13 @@ Use the fields in the *Definition* tab to write parameters: executed instead of the original command; if Do Instead specifies *No*, the rule will be invoked in addition to the original command. +.. image:: images/rule_definition_enabled.png + :alt: Trigger enabled in dialog tab + :align: center + +* *Rule enabled* field is available in rule dialog once the rule is created. + You can select one of the four options available. + Click the *Condition* tab to continue. .. image:: images/rule_condition.png 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..9a01eed4f 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,8 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): rset['rows'][0]['oid'], tid, rset['rows'][0]['name'], - icon="icon-rule" + icon="icon-rule" if + rset['rows'][0]['is_enable_rule'] == 'D' else "icon-rule-bad" ) return make_json_response( @@ -276,7 +277,9 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): row['oid'], tid, row['name'], - icon="icon-rule" + icon="icon-rule-bad" + if 'is_enable_rule' in row and + row['is_enable_rule'] == 'D' else "icon-rule" )) return make_json_response( @@ -385,7 +388,10 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): rid, tid, name, - icon="icon-%s" % self.node_type + icon="icon-%s-bad" % self.node_type + if 'is_enable_rule' in data and + data['is_enable_rule'] == 'D' + else "icon-%s" % 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..915189591 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: {'is_enable_rule' : 'O'}, + 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: {'is_enable_rule' : 'D'}, + 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..c15e82ef1 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,24 @@ export default class RuleSchema extends BaseUISchema { state.view = obj.fieldOptions.nodeData.label; }, }, + { + id: 'is_enable_rule', label: gettext('Rule enabled?'), + mode: ['edit', 'properties'], group: gettext('Definition'), + type: 'select', + disabled: () => { + if('catalog' in obj.fieldOptions.nodeInfo || 'view' in obj.fieldOptions.nodeInfo) { + return true; + } + return false; + }, + options: [ + {label: gettext('Enable'), value: 'O'}, + {label: gettext('Enable Replica'), value: 'R'}, + {label: gettext('Enable Always'), value: 'A'}, + {label: gettext('Disable'), value: 'D'}, + ], + controlProps: { allowClear: false }, + }, { id: 'event', label: gettext('Event'), control: 'select2', group: gettext('Definition'), type: 'select', @@ -94,10 +112,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..343b40bcf 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,9 @@ 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, + rw.ev_enabled AS is_enable_rule + FROM pg_catalog.pg_rewrite rw WHERE diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/properties.sql index c983896b0..8f238bb8e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/properties.sql @@ -12,6 +12,7 @@ SELECT {# ===== Check whether it is system rule or not ===== #} CASE WHEN rw.rulename = '_RETURN' THEN True ELSE False END AS system_rule, CASE WHEN rw.ev_enabled != 'D' THEN True ELSE False END AS enabled, + rw.ev_enabled AS is_enable_rule, pg_catalog.pg_get_ruledef(rw.oid) AS definition FROM pg_catalog.pg_rewrite rw 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..90a94e2a8 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,13 @@ 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 %} + +{% if data.is_enable_rule is defined and o_data.is_enable_rule != data.is_enable_rule %} +{% set enable_map = {'R':'ENABLE REPLICA', 'A':'ENABLE ALWAYS', 'O':'ENABLE', 'D':'DISABLE'} %} +ALTER TABLE {{ conn|qtIdent(o_data.schema, o_data.view) }} + {{ enable_map[data.is_enable_rule] }} RULE {{ conn|qtIdent(o_data.name) }}; +{% endif %}