Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 66 additions & 60 deletions web/pgadmin/browser/server_groups/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,14 @@
get_server_groups_for_user


def get_icon_css_class(group_id, group_user_id,
default_val='icon-server_group'):
def get_icon_css_class(is_shared_group, default_val='icon-server_group'):
"""
Returns css value
:param group_id:
:param group_user_id:
:param is_shared_group:
:param default_val:
:return: default_val
"""
if (config.SERVER_MODE and
group_user_id != current_user.id and
ServerGroupModule.has_shared_server(group_id)):
if (config.SERVER_MODE and is_shared_group):
default_val = 'icon-server_group_shared'
return default_val, True

Expand All @@ -66,39 +62,24 @@ def csssnippets(self):

return snippets

@staticmethod
def has_shared_server(gid):
"""
To check whether given server group contains shared server or not
:param gid:
:return: True if servergroup contains shared server else false
"""
servers = Server.query.filter_by(servergroup_id=gid)
for s in servers:
if s.shared:
return True
return False

def get_nodes(self, *arg, **kwargs):
"""Return a JSON document listing the server groups for the user"""

if config.SERVER_MODE:
groups = ServerGroupView.get_all_server_groups()
else:
groups = ServerGroup.query.filter_by(
user_id=current_user.id
).order_by("id")
groups = ServerGroupView.get_all_server_groups()

for idx, group in enumerate(groups):
icon_class, is_shared = get_icon_css_class(group.id, group.user_id)
for group in groups:
icon_class, is_shared = get_icon_css_class(group.is_shared_group)
yield self.generate_browser_node(
"%d" % (group.id), None,
"%d" % (group.id),
None,
group.name,
icon_class,
True,
self.node_type,
can_delete=True if idx > 0 else False,
user_id=group.user_id,
can_delete=(
not (group.is_first_user_group or group.is_shared_group)
),
can_edit=(not group.is_shared_group),
is_shared=is_shared
)

Expand Down Expand Up @@ -202,6 +183,7 @@ def delete(self, gid):
success=0,
errormsg=gettext(
'The specified server group cannot be deleted.'
' Shared servers are present in this group.'
)
)

Expand All @@ -211,6 +193,7 @@ def delete(self, gid):
success=0,
errormsg=gettext(
'The specified server group cannot be deleted.'
' The first server group is not deletable.'
)
)

Expand Down Expand Up @@ -239,10 +222,8 @@ def delete(self, gid):
def update(self, gid):
"""Update the server-group properties"""

# There can be only one record at most
servergroup = ServerGroup.query.filter_by(
user_id=current_user.id,
id=gid).first()
# There can be only one record at most (only owned)
servergroup = get_server_group(gid, hide_shared=True)

data = request.form if request.form else json.loads(
request.data
Expand All @@ -259,18 +240,20 @@ def update(self, gid):
if 'name' in data:
servergroup.name = data['name']
db.session.commit()

except exc.IntegrityError:
db.session.rollback()
return bad_request(gettext(
"The specified server group already exists."
))

except Exception as e:
db.session.rollback()
return make_json_response(
status=410, success=0, errormsg=str(e)
)

icon_class, is_shared = get_icon_css_class(gid, servergroup.user_id)
icon_class, is_shared = get_icon_css_class(servergroup.is_shared_group)
return jsonify(
node=self.blueprint.generate_browser_node(
gid,
Expand All @@ -279,7 +262,13 @@ def update(self, gid):
icon_class,
True,
self.node_type,
can_delete=True, # This is user created hence can delete
can_delete=(
not (
servergroup.is_first_user_group or
servergroup.is_shared_group
)
),
can_edit=(not servergroup.is_shared_group),
is_shared=is_shared
)
)
Expand Down Expand Up @@ -315,12 +304,17 @@ def create(self):
user_id=current_user.id,
name=data['name'])
db.session.add(sg)
db.session.flush()
group_id = sg.id
db.session.commit()

# Reload with access metadata attached
sg = get_server_group(group_id)

data['id'] = sg.id
data['name'] = sg.name

icon_class, is_shared = get_icon_css_class(sg.id, sg.user_id)
icon_class, is_shared = get_icon_css_class(sg.is_shared_group)
return jsonify(
node=self.blueprint.generate_browser_node(
"%d" % sg.id,
Expand All @@ -329,8 +323,13 @@ def create(self):
icon_class,
True,
self.node_type,
# This is user created hence can deleted
can_delete=True,
can_delete=(
not (
sg.is_first_user_group or
sg.is_shared_group
)
),
can_edit=(not sg.is_shared_group),
is_shared=is_shared
)
)
Expand Down Expand Up @@ -385,35 +384,28 @@ def get_all_server_groups():
# Don't display shared server if user has
# selected 'Hide shared server'
pref = Preferences.module('browser')
hide_shared_server = pref.preference('hide_shared_server').get()

server_groups = get_server_groups_for_user()

if hide_shared_server:
groups = []
for group in server_groups:
if group.user_id != current_user.id and \
ServerGroupModule.has_shared_server(group.id):
continue
groups.append(group)
return groups
pref_item = pref.preference('hide_shared_server')
hide_shared_server = (
pref_item.get() if pref_item is not None else False
)

return server_groups
return get_server_groups_for_user(hide_shared_server)

@pga_login_required
def nodes(self, gid=None):
"""Return a JSON document listing the server groups for the user"""
nodes = []
if gid is None:
if config.SERVER_MODE:

groups = self.get_all_server_groups()

else:
groups = ServerGroup.query.filter_by(user_id=current_user.id)
groups = get_server_groups_for_user(hide_shared=True)

for group in groups:
icon_class, is_shared = get_icon_css_class(group.id,
group.user_id)
icon_class, is_shared = get_icon_css_class(
group.is_shared_group
)
nodes.append(
self.blueprint.generate_browser_node(
"%d" % group.id,
Expand All @@ -422,6 +414,13 @@ def nodes(self, gid=None):
icon_class,
True,
self.node_type,
can_delete=(
not (
group.is_first_user_group or
group.is_shared_group
)
),
can_edit=(not group.is_shared_group),
is_shared=is_shared
)
)
Expand All @@ -433,14 +432,21 @@ def nodes(self, gid=None):
errormsg=gettext("Could not find the server group.")
)

icon_class, is_shared = get_icon_css_class(group.id,
group.user_id)
icon_class, is_shared = get_icon_css_class(group.is_shared_group)
nodes = self.blueprint.generate_browser_node(
"%d" % (group.id), None,
"%d" % (group.id),
None,
group.name,
icon_class,
True,
self.node_type,
can_delete=(
not (
group.is_first_user_group or
group.is_shared_group
)
),
can_edit=(not group.is_shared_group),
is_shared=is_shared
)

Expand Down
16 changes: 6 additions & 10 deletions web/pgadmin/browser/server_groups/static/js/server_group.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
//
//////////////////////////////////////////////////////////////
import ServerGroupSchema from './server_group.ui';
import _ from 'lodash';

define('pgadmin.node.server_group', [
'sources/gettext', 'sources/url_for',
'sources/pgadmin', 'pgadmin.user_management.current_user', 'pgadmin.browser', 'pgadmin.browser.node',
], function(gettext, url_for, pgAdmin, current_user) {
'sources/pgadmin', 'pgadmin.browser', 'pgadmin.browser.node',
], function(gettext, url_for, pgAdmin) {
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!pgAdmin.Browser.Nodes['server_group']) {
pgAdmin.Browser.Nodes['server_group'] = pgAdmin.Browser.Node.extend({
Expand All @@ -39,17 +38,14 @@ define('pgadmin.node.server_group', [
}]);
},
getSchema: ()=>new ServerGroupSchema(),
canEdit: function(itemData) {
return (itemData && itemData.can_edit);
},
canDrop: function(itemData) {
let serverOwner = itemData.user_id;
return !(serverOwner != current_user.id && !_.isUndefined(serverOwner));
return (itemData && itemData.can_delete);
},
dropAsRemove: true,
canDelete: function(i) {
let s = pgAdmin.Browser.tree.siblings(i, true);

/* This is the only server group - we can't remove it*/
return !(!s || s.length == 0);
},
});
}

Expand Down
Loading