Hi,

Please find the attached updated patch.

Thanks,
Khushboo

On Mon, Dec 5, 2016 at 11:09 PM, Dave Page <dp...@pgadmin.org> wrote:

> Hi
>
> On Friday, December 2, 2016, Khushboo Vashi <khushboo.vashi@enterprisedb.
> com> wrote:
>
>> Hi.
>>
>> Please find the attached updated patch.
>>
>> Thanks,
>> Khushboo
>>
>> On Fri, Nov 25, 2016 at 7:12 PM, Dave Page <dp...@pgadmin.org> wrote:
>>
>>> Hi
>>>
>>> On Fri, Nov 25, 2016 at 12:19 PM, Khushboo Vashi
>>> <khushboo.va...@enterprisedb.com> wrote:
>>> > Hi,
>>> >
>>> > Please find the attached updated patch.
>>>
>>> Please see the attached screenshot. It's still offering to let me
>>> connect to a database with datallowconn=false, or create objects in
>>> it.
>>>
>>> Fixed.
>>
>>
>>> It also doesn't display the properties or dashboard for it if I click
>>> on it - it just silently keeps displaying the properties/dashboard for
>>> the previous database.
>>>
>>> Fixed.
>>
>
> I'm still seeing graphs being generated when I've selected a template
> database with datallowconn = true. What is it showing me? I'm seeing
> transactions, tuple and block I/O, which I would not expect from a database
> that noone can connect to.
>
>
Fixed


> Thanks.
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
>
diff --git a/web/pgadmin/browser/collection.py b/web/pgadmin/browser/collection.py
index e4a83a2..391ccf9 100644
--- a/web/pgadmin/browser/collection.py
+++ b/web/pgadmin/browser/collection.py
@@ -66,7 +66,7 @@ class CollectionNodeModule(PgAdminModule, PGChildModule):
             "id": "%s/%s" % (self.node_type, node_id),
             "label": label,
             "icon": self.node_icon if not icon else icon,
-            "inode": self.node_inode,
+            "inode": self.node_inode if 'inode' not in kwargs else kwargs['inode'],
             "_type": self.node_type,
             "_id": node_id,
             "_pid": parent_id,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
index ed08ef6..0c96d6b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
@@ -214,7 +214,8 @@ class DatabaseView(PGChildNodeView):
                     allowConn=row['datallowconn'],
                     canCreate=row['cancreate'],
                     canDisconn=canDisConn,
-                    canDrop = canDrop
+                    canDrop=canDrop,
+                    inode=True if row['datallowconn'] else False
                 )
             )
 
@@ -276,11 +277,13 @@ class DatabaseView(PGChildNodeView):
 
     @check_precondition(action="properties")
     def properties(self, gid, sid, did):
+        conn = self.manager.connection()
+
         SQL = render_template(
             "/".join([self.template_path, 'properties.sql']),
-            did=did, conn=self.conn, last_system_oid=0
+            did=did, conn=conn, last_system_oid=0
         )
-        status, res = self.conn.execute_dict(SQL)
+        status, res = conn.execute_dict(SQL)
 
         if len(res['rows']) == 0:
             return gone(
@@ -292,9 +295,9 @@ class DatabaseView(PGChildNodeView):
 
         SQL = render_template(
             "/".join([self.template_path, 'acl.sql']),
-            did=did, conn=self.conn
+            did=did, conn=conn
         )
-        status, dataclres = self.conn.execute_dict(SQL)
+        status, dataclres = conn.execute_dict(SQL)
         if not status:
             return internal_server_error(errormsg=res)
 
@@ -302,9 +305,9 @@ class DatabaseView(PGChildNodeView):
 
         SQL = render_template(
             "/".join([self.template_path, 'defacl.sql']),
-            did=did, conn=self.conn
+            did=did, conn=conn
         )
-        status, defaclres = self.conn.execute_dict(SQL)
+        status, defaclres = conn.execute_dict(SQL)
         if not status:
             return internal_server_error(errormsg=res)
 
@@ -314,10 +317,10 @@ class DatabaseView(PGChildNodeView):
         # Fetching variable for database
         SQL = render_template(
             "/".join([self.template_path, 'get_variables.sql']),
-            did=did, conn=self.conn
+            did=did, conn=conn
         )
 
-        status, res1 = self.conn.execute_dict(SQL)
+        status, res1 = conn.execute_dict(SQL)
 
         if not status:
             return internal_server_error(errormsg=res1)
@@ -535,12 +538,13 @@ class DatabaseView(PGChildNodeView):
             request.data, encoding='utf-8'
         )
 
+        conn = self.manager.connection()
         if did is not None:
             # Fetch the name of database for comparison
-            status, rset = self.conn.execute_dict(
+            status, rset = conn.execute_dict(
                 render_template(
                     "/".join([self.template_path, 'nodes.sql']),
-                    did=did, conn=self.conn, last_system_oid=0
+                    did=did, conn=conn, last_system_oid=0
                 )
             )
             if not status:
@@ -556,7 +560,6 @@ class DatabaseView(PGChildNodeView):
                 data['name'] = data['old_name']
 
         status = self.manager.release(did=did)
-        conn = self.manager.connection()
         for action in ["rename_database", "tablespace"]:
             SQL = self.get_offline_sql(gid, sid, data, did, action)
             SQL = SQL.strip('\n').strip(' ')
@@ -565,6 +568,18 @@ class DatabaseView(PGChildNodeView):
                 if not status:
                     return internal_server_error(errormsg=msg)
 
+        if not self.manager.db_info[did]['datallowconn']:
+            return jsonify(
+                node=self.blueprint.generate_browser_node(
+                    did,
+                    sid,
+                    data['name'],
+                    "icon-database-not-connected",
+                    connected=False,
+                    allowConn=False
+                )
+            )
+
         self.conn = self.manager.connection(database=data['name'], auto_reconnect=True)
         status, errmsg = self.conn.connect()
 
@@ -655,10 +670,11 @@ class DatabaseView(PGChildNodeView):
         SQL = ''
         if did is not None:
             # Fetch the name of database for comparison
-            status, rset = self.conn.execute_dict(
+            conn = self.manager.connection()
+            status, rset = conn.execute_dict(
                 render_template(
                     "/".join([self.template_path, 'nodes.sql']),
-                    did=did, conn=self.conn, last_system_oid=0
+                    did=did, conn=conn, last_system_oid=0
                 )
             )
             if not status:
@@ -677,7 +693,8 @@ class DatabaseView(PGChildNodeView):
             for action in ["rename_database", "tablespace"]:
                 SQL += self.get_offline_sql(gid, sid, data, did, action)
 
-            SQL += self.get_online_sql(gid, sid, data, did)
+            if rset['rows'][0]['datallowconn']:
+                SQL += self.get_online_sql(gid, sid, data, did)
         else:
             SQL += self.get_new_sql(gid, sid, data, did)
 
@@ -696,31 +713,37 @@ class DatabaseView(PGChildNodeView):
                 return _(" -- definition incomplete")
 
         acls = []
-        try:
-            acls = render_template(
-                "/".join([self.template_path, 'allowed_privs.json'])
-            )
-            acls = json.loads(acls, encoding='utf-8')
-        except Exception as e:
-            current_app.logger.exception(e)
+        SQL_acl = ''
 
-        # Privileges
-        for aclcol in acls:
-            if aclcol in data:
-                allowedacl = acls[aclcol]
-                data[aclcol] = parse_priv_to_db(
-                    data[aclcol], allowedacl['acl']
+        if data['datallowconn']:
+            try:
+                acls = render_template(
+                    "/".join([self.template_path, 'allowed_privs.json'])
                 )
+                acls = json.loads(acls, encoding='utf-8')
+            except Exception as e:
+                current_app.logger.exception(e)
+
+            # Privileges
+            for aclcol in acls:
+                if aclcol in data:
+                    allowedacl = acls[aclcol]
+                    data[aclcol] = parse_priv_to_db(
+                        data[aclcol], allowedacl['acl']
+                    )
 
+            SQL_acl = render_template(
+                        "/".join([self.template_path, 'grant.sql']),
+                        data=data, conn=self.conn
+                    )
+
+        conn = self.manager.connection()
         SQL = render_template(
             "/".join([self.template_path, 'create.sql']),
-            data=data, conn=self.conn
+            data=data, conn=conn
         )
         SQL += "\n"
-        SQL += render_template(
-            "/".join([self.template_path, 'grant.sql']),
-            data=data, conn=self.conn
-        )
+        SQL += SQL_acl
         return SQL
 
     def get_online_sql(self, gid, sid, data, did=None):
@@ -792,10 +815,11 @@ class DatabaseView(PGChildNodeView):
             if self.manager.db_info is not None and \
             self.manager.did in self.manager.db_info else 0
 
-        status, res = self.conn.execute_dict(
+        conn = self.manager.connection()
+        status, res = conn.execute_dict(
             render_template(
                 "/".join([self.template_path, 'stats.sql']),
-                did=did, conn=self.conn, last_system_oid=last_system_oid
+                did=did, conn=conn, last_system_oid=last_system_oid
             )
         )
 
@@ -812,52 +836,56 @@ class DatabaseView(PGChildNodeView):
         """
         This function will generate sql for sql panel
         """
+
+        conn = self.manager.connection()
         SQL = render_template(
             "/".join([self.template_path, 'properties.sql']),
-            did=did, conn=self.conn, last_system_oid=0
+            did=did, conn=conn, last_system_oid=0
         )
-        status, res = self.conn.execute_dict(SQL)
+        status, res = conn.execute_dict(SQL)
         if not status:
             return internal_server_error(errormsg=res)
 
-        SQL = render_template(
-            "/".join([self.template_path, 'acl.sql']),
-            did=did, conn=self.conn
-        )
-        status, dataclres = self.conn.execute_dict(SQL)
-        if not status:
-            return internal_server_error(errormsg=res)
-        res = self.formatdbacl(res, dataclres['rows'])
+        if res['rows'][0]['datallowconn']:
+            SQL = render_template(
+                "/".join([self.template_path, 'acl.sql']),
+                did=did, conn=self.conn
+            )
+            status, dataclres = self.conn.execute_dict(SQL)
+            if not status:
+                return internal_server_error(errormsg=dataclres)
+            res = self.formatdbacl(res, dataclres['rows'])
 
-        SQL = render_template(
-            "/".join([self.template_path, 'defacl.sql']),
-            did=did, conn=self.conn
-        )
-        status, defaclres = self.conn.execute_dict(SQL)
-        if not status:
-            return internal_server_error(errormsg=res)
+            SQL = render_template(
+                "/".join([self.template_path, 'defacl.sql']),
+                did=did, conn=self.conn
+            )
+            status, defaclres = self.conn.execute_dict(SQL)
+            if not status:
+                return internal_server_error(errormsg=defaclres)
 
-        res = self.formatdbacl(res, defaclres['rows'])
+            res = self.formatdbacl(res, defaclres['rows'])
 
         result = res['rows'][0]
 
-        SQL = render_template(
-            "/".join([self.template_path, 'get_variables.sql']),
-            did=did, conn=self.conn
-        )
-        status, res1 = self.conn.execute_dict(SQL)
-        if not status:
-            return internal_server_error(errormsg=res1)
+        if result['datallowconn']:
+            SQL = render_template(
+                "/".join([self.template_path, 'get_variables.sql']),
+                did=did, conn=self.conn
+            )
+            status, res1 = self.conn.execute_dict(SQL)
+            if not status:
+                return internal_server_error(errormsg=res1)
 
-        # Get Formatted Security Labels
-        if 'seclabels' in result:
-            # Security Labels is not available for PostgreSQL <= 9.1
-            frmtd_sec_labels = parse_sec_labels_from_db(result['seclabels'])
-            result.update(frmtd_sec_labels)
+            # Get Formatted Security Labels
+            if 'seclabels' in result:
+                # Security Labels is not available for PostgreSQL <= 9.1
+                frmtd_sec_labels = parse_sec_labels_from_db(result['seclabels'])
+                result.update(frmtd_sec_labels)
 
-        # Get Formatted Variables
-        frmtd_variables = parse_variables_from_db(res1['rows'])
-        result.update(frmtd_variables)
+            # Get Formatted Variables
+            frmtd_variables = parse_variables_from_db(res1['rows'])
+            result.update(frmtd_variables)
 
         sql_header = "-- Database: {0}\n\n-- ".format(result['name'])
         if hasattr(str, 'decode'):
@@ -865,7 +893,7 @@ class DatabaseView(PGChildNodeView):
 
         sql_header += render_template(
             "/".join([self.template_path, 'delete.sql']),
-            datname=result['name'], conn=self.conn
+            datname=result['name'], conn=conn
         )
 
         SQL = self.get_new_sql(gid, sid, result, did)
@@ -886,7 +914,8 @@ class DatabaseView(PGChildNodeView):
             sid: Server ID
             did: Database ID
         """
-        dependents_result = self.get_dependents(self.conn, did)
+        dependents_result = self.get_dependents(self.conn, did) if\
+            self.conn.connected() else []
         return ajax_response(
             response=dependents_result,
             status=200
@@ -903,7 +932,8 @@ class DatabaseView(PGChildNodeView):
             sid: Server ID
             did: Database ID
         """
-        dependencies_result = self.get_dependencies(self.conn, did)
+        dependencies_result = self.get_dependencies(self.conn, did) if\
+            self.conn.connected() else []
         return ajax_response(
             response=dependencies_result,
             status=200
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/templates/cast/js/casts.js b/web/pgadmin/browser/server_groups/servers/databases/casts/templates/cast/js/casts.js
index fb53135..1483034 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/templates/cast/js/casts.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/templates/cast/js/casts.js
@@ -39,7 +39,8 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
             name: 'create_cast_on_database', node: 'database', module: this,
             applies: ['object', 'context'], callback: 'show_obj_properties',
             category: 'create', priority: 4, label: '{{ _('Cast...') }}',
-            icon: 'wcTabIcon icon-cast', data: {action: 'create'}
+            icon: 'wcTabIcon icon-cast', data: {action: 'create'},
+            enable: pgBrowser.Nodes['database'].is_conn_allow
           },{
             name: 'create_cast_on_coll', node: 'coll-cast', module: this,
             applies: ['object', 'context'], callback: 'show_obj_properties',
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/js/event_trigger.js b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/js/event_trigger.js
index af1f6e3..3a5a259 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/js/event_trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/js/event_trigger.js
@@ -46,7 +46,8 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
           name: 'create_event_trigger', node: 'database', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
           category: 'create', priority: 4, label: '{{ _('Event Trigger...') }}',
-          icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'}
+          icon: 'wcTabIcon icon-event_trigger', data: {action: 'create'},
+          enable: pgBrowser.Nodes['database'].is_conn_allow
         }
         ]);
       },
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/js/extensions.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/js/extensions.js
index 7ac302a..14e65e3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/js/extensions.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/js/extensions.js
@@ -72,7 +72,8 @@ function($, _, S, pgAdmin, pgBrowser) {
           name: 'create_extension', node: 'database', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
           category: 'create', priority: 4, label: '{{ _('Extension...') }}',
-          icon: 'wcTabIcon icon-extension', data: {action: 'create'}
+          icon: 'wcTabIcon icon-extension', data: {action: 'create'},
+          enable: pgBrowser.Nodes['database'].is_conn_allow
         }
         ]);
       },
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
index f1a1797..d4c68ea 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
@@ -12,7 +12,7 @@
 import simplejson as json
 from functools import wraps
 
-import pgadmin.browser.server_groups.servers as servers
+import pgadmin.browser.server_groups.servers.databases as databases
 from flask import render_template, make_response, request, jsonify
 from flask_babel import gettext
 from pgadmin.browser.collection import CollectionNodeModule
@@ -79,9 +79,9 @@ class ForeignDataWrapperModule(CollectionNodeModule):
         """
         Load the module script for foreign data wrapper, when any of the database node is initialized.
 
-        Returns: node type of the server module.
+        Returns: node type of the databse module.
         """
-        return servers.ServerModule.NODE_TYPE
+        return databases.DatabaseModule.NODE_TYPE
 
 
 blueprint = ForeignDataWrapperModule(__name__)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/js/foreign_data_wrappers.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/js/foreign_data_wrappers.js
index 6d0a4ec..b5af7f0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/js/foreign_data_wrappers.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/js/foreign_data_wrappers.js
@@ -86,7 +86,8 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
           name: 'create_foreign_data_wrapper', node: 'database', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
           category: 'create', priority: 4, label: '{{ _('Foreign Data Wrapper...') }}',
-          icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'}
+          icon: 'wcTabIcon icon-foreign_data_wrapper', data: {action: 'create'},
+          enable: pgBrowser.Nodes['database'].is_conn_allow
         }
         ]);
       },
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/templates/languages/js/languages.js b/web/pgadmin/browser/server_groups/servers/databases/languages/templates/languages/js/languages.js
index 470ae4f..e55c1ab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/templates/languages/js/languages.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/templates/languages/js/languages.js
@@ -40,7 +40,8 @@ define(
           name: 'create_language_on_database', node: 'database', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
           category: 'create', priority: 4, label: '{{ _('Language...') }}',
-          icon: 'wcTabIcon icon-language', data: {action: 'create'}
+          icon: 'wcTabIcon icon-language', data: {action: 'create'},
+          enable: pgBrowser.Nodes['database'].is_conn_allow
         },{
           name: 'create_language_on_coll', node: 'coll-language', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
index b75fb80..ef1f9d9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -88,7 +88,7 @@ class SchemaModule(CollectionNodeModule):
     @property
     def script_load(self):
         """
-        Load the module script for server, when any of the server-group node is
+        Load the module script for schema, when any of the server node is
         initialized.
         """
         return servers.ServerModule.NODE_TYPE
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/js/schema.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/js/schema.js
index 5c73022..cd55e0b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/js/schema.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/js/schema.js
@@ -310,10 +310,14 @@ function($, _, S, pgAdmin, pgBrowser, Backform, alertify) {
           name: 'create_schema', node: 'database', module: this,
           applies: ['object', 'context'], callback: 'show_obj_properties',
           category: 'create', priority: 4, label: '{{ _('Schema...') }}',
-          icon: 'wcTabIcon icon-schema', data: {action: 'create'}
+          icon: 'wcTabIcon icon-schema', data: {action: 'create'},
+          enable: 'can_create_schema'
         }
         ]);
       },
+      can_create_schema: function(node, item) {
+        return pgBrowser.Nodes['database'].is_conn_allow.call(this, node);
+      },
       model: pgBrowser.Node.Model.extend({
         defaults: {
           name: undefined,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/js/databases.js b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/js/databases.js
index cdd38a6..c567fb7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/js/databases.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/js/databases.js
@@ -82,11 +82,14 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
         return server.connected && server.user.can_create_db;
       },
       is_not_connected: function(node) {
-        return (node && node.connected != true);
+        return (node && node.connected != true && node.allowConn == true);
       },
       is_connected: function(node) {
         return (node && node.connected == true && node.canDisconn == true);
       },
+      is_conn_allow: function(node) {
+        return (node && node.allowConn == true)
+      },
       connection_lost: function(i, resp, server_connected) {
         if (pgBrowser.tree) {
           var t = pgBrowser.tree,
@@ -102,6 +105,7 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
           }
 
           if (i && d) {
+            if (!d.allowConn) return false;
             if (_.isUndefined(d.is_connecting) || !d.is_connecting) {
               d.is_connecting = true;
 
@@ -229,7 +233,7 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
           }
 
           pgBrowser.tree.addIcon(item, {icon: data.icon});
-          if (!data.connected) {
+          if (!data.connected && data.allowConn) {
             connect_to_database(this, data, pgBrowser.tree, item, true);
             return false;
           }
@@ -237,18 +241,28 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
         },
 
         selected: function(item, data) {
-          if(!data || data._type != 'database' || data.label == "template0") {
+          if(!data || data._type != 'database') {
             return false;
           }
 
           pgBrowser.tree.addIcon(item, {icon: data.icon});
-          if (!data.connected) {
+          if (!data.connected && data.allowConn) {
             connect_to_database(this, data, pgBrowser.tree, item, false);
             return false;
           }
 
           return pgBrowser.Node.callbacks.selected.apply(this, arguments);
         },
+
+        refresh: function(cmd, i) {
+          var self = this,
+              t = pgBrowser.tree,
+              item = i || t.selected(),
+              d = t.itemData(item);
+
+          if (!d.allowConn) return;
+          pgBrowser.Node.callbacks.refresh.apply(this, arguments);
+        }
       },
       model: pgBrowser.Node.Model.extend({
         defaults: {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_offline.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_offline.sql
index afebb6c..6f2b461 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_offline.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_offline.sql
@@ -1,6 +1,20 @@
 {% if data %}
-{% if action == "rename_database" and data.old_name != data.name %}
+{% if action == "rename_database" %} {% if data.old_name != data.name %}
 ALTER DATABASE {{ conn|qtIdent(data.old_name) }} RENAME TO {{ conn|qtIdent(data.name) }};
+{% endif %}
+{# Change the owner #}
+{% if data.datowner %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
+{% endif %}
+{# Change the comments/description #}
+{% if data.comments is defined %}
+COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
+    IS {{ data.comments|qtLiteral }};
+{% endif %}
+{# Change the connection limit #}
+{% if data.datconnlimit %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
+{% endif %}
 {% endif %}{% if action == "tablespace" and  data.spcname %}
 
 ALTER DATABASE {{ conn|qtIdent(data.name) }} SET TABLESPACE {{ conn|qtIdent(data.spcname) }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_online.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_online.sql
index e69c9b5..680ab23 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_online.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/alter_online.sql
@@ -3,19 +3,6 @@
 {% import 'macros/privilege.macros' as PRIVILEGE %}
 {% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
 {% if data %}
-{# Change the owner #}
-{% if data.datowner %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
-{% endif %}
-{# Change the comments/description #}
-{% if data.comments is defined %}
-COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
-    IS {{ data.comments|qtLiteral }};
-{% endif %}
-{# Change the connection limit #}
-{% if data.datconnlimit %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
-{% endif %}
 {# Change the variables/options #}
 {% if data.variables and data.variables|length > 0 %}
 {% set variables = data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_offline.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_offline.sql
index afebb6c..6f2b461 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_offline.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_offline.sql
@@ -1,6 +1,20 @@
 {% if data %}
-{% if action == "rename_database" and data.old_name != data.name %}
+{% if action == "rename_database" %} {% if data.old_name != data.name %}
 ALTER DATABASE {{ conn|qtIdent(data.old_name) }} RENAME TO {{ conn|qtIdent(data.name) }};
+{% endif %}
+{# Change the owner #}
+{% if data.datowner %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
+{% endif %}
+{# Change the comments/description #}
+{% if data.comments is defined %}
+COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
+    IS {{ data.comments|qtLiteral }};
+{% endif %}
+{# Change the connection limit #}
+{% if data.datconnlimit %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
+{% endif %}
 {% endif %}{% if action == "tablespace" and  data.spcname %}
 
 ALTER DATABASE {{ conn|qtIdent(data.name) }} SET TABLESPACE {{ conn|qtIdent(data.spcname) }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_online.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_online.sql
index 8d31f29..fd402b2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_online.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/alter_online.sql
@@ -3,19 +3,6 @@
 {% import 'macros/privilege.macros' as PRIVILEGE %}
 {% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
 {% if data %}
-{# Change the owner #}
-{% if data.datowner %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
-{% endif %}
-{# Change the comments/description #}
-{% if data.comments is defined %}
-COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
-    IS {{ data.comments|qtLiteral }};
-{% endif %}
-{# Change the connection limit #}
-{% if data.datconnlimit %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
-{% endif %}
 {# Change the security labels #}
 {% if data.seclabels and data.seclabels|length > 0 %}
 {% set seclabels = data.seclabels %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_offline.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_offline.sql
index afebb6c..59f9e59 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_offline.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_offline.sql
@@ -1,6 +1,20 @@
 {% if data %}
-{% if action == "rename_database" and data.old_name != data.name %}
+{% if action == "rename_database" %} {% if data.old_name != data.name %}
 ALTER DATABASE {{ conn|qtIdent(data.old_name) }} RENAME TO {{ conn|qtIdent(data.name) }};
+{% endif %}
+{# Change the owner #}
+{% if data.datowner %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
+{% endif %}
+{# Change the comments/description #}
+{% if data.comments is defined %}
+COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
+IS {{ data.comments|qtLiteral }};
+{% endif %}
+{# Change the connection limit #}
+{% if data.datconnlimit %}
+ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
+{% endif %}
 {% endif %}{% if action == "tablespace" and  data.spcname %}
 
 ALTER DATABASE {{ conn|qtIdent(data.name) }} SET TABLESPACE {{ conn|qtIdent(data.spcname) }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_online.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_online.sql
index 71f516a..7e5e0c3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_online.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/alter_online.sql
@@ -3,19 +3,6 @@
 {% import 'macros/privilege.macros' as PRIVILEGE %}
 {% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
 {% if data %}
-{# Change the owner #}
-{% if data.datowner %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} OWNER TO {{ conn|qtIdent(data.datowner) }};
-{% endif %}
-{# Change the comments/description #}
-{% if data.comments is defined %}
-COMMENT ON DATABASE {{ conn|qtIdent(data.name) }}
-IS {{ data.comments|qtLiteral }};
-{% endif %}
-{# Change the connection limit #}
-{% if data.datconnlimit %}
-ALTER DATABASE {{ conn|qtIdent(data.name) }} WITH CONNECTION LIMIT = {{ data.datconnlimit }};
-{% endif %}
 {# Change the security labels #}
 {% if data.seclabels and data.seclabels|length > 0 %}
 {% set seclabels = data.seclabels %}
diff --git a/web/pgadmin/browser/templates/browser/js/node.js b/web/pgadmin/browser/templates/browser/js/node.js
index 30c575f..7b2b5d3 100644
--- a/web/pgadmin/browser/templates/browser/js/node.js
+++ b/web/pgadmin/browser/templates/browser/js/node.js
@@ -126,7 +126,15 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) {
             name: 'show_query_tool', node: self.type, module: self,
             applies: ['context'], callback: 'show_query_tool',
             priority: 998, label: '{{ _("Query Tool...") }}',
-            icon: 'fa fa-bolt'
+            icon: 'fa fa-bolt',
+            enable: function(itemData, item, data) {
+              if (itemData._type == 'database' && itemData.allowConn)
+                return true;
+              else if(itemData._type != 'database')
+                return true;
+              else
+                return false;
+            }
           }]);
         }
       }
@@ -164,6 +172,11 @@ function($, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) {
       if (itemData._type == 'server-group' || itemData._type == 'server') {
         return false;
       }
+
+      // Do not display the menu if the database connection is not allowed
+      if (itemData._type == 'database' && !itemData.allowConn)
+        return false;
+
       var node = pgBrowser.Nodes[itemData._type],
         parentData = node.getTreeNodeHierarchy(item);
       if ( _.indexOf(['create','insert','update', 'delete'], data.script) != -1) {
diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py
index 7ccf353..fbce374 100644
--- a/web/pgadmin/dashboard/__init__.py
+++ b/web/pgadmin/dashboard/__init__.py
@@ -16,7 +16,8 @@ from flask import render_template, url_for, Response, g
 from flask_babel import gettext
 from flask_security import login_required
 from pgadmin.utils import PgAdminModule
-from pgadmin.utils.ajax import make_response as ajax_response, internal_server_error
+from pgadmin.utils.ajax import make_response as ajax_response,\
+    internal_server_error
 from pgadmin.utils.ajax import precondition_required
 from pgadmin.utils.driver import get_driver
 from pgadmin.utils.menu import Panel
@@ -68,7 +69,8 @@ class DashboardModule(PgAdminModule):
         Register preferences for this module.
         """
         # Register options for the PG and PPAS help paths
-        self.dashboard_preference = Preferences('dashboards', gettext('Dashboards'))
+        self.dashboard_preference = Preferences('dashboards',
+                                                gettext('Dashboards'))
 
         self.session_stats_refresh = self.dashboard_preference.register(
             'dashboards', 'session_stats_refresh',
@@ -133,9 +135,31 @@ def check_precondition(f):
 
         # If DB not connected then return error to browser
         if not g.conn.connected():
-            return precondition_required(
-                gettext("Connection to the server has been lost.")
-            )
+            if f.__name__ in ['activity', 'prepared', 'locks', 'config']:
+                return precondition_required(
+                    gettext("Please connect to the selected server"
+                            " to view the table.")
+                )
+            else:
+                return precondition_required(
+                    gettext("Please connect to the selected server"
+                            " to view the graph.")
+                )
+
+        if 'did' in kwargs:
+            db_conn = g.manager.connection(did=kwargs['did'])
+            # If the selected DB not connected then return error to browser
+            if not db_conn.connected():
+                if f.__name__ in ['activity', 'prepared', 'locks', 'config']:
+                    return precondition_required(
+                        gettext("Please connect to the selected database"
+                                " to view the table.")
+                    )
+                else:
+                    return precondition_required(
+                        gettext("Please connect to the selected database to"
+                                " view the graph.")
+                    )
 
         # Set template path for sql scripts
         g.server_type = g.manager.server_type
@@ -155,7 +179,8 @@ def check_precondition(f):
 @login_required
 def script():
     """render the required javascript"""
-    return Response(response=render_template("dashboard/js/dashboard.js", _=gettext),
+    return Response(response=render_template("dashboard/js/dashboard.js",
+                                             _=gettext),
                     status=200,
                     mimetype="application/javascript")
 
@@ -204,9 +229,16 @@ def index(sid=None, did=None):
     if sid is None and did is None:
         return render_template('/dashboard/welcome_dashboard.html')
     if did is None:
-        return render_template('/dashboard/server_dashboard.html', sid=sid, rates=rates, version=g.version)
+        return render_template('/dashboard/server_dashboard.html',
+                               sid=sid,
+                               rates=rates,
+                               version=g.version)
     else:
-        return render_template('/dashboard/database_dashboard.html', sid=sid, did=did, rates=rates, version=g.version)
+        return render_template('/dashboard/database_dashboard.html',
+                               sid=sid,
+                               did=did,
+                               rates=rates,
+                               version=g.version)
 
 
 def get_data(sid, did, template):
diff --git a/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js b/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
index 2f97138..1e85754 100644
--- a/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
+++ b/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
@@ -217,9 +217,13 @@ function(r, $, pgAdmin, _, Backbone) {
                         pgAdmin.Dashboard.render_chart(container, data, dataset, sid, did, url, options, counter, refresh);
                     },
                     error: function (xhr, status, msg) {
+                        var err = $.parseJSON(xhr.responseText),
+                            msg = err.errormsg
                         // If we get a 428, it means the server isn't connected
                         if (xhr.status == 428) {
-                            msg = '{{ gettext('Please connect to the selected server to view the graph.') }}';
+                            if (_.isUndefined(msg) || _.isNull(msg)) {
+                              msg = '{{ gettext('Please connect to the selected server to view the graph.') }}';
+                            }
                             cls = 'info';
                         } else {
                             msg = '{{ gettext('An error occurred whilst rendering the graph.') }}';
@@ -325,9 +329,13 @@ function(r, $, pgAdmin, _, Backbone) {
                     filter.search();
                 },
                 error: function(model, xhr, options) {
+                     var err = $.parseJSON(xhr.responseText),
+                         msg = err.errormsg
                     // If we get a 428, it means the server isn't connected
                     if (xhr.status == 428) {
-                        msg = '{{ gettext('Please connect to the selected server to view the table.') }}';
+                        if (_.isUndefined(msg) || _.isNull(msg)) {
+                            msg = '{{ gettext('Please connect to the selected server to view the table.') }}';
+                        }
                         cls = 'info';
                     } else {
                         msg = '{{ gettext('An error occurred whilst rendering the table.') }}';
diff --git a/web/pgadmin/tools/backup/templates/backup/js/backup.js b/web/pgadmin/tools/backup/templates/backup/js/backup.js
index 9d86386..f1a29d1 100644
--- a/web/pgadmin/tools/backup/templates/backup/js/backup.js
+++ b/web/pgadmin/tools/backup/templates/backup/js/backup.js
@@ -285,11 +285,19 @@ TODO LIST FOR BACKUP:
           var t = pgBrowser.tree, i = item, d = itemData;
           var parent_item = t.hasParent(i) ? t.parent(i): null,
               parent_data = parent_item ? t.itemData(parent_item) : null;
-            if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data))
-              return (
-                (_.indexOf(backup_supported_nodes, d._type) !== -1 &&
-                parent_data._type != 'catalog') ? true: false
-              );
+            if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
+                if (_.indexOf(backup_supported_nodes, d._type) !== -1 &&
+                parent_data._type != 'catalog') {
+                    if (d._type == 'database' && d.allowConn)
+                      return true;
+                    else if(d._type != 'database')
+                      return true;
+                    else
+                      return false;
+                }
+                else
+                  return false;
+            }
             else
               return false;
         };
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
index 93e9b2f..59d10f5 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
@@ -56,7 +56,14 @@ define(
          */
         query_tool_menu_enabled = function(obj) {
           if(!_.isUndefined(obj) && !_.isNull(obj))
-            return (_.indexOf(unsupported_nodes, obj._type) !== -1 ? false: true);
+            if(_.indexOf(unsupported_nodes, obj._type) == -1) {
+              if (obj._type == 'database' && obj.allowConn)
+                return true;
+              else if(obj._type != 'database')
+                return true;
+              else
+                return false;
+             }
           else
             return false;
         };
diff --git a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
index 79c02c3..de4b7a3 100644
--- a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
+++ b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
@@ -155,8 +155,19 @@ define([
               var t = pgBrowser.tree, i = item, d = itemData;
               var parent_item = t.hasParent(i) ? t.parent(i): null,
                   parent_data = parent_item ? t.itemData(parent_item) : null;
-              if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data))
-                return ((_.indexOf(supported_nodes, d._type) !== -1 && parent_data._type != 'catalog') ? true: false);
+              if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
+                if (_.indexOf(supported_nodes, d._type) !== -1 &&
+                  parent_data._type != 'catalog') {
+                    if (d._type == 'database' && d.allowConn)
+                      return true;
+                    else if(d._type != 'database')
+                      return true;
+                    else
+                      return false;
+                }
+                else
+                  return false;
+              }
               else
                 return false;
             };
diff --git a/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js b/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
index 5fcf70c..0466e74 100644
--- a/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
+++ b/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
@@ -154,11 +154,19 @@ define(
          var t = pgBrowser.tree, i = item, d = itemData;
          var parent_item = t.hasParent(i) ? t.parent(i): null,
              parent_data = parent_item ? t.itemData(parent_item) : null;
-           if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data))
-             return (
-               (_.indexOf(maintenance_supported_nodes, d._type) !== -1 &&
-               parent_data._type != 'catalog') ? true: false
-             );
+           if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
+             if (_.indexOf(maintenance_supported_nodes, d._type) !== -1 &&
+               parent_data._type != 'catalog') {
+               if (d._type == 'database' && d.allowConn)
+                 return true;
+               else if(d._type != 'database')
+                 return true;
+               else
+                 return false;
+              }
+              else
+                return false;
+           }
            else
              return false;
         };
diff --git a/web/pgadmin/tools/restore/templates/restore/js/restore.js b/web/pgadmin/tools/restore/templates/restore/js/restore.js
index 7064fa3..b76927c 100644
--- a/web/pgadmin/tools/restore/templates/restore/js/restore.js
+++ b/web/pgadmin/tools/restore/templates/restore/js/restore.js
@@ -240,11 +240,19 @@ define([
           var t = pgBrowser.tree, i = item, d = itemData;
           var parent_item = t.hasParent(i) ? t.parent(i): null,
               parent_data = parent_item ? t.itemData(parent_item) : null;
-            if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data))
-              return (
-                (_.indexOf(restore_supported_nodes, d._type) !== -1 &&
-                is_parent_catalog(itemData, item, data) ) ? true: false
-              );
+            if(!_.isUndefined(d) && !_.isNull(d) && !_.isNull(parent_data)) {
+              if (_.indexOf(restore_supported_nodes, d._type) !== -1 &&
+                is_parent_catalog(itemData, item, data) ) {
+                  if (d._type == 'database' && d.allowConn)
+                    return true;
+                  else if(d._type != 'database')
+                    return true;
+                  else
+                    return false;
+              }
+              else
+                return false;
+            }
             else
               return false;
         };
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to