admin_data 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +221 -0
- data/README.textile +21 -0
- data/Rakefile +46 -0
- data/app/controllers/admin_data/base_controller.rb +114 -0
- data/app/controllers/admin_data/diagnostic_controller.rb +28 -0
- data/app/controllers/admin_data/feed_controller.rb +17 -0
- data/app/controllers/admin_data/main_controller.rb +132 -0
- data/app/controllers/admin_data/migration_controller.rb +19 -0
- data/app/controllers/admin_data/search_controller.rb +125 -0
- data/app/controllers/admin_data/validate_model_controller.rb +106 -0
- data/app/views/admin_data/diagnostic/index.html.erb +17 -0
- data/app/views/admin_data/diagnostic/missing_index.html.erb +26 -0
- data/app/views/admin_data/feed/index.rss.builder +24 -0
- data/app/views/admin_data/main/all_models.html.erb +22 -0
- data/app/views/admin_data/main/association/_association_info.html.erb +10 -0
- data/app/views/admin_data/main/association/_belongs_to_info.html.erb +7 -0
- data/app/views/admin_data/main/association/_has_many_info.html.erb +7 -0
- data/app/views/admin_data/main/association/_has_one_info.html.erb +6 -0
- data/app/views/admin_data/main/edit.html.erb +38 -0
- data/app/views/admin_data/main/misc/_form.html.erb +25 -0
- data/app/views/admin_data/main/misc/_modify_record.html.erb +22 -0
- data/app/views/admin_data/main/new.html.erb +23 -0
- data/app/views/admin_data/main/show.html.erb +41 -0
- data/app/views/admin_data/main/table_structure.html.erb +55 -0
- data/app/views/admin_data/migration/index.html.erb +18 -0
- data/app/views/admin_data/migration/jstest.html.erb +51 -0
- data/app/views/admin_data/search/_search_base.html.erb +34 -0
- data/app/views/admin_data/search/advance_search.html.erb +3 -0
- data/app/views/admin_data/search/quick_search.html.erb +6 -0
- data/app/views/admin_data/search/search/_advance_search_form.html.erb +48 -0
- data/app/views/admin_data/search/search/_errors.html.erb +5 -0
- data/app/views/admin_data/search/search/_listing.html.erb +40 -0
- data/app/views/admin_data/search/search/_search_form.html.erb +28 -0
- data/app/views/admin_data/search/search/_sortby.html.erb +18 -0
- data/app/views/admin_data/search/search/_title.html.erb +34 -0
- data/app/views/admin_data/shared/_breadcrum.html.erb +10 -0
- data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
- data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
- data/app/views/admin_data/shared/_header.html.erb +23 -0
- data/app/views/admin_data/shared/_powered_by.html.erb +23 -0
- data/app/views/admin_data/shared/_secondary_navigation.html.erb +28 -0
- data/app/views/admin_data/validate_model/_bad.html.erb +1 -0
- data/app/views/admin_data/validate_model/tid.html.erb +2 -0
- data/app/views/admin_data/validate_model/validate.html.erb +67 -0
- data/app/views/layouts/admin_data.html.erb +60 -0
- data/config/routes.rb +34 -0
- data/init.rb +1 -0
- data/lib/admin_data.rb +34 -0
- data/lib/admin_data/chelper.rb +37 -0
- data/lib/admin_data/compatibility.rb +7 -0
- data/lib/admin_data/helpers.rb +222 -0
- data/lib/admin_data/railtie.rb +21 -0
- data/lib/admin_data/search.rb +186 -0
- data/lib/admin_data/settings.rb +72 -0
- data/lib/admin_data/util.rb +237 -0
- data/lib/admin_data/version.rb +3 -0
- data/lib/admin_data_date_validation.rb +79 -0
- data/lib/css/app.css +224 -0
- data/lib/css/base.css +1071 -0
- data/lib/css/header.css +65 -0
- data/lib/css/rounded.css +18 -0
- data/lib/css/themes/drastic-dark/style.css +374 -0
- data/lib/css/umbrella.css +34 -0
- data/lib/css/vendor/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
- data/lib/css/vendor/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
- data/lib/css/vendor/images/ui-bg_flat_0_333333_40x100.png +0 -0
- data/lib/css/vendor/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
- data/lib/css/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/lib/css/vendor/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
- data/lib/css/vendor/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
- data/lib/css/vendor/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
- data/lib/css/vendor/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
- data/lib/css/vendor/images/ui-icons_004276_256x240.png +0 -0
- data/lib/css/vendor/images/ui-icons_cc0000_256x240.png +0 -0
- data/lib/css/vendor/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/css/vendor/jquery-ui-1.7.2.custom.css +406 -0
- data/lib/css/vendor/qunit.css +119 -0
- data/lib/js/advance_search/act_on_result.js +47 -0
- data/lib/js/advance_search/adv_search.js +46 -0
- data/lib/js/advance_search/advance_search.js +60 -0
- data/lib/js/advance_search/advance_search_structure.js +79 -0
- data/lib/js/advance_search/ajaxify_advance_search.js +28 -0
- data/lib/js/advance_search/build_first_row.js +12 -0
- data/lib/js/advance_search/event_bindings.js +87 -0
- data/lib/js/advance_search/global_ajax_setting.js +10 -0
- data/lib/js/advance_search/trigger_submit_on_domready.js +6 -0
- data/lib/js/misc/drop_down_change.js +8 -0
- data/lib/js/misc/js_util.js +42 -0
- data/lib/js/misc/quick_search_input_focus.js +6 -0
- data/lib/js/test/act_on_result.js +120 -0
- data/lib/js/test/advance_search.js +80 -0
- data/lib/js/test/ajaxify_advance_search.js +29 -0
- data/lib/js/test/build_first_row.js +10 -0
- data/lib/js/test/event_bindings.js +100 -0
- data/lib/js/validate_model/ajaxify_form.js +66 -0
- data/lib/js/validate_model/select_all.js +15 -0
- data/lib/js/vendor/jack.js +903 -0
- data/lib/js/vendor/jquery-1.4.1.js +6078 -0
- data/lib/js/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
- data/lib/js/vendor/jquery.ba-isjquery.js +21 -0
- data/lib/js/vendor/jquery.form.js +814 -0
- data/lib/js/vendor/jquery.lint.js +604 -0
- data/lib/js/vendor/log.js +9 -0
- data/lib/js/vendor/qunit.js +1043 -0
- data/lib/tasks/admin_data_tasks.rake +7 -0
- data/lib/tasks/validate_models_bg.rake +23 -0
- data/test/factories/article.rb +9 -0
- data/test/factories/car.rb +4 -0
- data/test/factories/city.rb +4 -0
- data/test/factories/comment.rb +6 -0
- data/test/factories/door.rb +4 -0
- data/test/factories/engine.rb +4 -0
- data/test/functional/base_controller_test.rb +5 -0
- data/test/functional/feed_controller_test.rb +34 -0
- data/test/functional/main_controller_test.rb +421 -0
- data/test/functional/migration_controller_test.rb +30 -0
- data/test/functional/routes_test.rb +61 -0
- data/test/functional/search_controller_test.rb +814 -0
- data/test/helper/view_helper_test.rb +177 -0
- data/test/misc_tests/date_validation_test.rb +32 -0
- data/test/misc_tests/settings_test.rb +29 -0
- data/test/misc_tests/util_test.rb +83 -0
- data/test/rails_root/Gemfile +22 -0
- data/test/rails_root/Gemfile.lock +101 -0
- data/test/rails_root/Rakefile +7 -0
- data/test/rails_root/app/controllers/application_controller.rb +3 -0
- data/test/rails_root/app/helpers/application_helper.rb +2 -0
- data/test/rails_root/app/models/article.rb +25 -0
- data/test/rails_root/app/models/city.rb +15 -0
- data/test/rails_root/app/models/comment.rb +13 -0
- data/test/rails_root/app/models/tech_magazine.rb +2 -0
- data/test/rails_root/app/models/vehicle/car.rb +4 -0
- data/test/rails_root/app/models/vehicle/door.rb +3 -0
- data/test/rails_root/app/models/vehicle/engine.rb +3 -0
- data/test/rails_root/app/views/layouts/application.html.erb +14 -0
- data/test/rails_root/config.ru +4 -0
- data/test/rails_root/config/application.rb +42 -0
- data/test/rails_root/config/boot.rb +13 -0
- data/test/rails_root/config/database.yml +22 -0
- data/test/rails_root/config/environment.rb +5 -0
- data/test/rails_root/config/environments/development.rb +22 -0
- data/test/rails_root/config/environments/production.rb +49 -0
- data/test/rails_root/config/environments/test.rb +35 -0
- data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_root/config/initializers/inflections.rb +10 -0
- data/test/rails_root/config/initializers/mime_types.rb +5 -0
- data/test/rails_root/config/initializers/secret_token.rb +7 -0
- data/test/rails_root/config/initializers/session_store.rb +8 -0
- data/test/rails_root/config/locales/en.yml +5 -0
- data/test/rails_root/config/routes.rb +58 -0
- data/test/rails_root/db/migrate/20090809061114_create_tables.rb +70 -0
- data/test/rails_root/db/schema.rb +74 -0
- data/test/rails_root/db/seeds.rb +7 -0
- data/test/rails_root/script/rails +6 -0
- data/test/rails_root/test/performance/browsing_test.rb +0 -0
- data/test/rails_root/test/test_helper.rb +13 -0
- data/test/support/assertions.rb +20 -0
- data/test/test_helper.rb +74 -0
- metadata +321 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
class AdminData::MainController < AdminData::BaseController
|
2
|
+
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
before_filter :get_class_from_params, :only => [ :table_structure, :show, :destroy, :del, :edit, :new, :update, :create]
|
6
|
+
|
7
|
+
before_filter :ensure_is_allowed_to_view
|
8
|
+
|
9
|
+
before_filter :get_model_and_verify_it, :only => [:destroy, :del, :edit, :update, :show]
|
10
|
+
|
11
|
+
before_filter :ensure_is_allowed_to_view_model, :except => [:all_models, :index]
|
12
|
+
|
13
|
+
before_filter :ensure_is_allowed_to_update, :only => [:destroy, :del, :edit, :update, :create]
|
14
|
+
|
15
|
+
before_filter :ensure_is_allowed_to_update_model, :only => [:destroy, :del, :edit, :update, :create]
|
16
|
+
|
17
|
+
|
18
|
+
def table_structure
|
19
|
+
@page_title = 'table_structure'
|
20
|
+
@indexes = []
|
21
|
+
if (indexes = ActiveRecord::Base.connection.indexes(@klass.table_name)).any?
|
22
|
+
add_index_statements = indexes.map do |index|
|
23
|
+
statment_parts = [ ('add_index ' + index.table.inspect) ]
|
24
|
+
statment_parts << index.columns.inspect
|
25
|
+
statment_parts << (':name => ' + index.name.inspect)
|
26
|
+
statment_parts << ':unique => true' if index.unique
|
27
|
+
|
28
|
+
' ' + statment_parts.join(', ')
|
29
|
+
end
|
30
|
+
add_index_statements.sort.each { |index| @indexes << index }
|
31
|
+
end
|
32
|
+
respond_to {|format| format.html}
|
33
|
+
end
|
34
|
+
|
35
|
+
def all_models
|
36
|
+
respond_to {|format| format.html}
|
37
|
+
end
|
38
|
+
|
39
|
+
def show
|
40
|
+
@page_title = "#{@klass.name.underscore}:#{@model.id}"
|
41
|
+
respond_to {|format| format.html}
|
42
|
+
end
|
43
|
+
|
44
|
+
def destroy
|
45
|
+
@klass.send(:destroy, params[:id])
|
46
|
+
redirect_to admin_data_search_path(:klass => @klass.name.underscore)
|
47
|
+
end
|
48
|
+
|
49
|
+
def del
|
50
|
+
@klass.send(:delete, params[:id])
|
51
|
+
flash[:success] = 'Record was deleted'
|
52
|
+
redirect_to admin_data_search_path(:klass => @klass.name.underscore)
|
53
|
+
end
|
54
|
+
|
55
|
+
def edit
|
56
|
+
@page_title = "edit #{@klass.name.underscore}:#{@model.id}"
|
57
|
+
@columns = columns_list
|
58
|
+
respond_to {|format| format.html}
|
59
|
+
end
|
60
|
+
|
61
|
+
def new
|
62
|
+
@page_title = "new #{@klass.name.underscore}"
|
63
|
+
@model = @klass.send(:new)
|
64
|
+
@columns = columns_list
|
65
|
+
respond_to {|format| format.html}
|
66
|
+
end
|
67
|
+
|
68
|
+
def update
|
69
|
+
model_name_underscored = @klass.name.underscore
|
70
|
+
model_attrs = params[model_name_underscored]
|
71
|
+
@columns = columns_list
|
72
|
+
respond_to do |format|
|
73
|
+
if @model.update_attributes(model_attrs)
|
74
|
+
format.html do
|
75
|
+
flash[:success] = "Record was updated"
|
76
|
+
redirect_to admin_data_on_k_path(:id => @model, :klass => @klass.name.underscore)
|
77
|
+
end
|
78
|
+
format.js { render :json => {:success => true}}
|
79
|
+
else
|
80
|
+
format.html { render :action => 'edit' }
|
81
|
+
format.js { render :json => {:error => @model.errors.full_messages.join } }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def create
|
87
|
+
model_name_underscored = @klass.name.underscore
|
88
|
+
model_attrs = params[model_name_underscored]
|
89
|
+
@model = @klass.create(model_attrs)
|
90
|
+
@columns = columns_list
|
91
|
+
|
92
|
+
respond_to do |format|
|
93
|
+
if @model.errors.any?
|
94
|
+
format.html { render :action => 'new' }
|
95
|
+
format.js { render :json => {:error => @model.errors.full_messages.join() }}
|
96
|
+
else
|
97
|
+
format.html do
|
98
|
+
flash[:success] = "Record was created"
|
99
|
+
redirect_to admin_data_on_k_path(:id => @model, :klass => @klass.name.underscore)
|
100
|
+
end
|
101
|
+
format.js { render :json => {} }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def get_model_and_verify_it
|
109
|
+
primary_key = @klass.primary_key.intern
|
110
|
+
conditional_id = params[:id] =~ /^(\d+)-.*/ ? params[:id].to_i : params[:id]
|
111
|
+
condition = {primary_key => conditional_id}
|
112
|
+
|
113
|
+
# http://neerajdotname.github.com/admin_data/#override_find_condition
|
114
|
+
find_conditions_proc = AdminData::Config.setting[:find_conditions] ? AdminData::Config.setting[:find_conditions][@klass.name] : nil
|
115
|
+
if find_conditions_proc && find_conditions = find_conditions_proc.call(params)
|
116
|
+
|
117
|
+
if find_conditions.has_key?(:conditions)
|
118
|
+
condition = find_conditions.fetch(:conditions)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
@model = @klass.send('find', :first, :conditions => condition)
|
123
|
+
unless @model
|
124
|
+
render :text => "<h2>#{@klass.name} not found: #{params[:id]}</h2>", :status => :not_found
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def columns_list
|
129
|
+
params[:attr].blank? ? @klass.columns : @klass.columns.find_all {|col| params[:attr] == col.name}
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AdminData::MigrationController < AdminData::BaseController
|
2
|
+
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
before_filter :ensure_is_allowed_to_view
|
6
|
+
|
7
|
+
def index
|
8
|
+
@page_title = 'migration information'
|
9
|
+
m = 'select * from schema_migrations'
|
10
|
+
@data = ActiveRecord::Base.connection.select_all(m)
|
11
|
+
respond_to {|format| format.html}
|
12
|
+
end
|
13
|
+
|
14
|
+
def jstest
|
15
|
+
@page_title = 'jstest'
|
16
|
+
respond_to {|format| format.html { render :layout => false}}
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__) , '..', '..', '..', 'lib', 'admin_data', 'search')
|
2
|
+
|
3
|
+
class AdminData::SearchController < AdminData::BaseController
|
4
|
+
|
5
|
+
include Search
|
6
|
+
|
7
|
+
unloadable
|
8
|
+
|
9
|
+
before_filter :get_class_from_params
|
10
|
+
before_filter :ensure_is_allowed_to_view
|
11
|
+
before_filter :ensure_is_allowed_to_view_model
|
12
|
+
before_filter :ensure_valid_children_klass, :only => [:quick_search]
|
13
|
+
before_filter :ensure_is_authorized_for_update_opration, :only => [:advance_search]
|
14
|
+
before_filter :set_collection_of_columns, :only => [:advance_search]
|
15
|
+
|
16
|
+
def quick_search
|
17
|
+
@page_title = "Search #{@klass.name.underscore}"
|
18
|
+
@order = default_order
|
19
|
+
|
20
|
+
if params[:base]
|
21
|
+
klass = AdminData::Util.camelize_constantize(params[:base])
|
22
|
+
model = klass.find(params[:model_id])
|
23
|
+
has_many_proxy = model.send(params[:children].intern)
|
24
|
+
@total_num_of_children = has_many_proxy.send(:count)
|
25
|
+
h = { :page => params[:page], :per_page => per_page, :order => @order }
|
26
|
+
@records = has_many_proxy.send(:paginate, h)
|
27
|
+
else
|
28
|
+
params[:query] = params[:query].strip unless params[:query].blank?
|
29
|
+
cond = build_quick_search_conditions(@klass, params[:query])
|
30
|
+
h = { :page => params[:page], :per_page => per_page, :order => @order, :conditions => cond }
|
31
|
+
@records = @klass.paginate(h)
|
32
|
+
end
|
33
|
+
respond_to {|format| format.html}
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def advance_search
|
38
|
+
debugger
|
39
|
+
@page_title = "Advance search #{@klass.name.underscore}"
|
40
|
+
plugin_dir = AdminData::Config.setting[:plugin_dir]
|
41
|
+
hash = build_advance_search_conditions(@klass, params[:adv_search])
|
42
|
+
@relation = hash[:cond]
|
43
|
+
errors = hash[:errors]
|
44
|
+
@order = default_order
|
45
|
+
|
46
|
+
respond_to do |format|
|
47
|
+
format.html { render }
|
48
|
+
format.js {
|
49
|
+
debugger
|
50
|
+
|
51
|
+
if !hash[:errors].blank?
|
52
|
+
render :file => "#{plugin_dir}/app/views/admin_data/search/search/_errors.html.erb", :locals => {:errors => errors}
|
53
|
+
return
|
54
|
+
end
|
55
|
+
if params[:admin_data_advance_search_action_type] == 'destroy'
|
56
|
+
handle_advance_search_action_type_destroy
|
57
|
+
elsif params[:admin_data_advance_search_action_type] == 'delete'
|
58
|
+
handle_advance_search_action_type_delete
|
59
|
+
else
|
60
|
+
@records = @relation.order(@order).paginate(:page => params[:page], :per_page => per_page)
|
61
|
+
end
|
62
|
+
|
63
|
+
if @success_message
|
64
|
+
render :json => {:success => @success_message }
|
65
|
+
else
|
66
|
+
render :file => "#{plugin_dir}/app/views/admin_data/search/search/_listing.html.erb",
|
67
|
+
:locals => {:klass => @klass, :records => @records}
|
68
|
+
end
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def ensure_valid_children_klass
|
76
|
+
if params[:base]
|
77
|
+
begin
|
78
|
+
model_klass = AdminData::Util.camelize_constantize(params[:base])
|
79
|
+
rescue NameError => e #incase params[:base] is junk value
|
80
|
+
render :text => "#{params[:base]} is an invalid value", :status => :not_found
|
81
|
+
return
|
82
|
+
end
|
83
|
+
unless AdminData::Util.has_many_what(model_klass).include?(params[:children])
|
84
|
+
render :text => "<h2>#{params[:children]} is not a valid has_many association</h2>",
|
85
|
+
:status => :not_found
|
86
|
+
return
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def ensure_is_authorized_for_update_opration
|
92
|
+
if %w(destroy delete).include? params[:admin_data_advance_search_action_type]
|
93
|
+
render :text => 'not authorized', :status => :unauthorized unless admin_data_is_allowed_to_update?
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def handle_advance_search_action_type_delete
|
98
|
+
count = @relation.count
|
99
|
+
@relation.delete_all
|
100
|
+
@success_message = "#{count} #{AdminData::Util.pluralize(count, 'record')} deleted"
|
101
|
+
end
|
102
|
+
|
103
|
+
def handle_advance_search_action_type_destroy
|
104
|
+
count = @relation.count
|
105
|
+
@relation.find_in_batches do |group|
|
106
|
+
group.each {|record| record.destroy }
|
107
|
+
end
|
108
|
+
@success_message = "#{count} #{AdminData::Util.pluralize(count, 'record')} destroyed"
|
109
|
+
end
|
110
|
+
|
111
|
+
def default_order
|
112
|
+
params[:sortby] || "#{@klass.send(:table_name)}.#{@klass.send(:primary_key)} desc"
|
113
|
+
end
|
114
|
+
|
115
|
+
def set_collection_of_columns
|
116
|
+
collection_of_colums = @klass.columns.collect { |column|
|
117
|
+
#JSLint complains if a hash has key named boolean. So I am changing the key to booleant
|
118
|
+
column_type = (column.type.to_s == 'boolean') ? 'booleant' : column.type.to_s
|
119
|
+
"#{column.name}:'#{column_type}'"
|
120
|
+
}
|
121
|
+
collection_of_colums = collection_of_colums.join(',')
|
122
|
+
@collection_of_colums = "[{#{collection_of_colums}}]"
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
class AdminData::ValidateModelController < AdminData::BaseController
|
4
|
+
|
5
|
+
unloadable
|
6
|
+
|
7
|
+
before_filter :ensure_is_allowed_to_view
|
8
|
+
|
9
|
+
def tid
|
10
|
+
@data = gather_data(params[:tid])
|
11
|
+
respond_to {|format| format.html}
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate
|
15
|
+
@page_title = 'validate model'
|
16
|
+
@tid = Time.now.strftime('%Y%m%d%H%M%S')
|
17
|
+
|
18
|
+
dir = Rails.root.join('tmp', 'admin_data', 'validate_model')
|
19
|
+
FileUtils.mkdir_p(dir)
|
20
|
+
tids = Dir.chdir(dir) { Dir["*"] }
|
21
|
+
@tids = tids.sort!
|
22
|
+
|
23
|
+
respond_to {|format| format.html}
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate_model
|
27
|
+
respond_to do |format|
|
28
|
+
format.js do
|
29
|
+
if params[:tid].blank?
|
30
|
+
render :json => {:error => 'Something went wrong. Please try again !!' }
|
31
|
+
return
|
32
|
+
|
33
|
+
elsif params[:model].blank? && params[:still_processing].blank?
|
34
|
+
render :json => {:error => 'Please select at least one model' }
|
35
|
+
return
|
36
|
+
|
37
|
+
elsif !params[:still_processing].blank?
|
38
|
+
tid = params[:tid]
|
39
|
+
data = gather_data(tid)
|
40
|
+
done_file = File.join(Rails.root, 'tmp', 'admin_data', 'validate_model', tid, 'done.txt')
|
41
|
+
answer = File.exists?(done_file) ? 'no' : 'yes'
|
42
|
+
h = {
|
43
|
+
:still_processing => answer,
|
44
|
+
:data => data,
|
45
|
+
:currently_processing_klass => AdminData::Util.read_validation_file(tid, 'processing.txt')
|
46
|
+
}
|
47
|
+
render :json => h
|
48
|
+
return
|
49
|
+
else
|
50
|
+
tid = params[:tid]
|
51
|
+
klasses = params[:model].keys.join(',')
|
52
|
+
start_validation_rake_task(tid, klasses)
|
53
|
+
base_url = request.protocol + request.host_with_port
|
54
|
+
render :json => {:still_processing => 'yes', :base_url => base_url }
|
55
|
+
return
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def start_validation_rake_task(tid, klasses)
|
64
|
+
f = File.join(Rails.root, 'tmp', 'admin_data', 'validate_model', tid)
|
65
|
+
FileUtils.rm_rf(f) if File.directory?(f)
|
66
|
+
FileUtils.mkdir_p(f)
|
67
|
+
|
68
|
+
AdminData::Util.write_to_validation_file('', 'a', tid, 'processing.txt')
|
69
|
+
AdminData::Util.write_to_validation_file('', 'a', tid, 'bad.txt')
|
70
|
+
AdminData::Util.write_to_validation_file('', 'a', tid, 'good.txt')
|
71
|
+
AdminData::Util.write_to_validation_file('', 'a', tid, 'error.txt')
|
72
|
+
|
73
|
+
call_rake('admin_data:validate_models_bg', {:tid => tid, :klasses => klasses} )
|
74
|
+
end
|
75
|
+
|
76
|
+
def call_rake(task, options = {})
|
77
|
+
options[:rails_env] ||= Rails.env
|
78
|
+
args = options.map { |n, v| "#{n.to_s.upcase}='#{v}'" }
|
79
|
+
rake_command = AdminDataConfig.setting[:rake_command]
|
80
|
+
command = "#{rake_command} #{task} #{args.join(' ')}"
|
81
|
+
Rails.logger.info "command: #{command}"
|
82
|
+
p1 = Process.fork { system(command) }
|
83
|
+
AdminData::Util.write_to_validation_file(p1, 'a', options[:tid], 'pid.txt')
|
84
|
+
Process.detach(p1)
|
85
|
+
end
|
86
|
+
|
87
|
+
def gather_data(tid)
|
88
|
+
good_file = File.join(Rails.root, 'tmp', 'admin_data', 'validate_model', tid, 'good.txt')
|
89
|
+
bad_file = File.join(Rails.root, 'tmp', 'admin_data', 'validate_model', tid, 'bad.txt')
|
90
|
+
regex = /(\w+)\s+\|\s+(\d+)\s+\|\s+(.*)/
|
91
|
+
|
92
|
+
data = []
|
93
|
+
File.open(bad_file, "r") do |f|
|
94
|
+
f.each_line do |line|
|
95
|
+
next if line.strip.blank?
|
96
|
+
data << '<p>'
|
97
|
+
m = regex.match(line)
|
98
|
+
data << render_to_string(:partial => 'bad', :locals => {:klassu => m[1], :id => m[2], :error => m[3]})
|
99
|
+
data << '</p>'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
File.open(good_file, "r") { |f| f.each_line { |line| data << "<p>#{line}</p>" } }
|
103
|
+
data.join
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div id="main">
|
2
|
+
<div class="block" id="block-tables">
|
3
|
+
|
4
|
+
<div class="content rounded">
|
5
|
+
<h2 class="title">Diagnostic test</h2>
|
6
|
+
<div class="inner">
|
7
|
+
<h2>
|
8
|
+
<%= link_to 'Find missing database index', admin_data_diagnostic_missing_index_url %>
|
9
|
+
</h2>
|
10
|
+
<h2>
|
11
|
+
<%= link_to 'Validate Models', admin_data_validate_url %>
|
12
|
+
</h2>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<div id="main">
|
2
|
+
<div class="block" id="block-tables">
|
3
|
+
<div class="content rounded">
|
4
|
+
<h2 class="title">Missing Index Report</h2>
|
5
|
+
<div class="inner">
|
6
|
+
<p>It is recommended that all foreign keys be indexed.</p>
|
7
|
+
<p>
|
8
|
+
Given below is the migration code that should be performed to create index.
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<table id='missing_index'>
|
12
|
+
<% @indexes.each do |table, columns|
|
13
|
+
columns.map do |column| %>
|
14
|
+
<tr>
|
15
|
+
<td>
|
16
|
+
add_index '<%=table%>', '<%=column%>'
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
</table>
|
22
|
+
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
xml.instruct! :xml, :version => "1.0"
|
2
|
+
xml.rss(:version => "2.0" ){
|
3
|
+
xml.channel{
|
4
|
+
xml.title("Feeds from admin_data #{@klass.name}")
|
5
|
+
xml.link(request.host_with_port)
|
6
|
+
xml.description("feeds from AdminData #{@klass.name}")
|
7
|
+
xml.language('en-us')
|
8
|
+
h = {:order => "#{@klass.primary_key} desc", :limit => 100}
|
9
|
+
@klass.find(:all, h).each do |record|
|
10
|
+
xml.item do
|
11
|
+
xml.title("#{@klasss} id: #{record.id}")
|
12
|
+
|
13
|
+
desc = AdminData::Util.label_values_pair_for(record, self).inject([]) do |sum, a|
|
14
|
+
sum << "<p>#{a[0]}: #{a[1]}</p>"
|
15
|
+
end.join
|
16
|
+
|
17
|
+
xml.description(desc)
|
18
|
+
xml.pubDate(record.created_at.strftime("%a, %d %b %Y %H:%M:%S %z"))
|
19
|
+
xml.link(admin_data_on_k_path(:id => record, :klass => @klass.name))
|
20
|
+
xml.guid(admin_data_on_k_path(:id => record, :klass => @klass.name))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
}
|
24
|
+
}
|