Files
pgadmin4/web/pgadmin/browser/server_groups/__init__.py
Ashesh Vashi fd3ddbeafb Implementation of the client side 'url_for(...)' function.
Created a url_for function module to be used by different javascript
modules to use the same functionality of flask at client side.

A python module can expose the list of endpoints, used by its
javascripts, by overriding the 'get_exposed_url_endpoints(self)'
function.

In this patch, we have modified all the browser modules to use this
function. It will allow us to move the majority of the javascript
modules of browser nodes from templates directory to the static
directory.

TODO::
- Move these javascripts modules to the static directory.
- Use this function in all the applicable javascript modules.
  e.g. tools, miscellaneous modules
2017-06-12 12:01:25 +05:30

329 lines
9.7 KiB
Python

##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2017, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""Defines views for management of server groups"""
import simplejson as json
from abc import ABCMeta, abstractmethod
import six
from flask import request, render_template, make_response, jsonify, current_app
from flask_babel import gettext
from flask_security import current_user
from pgadmin.browser import BrowserPluginModule
from pgadmin.browser.utils import NodeView
from pgadmin.utils.ajax import make_json_response, gone, \
make_response as ajax_response, bad_request
from pgadmin.utils.menu import MenuItem
from sqlalchemy import exc
from pgadmin.model import db, ServerGroup
class ServerGroupModule(BrowserPluginModule):
NODE_TYPE = "server-group"
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
).order_by("id")
for idx, group in enumerate(groups):
yield self.generate_browser_node(
"%d" % (group.id), None,
group.name,
"icon-%s" % self.node_type,
True,
self.node_type,
can_delete=True if idx > 0 else False
)
@property
def node_type(self):
"""
node_type
Node type for Server Group is server-group. It is defined by NODE_TYPE
static attribute of the class.
"""
return self.NODE_TYPE
@property
def script_load(self):
"""
script_load
Load the server-group javascript module on loading of browser module.
"""
return None
def register_preferences(self):
"""
register_preferences
Overrides the register_preferences PgAdminModule, because - we will not
register any preference for server-group (specially the show_node
preference.)
"""
pass
class ServerGroupMenuItem(MenuItem):
def __init__(self, **kwargs):
kwargs.setdefault("type", ServerGroupModule.NODE_TYPE)
super(ServerGroupMenuItem, self).__init__(**kwargs)
@six.add_metaclass(ABCMeta)
class ServerGroupPluginModule(BrowserPluginModule):
"""
Base class for server group plugins.
"""
@abstractmethod
def get_nodes(self, *arg, **kwargs):
pass
blueprint = ServerGroupModule(__name__, static_url_path='')
class ServerGroupView(NodeView):
node_type = ServerGroupModule.NODE_TYPE
parent_ids = []
ids = [{'type': 'int', 'id': 'gid'}]
def list(self):
res = []
for sg in ServerGroup.query.filter_by(
user_id=current_user.id
).order_by('name'):
res.append({
'id': sg.id,
'name': sg.name
})
return ajax_response(response=res, status=200)
def delete(self, gid):
"""Delete a server group node in the settings database"""
groups = ServerGroup.query.filter_by(
user_id=current_user.id
).order_by("id")
# if server group id is 1 we won't delete it.
sg = groups.first()
if sg.id == gid:
return make_json_response(
status=417,
success=0,
errormsg=gettext(
'The specified server group cannot be deleted.'
)
)
# There can be only one record at most
sg = groups.filter_by(id=gid).first()
if sg is None:
return make_json_response(
status=410,
success=0,
errormsg=gettext(
'The specified server group could not be found.'
)
)
else:
try:
db.session.delete(sg)
db.session.commit()
except Exception as e:
return make_json_response(
status=410, success=0, errormsg=e.message
)
return make_json_response(result=request.form)
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()
data = request.form if request.form else json.loads(
request.data, encoding='utf-8'
)
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 u'name' in data:
servergroup.name = data[u'name']
db.session.commit()
except exc.IntegrityError:
return bad_request(gettext(
"The specified server group already exists."
))
except Exception as e:
return make_json_response(
status=410, success=0, errormsg=e.message
)
return jsonify(
node=self.blueprint.generate_browser_node(
gid,
None,
servergroup.name,
"icon-%s" % self.node_type,
True,
self.node_type,
can_delete=True # This is user created hence can deleted
)
)
def properties(self, gid):
"""Update the server-group properties"""
# There can be only one record at most
sg = ServerGroup.query.filter_by(
user_id=current_user.id,
id=gid).first()
if sg is None:
return make_json_response(
status=410,
success=0,
errormsg=gettext(
'The specified server group could not be found.'
)
)
else:
return ajax_response(
response={'id': sg.id, 'name': sg.name},
status=200
)
def create(self):
"""Creates new server-group """
data = request.form if request.form else json.loads(
request.data, encoding='utf-8'
)
if data[u'name'] != '':
try:
sg = ServerGroup(
user_id=current_user.id,
name=data[u'name'])
db.session.add(sg)
db.session.commit()
data[u'id'] = sg.id
data[u'name'] = sg.name
return jsonify(
node=self.blueprint.generate_browser_node(
"%d" % (sg.id),None,
sg.name,
"icon-%s" % self.node_type,
True,
self.node_type,
# This is user created hence can deleted
can_delete=True
)
)
except exc.IntegrityError:
return bad_request(gettext(
"The specified server group already exists."
))
except Exception as e:
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'))
def sql(self, gid):
return make_json_response(status=422)
def modified_sql(self, gid):
return make_json_response(status=422)
def statistics(self, gid):
return make_json_response(status=422)
def dependencies(self, gid):
return make_json_response(status=422)
def dependents(self, gid):
return make_json_response(status=422)
def module_js(self, **kwargs):
"""
This property defines (if javascript) exists for this node.
Override this property for your own logic.
"""
return make_response(
render_template("server_groups/server_groups.js"),
200, {'Content-Type': 'application/x-javascript'}
)
def nodes(self, gid=None):
"""Return a JSON document listing the server groups for the user"""
nodes = []
if gid is None:
groups = ServerGroup.query.filter_by(user_id=current_user.id)
for group in groups:
nodes.append(
self.blueprint.generate_browser_node(
"%d" % (group.id), None,
group.name,
"icon-%s" % self.node_type,
True,
self.node_type
)
)
else:
group = ServerGroup.query.filter_by(user_id=current_user.id,
id=gid).first()
if not group:
return gone(
errormsg=gettext("Could not find the server group.")
)
nodes = self.blueprint.generate_browser_node(
"%d" % (group.id), None,
group.name,
"icon-%s" % self.node_type,
True,
self.node_type
)
return make_json_response(data=nodes)
def node(self, gid):
return self.nodes(gid)
ServerGroupView.register_node_view(blueprint)