Added shared server support for admin users. Fixes #4979

This commit is contained in:
Pradip Parkale
2020-09-03 12:59:28 +05:30
committed by Akshay Joshi
parent 3e35dc95e5
commit b562ab7681
37 changed files with 2526 additions and 431 deletions

View File

@@ -56,7 +56,12 @@ define('pgadmin.node.server', [
type: 'server',
dialogHelp: url_for('help.static', {'filename': 'server_dialog.html'}),
label: gettext('Server'),
canDrop: true,
canDrop: function(node){
var serverOwner = node.user_id;
if (serverOwner != current_user.id)
return false;
return true;
},
dropAsRemove: true,
dropPriority: 5,
hasStatistics: true,
@@ -75,12 +80,12 @@ define('pgadmin.node.server', [
name: 'create_server_on_sg', node: 'server_group', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 1, label: gettext('Server...'),
data: {action: 'create'}, icon: 'wcTabIcon icon-server',
data: {action: 'create'}, icon: 'wcTabIcon icon-server', enable: 'canCreate',
},{
name: 'create_server', node: 'server', module: this,
applies: ['object', 'context'], callback: 'show_obj_properties',
category: 'create', priority: 3, label: gettext('Server...'),
data: {action: 'create'}, icon: 'wcTabIcon icon-server',
data: {action: 'create'}, icon: 'wcTabIcon icon-server', enable: 'canCreate',
},{
name: 'connect_server', node: 'server', module: this,
applies: ['object', 'context'], callback: 'connect_server',
@@ -150,6 +155,13 @@ define('pgadmin.node.server', [
is_not_connected: function(node) {
return (node && node.connected != true);
},
canCreate: function(node){
var serverOwner = node.user_id;
if (serverOwner == current_user.id || _.isUndefined(serverOwner))
return true;
return false;
},
is_connected: function(node) {
return (node && node.connected == true);
},
@@ -226,28 +238,25 @@ define('pgadmin.node.server', [
d = t.itemData(i);
t.removeIcon(i);
d.connected = false;
d.icon = 'icon-server-not-connected';
if (d.shared){
d.icon = 'icon-shared-server-not-connected';
}else{
d.icon = 'icon-server-not-connected';
}
t.addIcon(i, {icon: d.icon});
obj.callbacks.refresh.apply(obj, [null, i]);
if (pgBrowser.serverInfo && d._id in pgBrowser.serverInfo) {
delete pgBrowser.serverInfo[d._id];
}
pgBrowser.enable_disable_menus(i);
// Trigger server disconnect event
pgBrowser.Events.trigger(
'pgadmin:server:disconnect',
{item: i, data: d}, false
);
}
else {
try {
Alertify.error(res.errormsg);
} catch (e) {
console.warn(e.stack || e);
else {
try {
Alertify.error(res.errormsg);
} catch (e) {
console.warn(e.stack || e);
}
t.unload(i);
}
t.unload(i);
}
})
}})
.fail(function(xhr, status, error) {
Alertify.pgRespErrorNotify(xhr, error);
t.unload(i);
@@ -735,6 +744,7 @@ define('pgadmin.node.server', [
// Default values!
initialize: function(attrs, args) {
var isNew = (_.size(attrs) === 0);
console.warn('warn');
if (isNew) {
this.set({'gid': args.node_info['server_group']._id});
@@ -745,12 +755,17 @@ define('pgadmin.node.server', [
id: 'id', label: gettext('ID'), type: 'int', mode: ['properties'],
},{
id: 'name', label: gettext('Name'), type: 'text',
mode: ['properties', 'edit', 'create'],
},{
mode: ['properties', 'edit', 'create'], disabled: 'isShared',
},
{
id: 'gid', label: gettext('Server group'), type: 'int',
control: 'node-list-by-id', node: 'server_group',
mode: ['create', 'edit'], select2: {allowClear: false},
},{
mode: ['create', 'edit'], select2: {allowClear: false}, visible: 'isVisible',
},
{
id: 'server_owner', label: gettext('Shared Server Owner'), type: 'text', mode: ['properties'],
},
{
id: 'server_type', label: gettext('Server type'), type: 'options',
mode: ['properties'], visible: 'isConnected',
'options': supported_servers,
@@ -773,11 +788,27 @@ define('pgadmin.node.server', [
id: 'connect_now', controlLabel: gettext('Connect now?'), type: 'checkbox',
group: null, mode: ['create'],
},{
id: 'shared', label: gettext('Shared with all?'), type: 'switch',
mode: ['properties', 'create', 'edit'], 'options': {'size': 'mini'},
readonly: function(model){
var serverOwner = model.attributes.user_id;
if (!model.isNew() && serverOwner != current_user.id){
return true;
}
return false;
},visible: function(){
if (current_user.is_admin && pgAdmin.server_mode == 'True')
return true;
return false;
},
},
{
id: 'comment', label: gettext('Comments'), type: 'multiline', group: null,
mode: ['properties', 'edit', 'create'],
},{
id: 'host', label: gettext('Host name/address'), type: 'text', group: gettext('Connection'),
mode: ['properties', 'edit', 'create'],
mode: ['properties', 'edit', 'create'],disabled: 'isShared',
control: Backform.InputControl.extend({
onChange: function() {
Backform.InputControl.prototype.onChange.apply(this, arguments);
@@ -798,7 +829,7 @@ define('pgadmin.node.server', [
}),
},{
id: 'port', label: gettext('Port'), type: 'int', group: gettext('Connection'),
mode: ['properties', 'edit', 'create'], min: 1, max: 65535,
mode: ['properties', 'edit', 'create'], min: 1, max: 65535, disabled: 'isShared',
control: Backform.InputControl.extend({
onChange: function() {
Backform.InputControl.prototype.onChange.apply(this, arguments);
@@ -819,7 +850,7 @@ define('pgadmin.node.server', [
}),
},{
id: 'db', label: gettext('Maintenance database'), type: 'text', group: gettext('Connection'),
mode: ['properties', 'edit', 'create'], readonly: 'isConnected',
mode: ['properties', 'edit', 'create'], readonly: 'isConnected',disabled: 'isShared',
},{
id: 'username', label: gettext('Username'), type: 'text', group: gettext('Connection'),
mode: ['properties', 'edit', 'create'],
@@ -1057,6 +1088,21 @@ define('pgadmin.node.server', [
mode: ['properties', 'edit', 'create'], readonly: 'isConnected',
min: 0,
}],
isVisible: function(model){
var serverOwner = model.attributes.user_id;
if (!model.isNew() && serverOwner != current_user.id){
return false;
}
return true;
},
isShared: function(model){
var serverOwner = model.attributes.user_id;
if (!model.isNew() && serverOwner != current_user.id && model.attributes.shared){
return true;
}
return false;
},
validate: function() {
const validateModel = new modelValidation.ModelValidation(this);
return validateModel.validate();
@@ -1153,7 +1199,36 @@ define('pgadmin.node.server', [
}
},
});
var connect_to_server = function(obj, data, tree, item, reconnect) {
// Open properties dialog in edit mode
const selectedTreeNode = tree.selected().length > 0 ? tree.selected() : tree.first();
const selectedTreeNodeData = selectedTreeNode && selectedTreeNode.length === 1 ? tree.itemData(selectedTreeNode) : undefined;
var server_url = obj.generate_url(item, 'obj', data, true);
// Fetch the updated data
$.get(server_url)
.done(function(res) {
if (res.shared && _.isNull(res.username) && data.user_id != current_user.id){
if (selectedTreeNodeData._type == 'server'){
pgAdmin.Browser.Node.callbacks.show_obj_properties.call(
pgAdmin.Browser.Nodes[tree.itemData(item)._type], {action: 'edit'}
);
data.is_connecting = false;
tree.unload(item);
tree.setInode(item);
tree.addIcon(item, {icon: 'icon-shared-server-not-connected'});
}else{
data.is_connecting = false;
tree.unload(item);
tree.setInode(item);
tree.addIcon(item, {icon: 'icon-shared-server-not-connected'});
}
}
return;
}).always(function(){
data.is_connecting = false;
});
var wasConnected = reconnect || data.connected,
onFailure = function(
xhr, status, error, _node, _data, _tree, _item, _wasConnected
@@ -1164,7 +1239,12 @@ define('pgadmin.node.server', [
// Let's not change the status of the tree node now.
if (!_wasConnected) {
tree.setInode(_item);
tree.addIcon(_item, {icon: 'icon-server-not-connected'});
if (data.shared){
tree.addIcon(_item, {icon: 'icon-shared-server-not-connected'});
}else{
tree.addIcon(_item, {icon: 'icon-server-not-connected'});
}
}
Alertify.pgNotifier('error', xhr, error, function(msg) {
@@ -1321,7 +1401,11 @@ define('pgadmin.node.server', [
_tree.unload(_item);
_tree.setInode(_item);
_tree.removeIcon(_item);
_tree.addIcon(_item, {icon: 'icon-server-not-connected'});
if (_data.shared){
_tree.addIcon(_item, {icon: 'icon-shared-server-not-connected'});
}else{
_tree.addIcon(_item, {icon: 'icon-server-not-connected'});
}
obj.trigger('connect:cancelled', data._id, data.db, obj, _item, _data);
pgBrowser.Events.trigger(
'pgadmin:server:connect:cancelled', data._id, _item, _data, obj
@@ -1387,7 +1471,11 @@ define('pgadmin.node.server', [
})
.fail(function(xhr, status, error) {
tree.setInode(item);
tree.addIcon(item, {icon: 'icon-server-not-connected'});
if (data.shared){
tree.addIcon(item, {icon: 'icon-shared-server-not-connected'});
}else{
tree.addIcon(item, {icon: 'icon-server-not-connected'});
}
Alertify.pgRespErrorNotify(xhr, error);
});
};