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
This commit is contained in:
Ashesh Vashi 2017-06-12 12:01:22 +05:30
parent dea850b503
commit fd3ddbeafb
67 changed files with 449 additions and 286 deletions

View File

@ -19,7 +19,8 @@ module.exports = function(config) {
{pattern: 'regression/javascript/**/*.js', included: false},
{pattern: 'pgadmin/static/vendor/**/*.js', included: false},
{pattern: 'pgadmin/static/js/**/*.js', included: false},
{pattern: 'pgadmin/browser/static/js/**/*.js', included: false}
{pattern: 'pgadmin/browser/static/js/**/*.js', included: false},
{pattern: 'pgadmin/static/img/*.png', included: false}
],

View File

@ -86,6 +86,16 @@ class PgAdmin(Flask):
messages.update(getattr(module, "messages", dict()))
return messages
@property
def exposed_endpoint_url_map(self):
for rule in current_app.url_map.iter_rules('static'):
yield rule.endpoint, rule.rule
for module in self.submodules:
for endpoint in module.exposed_endpoints:
for rule in current_app.url_map.iter_rules(endpoint):
yield rule.endpoint, rule.rule
@property
def javascripts(self):
scripts = []

View File

@ -12,7 +12,7 @@ from abc import ABCMeta, abstractmethod, abstractproperty
import six
from flask import current_app, render_template, url_for, make_response, flash,\
Response, request
Response
from flask_babel import gettext
from flask_login import current_user
from flask_security import login_required
@ -152,6 +152,7 @@ class BrowserModule(PgAdminModule):
for name, script in [
['pgadmin.browser', 'js/browser'],
['pgadmin.browser.endpoints', 'js/endpoints'],
['pgadmin.browser.error', 'js/error']]:
scripts.append({
'name': name,
@ -195,6 +196,13 @@ class BrowserModule(PgAdminModule):
category_label=gettext('Display')
)
def get_exposed_url_endpoints(self):
"""
Returns:
list: a list of url endpoints exposed to the client.
"""
return ['browser.index', 'browser.nodes']
blueprint = BrowserModule(MODULE_NAME, __name__)
@ -538,6 +546,14 @@ def browser_js():
200, {'Content-Type': 'application/x-javascript'})
@blueprint.route("/js/endpoints.js")
def exposed_urls():
return make_response(
render_template('browser/js/endpoints.js'),
200, {'Content-Type': 'application/x-javascript'}
)
@blueprint.route("/js/error.js")
@login_required
def error_js():
@ -605,11 +621,12 @@ def browser_css():
200, {'Content-Type': 'text/css'})
@blueprint.route("/nodes/")
@blueprint.route("/nodes/", endpoint="nodes")
@login_required
def get_nodes():
"""Build a list of treeview nodes from the child nodes."""
nodes = []
for submodule in current_blueprint.submodules:
nodes.extend(submodule.get_nodes())
return make_json_response(data=nodes)

View File

@ -13,7 +13,7 @@ import simplejson as json
from abc import ABCMeta, abstractmethod
import six
from flask import request, render_template, make_response, jsonify
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

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
define('pgadmin.node.cast', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the collection class for cast
if (!pgBrowser.Nodes['coll-cast']) {
var casts = pgAdmin.Browser.Nodes['coll-cast'] =
@ -20,7 +20,7 @@ define([
type: 'cast',
sqlAlterHelp: 'sql-altercast.html',
sqlCreateHelp: 'sql-createcast.html',
dialogHelp: '{{ url_for('help.static', filename='cast_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'cast_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('Cast'),

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.event_trigger', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's collection class for event trigger collection
if (!pgBrowser.Nodes['coll-event_trigger']) {
@ -21,7 +22,7 @@ define([
type: 'event_trigger',
sqlAlterHelp: 'sql-altereventtrigger.html',
sqlCreateHelp: 'sql-createeventtrigger.html',
dialogHelp: '{{ url_for('help.static', filename='event_trigger_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'event_trigger_dialog.html'}),
label: gettext('Event Trigger'),
hasSQL: true,
hasDepends: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser) {
define('pgadmin.node.extension', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser) {
/*
* Create and Add an Extension Collection into nodes
@ -40,7 +41,7 @@ define([
type: 'extension',
sqlAlterHelp: 'sql-alterextension.html',
sqlCreateHelp: 'sql-createextension.html',
dialogHelp: '{{ url_for('help.static', filename='extension_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'extension_dialog.html'}),
hasSQL: true,
hasDepends: true,
canDrop: true,

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.foreign_server', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
define('pgadmin.node.user_mapping', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's node model class to create a Options model
var OptionsModel = pgAdmin.Browser.Node.Model.extend({
@ -57,7 +57,7 @@ define([
type: 'user_mapping',
sqlAlterHelp: 'sql-alterusermapping.html',
sqlCreateHelp: 'sql-createusermapping.html',
dialogHelp: '{{ url_for('help.static', filename='user_mapping_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'user_mapping_dialog.html'}),
label: gettext('User Mapping'),
hasSQL: true,
hasDepends: true,

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.foreign_data_wrapper', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's node model class to create a Options model
var OptionsModel = pgBrowser.Node.Model.extend({
@ -56,7 +56,7 @@ define([
type: 'foreign_data_wrapper',
sqlAlterHelp: 'sql-alterforeigndatawrapper.html',
sqlCreateHelp: 'sql-createforeigndatawrapper.html',
dialogHelp: '{{ url_for('help.static', filename='foreign_data_wrapper_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'foreign_data_wrapper_dialog.html'}),
label: gettext('Foreign Data Wrapper'),
hasSQL: true,
hasDepends: true,

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.language', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's collection class for languages collection
if (!pgBrowser.Nodes['coll-language']) {
@ -22,7 +22,7 @@ define([
type: 'language',
sqlAlterHelp: 'sql-alterlanguage.html',
sqlCreateHelp: 'sql-createlanguage.html',
dialogHelp: '{{ url_for('help.static', filename='language_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'language_dialog.html'}),
label: gettext('Language'),
hasSQL: true,
canDrop: true,

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.catalog_object_column', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.catalog_object', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.collation', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-collation']) {
var databases = pgAdmin.Browser.Nodes['coll-collation'] =
@ -18,7 +19,7 @@ define([
type: 'collation',
sqlAlterHelp: 'sql-altercollation.html',
sqlCreateHelp: 'sql-createcollation.html',
dialogHelp: '{{ url_for('help.static', filename='collation_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'collation_dialog.html'}),
label: gettext('Collation'),
collection_type: 'coll-collation',
hasSQL: true,

View File

@ -1,8 +1,9 @@
// Domain Constraint Module: Collection and Node
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.domain_constraints', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Define Domain Constraint Collection Node
if (!pgBrowser.Nodes['coll-domain_constraints']) {
@ -21,7 +22,7 @@ define([
type: 'domain_constraints',
sqlAlterHelp: 'sql-alterdomain.html',
sqlCreateHelp: 'sql-alterdomain.html',
dialogHelp: '{{ url_for('help.static', filename='domain_constraint_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'domain_constraint_dialog.html'}),
label: gettext('Domain Constraints'),
collection_type: 'coll-domain_constraints',
hasSQL: true,

View File

@ -1,8 +1,8 @@
// Domain Module: Collection and Node.
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
define('pgadmin.node.domain', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Define Domain Collection Node
if (!pgBrowser.Nodes['coll-domain']) {
@ -88,7 +88,7 @@ define([
type: 'domain',
sqlAlterHelp: 'sql-alterdomain.html',
sqlCreateHelp: 'sql-createdomain.html',
dialogHelp: '{{ url_for('help.static', filename='domain_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'domain_dialog.html'}),
label: gettext('Domain'),
collection_type: 'coll-domain',
hasSQL: true,

View File

@ -1,8 +1,9 @@
/* Create and Register Foreign Table Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.foreign-table', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-foreign-table']) {
var foreigntable = pgBrowser.Nodes['coll-foreign-table'] =
@ -495,7 +496,7 @@ define([
type: 'foreign-table',
sqlAlterHelp: 'sql-alterforeigntable.html',
sqlCreateHelp: 'sql-createforeigntable.html',
dialogHelp: '{{ url_for('help.static', filename='foreign_table_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'foreign_table_dialog.html'}),
label: gettext('Foreign Table'),
collection_type: 'coll-foreign-table',
hasSQL: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.fts_configuration', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Model for tokens control
var TokenModel = pgAdmin.Browser.Node.Model.extend({
@ -415,7 +416,7 @@ define([
type: 'fts_configuration',
sqlAlterHelp: 'sql-altertsconfig.html',
sqlCreateHelp: 'sql-createtsconfig.html',
dialogHelp: '{{ url_for('help.static', filename='fts_configuration_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'fts_configuration_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('FTS Configuration'),

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.fts_dictionary', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's node model class to create a option/value pair
var OptionLabelModel = pgAdmin.Browser.Node.Model.extend({
@ -57,7 +58,7 @@ define([
type: 'fts_dictionary',
sqlAlterHelp: 'sql-altertsdictionary.html',
sqlCreateHelp: 'sql-createtsdictionary.html',
dialogHelp: '{{ url_for('help.static', filename='fts_dictionary_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'fts_dictionary_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('FTS Dictionary'),

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.fts_parser', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the collection class for fts parser
if (!pgBrowser.Nodes['coll-fts_parser']) {
@ -21,7 +22,7 @@ define([
type: 'fts_parser',
sqlAlterHelp: 'sql-altertsparser.html',
sqlCreateHelp: 'sql-createtsparser.html',
dialogHelp: '{{ url_for('help.static', filename='fts_parser_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'fts_parser_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('FTS Parser'),

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.fts_template', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the collection class for fts template
if (!pgBrowser.Nodes['coll-fts_template']) {
@ -21,7 +22,7 @@ define([
type: 'fts_template',
sqlAlterHelp: 'sql-altertstemplate.html',
sqlCreateHelp: 'sql-createtstemplate.html',
dialogHelp: '{{ url_for('help.static', filename='fts_template_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'fts_template_dialog.html'}),
canDrop: true,
canDropCascade: true,
label: gettext('FTS Template'),

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.function', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-function']) {
var functions = pgBrowser.Nodes['coll-function'] =
@ -87,7 +87,7 @@ define([
type: 'function',
sqlAlterHelp: 'sql-alterfunction.html',
sqlCreateHelp: 'sql-createfunction.html',
dialogHelp: '{{ url_for('help.static', filename='function_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'function_dialog.html'}),
label: gettext('Function'),
collection_type: 'coll-function',
hasSQL: true,

View File

@ -1,9 +1,10 @@
/* Create and Register Procedure Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.node.function',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify, Function) {
define('pgadmin.node.procedure', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.node.function', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Function) {
if (!pgBrowser.Nodes['coll-procedure']) {
var procedures = pgAdmin.Browser.Nodes['coll-procedure'] =
@ -24,7 +25,7 @@ define([
type: 'procedure',
sqlAlterHelp: 'sql-alterprocedure.html',
sqlCreateHelp: 'sql-createprocedure.html',
dialogHelp: '{{ url_for('help.static', filename='procedure_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'procedure_dialog.html'}),
label: gettext('Procedure'),
collection_type: 'coll-procedure',
hasSQL: true,

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.trigger_function', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-trigger_function']) {
var trigger_functions = pgBrowser.Nodes['coll-trigger_function'] =
@ -21,7 +21,7 @@ define([
type: 'trigger_function',
sqlAlterHelp: 'plpgsql-trigger.html',
sqlCreateHelp: 'plpgsql-trigger.html',
dialogHelp: '{{ url_for('help.static', filename='trigger_function_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'trigger_function_dialog.html'}),
label: gettext('Trigger function'),
collection_type: 'coll-trigger_function',
hasSQL: true,

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.edbfunc', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-edbfunc']) {
pgBrowser.Nodes['coll-edbfunc'] =
@ -18,7 +18,7 @@ define([
if (!pgBrowser.Nodes['edbfunc']) {
pgBrowser.Nodes['edbfunc'] = pgBrowser.Node.extend({
type: 'edbfunc',
dialogHelp: '{{ url_for('help.static', filename='edbfunc_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'edbfunc_dialog.html'}),
label: gettext('Function'),
collection_type: 'coll-edbfunc',
hasDepends: true,

View File

@ -1,9 +1,12 @@
/* Create and Register Procedure Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.node.edbfunc',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify, EdbFunction) {
define('pgadmin.node.edbproc', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.node.edbfunc', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(
gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, EdbFunction
) {
if (!pgBrowser.Nodes['coll-edbproc']) {
pgAdmin.Browser.Nodes['coll-edbproc'] =
@ -20,7 +23,7 @@ define([
if (!pgBrowser.Nodes['edbproc']) {
pgAdmin.Browser.Nodes['edbproc'] = pgBrowser.Node.extend({
type: 'edbproc',
dialogHelp: '{{ url_for('help.static', filename='edbproc_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'edbproc_dialog.html'}),
label: gettext('Procedure'),
collection_type: 'coll-edbproc',
hasDepends: true,

View File

@ -1,9 +1,9 @@
/* Create and Register Function Collection and Node. */
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.edbvar', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-edbvar']) {
pgBrowser.Nodes['coll-edbvar'] =
@ -18,7 +18,7 @@ define([
if (!pgBrowser.Nodes['edbvar']) {
pgBrowser.Nodes['edbvar'] = pgBrowser.Node.extend({
type: 'edbvar',
dialogHelp: '{{ url_for('help.static', filename='edbvar_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'edbvar_dialog.html'}),
label: gettext('Function'),
collection_type: 'coll-edbvar',
canEdit: false,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.package', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's collection class for package collection
if (!pgBrowser.Nodes['coll-package']) {
@ -18,7 +19,7 @@ define([
if (!pgBrowser.Nodes['package']) {
pgBrowser.Nodes['package'] = pgBrowser.Node.extend({
type: 'package',
dialogHelp: '{{ url_for('help.static', filename='package_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'package_dialog.html'}),
label: gettext('Package'),
collection_type: 'coll-package',
hasSQL: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.sequence', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
// Extend the browser's collection class for sequence collection
if (!pgBrowser.Nodes['coll-sequence']) {
@ -21,7 +22,7 @@ define([
type: 'sequence',
sqlAlterHelp: 'sql-altersequence.html',
sqlCreateHelp: 'sql-createsequence.html',
dialogHelp: '{{ url_for('help.static', filename='sequence_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'sequence_dialog.html'}),
label: gettext('Sequence'),
collection_type: 'coll-sequence',
hasSQL: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.synonym', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-synonym']) {
var databases = pgAdmin.Browser.Nodes['coll-synonym'] =
@ -16,7 +17,7 @@ define([
if (!pgBrowser.Nodes['synonym']) {
pgAdmin.Browser.Nodes['synonym'] = pgBrowser.Node.extend({
type: 'synonym',
dialogHelp: '{{ url_for('help.static', filename='synonym_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'synonym_dialog.html'}),
label: gettext('Synonym'),
collection_type: 'coll-synonym',
hasSQL: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
define('pgadmin.node.column', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
if (!pgBrowser.Nodes['coll-column']) {
var databases = pgBrowser.Nodes['coll-column'] =
@ -92,7 +93,7 @@ define([
hasSQL: true,
sqlAlterHelp: 'sql-altertable.html',
sqlCreateHelp: 'sql-altertable.html',
dialogHelp: '{{ url_for('help.static', filename='column_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'column_dialog.html'}),
canDrop: function(itemData, item, data){
if (pgBrowser.Nodes['schema'].canChildDrop.apply(this, [itemData, item, data])) {
var t = pgBrowser.tree, i = item, d = itemData, parents = [];

View File

@ -1,8 +1,9 @@
// Check Constraint Module: Node
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify) {
define('pgadmin.node.check_constraints', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
// Check Constraint Node
if (!pgBrowser.Nodes['check_constraints']) {
@ -12,7 +13,7 @@ define([
collection_type: 'coll-constraints',
sqlAlterHelp: 'ddl-alter.html',
sqlCreateHelp: 'ddl-constraints.html',
dialogHelp: '{{ url_for('help.static', filename='check_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'check_dialog.html'}),
hasSQL: true,
hasDepends: true,
parent_type: ['table'],

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify) {
define('pgadmin.node.exclusion_constraint', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
var ExclusionConstraintColumnModel = pgBrowser.Node.Model.extend({
defaults: {
@ -606,7 +607,7 @@ define([
collection_type: 'coll-constraints',
sqlAlterHelp: 'ddl-alter.html',
sqlCreateHelp: 'ddl-constraints.html',
dialogHelp: '{{ url_for('help.static', filename='exclusion_constraint_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'exclusion_constraint_dialog.html'}),
hasSQL: true,
parent_type: 'table',
canDrop: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify) {
define('pgadmin.node.foreign_key', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
var formatNode = function(opt) {
if (!opt.id) {
@ -604,7 +605,7 @@ define([
collection_type: 'coll-constraints',
sqlAlterHelp: 'ddl-alter.html',
sqlCreateHelp: 'ddl-constraints.html',
dialogHelp: '{{ url_for('help.static', filename='foreign_key_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'foreign_key_dialog.html'}),
hasSQL: true,
hasDepends: false,
parent_type: 'table',

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.{{node_type}}', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.constraints', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'pgadmin.browser.collection'{% for c in constraints %}, 'pgadmin.node.{{ c|safe }}'{%endfor%}
], function(gettext, $, _, S, pgAdmin, pgBrowser) {

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
define('pgadmin.node.index', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
if (!pgBrowser.Nodes['coll-index']) {
var databases = pgAdmin.Browser.Nodes['coll-index'] =
@ -11,7 +12,7 @@ define([
type: 'coll-index',
sqlAlterHelp: 'sql-alterindex.html',
sqlCreateHelp: 'sql-createindex.html',
dialogHelp: '{{ url_for('help.static', filename='index_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'index_dialog.html'}),
columns: ['name', 'description'],
hasStatistics: true,
statsPrettifyFields: ['Size', 'Index size']

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'codemirror'
], function(gettext, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
define('pgadmin.node.rule', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'codemirror'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
/**
Create and add a rule collection into nodes
@ -38,7 +38,7 @@ define([
type: 'rule',
sqlAlterHelp: 'sql-alterrule.html',
sqlCreateHelp: 'sql-createrule.html',
dialogHelp: '{{ url_for('help.static', filename='rule_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'rule_dialog.html'}),
label: gettext('rule'),
collection_type: 'coll-table',
hasSQL: true,

View File

@ -1,8 +1,9 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.node.column', 'pgadmin.node.constraints'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.table', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.node.column',
'pgadmin.node.constraints'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-table']) {
var databases = pgBrowser.Nodes['coll-table'] =
@ -31,7 +32,7 @@ define([
'Dead tuple length', 'Free space'],
sqlAlterHelp: 'sql-altertable.html',
sqlCreateHelp: 'sql-createtable.html',
dialogHelp: '{{ url_for('help.static', filename='table_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'table_dialog.html'}),
parent_type: ['schema', 'catalog'],
hasScriptTypes: ['create', 'select', 'insert', 'update', 'delete'],
height: '95%',

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
define('pgadmin.node.trigger', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
var CustomSwitchControl = Backform.CustomSwitchControl = Backform.SwitchControl.extend({
template: _.template([
@ -43,7 +44,7 @@ define([
width: '650px',
sqlAlterHelp: 'sql-altertrigger.html',
sqlCreateHelp: 'sql-createtrigger.html',
dialogHelp: '{{ url_for('help.static', filename='trigger_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'trigger_dialog.html'}),
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)

View File

@ -1,4 +1,4 @@
define([
define('pgadmin.node.catalog', [
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'backform', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
define('pgadmin.node.schema', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'backform', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify) {
// VacuumSettings Collection to display all settings parameters as Grid
var VacuumCollectionControl = Backform.VacuumCollectionControl =
@ -281,7 +281,7 @@ define([
type: 'schema',
sqlAlterHelp: 'sql-alterschema.html',
sqlCreateHelp: 'sql-createschema.html',
dialogHelp: '{{ url_for('help.static', filename='schema_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'schema_dialog.html'}),
label: gettext('Schema'),
hasSQL: true,
canDrop: true,

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'backgrid', 'pgadmin.backgrid',
'pgadmin.browser.collection'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify, Backgrid) {
define('pgadmin.node.type', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify', 'backgrid',
'pgadmin.backgrid', 'pgadmin.browser.collection'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backgrid) {
if (!pgBrowser.Nodes['coll-type']) {
var databases = pgBrowser.Nodes['coll-type'] =
@ -250,7 +250,7 @@ define([
type: 'type',
sqlAlterHelp: 'sql-altertype.html',
sqlCreateHelp: 'sql-createtype.html',
dialogHelp: '{{ url_for('help.static', filename='type_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'type_dialog.html'}),
label: gettext('Type'),
collection_type: 'coll-type',
hasSQL: true,

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'alertify', 'pgadmin.browser', 'codemirror',
define('pgadmin.node.mview', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'alertify', 'pgadmin.browser', 'codemirror',
'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, alertify, pgBrowser, CodeMirror) {
], function(gettext, url_for, $, _, S, pgAdmin, alertify, pgBrowser, CodeMirror) {
/**
Create and add a view collection into nodes
@ -38,7 +38,7 @@ define([
type: 'mview',
sqlAlterHelp: 'sql-altermaterializedview.html',
sqlCreateHelp: 'sql-creatematerializedview.html',
dialogHelp: '{{ url_for('help.static', filename='materialized_view_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'materialized_view_dialog.html'}),
label: gettext('Materialized View'),
hasSQL: true,
hasDepends: true,

View File

@ -1,8 +1,9 @@
define([
define('pgadmin.node.view', [
'sources/gettext',
'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'codemirror', 'pgadmin.browser.server.privilege', 'pgadmin.node.rule'
], function(gettext, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'codemirror', 'pgadmin.browser.server.privilege',
'pgadmin.node.rule'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, CodeMirror) {
/**
Create and add a view collection into nodes
@ -38,7 +39,7 @@ define([
type: 'view',
sqlAlterHelp: 'sql-alterview.html',
sqlCreateHelp: 'sql-createview.html',
dialogHelp: '{{ url_for('help.static', filename='view_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'view_dialog.html'}),
label: gettext('View'),
hasSQL: true,
hasDepends: true,

View File

@ -1,8 +1,9 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.server.privilege', 'pgadmin.browser.server.variable',
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify) {
define('pgadmin.node.database', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
'pgadmin.browser.server.variable',
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
if (!pgBrowser.Nodes['coll-database']) {
var databases = pgBrowser.Nodes['coll-database'] =
@ -22,7 +23,7 @@ define([
type: 'database',
sqlAlterHelp: 'sql-alterdatabase.html',
sqlCreateHelp: 'sql-createdatabase.html',
dialogHelp: '{{ url_for('help.static', filename='database_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'database_dialog.html'}),
hasSQL: true,
hasDepends: true,
hasStatistics: true,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin', 'moment',
'pgadmin.browser', 'alertify', 'backform', 'pgadmin.backform'
], function(gettext, $, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform) {
define('pgadmin.node.pga_schedule', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'moment', 'pgadmin.browser', 'alertify',
'backform', 'pgadmin.backform'
], function(gettext, url_for, $, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform) {
if (!pgBrowser.Nodes['coll-pga_schedule']) {
pgBrowser.Nodes['coll-pga_schedule'] =
@ -181,7 +182,7 @@ define([
pgBrowser.Nodes['pga_schedule'] = pgBrowser.Node.extend({
parent_type: 'pga_job',
type: 'pga_schedule',
dialogHelp: '{{ url_for('help.static', filename='pgagent_jobs.html') }}',
dialogHelp: url_for('help.static', {'filename': 'pgagent_jobs.html'}),
hasSQL: true,
hasDepends: false,
hasStatistics: false,

View File

@ -1,7 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'backform', 'pgadmin.backform'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify, Backform) {
define('pgadmin.node.pga_jobstep', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify', 'backform',
'pgadmin.backform'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform) {
if (!pgBrowser.Nodes['coll-pga_jobstep']) {
pgBrowser.Nodes['coll-pga_jobstep'] =
@ -21,7 +22,7 @@ define([
pgBrowser.Nodes['pga_jobstep'] = pgBrowser.Node.extend({
parent_type: 'pga_job',
type: 'pga_jobstep',
dialogHelp: '{{ url_for('help.static', filename='pgagent_jobs.html') }}',
dialogHelp: url_for('help.static', {'filename': 'pgagent_jobs.html'}),
hasSQL: true,
hasDepends: false,
hasStatistics: true,

View File

@ -1,8 +1,8 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.node.pga_jobstep',
'pgadmin.node.pga_schedule'
], function(gettext, $, _, S, pgAdmin, pgBrowser, Alertify) {
define('pgadmin.node.pga_job', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.node.pga_jobstep', 'pgadmin.node.pga_schedule'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify) {
if (!pgBrowser.Nodes['coll-pga_job']) {
var pga_jobs = pgBrowser.Nodes['coll-pga_job'] =
@ -19,7 +19,7 @@ define([
pgBrowser.Nodes['pga_job'] = pgBrowser.Node.extend({
parent_type: 'server',
type: 'pga_job',
dialogHelp: '{{ url_for('help.static', filename='pgagent_jobs.html') }}',
dialogHelp: url_for('help.static', {'filename': 'pgagent_jobs.html'}),
hasSQL: true,
hasDepends: false,
hasStatistics: true,

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'underscore', 'pgadmin.browser',
define('pgadmin.node.resource_group', [
'sources/gettext', 'sources/url_for', 'underscore', 'pgadmin.browser',
'pgadmin.browser.collection'
], function(gettext, _, pgBrowser) {
], function(gettext, url_for, _, pgBrowser) {
// Extend the browser's collection class for resource group collection
if (!pgBrowser.Nodes['coll-resource_group']) {
@ -19,7 +19,7 @@ define([
pgBrowser.Nodes['resource_group'] = pgBrowser.Node.extend({
parent_type: 'server',
type: 'resource_group',
dialogHelp: "{{ url_for('help.static', filename='resource_group_dialog.html') }}",
dialogHelp: url_for('help.static', {'ilename': 'resource_group_dialog.html'}),
label: gettext('Resource Group'),
hasSQL: true,
canDrop: true,

View File

@ -1,9 +1,9 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.backform', 'select2',
'pgadmin.browser.collection', 'pgadmin.browser.node.ui',
'pgadmin.browser.server.variable'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
define('pgadmin.node.role', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.backform', 'select2', 'pgadmin.browser.collection',
'pgadmin.browser.node.ui', 'pgadmin.browser.server.variable'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
if (!pgBrowser.Nodes['coll-role']) {
var role = pgAdmin.Browser.Nodes['coll-role'] =
@ -311,7 +311,7 @@ define([
type: 'role',
sqlAlterHelp: 'sql-alterrole.html',
sqlCreateHelp: 'sql-createrole.html',
dialogHelp: '{{ url_for('help.static', filename='role_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'role_dialog.html'}),
label: gettext('Login/Group Role'),
hasSQL: true,
canDrop: function(node, item) {

View File

@ -1,8 +1,9 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify', 'pgadmin.browser.collection',
'pgadmin.browser.node.ui', 'pgadmin.browser.server.privilege'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.tablespace', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
'pgadmin.browser.collection', 'pgadmin.browser.node.ui',
'pgadmin.browser.server.privilege'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['coll-tablespace']) {
var databases = pgBrowser.Nodes['coll-tablespace'] =
@ -22,7 +23,7 @@ define([
type: 'tablespace',
sqlAlterHelp: 'sql-altertablespace.html',
sqlCreateHelp: 'sql-createtablespace.html',
dialogHelp: '{{ url_for('help.static', filename='tablespace_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'tablespace_dialog.html'}),
label: gettext('Tablespace'),
hasSQL: true,
canDrop: true,
@ -178,7 +179,7 @@ define([
buttons: [{
text: '', key: 27, className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{name:'dialog_help', type:'button', label: gettext('Users'),
url: '{{ url_for('help.static', filename='move_objects.html') }}'}
url: url_for('help.static', {'filename': 'move_objects.html'})}
},{
text: gettext('OK'), key: 27, className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button'
},{

View File

@ -1,7 +1,7 @@
define([
'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
'pgadmin.browser', 'alertify'
], function(gettext, $, _, S, pgAdmin, pgBrowser, alertify) {
define('pgadmin.node.server', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify'
], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
if (!pgBrowser.Nodes['server']) {
@ -39,7 +39,7 @@ define([
pgAdmin.Browser.Nodes['server'] = pgAdmin.Browser.Node.extend({
parent_type: 'server-group',
type: 'server',
dialogHelp: '{{ url_for('help.static', filename='server_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'server_dialog.html'}),
label: gettext('Server'),
canDrop: true,
hasStatistics: true,

View File

@ -1,13 +1,13 @@
define([
'sources/gettext', 'jquery', 'underscore', 'pgadmin', 'backbone',
'pgadmin.browser', 'pgadmin.browser.node'
], function(gettext, $, _, pgAdmin, Backbone) {
define('pgadmin.node.server-group', [
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin',
'backbone', 'pgadmin.browser', 'pgadmin.browser.node'
], function(gettext, url_for, $, _, pgAdmin, Backbone) {
if (!pgAdmin.Browser.Nodes['server-group']) {
pgAdmin.Browser.Nodes['server-group'] = pgAdmin.Browser.Node.extend({
parent_type: null,
type: 'server-group',
dialogHelp: '{{ url_for('help.static', filename='server_group_dialog.html') }}',
dialogHelp: url_for('help.static', {'filename': 'server_group_dialog.html'}),
label: gettext('Server Group'),
width: '350px',
height: '250px',

View File

@ -5,7 +5,7 @@ try {
require(
['pgadmin', 'pgadmin.browser'],
function(pgAdmin, pgBrowser) {
pgBrowser.init();
pgBrowser.init();
},
function() {
/* TODO:: Show proper error dialog */

View File

@ -1,6 +1,6 @@
define(
'pgadmin.browser', [
'sources/gettext', 'require', 'jquery', 'underscore', 'underscore.string',
'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', 'underscore.string',
'bootstrap', 'pgadmin', 'alertify', 'codemirror',
'sources/check_node_visibility', 'codemirror/mode/sql/sql', 'wcdocker',
'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree',
@ -9,7 +9,7 @@ define(
'pgadmin.browser.error', 'pgadmin.browser.frame',
'pgadmin.browser.node', 'pgadmin.browser.collection'
], function(
gettext, require, $, _, S, Bootstrap, pgAdmin, Alertify,
gettext, url_for, require, $, _, S, Bootstrap, pgAdmin, Alertify,
CodeMirror, checkNodeVisibility
) {
@ -55,7 +55,7 @@ define(
function(b) {
$('#tree').aciTree({
ajax: {
url: '{{ url_for('browser.get_nodes') }}',
url: url_for('browser.nodes'),
converters: {
'text json': processTreeData,
}
@ -86,7 +86,7 @@ define(
// Extend the browser class attributes
_.extend(pgAdmin.Browser, {
// The base url for browser
URL: '{{ url_for('browser.index') }}',
URL: url_for('browser.index'),
// We do have docker of type wcDocker to take care of different
// containers. (i.e. panels, tabs, frames, etc.)
docker:null,
@ -313,7 +313,7 @@ define(
settings = { setting: "Browser/Layout", value: state };
$.ajax({
type: 'POST',
url: "{{ url_for('settings.store') }}",
url: url_for('settings.store_bulk'),
data: settings
});
}
@ -551,7 +551,7 @@ define(
// Ping the server every 5 minutes
setInterval(function() {
$.ajax({
url: '{{ url_for('misc.ping') }}',
url: url_for('misc.ping'),
type:'POST',
success: function() {},
error: function() {}
@ -753,7 +753,11 @@ define(
var preference = null;
$.ajax({
async: false,
url: "{{ url_for('preferences.preferences') }}" +"/"+ module +"/"+ preference_name,
url: url_for(
'preferences.get_by_name', {
'module': module,
'preference': preference_name
}),
success: function(res) {
preference = res;
},

View File

@ -0,0 +1,11 @@
define(
'pgadmin.browser.endpoints', [],
function() {
return {
{% for endpoint, url in current_app.exposed_endpoint_url_map %}{% if loop.index != 1 %},
{% endif %}
'{{ endpoint|safe }}': '{{ url|safe }}'{% endfor %}
};
});

View File

@ -101,6 +101,12 @@ class HelpModule(PgAdminModule):
'Path to the EDB Advanced Server documentation. $VERSION$ will be replaced with the major.minor version number.')
)
def get_exposed_url_endpoints(self):
"""
Returns the list of URLs exposed to the client.
"""
return ['help.static']
# Initialise the module
blueprint = HelpModule(MODULE_NAME, __name__, static_url_path='/help',

View File

@ -54,13 +54,20 @@ class MiscModule(PgAdminModule):
'value': lang})
# Register options for the User language settings
language = self.misc_preference.register(
self.misc_preference.register(
'miscellaneous', 'user_language',
_("User language"), 'options', 'en',
category_label=_('User language'),
options=lang_options
)
def get_exposed_url_endpoints(self):
"""
Returns:
list: a list of url endpoints exposed to the client.
"""
return ['misc.ping']
# Initialise the module
blueprint = MiscModule(MODULE_NAME, __name__)

View File

@ -15,7 +15,6 @@ side and for getting/setting preferences.
import simplejson as json
from flask import render_template, url_for, Response, request, session
from flask_babel import gettext
from flask_login import current_user
from flask_security import login_required
from pgadmin.utils import PgAdminModule
from pgadmin.utils.ajax import success_return, \
@ -56,21 +55,17 @@ class PreferencesModule(PgAdminModule):
]
}
def get_exposed_url_endpoints(self):
"""
Returns:
list: a list of url endpoints exposed to the client.
"""
return ['preferences.index', 'preferences.get_by_name']
blueprint = PreferencesModule(MODULE_NAME, __name__)
@blueprint.route("/")
@login_required
def index():
"""Render the preferences dialog."""
return render_template(
MODULE_NAME + "/index.html",
username=current_user.email,
_=gettext
)
@blueprint.route("/preferences.js")
@login_required
def script():
@ -80,8 +75,8 @@ def script():
mimetype="application/javascript")
@blueprint.route("/preferences", methods=["GET"])
@blueprint.route("/preferences/<module>/<preference>")
@blueprint.route("/", methods=["GET"], endpoint='index')
@blueprint.route("/<module>/<preference>", endpoint='get_by_name')
@login_required
def preferences(module=None, preference=None):
"""Fetch all/or requested preferences of pgAdmin IV."""
@ -147,7 +142,7 @@ def preferences(module=None, preference=None):
)
@blueprint.route("/preferences/<int:pid>", methods=["PUT"])
@blueprint.route("/<int:pid>", methods=["PUT"], endpoint="update")
@login_required
def save(pid):
"""

View File

@ -1,7 +1,7 @@
define([
'jquery', 'alertify', 'pgadmin', 'underscore', 'backform',
'pgadmin.browser', 'sources/gettext', 'pgadmin.backform'
], function($, alertify, pgAdmin, _, Backform, pgBrowser, gettext) {
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'alertify',
'pgadmin', 'backform', 'pgadmin.browser', 'pgadmin.backform'
], function(gettext, url_for, $, _, alertify, pgAdmin, Backform, pgBrowser) {
// This defines the Preference/Options Dialog for pgAdmin IV.
pgAdmin = pgAdmin || window.pgAdmin || {};
@ -52,7 +52,7 @@ define([
var changed = {},
preferences = this.preferences = new (Backbone.Collection.extend({
model: PreferenceModel,
url: "{{ url_for('preferences.preferences') }}",
url: url_for('preferences.index'),
updateAll: function() {
// We will send only the modified data to the server.
for (var key in changed) {
@ -207,7 +207,7 @@ define([
};
return 'switch';
case 'integer':
return 'integer';
return 'numeric';
case 'numeric':
return 'numeric';
case 'date':
@ -345,7 +345,7 @@ define([
selectable: true,
expand: true,
ajax: {
url: "{{ url_for('preferences.preferences') }}"
url: url_for('preferences.index')
}
});
@ -354,15 +354,20 @@ define([
setup: function() {
return {
buttons:[{
text: '', key: 27, className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{name:'dialog_help', type:'button', label: gettext('Preferences'),
url: '{{ url_for('help.static', filename='preferences.html') }}'}
},{
text: gettext('OK'), key: 13, className: "btn btn-primary fa fa-lg fa-save pg-alertify-button"
},{
text: gettext('Cancel'), className: "btn btn-danger fa fa-lg fa-times pg-alertify-button"
text: '', key: 27,
className: 'btn btn-default pull-left fa fa-lg fa-question',
attrs:{
name:'dialog_help', type:'button',
label: gettext('Preferences'),
url: url_for(
'help.static', {'filename': 'preferences.html'}
)
}
],
},{
text: gettext('OK'), key: 13, className: "btn btn-primary fa fa-lg fa-save pg-alertify-button"
},{
text: gettext('Cancel'), className: "btn btn-danger fa fa-lg fa-times pg-alertify-button"
}],
focus: { element: 0 },
options: {
padding: !1,

View File

@ -44,6 +44,13 @@ class SettingsModule(PgAdminModule):
]
}
def get_exposed_url_endpoints(self):
"""
Returns:
list: a list of url endpoints exposed to the client.
"""
return ['settings.store', 'settings.store_bulk']
blueprint = SettingsModule(MODULE_NAME, __name__)
@ -82,8 +89,8 @@ def script():
mimetype="application/javascript")
@blueprint.route("/store", methods=['POST'])
@blueprint.route("/store/<setting>/<value>", methods=['GET'])
@blueprint.route("/store", methods=['POST'], endpoint='store_bulk')
@blueprint.route("/store/<setting>/<value>", methods=['PUT'], endpoint='store')
@login_required
def store(setting=None, value=None):
"""Store a configuration setting, or if this is a POST request and a

View File

@ -1,8 +1,10 @@
define(['jquery',
'sources/selection/column_selector',
'sources/selection/row_selector',
'sources/selection/range_selection_helper'],
function ($, ColumnSelector, RowSelector, RangeSelectionHelper) {
'sources/selection/range_selection_helper',
'sources/url_for'
],
function ($, ColumnSelector, RowSelector, RangeSelectionHelper, url_for) {
var Slick = window.Slick;
var GridSelector = function (columnDefinitions) {
@ -32,7 +34,7 @@ define(['jquery',
'title="Select/Deselect All">' +
'<br>' +
columnDefinitions[0].name +
'<img class="select-all-icon" src="/static/img/select-all-icon.png">' +
'<img class="select-all-icon" src="' + url_for('static', {'filename': 'img/select-all-icon.png'}) + '"></img>'
'</span>';
return columnDefinitions;
};

View File

@ -0,0 +1,41 @@
define(["pgadmin.browser.endpoints"], function (endpoints) {
/***
* This method behaves as a drop-in replacement for flask url_for function.
* It uses the exposed URLs file under the hood, and replace the substitions provided by the modules.
*
* ex.
* url_for("help.static", {filename: "server_dialog.html"}) will produce the
* output string '/help/help/server_dialog.html' from the url ->
* '/help/help/<path:filename>'.
*
* @param {String} text
* @param {Object} substitutions
*/
return function url_for(endpoint, substitutions) {
var rawURL = endpoints[endpoint];
// captures things of the form <path:substitutionName>
var substitutionGroupsRegExp = /([<])([^:^>]*:)?([^>]+)([>])/g;
var matchFound;
var interpolated = rawURL;
if (!rawURL)
return rawURL;
interpolated = interpolated.replace(
substitutionGroupsRegExp,
function (_origin, _1, _2, substitutionName) {
if (substitutionName in substitutions) {
return substitutions[substitutionName];
}
return _origin;
}
);
return interpolated;
};
});

View File

@ -100,6 +100,13 @@ class PgAdminModule(Blueprint):
"""
return []
def get_exposed_url_endpoints(self):
"""
Returns:
list: a list of url endpoints exposed to the client.
"""
return []
@property
def stylesheets(self):
stylesheets = self.get_own_stylesheets()
@ -132,6 +139,15 @@ class PgAdminModule(Blueprint):
for key, value in menu_items.items())
return menu_items
@property
def exposed_endpoints(self):
res = self.get_exposed_url_endpoints()
for module in self.submodules:
res += module.exposed_endpoints
return res
import os
import sys

View File

@ -0,0 +1,12 @@
//////////////////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2017, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
define(function () {
return {'static': '/base/pgadmin/static/<path:filename>'}
});

View File

@ -37,6 +37,7 @@ require.config({
'slickgrid': sourcesDir + 'vendor/slickgrid/slick.core',
'slickgrid/slick.grid': sourcesDir + 'vendor/slickgrid/slick.grid',
'translations': '/base/regression/javascript/fake_translations',
'pgadmin.browser.endpoints': '/base/regression/javascript/fake_endpoints',
'sources': sourcesDir + 'js',
'browser': '/base/pgadmin/browser/static/js'
},