mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Added shared server support for admin users. Fixes #4979
This commit is contained in:
committed by
Akshay Joshi
parent
3e35dc95e5
commit
b562ab7681
@@ -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);
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user