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

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F2F2F2;}
.st1{fill:#9BA5B0;}
.st2{fill:none;stroke:#9BA5B0;stroke-width:0.75;stroke-miterlimit:1;}
.st3{fill:#F7F7F7;}
.st4{fill:#354A5F;}
.st5{fill:none;stroke:#D0021B;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;}
</style>
<g>
<path class="st0" d="M6.7,2.1h4.6c0.6,0,1.1,0.5,1.1,1.1v0.8c0,0.6-0.5,1.1-1.1,1.1H6.7c-0.6,0-1.1-0.5-1.1-1.1V3.2
C5.6,2.6,6.1,2.1,6.7,2.1z"/>
<path class="st1" d="M11.3,2.5c0.4,0,0.8,0.3,0.8,0.8v0.8c0,0.4-0.3,0.8-0.8,0.8H6.7C6.3,4.8,6,4.5,6,4.1V3.2
c0-0.4,0.3-0.7,0.8-0.7H11.3 M11.3,1.7H6.7c-0.8,0-1.5,0.7-1.5,1.5v0.8c0,0.8,0.7,1.5,1.5,1.5h4.6c0.8,0,1.5-0.7,1.5-1.5V3.2
C12.8,2.4,12.1,1.7,11.3,1.7L11.3,1.7z"/>
<line class="st2" x1="8.9" y1="3.6" x2="6.8" y2="3.6"/>
<path class="st0" d="M6.7,5.2h4.6c0.6,0,1.1,0.5,1.1,1.1v0.8c0,0.6-0.5,1.1-1.1,1.1H6.7c-0.6,0-1.1-0.5-1.1-1.1V6.3
C5.6,5.7,6.1,5.2,6.7,5.2z"/>
<path class="st1" d="M11.3,5.6c0.4,0,0.8,0.3,0.8,0.8v0.8c0,0.4-0.3,0.8-0.8,0.8H6.7C6.3,7.9,6,7.6,6,7.1V6.3
c0-0.4,0.3-0.7,0.8-0.7H11.3 M11.3,4.8H6.7c-0.8,0-1.5,0.7-1.5,1.5v0.8c0,0.8,0.7,1.5,1.5,1.5h4.6c0.8,0,1.5-0.7,1.5-1.5V6.3
C12.8,5.5,12.1,4.8,11.3,4.8L11.3,4.8z"/>
<line class="st2" x1="8.9" y1="6.7" x2="6.8" y2="6.7"/>
<path class="st0" d="M6.7,8.3h4.6c0.6,0,1.1,0.5,1.1,1.1v0.9c0,0.6-0.5,1.1-1.1,1.1c0,0,0,0,0,0H6.7c-0.6,0-1.1-0.5-1.1-1.1l0,0
V9.4C5.6,8.8,6.1,8.3,6.7,8.3C6.7,8.3,6.7,8.3,6.7,8.3z"/>
<path class="st1" d="M11.3,8.7c0.4,0,0.8,0.3,0.8,0.8v0.8c0,0.4-0.3,0.8-0.8,0.8H6.7C6.3,11,6,10.7,6,10.3V9.4C6,9,6.3,8.7,6.7,8.7
H11.3 M11.3,7.9H6.7c-0.8,0-1.5,0.7-1.5,1.5v0.8c0,0.8,0.7,1.5,1.5,1.5h4.6c0.8,0,1.5-0.7,1.5-1.5V9.4C12.8,8.6,12.1,7.9,11.3,7.9z
"/>
<line class="st2" x1="8.9" y1="9.8" x2="6.8" y2="9.8"/>
</g>
<path class="st3" d="M11.6,10.5c-0.6,0.3-0.8,0.1-1.1-0.2c-0.1-0.2-0.3-0.4-0.6-0.5L7.1,8.5C6.8,8.4,6.4,8.3,6.1,8.3
C5.1,8.1,4.2,8.4,3.4,9l-1.4,1.1v2.7h0.9v-0.2l3.7,1.8c0.4,0.2,0.7,0.3,1.1,0.3c0.3,0,0.7-0.1,1-0.2l6.1-2.6
c0.3-0.1,0.6-0.4,0.7-0.7c0.1-0.3,0.1-0.7,0-1c-0.3-0.6-1.1-0.9-1.7-0.6l-0.4,0.2L11.6,10.5"/>
<path class="st4" d="M15.5,10.2c-0.3-0.6-1.1-0.9-1.7-0.6l-0.4,0.2l-1.8,0.8l0.3,0.8l1.8-0.8l0.4-0.2c0.2-0.1,0.5,0,0.6,0.2
c0.1,0.1,0.1,0.2,0,0.3c0,0.1-0.1,0.2-0.2,0.2l-6.1,2.6c-0.5,0.2-1,0.2-1.4,0l-4.1-2v-1.2l1-0.8C4.5,9.2,5.2,9,6,9.1
c0.3,0,0.6,0.1,0.8,0.2l2.8,1.2c0.1,0,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.3,0,0.4c0,0,0,0.1-0.1,0.1c-0.1,0.1-0.3,0.2-0.5,0.1l-2.2-1
l-0.4,0.8l2.2,1c0.2,0.1,0.4,0.1,0.5,0.1c0.4,0,0.7-0.2,1-0.4c0.1-0.1,0.2-0.2,0.2-0.3c0.2-0.4,0.1-0.9-0.1-1.2
c-0.1-0.2-0.3-0.4-0.6-0.5L7.1,8.5C6.8,8.4,6.4,8.3,6.1,8.3C5.1,8.1,4.2,8.4,3.4,9L2.9,9.4V9.3c0-0.6-0.4-1-1-1H1.4
c-0.6,0-1,0.4-1,1v4.1c0,0.6,0.4,1,1,1h0.5c0.6,0,1-0.4,1-1v-0.6h0v-0.2l3.7,1.8c0.4,0.2,0.7,0.3,1.1,0.3c0.3,0,0.7-0.1,1-0.2
l6.1-2.6c0.3-0.1,0.6-0.4,0.7-0.7C15.7,10.9,15.7,10.5,15.5,10.2z M1.9,13.4H1.4V9.3h0.5L1.9,13.4z"/>
<line class="st5" x1="13.8" y1="1.3" x2="10.8" y2="4.3"/>
<line class="st5" x1="13.8" y1="4.3" x2="10.8" y2="1.3"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

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);
});
};