rails_db_admin 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/GPL-3-LICENSE +674 -0
- data/README.md +5 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/rails_db_admin/application.js +9 -0
- data/app/assets/stylesheets/rails_db_admin/application.css +7 -0
- data/app/controllers/rails_db_admin/erp_app/desktop/base_controller.rb +182 -0
- data/app/controllers/rails_db_admin/erp_app/desktop/queries_controller.rb +173 -0
- data/app/helpers/rails_db_admin/application_helper.rb +4 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/rails_db_admin/application.html.erb +14 -0
- data/config/initializers/rails_db_admin.rb +4 -0
- data/config/routes.rb +4 -0
- data/db/data_migrations/20110816005525_rails_db_admin_application.rb +31 -0
- data/lib/rails_db_admin.rb +15 -0
- data/lib/rails_db_admin/config.rb +27 -0
- data/lib/rails_db_admin/connection_handler.rb +17 -0
- data/lib/rails_db_admin/engine.rb +11 -0
- data/lib/rails_db_admin/extjs.rb +2 -0
- data/lib/rails_db_admin/extjs/json_column_builder.rb +139 -0
- data/lib/rails_db_admin/extjs/json_data_builder.rb +82 -0
- data/lib/rails_db_admin/query_support.rb +72 -0
- data/lib/rails_db_admin/table_support.rb +147 -0
- data/lib/rails_db_admin/version.rb +3 -0
- data/lib/tasks/rails_db_admin_tasks.rake +4 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_16x16.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_24x24.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_32x32.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_48x48.png +0 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/database_combo.js +52 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/module.js +429 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/queries_tree_menu.js +86 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/query_panel.js +206 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/readonly_table_data_grid.js +27 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/tables_tree_menu.js +87 -0
- data/public/stylesheets/erp_app/desktop/applications/rails_db_admin/rails_db_admin.css +10 -0
- data/spec/controllers/rails_db_admin/base_controller_spec.rb +481 -0
- data/spec/controllers/rails_db_admin/queries_controller_spec.rb +134 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +14 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/cucumber.rb +3 -0
- data/spec/dummy/config/environments/spec.rb +27 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/lib/rails_db_admin/extjs/json_column_builder_spec.rb +206 -0
- data/spec/lib/rails_db_admin/extjs/json_data_builder_spec.rb +201 -0
- data/spec/lib/rails_db_admin/query_support_spec.rb +40 -0
- data/spec/lib/rails_db_admin/table_support_spec.rb +349 -0
- data/spec/spec_helper.rb +60 -0
- metadata +183 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.QueriesMenuTreePanel",{
|
|
2
|
+
extend:"Ext.tree.TreePanel",
|
|
3
|
+
alias:'widget.railsdbadmin_queriestreemenu',
|
|
4
|
+
|
|
5
|
+
constructor : function(config) {
|
|
6
|
+
var self = this;
|
|
7
|
+
|
|
8
|
+
config = Ext.apply({
|
|
9
|
+
title:'Queries',
|
|
10
|
+
autoScroll:true,
|
|
11
|
+
store:Ext.create('Ext.data.TreeStore', {
|
|
12
|
+
proxy: {
|
|
13
|
+
type: 'ajax',
|
|
14
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries_tree'
|
|
15
|
+
},
|
|
16
|
+
root:{
|
|
17
|
+
text: 'Queries',
|
|
18
|
+
expanded: true,
|
|
19
|
+
draggable:false,
|
|
20
|
+
iconCls:'icon-content'
|
|
21
|
+
}
|
|
22
|
+
}),
|
|
23
|
+
animate:false,
|
|
24
|
+
//TODO_EXTJS4 this is added to fix error should be removed when extjs 4 releases fix.
|
|
25
|
+
viewConfig:{
|
|
26
|
+
loadMask: false
|
|
27
|
+
},
|
|
28
|
+
listeners:{
|
|
29
|
+
'itemclick':function(view, record, item, index, e){
|
|
30
|
+
e.stopEvent();
|
|
31
|
+
if(record.data.leaf){
|
|
32
|
+
self.initialConfig.module.displayQuery(record.data.id);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
'itemcontextmenu':function(view, record, item, index, e){
|
|
36
|
+
e.stopEvent();
|
|
37
|
+
var contextMenu = null;
|
|
38
|
+
if(record.data.leaf){
|
|
39
|
+
contextMenu = new Ext.menu.Menu({
|
|
40
|
+
items:[
|
|
41
|
+
{
|
|
42
|
+
text:"Execute",
|
|
43
|
+
iconCls:'icon-settings',
|
|
44
|
+
listeners:{
|
|
45
|
+
scope:record,
|
|
46
|
+
'click':function(){
|
|
47
|
+
self.initialConfig.module.displayAndExecuteQuery(record.data.id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
text:"Delete",
|
|
53
|
+
iconCls:'icon-delete',
|
|
54
|
+
listeners:{
|
|
55
|
+
scope:record,
|
|
56
|
+
'click':function(){
|
|
57
|
+
self.initialConfig.module.deleteQuery(record.data.id);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else{
|
|
65
|
+
contextMenu = new Ext.menu.Menu({
|
|
66
|
+
items:[
|
|
67
|
+
{
|
|
68
|
+
text:"New Query",
|
|
69
|
+
iconCls:'icon-new',
|
|
70
|
+
listeners:{
|
|
71
|
+
'click':function(){
|
|
72
|
+
self.initialConfig.module.addNewQueryTab();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
contextMenu.showAt(e.xy);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}, config);
|
|
83
|
+
|
|
84
|
+
this.callParent([config]);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.QueryPanel",{
|
|
2
|
+
extend:"Ext.Panel",
|
|
3
|
+
alias:'widget.railsdbadmin_querypanel',
|
|
4
|
+
gridContainer : null,
|
|
5
|
+
initComponent: function() {
|
|
6
|
+
var self = this;
|
|
7
|
+
var messageBox = null;
|
|
8
|
+
|
|
9
|
+
var savedQueriesJsonStore = Ext.create('Ext.data.Store', {
|
|
10
|
+
proxy: {
|
|
11
|
+
type: 'ajax',
|
|
12
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries',
|
|
13
|
+
reader: {
|
|
14
|
+
type: 'json',
|
|
15
|
+
root: 'data'
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
fields:[
|
|
19
|
+
{
|
|
20
|
+
name:'value'
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name:'display'
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
var tableGridContainer = new Ext.Panel({
|
|
29
|
+
layout:'card',
|
|
30
|
+
region : 'center',
|
|
31
|
+
margins : '0 0 0 0',
|
|
32
|
+
autoScroll:true,
|
|
33
|
+
items:[]
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
this.gridContainer = tableGridContainer;
|
|
37
|
+
|
|
38
|
+
var codeMirrorPanel = new Ext.Panel({
|
|
39
|
+
height:250,
|
|
40
|
+
region:'north',
|
|
41
|
+
margins : '0 0 0 0',
|
|
42
|
+
frame:false,
|
|
43
|
+
border:false,
|
|
44
|
+
autoScroll:true,
|
|
45
|
+
layout:'fit',
|
|
46
|
+
items:[
|
|
47
|
+
{
|
|
48
|
+
xtype:'codemirror',
|
|
49
|
+
parser:'sql',
|
|
50
|
+
sourceCode:this.initialConfig['sqlQuery'],
|
|
51
|
+
disableSave:true
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
this.tbar = {
|
|
58
|
+
items:[{
|
|
59
|
+
text: 'Execute',
|
|
60
|
+
iconCls: 'icon-settings',
|
|
61
|
+
handler: function(button) {
|
|
62
|
+
var textarea = self.query('.codemirror')[0];
|
|
63
|
+
var sql = textarea.getValue();
|
|
64
|
+
var selected_sql = textarea.getSelection();
|
|
65
|
+
var cursor_pos = textarea.getCursor().line;
|
|
66
|
+
var database = self.module.getDatabase();
|
|
67
|
+
|
|
68
|
+
messageBox = Ext.Msg.wait('Status', 'Executing..');
|
|
69
|
+
|
|
70
|
+
var conn = new Ext.data.Connection();
|
|
71
|
+
conn.request({
|
|
72
|
+
url: '/rails_db_admin/erp_app/desktop/queries/execute_query',
|
|
73
|
+
params:{
|
|
74
|
+
sql:sql,
|
|
75
|
+
database:database,
|
|
76
|
+
cursor_pos: cursor_pos,
|
|
77
|
+
selected_sql : selected_sql
|
|
78
|
+
},
|
|
79
|
+
method:'post',
|
|
80
|
+
success: function(responseObject) {
|
|
81
|
+
|
|
82
|
+
messageBox.hide();
|
|
83
|
+
var response = Ext.decode(responseObject.responseText);
|
|
84
|
+
|
|
85
|
+
if(response.success)
|
|
86
|
+
{
|
|
87
|
+
var columns = response.columns;
|
|
88
|
+
var fields = response.fields;
|
|
89
|
+
var data = response.data;
|
|
90
|
+
|
|
91
|
+
var grid = new Compass.ErpApp.Desktop.Applications.RailsDbAdmin.ReadOnlyTableDataGrid({
|
|
92
|
+
columns:columns,
|
|
93
|
+
fields:fields,
|
|
94
|
+
data:data
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
tableGridContainer.removeAll(true);
|
|
98
|
+
tableGridContainer.add(grid);
|
|
99
|
+
tableGridContainer.getLayout().setActiveItem(0);
|
|
100
|
+
}
|
|
101
|
+
else
|
|
102
|
+
{
|
|
103
|
+
Ext.Msg.alert("Error", response.exception);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
},
|
|
107
|
+
failure: function() {
|
|
108
|
+
messageBox.hide();
|
|
109
|
+
Ext.Msg.alert('Status', 'Error loading grid');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
text: 'Save',
|
|
116
|
+
iconCls: 'icon-save',
|
|
117
|
+
handler:function(){
|
|
118
|
+
var textarea = self.query('.codemirror')[0];
|
|
119
|
+
var save_window = new Ext.Window({
|
|
120
|
+
layout:'fit',
|
|
121
|
+
width:375,
|
|
122
|
+
title:'Save Query',
|
|
123
|
+
height:125,
|
|
124
|
+
buttonAlign:'center',
|
|
125
|
+
closeAction:'hide',
|
|
126
|
+
plain: true,
|
|
127
|
+
items: new Ext.FormPanel({
|
|
128
|
+
frame:false,
|
|
129
|
+
bodyStyle:'padding:5px 5px 0',
|
|
130
|
+
width: 500,
|
|
131
|
+
items: [{
|
|
132
|
+
xtype: 'combo',
|
|
133
|
+
fieldLabel: 'Query Name',
|
|
134
|
+
name: 'query_name',
|
|
135
|
+
allowBlank:false,
|
|
136
|
+
store:savedQueriesJsonStore,
|
|
137
|
+
valueField:'value',
|
|
138
|
+
displayField:'display',
|
|
139
|
+
triggerAction:'all',
|
|
140
|
+
forceSelection:false,
|
|
141
|
+
mode:'remote'
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
xtype: 'hidden',
|
|
145
|
+
value: textarea.getValue(),
|
|
146
|
+
name: 'query'
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
xtype: 'hidden',
|
|
150
|
+
value: self.module.getDatabase(),
|
|
151
|
+
name: 'database'
|
|
152
|
+
}]
|
|
153
|
+
}),
|
|
154
|
+
buttons: [{
|
|
155
|
+
text: 'Save',
|
|
156
|
+
handler: function(){
|
|
157
|
+
var fp = this.findParentByType('window').query('.form')[0];
|
|
158
|
+
if(fp.getForm().isValid()){
|
|
159
|
+
fp.getForm().submit({
|
|
160
|
+
url: '/rails_db_admin/erp_app/desktop/queries/save_query',
|
|
161
|
+
waitMsg: 'Saving Query...',
|
|
162
|
+
success: function(fp, o){
|
|
163
|
+
Ext.Msg.alert('Success', 'Saved Query');
|
|
164
|
+
var database = self.module.getDatabase();
|
|
165
|
+
self.module.queriesTreePanel().store.setProxy({
|
|
166
|
+
type: 'ajax',
|
|
167
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries_tree',
|
|
168
|
+
extraParams:{
|
|
169
|
+
database:database
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
self.module.queriesTreePanel().store.load();
|
|
173
|
+
save_window.hide();
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},{
|
|
179
|
+
text: 'Cancel',
|
|
180
|
+
handler: function(){
|
|
181
|
+
save_window.hide();
|
|
182
|
+
}
|
|
183
|
+
}]
|
|
184
|
+
|
|
185
|
+
});
|
|
186
|
+
save_window.show();
|
|
187
|
+
}
|
|
188
|
+
}]
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
this.items = [codeMirrorPanel, tableGridContainer];
|
|
192
|
+
this.callParent(arguments);
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
constructor : function(config) {
|
|
196
|
+
config = Ext.apply({
|
|
197
|
+
title:'Query',
|
|
198
|
+
layout:'border',
|
|
199
|
+
autoScroll:true,
|
|
200
|
+
closable: true,
|
|
201
|
+
border:false
|
|
202
|
+
}, config);
|
|
203
|
+
this.callParent([config]);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
});
|
data/public/javascripts/erp_app/desktop/applications/rails_db_admin/readonly_table_data_grid.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.ReadOnlyTableDataGrid",{
|
|
2
|
+
extend:"Ext.grid.GridPanel",
|
|
3
|
+
alias:'widget.railsdbadmin_readonlytabledatagrid',
|
|
4
|
+
constructor : function(config) {
|
|
5
|
+
var jsonStore = new Ext.data.JsonStore({
|
|
6
|
+
fields:config.fields,
|
|
7
|
+
data:config.data
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
config = Ext.apply({
|
|
11
|
+
store:jsonStore,
|
|
12
|
+
layout:'fit',
|
|
13
|
+
frame: false,
|
|
14
|
+
closable: true,
|
|
15
|
+
autoScroll:true,
|
|
16
|
+
region:'center',
|
|
17
|
+
loadMask:true
|
|
18
|
+
}, config);
|
|
19
|
+
|
|
20
|
+
this.callParent([config]);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.TablesMenuTreePanel",{
|
|
2
|
+
extend:"Ext.tree.TreePanel",
|
|
3
|
+
alias:'widget.railsdbadmin_tablestreemenu',
|
|
4
|
+
constructor : function(config) {
|
|
5
|
+
var self = this;
|
|
6
|
+
|
|
7
|
+
config = Ext.apply({
|
|
8
|
+
title:'Tables',
|
|
9
|
+
autoScroll:true,
|
|
10
|
+
store:Ext.create('Ext.data.TreeStore', {
|
|
11
|
+
proxy: {
|
|
12
|
+
type: 'ajax',
|
|
13
|
+
url: '/rails_db_admin/erp_app/desktop/base/tables'
|
|
14
|
+
},
|
|
15
|
+
root: {
|
|
16
|
+
text: 'Tables',
|
|
17
|
+
expanded:false,
|
|
18
|
+
draggable:false,
|
|
19
|
+
iconCls:'icon-content'
|
|
20
|
+
},
|
|
21
|
+
fields:[
|
|
22
|
+
{
|
|
23
|
+
name:'leaf'
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
{
|
|
27
|
+
name:'iconCls'
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
{
|
|
31
|
+
name:'text'
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
name:'id'
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
{
|
|
39
|
+
name:'isTable'
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}),
|
|
43
|
+
animate:false,
|
|
44
|
+
//TODO_EXTJS4 this is added to fix error should be removed when extjs 4 releases fix.
|
|
45
|
+
viewConfig:{
|
|
46
|
+
loadMask: false
|
|
47
|
+
},
|
|
48
|
+
listeners:{
|
|
49
|
+
'itemcontextmenu':function(view, record, item, index, e){
|
|
50
|
+
e.stopEvent();
|
|
51
|
+
if(!record.data['isTable']){
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
else{
|
|
55
|
+
var contextMenu = new Ext.menu.Menu({
|
|
56
|
+
items:[
|
|
57
|
+
{
|
|
58
|
+
text:"Select Top 50",
|
|
59
|
+
iconCls:'icon-settings',
|
|
60
|
+
listeners:{
|
|
61
|
+
scope:record,
|
|
62
|
+
'click':function(){
|
|
63
|
+
self.initialConfig.module.selectTopFifty(this.data.id);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
text:"Edit Table Data",
|
|
69
|
+
iconCls:'icon-edit',
|
|
70
|
+
listeners:{
|
|
71
|
+
scope:record,
|
|
72
|
+
'click':function(){
|
|
73
|
+
self.initialConfig.module.getTableData(this.data.id);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
});
|
|
79
|
+
contextMenu.showAt(e.xy);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}, config);
|
|
84
|
+
|
|
85
|
+
this.callParent([config]);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
.icon-rails_db_admin {
|
|
2
|
+
background-image:url( /images/icons/rails_db_admin/rails_db_admin_16x16.png ) !important;
|
|
3
|
+
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/icons/rails_db_admin/rails_db_admin_16x16.png', sizingMethod='crop');
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe RailsDbAdmin::BaseController do
|
|
4
|
+
|
|
5
|
+
#handle devise user auth
|
|
6
|
+
before(:each) do
|
|
7
|
+
basic_user_auth
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
before(:all) do
|
|
11
|
+
Factory.create(:role_type, :internal_identifier => "execute_query_test_role")
|
|
12
|
+
Factory.create(:role_type, :internal_identifier => "execute_query_test_role_2")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "POST setup_table_grid" do
|
|
16
|
+
|
|
17
|
+
it "should return success:true" do
|
|
18
|
+
|
|
19
|
+
post :base, {:use_route => :rails_db_admin,
|
|
20
|
+
:action => "setup_table_grid",
|
|
21
|
+
:table => 'role_types'}
|
|
22
|
+
|
|
23
|
+
parsed_body = JSON.parse(response.body)
|
|
24
|
+
parsed_body["success"].should eq(true)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should return model, columns, and fields" do
|
|
28
|
+
|
|
29
|
+
post :base, {:use_route => :rails_db_admin,
|
|
30
|
+
:action => "setup_table_grid",
|
|
31
|
+
:table => 'role_types'}
|
|
32
|
+
|
|
33
|
+
parsed_body = JSON.parse(response.body)
|
|
34
|
+
parsed_body["model"].should eq("role_types")
|
|
35
|
+
parsed_body["columns"].should include(
|
|
36
|
+
{"header"=>"id", "type"=>"number", "dataIndex"=>"id", "width"=>150})
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should return true even if there is not an 'id' column on the table in question" do
|
|
40
|
+
|
|
41
|
+
post :base, {:use_route => :rails_db_admin,
|
|
42
|
+
:action => "setup_table_grid",
|
|
43
|
+
:table => 'preference_options_preference_types'}
|
|
44
|
+
|
|
45
|
+
parsed_body = JSON.parse(response.body)
|
|
46
|
+
parsed_body["success"].should eq(true)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should return model, columns, and fields even if there is not an 'id' column on a table
|
|
50
|
+
and should have a 'fake_id' column in the fields and columns array" do
|
|
51
|
+
|
|
52
|
+
post :base, {:use_route => :rails_db_admin,
|
|
53
|
+
:action => "setup_table_grid",
|
|
54
|
+
:table => 'preference_options_preference_types'}
|
|
55
|
+
|
|
56
|
+
parsed_body = JSON.parse(response.body)
|
|
57
|
+
|
|
58
|
+
parsed_body["model"].should eq("preference_options_preference_types")
|
|
59
|
+
parsed_body["columns"][0].should include(
|
|
60
|
+
{"header"=>"preference_type_id",
|
|
61
|
+
"type"=>"number",
|
|
62
|
+
"dataIndex"=>"preference_type_id",
|
|
63
|
+
"width"=>150,
|
|
64
|
+
"editor"=>{"xtype"=>"textfield"}})
|
|
65
|
+
parsed_body["columns"][4].should include(
|
|
66
|
+
{"header"=>"fake_id", "type"=>"number", "dataIndex"=>"fake_id", "hidden"=>true}
|
|
67
|
+
)
|
|
68
|
+
parsed_body["fields"].should include(
|
|
69
|
+
{"name" => "preference_type_id"})
|
|
70
|
+
parsed_body["fields"].should include(
|
|
71
|
+
{"name" => "fake_id"})
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should return a value called id_property that equals 'fake_id'" do
|
|
75
|
+
|
|
76
|
+
post :base, {:use_route => :rails_db_admin,
|
|
77
|
+
:action => "setup_table_grid",
|
|
78
|
+
:table => 'preference_options_preference_types'}
|
|
79
|
+
|
|
80
|
+
parsed_body = JSON.parse(response.body)
|
|
81
|
+
parsed_body["id_property"].should eq("fake_id")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should return a value called id_property that equals 'id'" do
|
|
85
|
+
|
|
86
|
+
post :base, {:use_route => :rails_db_admin,
|
|
87
|
+
:action => "setup_table_grid",
|
|
88
|
+
:table => 'role_types'}
|
|
89
|
+
|
|
90
|
+
parsed_body = JSON.parse(response.body)
|
|
91
|
+
parsed_body["id_property"].should eq("id")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
describe "GET table_data" do
|
|
96
|
+
|
|
97
|
+
it "should return JSON to display in an ExtJS data grid for Rails tables with an Id column" do
|
|
98
|
+
|
|
99
|
+
get :base, {:use_route => :rails_db_admin,
|
|
100
|
+
:action => "table_data",
|
|
101
|
+
:table => "role_types"}
|
|
102
|
+
|
|
103
|
+
parsed_body = JSON.parse(response.body)
|
|
104
|
+
parsed_body["totalCount"].should eq(2)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "should return 1 row because start is increased by 1, but totalCount should remain 2" do
|
|
108
|
+
|
|
109
|
+
get :base, {:use_route => :rails_db_admin,
|
|
110
|
+
:action => "table_data",
|
|
111
|
+
:table => "role_types",
|
|
112
|
+
:start => "1"}
|
|
113
|
+
|
|
114
|
+
parsed_body = JSON.parse(response.body)
|
|
115
|
+
parsed_body["totalCount"].should eq(2)
|
|
116
|
+
parsed_body["data"].length.should eq(1)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should return 1 row because limit is set to 1, but totalCount should remain 2" do
|
|
120
|
+
|
|
121
|
+
get :base, {:use_route => :rails_db_admin,
|
|
122
|
+
:action => "table_data",
|
|
123
|
+
:table => "role_types",
|
|
124
|
+
:limit => "1"}
|
|
125
|
+
|
|
126
|
+
parsed_body = JSON.parse(response.body)
|
|
127
|
+
parsed_body["totalCount"].should eq(2)
|
|
128
|
+
parsed_body["data"].length.should eq(1)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#TODO: Need to setup Factory Girl to dummy up data for this test
|
|
132
|
+
it "should return successfully with a fake_id column because there is no id column defined in the DB" do
|
|
133
|
+
|
|
134
|
+
get :base, {:use_route => :rails_db_admin,
|
|
135
|
+
:action => "table_data",
|
|
136
|
+
:table => 'preference_options_preference_types'}
|
|
137
|
+
|
|
138
|
+
parsed_body = JSON.parse(response.body)
|
|
139
|
+
parsed_body["totalCount"].should eq(0)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
describe "PUT table_data" do
|
|
145
|
+
|
|
146
|
+
before(:each) do
|
|
147
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
|
148
|
+
"preference_option_id" => "2",
|
|
149
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
150
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
151
|
+
@role_types_data = {"id" => 2,
|
|
152
|
+
"parent_id" => "",
|
|
153
|
+
"lft" => "3",
|
|
154
|
+
"rgt" => "4",
|
|
155
|
+
"description" => "Partner-Test",
|
|
156
|
+
"comments" => "",
|
|
157
|
+
"internal_identifier" => "partner",
|
|
158
|
+
"external_identifier" => "",
|
|
159
|
+
"external_id_source" => "",
|
|
160
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
161
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
162
|
+
@mod_role_types_data = {"parent_id" => "",
|
|
163
|
+
"lft" => "3",
|
|
164
|
+
"rgt" => "4",
|
|
165
|
+
"description" => "Partner-Test",
|
|
166
|
+
"comments" => "",
|
|
167
|
+
"internal_identifier" => "partner",
|
|
168
|
+
"external_identifier" => "",
|
|
169
|
+
"external_id_source" => "",
|
|
170
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
171
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
172
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
|
173
|
+
@json_data_builder = double("RailsDbAdmin::Extjs::JsonDataBuilder")
|
|
174
|
+
|
|
175
|
+
RailsDbAdmin::TableSupport.should_receive(
|
|
176
|
+
:new).and_return(@table_support)
|
|
177
|
+
RailsDbAdmin::Extjs::JsonDataBuilder.should_receive(
|
|
178
|
+
:new).and_return(@json_data_builder)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "should return success" do
|
|
182
|
+
|
|
183
|
+
@table = "role_types"
|
|
184
|
+
@pkey = ['id', "2"]
|
|
185
|
+
|
|
186
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
|
187
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
|
188
|
+
|
|
189
|
+
@table_support.should_receive(:update_table).with(
|
|
190
|
+
@table, @pkey, @mod_role_types_data)
|
|
191
|
+
@json_data_builder.should_receive(:get_row_data).with(
|
|
192
|
+
@table, @pkey).and_return(@role_types_data)
|
|
193
|
+
|
|
194
|
+
put :base, {:use_route => :rails_db_admin,
|
|
195
|
+
:action => "table_data",
|
|
196
|
+
:table => @table,
|
|
197
|
+
:data => [@role_types_data, @role_types_data] }
|
|
198
|
+
|
|
199
|
+
parsed_body = JSON.parse(response.body)
|
|
200
|
+
parsed_body["success"].should eq(true)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "should update table data and return success even if there is not an 'id' column" do
|
|
204
|
+
|
|
205
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
|
206
|
+
"preference_option_id" => "2",
|
|
207
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
208
|
+
"updated_at" => "",
|
|
209
|
+
"fake_id" => "162"}
|
|
210
|
+
|
|
211
|
+
@table = "preference_options_preference_types"
|
|
212
|
+
|
|
213
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
|
214
|
+
|
|
215
|
+
@table_support.should_receive(:update_table_without_id).with(
|
|
216
|
+
@table, [@pref_opt_types_data, @pref_opt_types_data])
|
|
217
|
+
|
|
218
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
|
219
|
+
@table, @pref_opt_types_data).and_return(
|
|
220
|
+
@pref_opt_types_data)
|
|
221
|
+
|
|
222
|
+
put :base, {:use_route => :rails_db_admin,
|
|
223
|
+
:action => "table_data",
|
|
224
|
+
:table => @table,
|
|
225
|
+
:data => [@pref_opt_types_data, @pref_opt_types_data]}
|
|
226
|
+
|
|
227
|
+
parsed_body = JSON.parse(response.body)
|
|
228
|
+
parsed_body["success"].should eq(true)
|
|
229
|
+
parsed_body["data"].should eq(@pref_opt_types_data)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
describe "POST table_data" do
|
|
234
|
+
|
|
235
|
+
before(:each) do
|
|
236
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
|
237
|
+
@json_data_builder = double("RailsDbAdmin::Extjs::JsonDataBuilder")
|
|
238
|
+
|
|
239
|
+
RailsDbAdmin::TableSupport.should_receive(
|
|
240
|
+
:new).and_return(@table_support)
|
|
241
|
+
RailsDbAdmin::Extjs::JsonDataBuilder.should_receive(
|
|
242
|
+
:new).and_return(@json_data_builder)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should return success and the row that was created" do
|
|
246
|
+
|
|
247
|
+
@table = "role_types"
|
|
248
|
+
|
|
249
|
+
@role_types_data = {"id" => 3,
|
|
250
|
+
"parent_id" => "",
|
|
251
|
+
"lft" => "3",
|
|
252
|
+
"rgt" => "4",
|
|
253
|
+
"description" => "Partner-Test",
|
|
254
|
+
"comments" => "",
|
|
255
|
+
"internal_identifier" => "partner",
|
|
256
|
+
"external_identifier" => "",
|
|
257
|
+
"external_id_source" => "",
|
|
258
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
259
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
260
|
+
|
|
261
|
+
@mod_types_data = {"parent_id" => "",
|
|
262
|
+
"lft" => "3",
|
|
263
|
+
"rgt" => "4",
|
|
264
|
+
"description" => "Partner-Test",
|
|
265
|
+
"comments" => "",
|
|
266
|
+
"internal_identifier" => "partner",
|
|
267
|
+
"external_identifier" => "",
|
|
268
|
+
"external_id_source" => "",
|
|
269
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
270
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
271
|
+
|
|
272
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
|
273
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
|
274
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_types_data).
|
|
275
|
+
and_return(3)
|
|
276
|
+
@json_data_builder.should_receive(:get_row_data).with(@table,["id",3]).
|
|
277
|
+
and_return(@role_types_data)
|
|
278
|
+
|
|
279
|
+
post :base, {:use_route => :rails_db_admin,
|
|
280
|
+
:action => "table_data",
|
|
281
|
+
:table => @table,
|
|
282
|
+
:data => @role_types_data}
|
|
283
|
+
|
|
284
|
+
parsed_body = JSON.parse(response.body)
|
|
285
|
+
parsed_body["success"].should eq(true)
|
|
286
|
+
parsed_body[:data].should eq(@roles_types_data)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "should return success even with empty row hashed passed in" do
|
|
290
|
+
|
|
291
|
+
@table = "role_types"
|
|
292
|
+
@role_types_data = {"id" => "",
|
|
293
|
+
"parent_id" => "",
|
|
294
|
+
"lft" => "",
|
|
295
|
+
"rgt" => "",
|
|
296
|
+
"description" => "",
|
|
297
|
+
"comments" => "",
|
|
298
|
+
"internal_identifier" => "",
|
|
299
|
+
"external_identifier" => "",
|
|
300
|
+
"external_id_source" => "",
|
|
301
|
+
"created_at" => "",
|
|
302
|
+
"updated_at" => ""}
|
|
303
|
+
|
|
304
|
+
@mod_types_data = {"parent_id" => "",
|
|
305
|
+
"lft" => "",
|
|
306
|
+
"rgt" => "",
|
|
307
|
+
"description" => "",
|
|
308
|
+
"comments" => "",
|
|
309
|
+
"internal_identifier" => "",
|
|
310
|
+
"external_identifier" => "",
|
|
311
|
+
"external_id_source" => "",
|
|
312
|
+
"created_at" => "",
|
|
313
|
+
"updated_at" => ""}
|
|
314
|
+
|
|
315
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
|
316
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
|
317
|
+
|
|
318
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_types_data).
|
|
319
|
+
and_return(3)
|
|
320
|
+
@json_data_builder.should_receive(:get_row_data).with(@table,["id",3]).
|
|
321
|
+
and_return(@role_types_data)
|
|
322
|
+
|
|
323
|
+
post :base, {:use_route => :rails_db_admin,
|
|
324
|
+
:action => "table_data",
|
|
325
|
+
:table => @table,
|
|
326
|
+
:data => @role_types_data}
|
|
327
|
+
|
|
328
|
+
parsed_body = JSON.parse(response.body)
|
|
329
|
+
parsed_body["success"].should eq(true)
|
|
330
|
+
parsed_body[:data].should eq(@roles_types_data)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
it "should return success and the inserted data, with a row with a 'fake_id'" do
|
|
334
|
+
|
|
335
|
+
@table = "preference_options_preference_types"
|
|
336
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
|
337
|
+
"preference_option_id" => "2",
|
|
338
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
339
|
+
"updated_at" => "2011-10-11 00:54:56.137144",
|
|
340
|
+
"fake_id" => "5"}
|
|
341
|
+
|
|
342
|
+
@mod_data = {"preference_type_id" => "1",
|
|
343
|
+
"preference_option_id" => "2",
|
|
344
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
345
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
|
346
|
+
|
|
347
|
+
@final_data = {"preference_type_id" => "1",
|
|
348
|
+
"preference_option_id" => "2",
|
|
349
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
|
350
|
+
"updated_at" => "2011-10-11 00:54:56.137144",
|
|
351
|
+
"fake_id" => 300}
|
|
352
|
+
|
|
353
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
|
354
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_data, true).and_return(300)
|
|
355
|
+
|
|
356
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
|
357
|
+
@table, @mod_data).and_return(
|
|
358
|
+
@pref_opt_types_data)
|
|
359
|
+
|
|
360
|
+
post :base, {:use_route => :rails_db_admin,
|
|
361
|
+
:action => "table_data",
|
|
362
|
+
:table => @table,
|
|
363
|
+
:data => @pref_opt_types_data}
|
|
364
|
+
|
|
365
|
+
parsed_body = JSON.parse(response.body)
|
|
366
|
+
parsed_body["success"].should eq(true)
|
|
367
|
+
parsed_body["data"].should eq(@final_data)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
it "should return success and the inserted data, with a row with a 'fake_id', with empty data passed in" do
|
|
371
|
+
|
|
372
|
+
@table = "preference_options_preference_types"
|
|
373
|
+
@pref_opt_types_data = {"preference_type_id" => "",
|
|
374
|
+
"preference_option_id" => "",
|
|
375
|
+
"created_at" => "",
|
|
376
|
+
"updated_at" => "",
|
|
377
|
+
"fake_id" => ""}
|
|
378
|
+
|
|
379
|
+
@mod_data = {"preference_type_id" => "",
|
|
380
|
+
"preference_option_id" => "",
|
|
381
|
+
"created_at" => "",
|
|
382
|
+
"updated_at" => ""}
|
|
383
|
+
|
|
384
|
+
@final_data = {"preference_type_id" => "",
|
|
385
|
+
"preference_option_id" => "",
|
|
386
|
+
"created_at" => "",
|
|
387
|
+
"updated_at" => "",
|
|
388
|
+
"fake_id" => 300}
|
|
389
|
+
|
|
390
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
|
391
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_data, true).and_return(300)
|
|
392
|
+
|
|
393
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
|
394
|
+
@table, @mod_data).and_return(
|
|
395
|
+
@pref_opt_types_data)
|
|
396
|
+
|
|
397
|
+
post :base, {:use_route => :rails_db_admin,
|
|
398
|
+
:action => "table_data",
|
|
399
|
+
:table => @table,
|
|
400
|
+
:data => @pref_opt_types_data}
|
|
401
|
+
|
|
402
|
+
parsed_body = JSON.parse(response.body)
|
|
403
|
+
parsed_body["success"].should eq(true)
|
|
404
|
+
parsed_body["data"].should eq(@final_data)
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
describe "DELETE table_data" do
|
|
410
|
+
|
|
411
|
+
before(:each) do
|
|
412
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
|
413
|
+
RailsDbAdmin::TableSupport.should_receive(
|
|
414
|
+
:new).and_return(@table_support)
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
it "should process the request successfully" do
|
|
418
|
+
|
|
419
|
+
@table = "role_types"
|
|
420
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
|
421
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
|
422
|
+
id = ["id", "2"]
|
|
423
|
+
|
|
424
|
+
@table_support.should_receive(:delete_row).with(
|
|
425
|
+
@table, id)
|
|
426
|
+
|
|
427
|
+
delete :base, {:use_route => :rails_db_admin,
|
|
428
|
+
:action => "table_data",
|
|
429
|
+
:table => @table,
|
|
430
|
+
:id => "2"}
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
it "should fail because we don't send an id parameter" do
|
|
434
|
+
|
|
435
|
+
id = "2"
|
|
436
|
+
@table_support.should_receive(:primary_key?).and_return(false)
|
|
437
|
+
|
|
438
|
+
delete :base, {:use_route => :rails_db_admin,
|
|
439
|
+
:action => "table_data",
|
|
440
|
+
:table => "role_types",
|
|
441
|
+
:id => id}
|
|
442
|
+
|
|
443
|
+
parsed_body = JSON.parse(response.body)
|
|
444
|
+
parsed_body["success"].should eq(false)
|
|
445
|
+
parsed_body["exception"].should eq("Unable to determine primary key "\
|
|
446
|
+
"on this table. Delete not performed")
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
describe "GET tables" do
|
|
451
|
+
|
|
452
|
+
it "should return data for a tree grid of tables" do
|
|
453
|
+
|
|
454
|
+
get :base, {:use_route => :rails_db_admin,
|
|
455
|
+
:action => "tables",
|
|
456
|
+
:node => "root"}
|
|
457
|
+
|
|
458
|
+
parsed_body = JSON.parse(response.body)
|
|
459
|
+
parsed_body[0].should eq({"isTable"=>true, "text"=>"app_containers",
|
|
460
|
+
"id"=>"app_containers", "iconCls"=>"icon-data",
|
|
461
|
+
"leaf"=>false})
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
it "should create nested tree of column names if a node id is passed in" do
|
|
465
|
+
|
|
466
|
+
get :base, {:use_route => :rails_db_admin,
|
|
467
|
+
:action => "tables",
|
|
468
|
+
:node => "app_containers"}
|
|
469
|
+
|
|
470
|
+
parsed_body = JSON.parse(response.body)
|
|
471
|
+
parsed_body[0].should eq({"text"=>"id : integer",
|
|
472
|
+
"iconCls"=>"icon-gear",
|
|
473
|
+
"leaf"=>true})
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
after(:all) do
|
|
478
|
+
RoleType.where(:internal_identifier => "execute_query_test_role").destroy_all
|
|
479
|
+
RoleType.where(:internal_identifier => "execute_query_test_role_2").destroy_all
|
|
480
|
+
end
|
|
481
|
+
end
|