Introduced a PgAdmin class inherited from the Flask, which looks for

submodules inherited from the PgAdminModule instead of regular
Blueprint. This allows us to load the module automatically from the
under the pgadmin directory, and will work to extend the pgAdmin
extension module.

PgAdminModule is inherited from the Blueprint, and bring several
methods:
-  get_own_stylesheets, which returns the stylesheets used by the module
   (excluding its submodules stylesheets)
- get_own_javascripts
- menu_items, which returns a dictionray mapping the old hook names
  (context_items etc) to a list of MenuItem instances

For more specialized modules (as for now, any module that should be part
of the browser tree construction), one can define an abstract base class
defining additional methods.

For example, the BrowserPluginModule abstract base class defines the
following methods:
- jssnippets
- csssnipeets
- node_type
- get_nodes
This commit is contained in:
Ronan Dunklau
2015-06-29 12:28:41 +05:30
committed by Ashesh Vashi
parent 9e0b011ec8
commit eb6580b43a
25 changed files with 876 additions and 943 deletions
+197 -5
View File
@@ -6,10 +6,202 @@
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""Defines views for management of server groups"""
# Node meta data
NODE_TYPE = 'server-group'
NODE_PATH = '/browser/nodes/' + NODE_TYPE
from abc import ABCMeta, abstractmethod
import traceback
from flask import Blueprint, Response, current_app, request, render_template
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.browser import BrowserPluginModule
from pgadmin.utils.menu import MenuItem
from pgadmin.settings.settings_model import db, ServerGroup
import config
# Define the child node list
sub_nodes = [ ]
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):
"""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 {
"id": "%s/%d" % (self.node_type, group.id),
"label": group.name,
"icon": "icon-%s" % self.node_type,
"inode": True,
"_type": self.node_type
}
@property
def node_type(self):
return self.NODE_TYPE
class ServerGroupMenuItem(MenuItem):
def __init__(self, **kwargs):
kwargs.setdefault("type", ServerGroupModule.NODE_TYPE)
super(ServerGroupMenuItem, self).__init__(**kwargs)
class ServerGroupPluginModule(BrowserPluginModule):
"""
Base class for server group plugins.
"""
__metaclass__ = ABCMeta
@abstractmethod
def get_nodes(self, servergroup):
pass
# Initialise the module
blueprint = ServerGroupModule( __name__, static_url_path='')
@blueprint.route("/<server_group>")
@login_required
def get_nodes(server_group):
"""Build a list of treeview nodes from the child nodes."""
nodes = []
for module in current_blueprint.submodules:
nodes.extend(module.get_nodes(server_group=server_group))
return make_json_response(data=nodes)
@blueprint.route('/add/', methods=['POST'])
@login_required
def add():
"""Add a server group node to the settings database"""
success = 1
errormsg = ''
data = { }
if request.form['name'] != '':
servergroup = ServerGroup(user_id=current_user.id, name=request.form['name'])
try:
db.session.add(servergroup)
db.session.commit()
except Exception as e:
success = 0
errormsg = e.message
else:
success = 0
errormsg = gettext('No server group name was specified')
if success == 1:
data['id'] = servergroup.id
data['name'] = servergroup.name
return make_json_response(success=success,
errormsg=errormsg,
info=traceback.format_exc(),
result=request.form,
data=data)
@blueprint.route('/delete/', methods=['POST'])
@login_required
def delete():
"""Delete a server group node in the settings database"""
success = 1
errormsg = ''
if request.form['id'] != '':
# There can be only one record at most
servergroup = ServerGroup.query.filter_by(user_id=current_user.id, id=int(request.form['id'])).first()
if servergroup is None:
success = 0
errormsg = gettext('The specified server group could not be found.')
else:
try:
db.session.delete(servergroup)
db.session.commit()
except Exception as e:
success = 0
errormsg = e.message
else:
success = 0
errormsg = gettext('No server group was specified.')
return make_json_response(success=success,
errormsg=errormsg,
info=traceback.format_exc(),
result=request.form)
@blueprint.route('/rename/', methods=['POST'])
@login_required
def rename():
"""Rename a server group node in the settings database"""
success = 1
errormsg = ''
if request.form['id'] != '':
# There can be only one record at most
servergroup = ServerGroup.query.filter_by(user_id=current_user.id, id=int(request.form['id'])).first()
if servergroup is None:
success = 0
errormsg = gettext('The specified server group could not be found.')
else:
try:
servergroup.name = request.form['name']
db.session.commit()
except Exception as e:
success = 0
errormsg = e.message
else:
success = 0
errormsg = gettext('No server group was specified.')
return make_json_response(success=success,
errormsg=errormsg,
info=traceback.format_exc(),
result=request.form)