Allow to create the foreign table with inherits options. Fixes #1260

This commit is contained in:
Harshal Dhumal 2016-08-02 09:38:17 +05:30 committed by Ashesh Vashi
parent 01252a13cf
commit ec3b9bb15b
9 changed files with 32 additions and 163 deletions

View File

@ -668,7 +668,8 @@ AND relkind != 'c'))"""
if not status:
return internal_server_error(errormsg=res)
foid, scid = res['rows'][0]
foid = res['rows'][0]['oid']
scid = res['rows'][0]['scid']
return jsonify(
node=self.blueprint.generate_browser_node(
@ -718,7 +719,8 @@ AND relkind != 'c'))"""
)
)
name, basensp = res['rows'][0]
name = res['rows'][0]['name']
basensp = res['rows'][0]['basensp']
SQL = render_template("/".join([self.template_path,
'delete.sql']),
@ -1103,13 +1105,6 @@ AND relkind != 'c'))"""
if cols and 'rows' in cols:
data['columns'] = cols['rows']
data['strcolumn'] = ''
str_cols = []
if 'columns' in data:
for c in data['columns']:
str_cols.append(c['strcolumn'])
data['strcolumn'] = ', '.join(str_cols)
# Get Inherited table names from their OID
if inherits:
if 'inherits' in data and data['inherits']:

View File

@ -241,22 +241,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
toJSON: Backbone.Model.prototype.toJSON
});
var formatNode = function(opt) {
if (!opt.id) {
return opt.text;
}
var optimage = $(opt.element).data('image');
if(!optimage){
return opt.text;
} else {
return $(
'<span><span class="wcTabIcon ' + optimage + '"/>' + opt.text + '</span>'
);
}
};
/* NodeAjaxOptionsMultipleControl is for multiple selection of Combobox.
* This control is used to select Multiple Parent Tables to be inherited.
@ -264,83 +248,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
* To populates the column, it calls the server and fetch the columns data
* for the selected table.
*/
var NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsControl.extend({
template: _.template([
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
'<div class="<%=Backform.controlsClassName%> <%=extraClasses.join(\' \')%>">',
' <select class="pgadmin-node-select form-control" name="<%=name%>" style="width:100%;" value=<%-value%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> >',
' </select>',
'</div>'].join("\n")),
defaults: _.extend(
{}, Backform.NodeAjaxOptionsControl.prototype.defaults,
{
select2: {
allowClear: true,
placeholder: 'Select from the list',
width: 'style',
templateResult: formatNode,
templateSelection: formatNode
}
}),
render: function() {
var field = _.defaults(this.field.toJSON(), this.defaults),
attributes = this.model.toJSON(),
attrArr = field.name.split('.'),
name = attrArr.shift(),
path = attrArr.join('.'),
rawValue = this.keyPathAccessor(attributes[name], path),
data = _.extend(field, {
rawValue: rawValue,
value: this.formatter.fromRaw(rawValue, this.model),
attributes: attributes,
formatter: this.formatter
}),
evalF = function(f, d, m) {
return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f);
};
// Evaluate the disabled, visible, and required option
_.extend(data, {
disabled: evalF(data.disabled, data, this.model),
visible: evalF(data.visible, data, this.model),
required: evalF(data.required, data, this.model)
});
if (field.node_info.server.version < field.min_version) {
field.version_compatible = false
return this;
}
else {
// Evaluation the options
if (_.isFunction(data.options)) {
try {
data.options = data.options.apply(this)
} catch(e) {
// Do nothing
data.options = []
this.model.trigger('pgadmin-view:transform:error', self.model, self.field, e);
}
}
// Clean up first
this.$el.removeClass(Backform.hiddenClassname);
this.$el.html(this.template(data)).addClass(field.name);
if (!data.visible) {
this.$el.addClass(Backform.hiddenClassname);
} else {
var opts = _.extend(
{}, this.defaults.select2, data.select2,
{
'data': data.options
});
this.$el.find("select").select2(opts).val(data.rawValue).trigger("change");
this.updateInvalid();
}
}
return this;
},
var NodeAjaxOptionsMultipleControl = Backform.NodeAjaxOptionsControl.extend({
onChange: function(e) {
var model = this.model,
$el = $(e.target),
@ -370,7 +278,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
// Remove Columns if inherit option is deselected from the combobox
if(_.size(value) < _.size(inherits)) {
var dif = _.difference(inherits, JSON.parse(value));
var dif = _.difference(inherits, value);
var rmv_columns = columns.where({inheritedid: parseInt(dif[0])});
columns.remove(rmv_columns);
}
@ -600,7 +508,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
basensp: undefined,
description: undefined,
ftsrvname: undefined,
strcolumn: undefined,
strftoptions: undefined,
inherits: [],
columns: [],
@ -632,7 +539,7 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
type: 'text', group: 'Definition', url: 'get_foreign_servers', disabled: function(m) { return !m.isNew(); }
},{
id: 'inherits', label:'{{ _('Inherits') }}', group: 'Definition',
type: 'array', min_version: 90500, control: 'node-ajax-options-multiple',
type: 'array', min_version: 90500, control: NodeAjaxOptionsMultipleControl,
url: 'get_tables', select2: {multiple: true},
'cache_level': 'database',
transform: function(d, self){
@ -645,9 +552,6 @@ function($, _, S, pgAdmin, pgBrowser, alertify) {
}
return d;
}
},{
id: 'strcolumn', label:'{{ _('Columns') }}', cell: 'string', group: 'Definition',
type: 'text', min_version: 90500, mode: ['properties']
},{
id: 'columns', label:'{{ _('Columns') }}', cell: 'string',
type: 'collection', group: 'Columns', visible: false, mode: ['edit', 'create'],

View File

@ -1,13 +1,7 @@
SELECT
attname, attndims, atttypmod, format_type(t.oid,NULL) AS datatype,
format_type(t.oid, att.atttypmod) AS fulltype, attnotnull, attnum,
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup,
(
attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
(CASE WHEN attnotnull='true'
THEN 'NOT NULL' ELSE 'NULL'
END)
) as strcolumn
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup
FROM
pg_attribute att
JOIN

View File

@ -4,25 +4,7 @@ SELECT
CASE WHEN length(cn.nspname) > 0 AND length(cl.collname) > 0 THEN
concat(cn.nspname, '."', cl.collname,'"') ELSE '' END AS collname,
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup,
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault,
(
attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
(
CASE WHEN array_length(attfdwoptions, 1)>0
THEN concat('OPTIONS (', array_to_string(attfdwoptions, ', '), ')') ELSE ''
END
) || ' ' ||
(
CASE WHEN attnotnull='true'
THEN 'NOT NULL' ELSE 'NULL'
END
) || ' ' ||
(
CASE WHEN pg_catalog.pg_get_expr(def.adbin, def.adrelid)<>''
THEN 'DEFAULT ' || pg_catalog.pg_get_expr(def.adbin, def.adrelid)
ELSE '' END
)
) as strcolumn
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault
FROM
pg_attribute att
JOIN

View File

@ -20,25 +20,6 @@ SELECT INH.inheritedfrom, INH.inheritedid, att.attoptions, attfdwoptions,
concat(cn.nspname, '."', cl.collname,'"')
ELSE '' END AS collname,
pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS typdefault,
(
att.attname || ' ' || format_type(t.oid, att.atttypmod) || ' ' ||
(
CASE WHEN array_length(attfdwoptions, 1)>0
THEN concat('OPTIONS (', array_to_string(attfdwoptions, ', '), ')') ELSE ''
END
) || ' ' ||
(
CASE WHEN attnotnull='true'
THEN 'NOT NULL' ELSE 'NULL'
END
) || ' ' ||
(
CASE WHEN pg_catalog.pg_get_expr(def.adbin, def.adrelid)<>''
THEN 'DEFAULT ' || pg_catalog.pg_get_expr(def.adbin, def.adrelid)
ELSE '' END
)
) as strcolumn,
(SELECT COUNT(1) from pg_type t2 WHERE t2.typname=t.typname) > 1 AS isdup
FROM
pg_attribute att

View File

@ -9,7 +9,7 @@ WHERE
{% else %}
SELECT
c.oid AS id, quote_ident(n.nspname) || '.' || quote_ident(c.relname) as text
c.oid AS value, quote_ident(n.nspname) || '.' || quote_ident(c.relname) as label
FROM
pg_class c, pg_namespace n
WHERE

View File

@ -21,6 +21,7 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
headerSelectControlTemplate = _.template([
'<div class="<%=Backform.controlsClassName%> <%=extraClasses.join(\' \')%>">',
' <select class="pgadmin-node-select form-control" name="<%=name%>" style="width:100%;" value="<%-value%>" <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> >',
' <%=select2.first_empty ? " <option></option>" : ""%>',
' <% for (var i=0; i < options.length; i++) { %>',
' <% var option = options[i]; %>',
' <option <% if (option.image) { %> data-image=<%= option.image %> <% } %> value=<%= formatter.fromRaw(option.value) %> <%=option.value === rawValue ? "selected=\'selected\'" : "" %>><%-option.label%></option>',
@ -134,8 +135,9 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
}),
select2: {
allowClear: false, width: 'style',
placeholder: 'Select column'
}, first_empty: !_.isUndefined(self.model.get('oid')),
placeholder: '{{ _('Select column') }}',
first_empty: !_.isUndefined(self.model.get('oid'))
},
version_compatible: self.field.get('version_compatible'),
disabled: function(m) {
return !_.isUndefined(self.model.get('oid'));
@ -234,10 +236,11 @@ function($, _, S, pgAdmin, pgBrowser, Alertify) {
Backform.Select2Control.prototype.render.apply(this, arguments);
return this;
}
}), url: 'get_columns', first_empty: true,
}), url: 'get_columns',
select2: {
allowClear: false,
width: "style",
placeholder: 'Select column',
placeholder: '{{ _('Select column') }}',
templateResult: formatNode,
templateSelection: formatNode
},

View File

@ -124,7 +124,7 @@ function(_, pgAdmin, $, Backbone) {
var self = this;
self._previous_key_values = {};
if ('on_server' in options && options.on_server) {
if (!_.isUndefined(options) && 'on_server' in options && options.on_server) {
self.on_server = true;
}

View File

@ -1804,7 +1804,11 @@
if (_.isArray(formattedData)) {
return _.map(formattedData, decodeURIComponent);
} else {
return decodeURIComponent(formattedData);
if(!_.isNull(formattedData) && !_.isUndefined(formattedData)) {
return decodeURIComponent(formattedData);
} else {
return null;
}
}
}
});
@ -1915,9 +1919,15 @@
return this;
},
getValueFromDOM: function() {
return Backform.SelectControl.prototype.getValueFromDOM.apply(
this, arguments
);
var val = Backform.SelectControl.prototype.getValueFromDOM.apply(
this, arguments
),
select2Opts = _.extend({}, this.field.get("select2") || this.defaults.select2);
if (select2Opts.multiple && val == null) {
return [];
}
return val;
}
});