mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Introduced a mechanism to load required javascripts at runtime
(lazy loading) using the require.js. This allows us to load the javascript required for any node, only when it was loaded in the browser tree. Also, introduced the mechanism to show/edit/create of any node in a tab panel (wcDocker.Panel).
This commit is contained in:
@@ -10,75 +10,45 @@
|
||||
|
||||
from abc import ABCMeta, abstractmethod
|
||||
import traceback
|
||||
from flask import Blueprint, Response, current_app, request, render_template
|
||||
import json
|
||||
from flask import request, render_template, make_response, jsonify
|
||||
from flask.ext.babel import gettext
|
||||
from flask.ext.security import current_user, login_required
|
||||
from pgadmin import current_blueprint
|
||||
from pgadmin.utils.ajax import make_json_response
|
||||
from pgadmin.utils.ajax import make_json_response, \
|
||||
make_response as ajax_response
|
||||
from pgadmin.browser import BrowserPluginModule
|
||||
from pgadmin.utils.menu import MenuItem
|
||||
from pgadmin.settings.settings_model import db, ServerGroup
|
||||
from pgadmin.browser.utils import generate_browser_node
|
||||
import config
|
||||
|
||||
|
||||
class ServerGroupModule(BrowserPluginModule):
|
||||
|
||||
NODE_TYPE = "server-group"
|
||||
|
||||
def get_own_menuitems(self):
|
||||
return {
|
||||
'standard_items': [
|
||||
ServerGroupMenuItem(action="drop", priority=10, function="drop_server_group"),
|
||||
ServerGroupMenuItem(action="rename", priority=10, function="rename_server_group")
|
||||
],
|
||||
'create_items': [
|
||||
ServerGroupMenuItem(name="create_server_group",
|
||||
label=gettext('Server Group...'),
|
||||
priority=10,
|
||||
function="create_server_group",
|
||||
types=[self.node_type])
|
||||
],
|
||||
'context_items': [
|
||||
ServerGroupMenuItem(name="delete_server_group",
|
||||
label=gettext('Delete server group'),
|
||||
priority=10,
|
||||
onclick='drop_server_group(item);'),
|
||||
ServerGroupMenuItem(name="rename_server_group",
|
||||
label=gettext('Rename server group...'),
|
||||
priority=10,
|
||||
onclick='rename_server_group(item);')
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@property
|
||||
def jssnippets(self):
|
||||
snippets = [render_template("server_groups/server_groups.js")]
|
||||
for module in self.submodules:
|
||||
snippets.extend(module.jssnippets)
|
||||
return snippets
|
||||
|
||||
def get_nodes(self, **kwargs):
|
||||
def get_nodes(self, *arg, **kwargs):
|
||||
"""Return a JSON document listing the server groups for the user"""
|
||||
groups = ServerGroup.query.filter_by(user_id=current_user.id)
|
||||
# TODO: Move this JSON generation to a Server method
|
||||
# this code is duplicated somewhere else
|
||||
for group in groups:
|
||||
yield generate_browser_node(
|
||||
group = self.generate_browser_node(
|
||||
"%d" % (group.id),
|
||||
None,
|
||||
group.name,
|
||||
"icon-%s" % self.node_type,
|
||||
True,
|
||||
self.node_type)
|
||||
True)
|
||||
yield group
|
||||
|
||||
@property
|
||||
def node_type(self):
|
||||
return self.NODE_TYPE
|
||||
|
||||
@property
|
||||
def script_load(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def node_path(self):
|
||||
return '/browser/' + self.node_type
|
||||
return BrowserPluginModule.browser_url_prefix + self.node_type
|
||||
|
||||
|
||||
class ServerGroupMenuItem(MenuItem):
|
||||
@@ -97,17 +67,25 @@ class ServerGroupPluginModule(BrowserPluginModule):
|
||||
|
||||
|
||||
@abstractmethod
|
||||
def get_nodes(self, servergroup):
|
||||
def get_nodes(self, *arg, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
@property
|
||||
def node_path(self):
|
||||
return '/browser/' + self.node_type
|
||||
return BrowserPluginModule.browser_url_prefix + self.node_type
|
||||
|
||||
|
||||
blueprint = ServerGroupModule( __name__, static_url_path='')
|
||||
|
||||
@blueprint.route('/module.js')
|
||||
@login_required
|
||||
def module():
|
||||
return make_response(
|
||||
render_template("server_groups/server_groups.js"),
|
||||
200, {'Content-Type': 'application/x-javascript'})
|
||||
|
||||
|
||||
# Initialise the module
|
||||
from pgadmin.browser.utils import NodeView
|
||||
|
||||
@@ -136,14 +114,16 @@ class ServerGroupView(NodeView):
|
||||
|
||||
if servergroup is None:
|
||||
return make_json_response(
|
||||
status=417,
|
||||
success=0,
|
||||
errormsg=gettext('The specified server group could not be found.'))
|
||||
else:
|
||||
try:
|
||||
db.session.delete(servergroup)
|
||||
for sg in servergroup:
|
||||
db.session.delete(sg)
|
||||
db.session.commit()
|
||||
except Exception as e:
|
||||
return make_json_response(success=0, errormsg=e.message)
|
||||
return make_json_response(status=410, success=0, errormsg=e.message)
|
||||
|
||||
return make_json_response(result=request.form)
|
||||
|
||||
@@ -156,17 +136,20 @@ class ServerGroupView(NodeView):
|
||||
user_id=current_user.id,
|
||||
id=gid).first()
|
||||
|
||||
data = request.form if request.form else json.loads(request.data)
|
||||
|
||||
if servergroup is None:
|
||||
return make_json_response(
|
||||
status=417,
|
||||
success=0,
|
||||
errormsg=gettext('The specified server group could not be found.'))
|
||||
else:
|
||||
try:
|
||||
if 'name' in request.form:
|
||||
servergroup.name = request.form['name']
|
||||
if u'name' in data:
|
||||
servergroup.name = data[u'name']
|
||||
db.session.commit()
|
||||
except Exception as e:
|
||||
return make_json_response(success=0, errormsg=e.message)
|
||||
return make_json_response(status=410, success=0, errormsg=e.message)
|
||||
|
||||
return make_json_response(result=request.form)
|
||||
|
||||
@@ -182,34 +165,47 @@ class ServerGroupView(NodeView):
|
||||
|
||||
if sg is None:
|
||||
return make_json_response(
|
||||
status=417,
|
||||
success=0,
|
||||
errormsg=gettext('The specified server group could not be found.'))
|
||||
else:
|
||||
return make_json_response(data={'id': sg.id, 'name': sg.name})
|
||||
return ajax_response(response={'id': sg.id, 'name': sg.name},
|
||||
status=200)
|
||||
|
||||
|
||||
def create(self):
|
||||
data = []
|
||||
if request.form['name'] != '':
|
||||
servergroup = ServerGroup(
|
||||
user_id=current_user.id,
|
||||
name=request.form['name'])
|
||||
data = request.form if request.form else json.loads(request.data)
|
||||
|
||||
if data[u'name'] != '':
|
||||
try:
|
||||
db.session.add(servergroup)
|
||||
sg = ServerGroup(
|
||||
user_id=current_user.id,
|
||||
name=data[u'name'])
|
||||
db.session.add(sg)
|
||||
db.session.commit()
|
||||
|
||||
data['id'] = servergroup.id
|
||||
data['name'] = servergroup.name
|
||||
data[u'id'] = sg.id
|
||||
data[u'name'] = sg.name
|
||||
|
||||
return jsonify(node=blueprint.generate_browser_node(
|
||||
"%d" % (sg.id),
|
||||
None,
|
||||
sg.name,
|
||||
"icon-%s" % self.node_type,
|
||||
True))
|
||||
except Exception as e:
|
||||
return make_json_response(success=0, errormsg=e.message)
|
||||
print 'except'
|
||||
return make_json_response(
|
||||
status=410,
|
||||
success=0,
|
||||
errormsg=e.message)
|
||||
|
||||
else:
|
||||
return make_json_response(
|
||||
status=417,
|
||||
success=0,
|
||||
errormsg=gettext('No server group name was specified'))
|
||||
|
||||
return make_json_response(data=data)
|
||||
|
||||
|
||||
def nodes(self, gid):
|
||||
"""Build a list of treeview nodes from the child nodes."""
|
||||
@@ -220,23 +216,23 @@ class ServerGroupView(NodeView):
|
||||
|
||||
|
||||
def sql(self, gid):
|
||||
return make_json_response(data='')
|
||||
return make_json_response(status=422)
|
||||
|
||||
|
||||
def modified_sql(self, gid):
|
||||
return make_json_response(data='')
|
||||
return make_json_response(status=422)
|
||||
|
||||
|
||||
def statistics(self, gid):
|
||||
return make_json_response(data='')
|
||||
return make_json_response(status=422)
|
||||
|
||||
|
||||
def dependencies(self, gid):
|
||||
return make_json_response(data='')
|
||||
return make_json_response(status=422)
|
||||
|
||||
|
||||
def dependents(self, gid):
|
||||
return make_json_response(data='')
|
||||
return make_json_response(status=422)
|
||||
|
||||
|
||||
ServerGroupView.register_node_view(blueprint)
|
||||
|
||||
@@ -6,72 +6,58 @@
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
from flask import render_template, request
|
||||
from pgadmin.browser.server_groups import ServerGroupPluginModule
|
||||
import json
|
||||
from flask import render_template, request, make_response, jsonify
|
||||
from flask.ext.security import login_required, current_user
|
||||
from pgadmin.settings.settings_model import db, Server, ServerGroup
|
||||
from pgadmin.utils.menu import MenuItem
|
||||
from pgadmin.utils.ajax import make_json_response
|
||||
from pgadmin.browser.utils import generate_browser_node, NodeView
|
||||
from pgadmin.utils.ajax import make_json_response, \
|
||||
make_response as ajax_response
|
||||
from pgadmin.browser.utils import NodeView, generate_browser_node
|
||||
import traceback
|
||||
from flask.ext.babel import gettext
|
||||
|
||||
import pgadmin.browser.server_groups as sg
|
||||
|
||||
class ServerModule(ServerGroupPluginModule):
|
||||
|
||||
class ServerModule(sg.ServerGroupPluginModule):
|
||||
NODE_TYPE = "server"
|
||||
|
||||
@property
|
||||
def node_type(self):
|
||||
return self.NODE_TYPE
|
||||
|
||||
@property
|
||||
def script_load(self):
|
||||
"""
|
||||
Load the module script for server, when any of the server-group node is
|
||||
initialized.
|
||||
"""
|
||||
return sg.ServerGroupModule.NODE_TYPE
|
||||
|
||||
def get_nodes(self, server_group):
|
||||
"""Return a JSON document listing the server groups for the user"""
|
||||
servers = Server.query.filter_by(user_id=current_user.id, servergroup_id=server_group)
|
||||
servers = Server.query.filter_by(user_id=current_user.id,
|
||||
servergroup_id=server_group)
|
||||
|
||||
# TODO: Move this JSON generation to a Server method
|
||||
for server in servers:
|
||||
yield generate_browser_node(
|
||||
"%d" % server.id,
|
||||
server.name,
|
||||
"icon-%s" % self.NODE_TYPE,
|
||||
True,
|
||||
self.NODE_TYPE
|
||||
)
|
||||
|
||||
def get_own_menuitems(self):
|
||||
return {
|
||||
'standard_items': [
|
||||
ServerMenuItem(action="drop", priority=50, function='drop_server'),
|
||||
ServerMenuItem(action="rename", priority=50, function='rename_server')
|
||||
],
|
||||
'create_items': [
|
||||
ServerMenuItem(types=["server-group", "server"],
|
||||
name="create_server",
|
||||
label=gettext('Server...'),
|
||||
priority=50,
|
||||
function='create_server(item)')
|
||||
],
|
||||
'context_items': [
|
||||
ServerMenuItem(name='delete_server',
|
||||
label=gettext('Delete server'),
|
||||
priority=50,
|
||||
onclick='drop_server(item)'),
|
||||
ServerMenuItem(name='rename_server',
|
||||
label=gettext('Rename server...'),
|
||||
priority=60,
|
||||
onclick='rename_server(item);')
|
||||
]
|
||||
}
|
||||
node = generate_browser_node(
|
||||
"%d" % (server.id),
|
||||
"%d" % server_group,
|
||||
server.name,
|
||||
"icon-%s-not-connected" % self.NODE_TYPE,
|
||||
True,
|
||||
self.NODE_TYPE)
|
||||
|
||||
yield node
|
||||
|
||||
@property
|
||||
def jssnippets(self):
|
||||
return [render_template("servers/servers.js")]
|
||||
return []
|
||||
|
||||
|
||||
class ServerMenuItem(MenuItem):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
kwargs.setdefault("type", ServerModule.NODE_TYPE)
|
||||
super(ServerMenuItem, self).__init__(**kwargs)
|
||||
@@ -80,59 +66,74 @@ class ServerMenuItem(MenuItem):
|
||||
blueprint = ServerModule(__name__)
|
||||
|
||||
|
||||
@blueprint.route('/module.js')
|
||||
@login_required
|
||||
def module():
|
||||
return make_response(
|
||||
render_template("servers/servers.js"),
|
||||
200, {'Content-Type': 'application/x-javascript'})
|
||||
|
||||
|
||||
class ServerNode(NodeView):
|
||||
|
||||
node_type = ServerModule.NODE_TYPE
|
||||
parent_ids = [{'type':'int', 'id':'gid'}]
|
||||
ids = [{'type':'int', 'id':'sid'}]
|
||||
|
||||
parent_ids = [{'type': 'int', 'id': 'gid'}]
|
||||
ids = [{'type': 'int', 'id': 'sid'}]
|
||||
operations = dict({
|
||||
'obj': [
|
||||
{'get': 'properties', 'delete': 'delete', 'put': 'update'},
|
||||
{'get': 'list', 'post': 'create'}
|
||||
],
|
||||
'nodes': [{'get': 'nodes'}],
|
||||
'sql': [{'get': 'sql', 'post': 'modified_sql'}],
|
||||
'stats': [{'get': 'statistics'}],
|
||||
'deps': [{'get': 'dependencies', 'post': 'dependents'}],
|
||||
'connect': [{'get': 'connect_status', 'post': 'connect', 'delete': 'disconnect'}]
|
||||
})
|
||||
|
||||
def list(self, gid):
|
||||
res = []
|
||||
"""Return a JSON document listing the server groups for the user"""
|
||||
servers = Server.query.filter_by(user_id=current_user.id,
|
||||
servergroup_id=gid)
|
||||
servergroup_id=gid)
|
||||
|
||||
for server in servers:
|
||||
res.append(
|
||||
generate_browser_node(
|
||||
"%d/%d" % (gid, server.id),
|
||||
server.name,
|
||||
"icon-%s" % NODE_TYPE,
|
||||
True,
|
||||
NODE_TYPE
|
||||
)
|
||||
)
|
||||
generate_browser_node(
|
||||
"%s" % server.id,
|
||||
"%s" % gid,
|
||||
server.name,
|
||||
"icon-%s-not-connected" % ServerModule.NODE_TYPE,
|
||||
True,
|
||||
ServerModule.NODE_TYPE)
|
||||
)
|
||||
return make_json_response(result=res)
|
||||
|
||||
|
||||
def delete(self, gid, sid):
|
||||
"""Delete a server node in the settings database"""
|
||||
server = Server.query.filter_by(user_id=current_user.id, id=sid)
|
||||
servers = Server.query.filter_by(user_id=current_user.id, id=sid)
|
||||
|
||||
# TODO:: A server, which is connected, can not be deleted
|
||||
if server is None:
|
||||
if servers is None:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=gettext(
|
||||
'The specified server could not be found.\n'
|
||||
'Does the user have permission to access the '
|
||||
'server?'
|
||||
)
|
||||
)
|
||||
success=0,
|
||||
errormsg=gettext(
|
||||
'The specified server could not be found.\n'
|
||||
'Does the user have permission to access the '
|
||||
'server?'
|
||||
)
|
||||
)
|
||||
else:
|
||||
try:
|
||||
db.session.delete(server)
|
||||
for s in servers:
|
||||
db.session.delete(s)
|
||||
db.session.commit()
|
||||
except Exception as e:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=e.message)
|
||||
|
||||
return make_json_response(success=success,
|
||||
errormsg=errormsg,
|
||||
info=traceback.format_exc())
|
||||
success=0,
|
||||
errormsg=e.message)
|
||||
|
||||
return make_json_response(success=1,
|
||||
info=traceback.format_exc())
|
||||
|
||||
def update(self, gid, sid):
|
||||
"""Update the server settings"""
|
||||
@@ -140,130 +141,139 @@ class ServerNode(NodeView):
|
||||
|
||||
if server is None:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=gettext("Couldn't find the given server.")
|
||||
)
|
||||
success=0,
|
||||
errormsg=gettext("Couldn't find the given server.")
|
||||
)
|
||||
|
||||
# TODO::
|
||||
# Not all parameters can be modified, while the server is connected
|
||||
possible_args = {
|
||||
'name': 'name',
|
||||
'host': 'host',
|
||||
'port': 'port',
|
||||
'db': 'maintenance_db',
|
||||
'username': 'username',
|
||||
'sslmode': 'sslmode',
|
||||
'gid': 'servergroup_id'
|
||||
}
|
||||
'name': 'name',
|
||||
'host': 'host',
|
||||
'port': 'port',
|
||||
'db': 'maintenance_db',
|
||||
'username': 'username',
|
||||
'sslmode': 'sslmode',
|
||||
'gid': 'servergroup_id',
|
||||
'comment': 'comment'
|
||||
}
|
||||
|
||||
idx = 0
|
||||
data = request.form if request.form else json.loads(request.data)
|
||||
|
||||
for arg in possible_args:
|
||||
if arg in request.form:
|
||||
server[possible_args[arg]] = request.form[arg]
|
||||
if arg in data:
|
||||
setattr(server, possible_args[arg], data[arg])
|
||||
idx += 1
|
||||
|
||||
if idx == 0:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=gettext('No parameters were chagned!')
|
||||
)
|
||||
success=0,
|
||||
errormsg=gettext('No parameters were chagned!')
|
||||
)
|
||||
|
||||
try:
|
||||
db.session.commit()
|
||||
except Exception as e:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=e.message
|
||||
)
|
||||
success=0,
|
||||
errormsg=e.message
|
||||
)
|
||||
|
||||
return make_json_response(
|
||||
success=1,
|
||||
data={
|
||||
'id': server.id,
|
||||
'gid': server.servergroup_id
|
||||
}
|
||||
)
|
||||
|
||||
success=1,
|
||||
data={
|
||||
'id': server.id,
|
||||
'gid': server.servergroup_id
|
||||
}
|
||||
)
|
||||
|
||||
def properties(self, gid, sid):
|
||||
"""Return list of attributes of a server"""
|
||||
server = Server.query.filter_by(
|
||||
user_id=current_user.id,
|
||||
id=sid).first()
|
||||
user_id=current_user.id,
|
||||
id=sid).first()
|
||||
|
||||
if server is None:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=gettext("Couldn't find the given server")
|
||||
)
|
||||
success=0,
|
||||
errormsg=gettext("Couldn't find the given server")
|
||||
)
|
||||
|
||||
sg = ServerGroup.query.filter_by(
|
||||
user_id=current_user.id,
|
||||
id=server.servergroup_id
|
||||
).first()
|
||||
|
||||
return make_json_response(
|
||||
success=1,
|
||||
data={
|
||||
'id':server.id,
|
||||
'name':server.name,
|
||||
'host':server.host,
|
||||
'port':server.port,
|
||||
'db':server.maintenance_db,
|
||||
'username':server.username,
|
||||
'gid':server.servergroup_id,
|
||||
'group-name':sg.name
|
||||
}
|
||||
)
|
||||
user_id=current_user.id,
|
||||
id=server.servergroup_id
|
||||
).first()
|
||||
|
||||
return ajax_response(
|
||||
response={
|
||||
'id': server.id,
|
||||
'name': server.name,
|
||||
'host': server.host,
|
||||
'port': server.port,
|
||||
'db': server.maintenance_db,
|
||||
'username': server.username,
|
||||
'gid': server.servergroup_id,
|
||||
'group-name': sg.name,
|
||||
'comment': server.comment,
|
||||
# TODO:: Make sure - we do have correct values here
|
||||
'connected': True,
|
||||
'version': 'PostgreSQL 9.3 (linux-x64)'
|
||||
}
|
||||
)
|
||||
|
||||
def create(self, gid):
|
||||
"""Add a server node to the settings database"""
|
||||
required_args = [
|
||||
'name',
|
||||
'host',
|
||||
'port',
|
||||
'db',
|
||||
'username',
|
||||
'sslmode'
|
||||
]
|
||||
u'name',
|
||||
u'host',
|
||||
u'port',
|
||||
u'db',
|
||||
u'username',
|
||||
u'sslmode'
|
||||
]
|
||||
|
||||
data = request.form if request.form else json.loads(request.data)
|
||||
|
||||
for arg in required_args:
|
||||
if arg not in request.form:
|
||||
if arg not in data:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=gettext(
|
||||
"Couldn't find the required parameter (%s)." % arg
|
||||
)
|
||||
)
|
||||
|
||||
server = Server(
|
||||
user_id=current_user.id,
|
||||
servergroup_id=gid,
|
||||
name=request.form['name'],
|
||||
host=request.form['host'],
|
||||
port=request.form['port'],
|
||||
maintenance_db=request.form['db'],
|
||||
username=request.form['username'],
|
||||
sslmode=request.form['username']
|
||||
status=410,
|
||||
success=0,
|
||||
errormsg=gettext(
|
||||
"Couldn't find the required parameter (%s)." % arg
|
||||
)
|
||||
)
|
||||
|
||||
try:
|
||||
server = Server(
|
||||
user_id=current_user.id,
|
||||
servergroup_id=gid,
|
||||
name=data[u'name'],
|
||||
host=data[u'host'],
|
||||
port=data[u'port'],
|
||||
maintenance_db=data[u'db'],
|
||||
username=data[u'username'],
|
||||
ssl_mode=data['sslmode'],
|
||||
comment=data['comment'] if 'comment' in data else None
|
||||
)
|
||||
db.session.add(server)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify(node=generate_browser_node(
|
||||
'%s' % server.id,
|
||||
'%s' % gid,
|
||||
'%s' % server.name,
|
||||
"icon-{0}-not-connected".format(ServerModule.NODE_TYPE),
|
||||
True,
|
||||
ServerModule.NODE_TYPE))
|
||||
|
||||
except Exception as e:
|
||||
return make_json_response(
|
||||
success=0,
|
||||
errormsg=e.message
|
||||
)
|
||||
|
||||
return make_json_response(success=1,
|
||||
data={
|
||||
'id': server.id,
|
||||
'name': server.name,
|
||||
'gid': gid
|
||||
})
|
||||
|
||||
status=410,
|
||||
success=0,
|
||||
errormsg=e.message
|
||||
)
|
||||
|
||||
def nodes(self, gid, sid):
|
||||
"""Build a list of treeview nodes from the child nodes."""
|
||||
@@ -275,23 +285,18 @@ class ServerNode(NodeView):
|
||||
nodes.extend(module.get_nodes(server=sid))
|
||||
return make_json_response(data=nodes)
|
||||
|
||||
|
||||
def sql(self, gid, sid):
|
||||
return make_json_response(data='')
|
||||
|
||||
|
||||
def modified_sql(self, gid, sid):
|
||||
return make_json_response(data='')
|
||||
|
||||
|
||||
def statistics(self, gid, sid):
|
||||
return make_json_response(data='')
|
||||
|
||||
|
||||
def dependencies(self, gid, sid):
|
||||
return make_json_response(data='')
|
||||
|
||||
|
||||
def dependents(self, gid, sid):
|
||||
return make_json_response(data='')
|
||||
|
||||
|
||||
@@ -1,94 +1,169 @@
|
||||
// Add a server
|
||||
function create_server(item) {
|
||||
var alert = alertify.prompt(
|
||||
'{{ _('Create a server') }}',
|
||||
'{{ _('Enter a name for the new server') }}',
|
||||
'',
|
||||
function(evt, value) {
|
||||
var d = tree.itemData(item);
|
||||
if (d._type != 'server-group') {
|
||||
define(
|
||||
['jquery', 'underscore', 'pgadmin', 'pgadmin.browser', 'alertify'],
|
||||
function($, _, pgAdmin, pgBrowser, alertify) {
|
||||
|
||||
if (!pgBrowser.Nodes['server']) {
|
||||
pgAdmin.Browser.Nodes['server'] = pgAdmin.Browser.Node.extend({
|
||||
parent_type: 'server-group',
|
||||
type: 'server',
|
||||
label: '{{ _('Server...') }}',
|
||||
Init: function() {
|
||||
|
||||
/* Avoid multiple registration of same menus */
|
||||
if (this.initialized)
|
||||
return;
|
||||
|
||||
this.initialized = true;
|
||||
|
||||
pgBrowser.add_menus([{
|
||||
name: 'create_server_on_sg', node: 'server-group', module: this,
|
||||
applies: ['object', 'context'], callback: 'show_obj_properties',
|
||||
category: 'create', priority: 1, label: '{{ _('Server...') }}',
|
||||
data: {action: 'create'}, icon: 'wcTabIcon icon-server'
|
||||
}, {
|
||||
name: 'create_server', node: 'server', module: this,
|
||||
applies: ['object', 'context'], callback: 'show_obj_properties',
|
||||
category: 'create', priority: 3, label: '{{ _('Server...') }}',
|
||||
data: {action: 'create'}, icon: 'wcTabIcon icon-server'
|
||||
}, {
|
||||
name: 'edit_server', node: 'server', module: this,
|
||||
applies: ['object', 'context'], callback: 'show_obj_properties',
|
||||
category: 'edit', priority: 4, label: '{{ _('Edit...') }}',
|
||||
data: {action: 'edit'}, icon: 'fa fa-pencil-square-o'
|
||||
},{
|
||||
name: 'drop_server', node: 'server', module: this,
|
||||
applies: ['object', 'context'], callback: 'delete_obj',
|
||||
category: 'drop', priority: 3, label: '{{ _('Drop Server...') }}',
|
||||
icon: 'fa fa-trash'
|
||||
}]);
|
||||
},
|
||||
callbacks: {
|
||||
// Add a server
|
||||
create_server: function (item) {
|
||||
var alert = alertify.prompt(
|
||||
'{{ _('Create a server') }}',
|
||||
'{{ _('Enter a name for the new server') }}',
|
||||
'',
|
||||
function(evt, value) {
|
||||
var d = tree.itemData(item);
|
||||
if (d._type != 'server-group') {
|
||||
d = tree.itemData(tree.parent(item));
|
||||
}
|
||||
$.post(
|
||||
"{{ url_for('browser.index') }}server/obj/" + d.refid + '/',
|
||||
}
|
||||
$.post(
|
||||
"{{ url_for('browser.index') }}server/obj/" + d.refid + '/' + d.id + '/',
|
||||
{ name: value }
|
||||
)
|
||||
.done(function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var item = {
|
||||
id: data.data.id,
|
||||
label: data.data.name,
|
||||
inode: true,
|
||||
open: false,
|
||||
icon: 'icon-server'
|
||||
}
|
||||
|
||||
tree.append(null, {
|
||||
itemData: item
|
||||
});
|
||||
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var item = {
|
||||
id: data.data.id,
|
||||
label: data.data.name,
|
||||
inode: true,
|
||||
open: false,
|
||||
icon: 'icon-server-not-connected'
|
||||
}
|
||||
}
|
||||
)
|
||||
tree.append(null, {
|
||||
itemData: item
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
null
|
||||
);
|
||||
alert.show();
|
||||
},
|
||||
null
|
||||
);
|
||||
alert.show();
|
||||
}
|
||||
|
||||
// Delete a server
|
||||
function drop_server(item) {
|
||||
alertify.confirm(
|
||||
'{{ _('Drop server?') }}',
|
||||
'{{ _('Are you sure you wish to drop the server "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
|
||||
function() {
|
||||
var id = tree.getId(item).split('/').pop()
|
||||
$.ajax({
|
||||
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
|
||||
type:'DELETE',
|
||||
success: function(data) {
|
||||
/* Connect the server (if not connected), before opening this node */
|
||||
beforeopen: function(o) {
|
||||
o.browser.tree.removeIcon(o.item);
|
||||
if (o.data.connected) {
|
||||
o.browser.tree.addIcon(o.item, {icon: 'icon-server-connected'});
|
||||
} else {
|
||||
o.browser.tree.addIcon(o.item, {icon: 'icon-server-not-connected'});
|
||||
}
|
||||
var data = o.data;
|
||||
if(!data || data._type != 'server') {
|
||||
return false;
|
||||
}
|
||||
if (!data.connected) {
|
||||
alertify.confirm(
|
||||
'{{ _('Connect to server') }}',
|
||||
'{{ _('Do you want to connect the server?') }}',
|
||||
function(evt) {
|
||||
$.post(
|
||||
"{{ url_for('browser.index') }}server/connect/" + data.refid + '/'
|
||||
).done(function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var next = tree.next(item);
|
||||
var prev = tree.prev(item);
|
||||
tree.remove(item);
|
||||
if (next.length) {
|
||||
tree.select(next);
|
||||
} else if (prev.length) {
|
||||
tree.select(prev);
|
||||
}
|
||||
report_error(data.errormsg, data.info);
|
||||
}
|
||||
}
|
||||
})
|
||||
}).fail(function() {});
|
||||
return true;
|
||||
},
|
||||
function(evt) {
|
||||
return true;
|
||||
}
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
},
|
||||
model: pgAdmin.Browser.Node.Model.extend({
|
||||
defaults: {
|
||||
id: undefined,
|
||||
name: undefined,
|
||||
sslmode: 'prefer'
|
||||
},
|
||||
null
|
||||
)
|
||||
}
|
||||
schema: [{
|
||||
id: 'id', label: 'ID', type: 'int', group: null,
|
||||
mode: ['properties']
|
||||
},{
|
||||
id: 'name', label:'Name', type: 'text', group: null,
|
||||
mode: ['properties', 'edit', 'create']
|
||||
},{
|
||||
id: 'connected', label:'Connected', type: 'text', group: null,
|
||||
mode: ['properties']
|
||||
},{
|
||||
id: 'version', label:'Version', type: 'text', group: null,
|
||||
mode: ['properties'], show: 'isConnected'
|
||||
},{
|
||||
id: 'comment', label:'Comments:', type: 'multiline', group: null,
|
||||
mode: ['properties', 'edit', 'create'], disable: 'notEditMode'
|
||||
},{
|
||||
id: 'host', label:'Host Name/Address', type: 'text', group: "Connection",
|
||||
mode: ['properties', 'edit', 'create']
|
||||
},{
|
||||
id: 'port', label:'Port', type: 'int', group: "Connection",
|
||||
mode: ['properties', 'edit', 'create']
|
||||
},{
|
||||
id: 'db', label:'Maintenance Database', type: 'text', group: "Connection",
|
||||
mode: ['properties', 'edit', 'create']
|
||||
},{
|
||||
id: 'username', label:'User Name', type: 'text', group: "Connection",
|
||||
mode: ['properties', 'edit', 'create']
|
||||
},{
|
||||
id: 'sslmode', label:'SSL Mode', type: 'options', group: "Connection",
|
||||
mode: ['properties', 'edit', 'create'],
|
||||
'options': [{label:'Allow', value:'allow'}, {label: 'Prefer', value:'prefer'}, {label: 'Require', value: 'require'}, {label: 'Disable', value:'disable'}, {label:'Verify-CA', value: 'verify-ca'}, {label:'Verify-Full', value:'verify-full'}]
|
||||
}],
|
||||
validate: function(attrs, options) {
|
||||
if (!this.isNew() && 'id' in this.changed) {
|
||||
return '{{ _('Id can not be changed!') }}';
|
||||
}
|
||||
if (String(this.name).replace(/^\s+|\s+$/g, '') == '') {
|
||||
return '{{ _('Name can be empty!') }}';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
isConnected: function(mode) {
|
||||
return mode == 'properties' && this.get('connected');
|
||||
},
|
||||
notEditMode: function(mode) {
|
||||
return mode != 'edit';
|
||||
}})
|
||||
});
|
||||
}
|
||||
|
||||
// Rename a server
|
||||
function rename_server(item) {
|
||||
alertify.prompt(
|
||||
'{{ _('Rename server') }}',
|
||||
'{{ _('Enter a new name for the server') }}',
|
||||
tree.getLabel(item),
|
||||
function(evt, value) {
|
||||
var d = tree.itemData(item);
|
||||
$.ajax({
|
||||
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
|
||||
type:'PUT',
|
||||
params: {name: value},
|
||||
success: function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
tree.setLabel(item, { label: value });
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
null
|
||||
)
|
||||
}
|
||||
return pgBrowser.Nodes['server'];
|
||||
});
|
||||
|
||||
@@ -1,87 +1,152 @@
|
||||
// Add a server group
|
||||
function create_server_group() {
|
||||
var alert = alertify.prompt(
|
||||
'{{ _('Add a server group') }}',
|
||||
'{{ _('Enter a name for the new server group') }}',
|
||||
'',
|
||||
function(evt, value) {
|
||||
$.post("{{ url_for('browser.index') }}server-group/obj/", { name: value })
|
||||
.done(function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var item = {
|
||||
id: data.data.id,
|
||||
label: data.data.name,
|
||||
inode: true,
|
||||
open: false,
|
||||
icon: 'icon-server-group'
|
||||
}
|
||||
define(
|
||||
['jquery', 'underscore', 'pgadmin', 'backbone', 'pgadmin.browser', 'pgadmin.browser.node'],
|
||||
function($, _, pgAdmin, Backbone) {
|
||||
|
||||
tree.append(null, {
|
||||
itemData: item
|
||||
});
|
||||
if (!pgAdmin.Browser.Nodes['server-group']) {
|
||||
pgAdmin.Browser.Nodes['server-group'] = pgAdmin.Browser.Node.extend({
|
||||
parent_type: null,
|
||||
type: 'server-group',
|
||||
label: '{{ _('Server Group') }}',
|
||||
Init: function() {
|
||||
/* Avoid mulitple registration of menus */
|
||||
if (this.initialized)
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
)
|
||||
this.initialized = true;
|
||||
|
||||
pgAdmin.Browser.add_menus([{
|
||||
name: 'create_server_group', node: 'server-group', module: this,
|
||||
applies: ['object', 'context'], callback: 'show_obj_properties',
|
||||
category: 'create', priority: 1, label: '{{ _('Server Group...') }}',
|
||||
data: {'action': 'create'}, icon: 'wcTabIcon icon-server-group'
|
||||
},{
|
||||
name: 'edit_server_group', node: 'server-group', module: this,
|
||||
applies: ['object', 'context'], callback: 'show_obj_properties',
|
||||
priority: 3, label: '{{ _('Edit...') }}', data: {'action': 'edit'},
|
||||
icon: 'fa fa-pencil-square-o'
|
||||
}, {
|
||||
name: 'drop_server_group', node: 'server-group', module: this,
|
||||
applies: ['object', 'context'], callback: 'delete_obj',
|
||||
priority: 2, label: '{{ _('Drop Server Group...') }}',
|
||||
icon: 'fa fa-trash'
|
||||
}]);
|
||||
},
|
||||
model: pgAdmin.Browser.Node.Model.extend({
|
||||
defaults: {
|
||||
id: undefined,
|
||||
name: undefined
|
||||
},
|
||||
null
|
||||
);
|
||||
alert.show();
|
||||
}
|
||||
schema: [
|
||||
{id: 'id', label: 'ID', type: 'int', group: null, mode: ['properties']},
|
||||
{id: 'name', label:'Name', type: 'text', group: null, mode: ['properties', 'edit', 'create']}
|
||||
],
|
||||
validate: function(attrs, options) {
|
||||
if (!this.isNew() && 'id' in this.changed) {
|
||||
return '{{ _('Id can not be changed!') }}';
|
||||
}
|
||||
if (String(this.name).replace(/^\s+|\s+$/g, '') == '') {
|
||||
return '{{ _('Name can be empty!') }}';
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}),
|
||||
canDelete: function(i) {
|
||||
var s = pgAdmin.Browser.tree.siblings(i, true);
|
||||
|
||||
// Delete a server group
|
||||
function drop_server_group(item) {
|
||||
alertify.confirm(
|
||||
'{{ _('Delete server group?') }}',
|
||||
'{{ _('Are you sure you wish to delete the server group "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
|
||||
function() {
|
||||
var d = tree.itemData(item);
|
||||
$.ajax({
|
||||
/* This is the only server group - we can't remove it*/
|
||||
if (!s || s.length == 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
callbacks: {
|
||||
// Add a server group
|
||||
create_server_group: function() {
|
||||
var tree = pgAdmin.Browser.tree;
|
||||
var alert = alertify.prompt(
|
||||
'{{ _('Add a server group') }}',
|
||||
'{{ _('Enter a name for the new server group') }}',
|
||||
function(evt, value) {
|
||||
$.post("{{ url_for('browser.index') }}server-group/obj/", { name: value })
|
||||
.done(function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var item = {
|
||||
id: data.data.id,
|
||||
label: data.data.name,
|
||||
inode: true,
|
||||
open: false,
|
||||
icon: 'icon-server-group'
|
||||
}
|
||||
tree.append(null, {
|
||||
itemData: item
|
||||
});
|
||||
}
|
||||
})
|
||||
},
|
||||
function() {}
|
||||
);
|
||||
alert.show();
|
||||
},
|
||||
// Delete a server group
|
||||
drop_server_group: function (item) {
|
||||
var tree = pgAdmin.Browser.tree;
|
||||
alertify.confirm(
|
||||
'{{ _('Delete server group?') }}',
|
||||
'{{ _('Are you sure you wish to delete the server group "{0}"?') }}'.replace('{0}', tree.getLabel(item)),
|
||||
function() {
|
||||
var d = tree.itemData(item);
|
||||
$.ajax({
|
||||
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
|
||||
type:'DELETE',
|
||||
success: function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var next = tree.next(item);
|
||||
var prev = tree.prev(item);
|
||||
tree.remove(item);
|
||||
if (next.length) {
|
||||
tree.select(next);
|
||||
} else if (prev.length) {
|
||||
tree.select(prev);
|
||||
}
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
var next = tree.next(item);
|
||||
var prev = tree.prev(item);
|
||||
tree.remove(item);
|
||||
if (next.length) {
|
||||
tree.select(next);
|
||||
} else if (prev.length) {
|
||||
tree.select(prev);
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
function() {}
|
||||
).show();
|
||||
},
|
||||
null
|
||||
)
|
||||
}
|
||||
|
||||
// Rename a server group
|
||||
function rename_server_group(item) {
|
||||
alertify.prompt(
|
||||
'{{ _('Rename server group') }}',
|
||||
'{{ _('Enter a new name for the server group') }}',
|
||||
tree.getLabel(item),
|
||||
function(evt, value) {
|
||||
var d = tree.itemData(item);
|
||||
$.ajax({
|
||||
// Rename a server group
|
||||
rename_server_group: function (item) {
|
||||
var tree = pgAdmin.Browser.tree;
|
||||
alertify.prompt(
|
||||
'{{ _('Rename server group') }}',
|
||||
'{{ _('Enter a new name for the server group') }}',
|
||||
tree.getLabel(item),
|
||||
function(evt, value) {
|
||||
var d = tree.itemData(item);
|
||||
$.ajax({
|
||||
url:"{{ url_for('browser.index') }}" + d._type + "/obj/" + d.refid,
|
||||
type:'PUT',
|
||||
params: { name: value },
|
||||
success: function(data) {
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
tree.setLabel(item, { label: value });
|
||||
}
|
||||
if (data.success == 0) {
|
||||
report_error(data.errormsg, data.info);
|
||||
} else {
|
||||
tree.setLabel(item, { label: value });
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
null
|
||||
)
|
||||
}
|
||||
})
|
||||
},
|
||||
null
|
||||
).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return pgAdmin.Browser.Nodes['server-group'];
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user