admin_data 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/History.txt +221 -0
  2. data/README.textile +21 -0
  3. data/Rakefile +46 -0
  4. data/app/controllers/admin_data/base_controller.rb +114 -0
  5. data/app/controllers/admin_data/diagnostic_controller.rb +28 -0
  6. data/app/controllers/admin_data/feed_controller.rb +17 -0
  7. data/app/controllers/admin_data/main_controller.rb +132 -0
  8. data/app/controllers/admin_data/migration_controller.rb +19 -0
  9. data/app/controllers/admin_data/search_controller.rb +125 -0
  10. data/app/controllers/admin_data/validate_model_controller.rb +106 -0
  11. data/app/views/admin_data/diagnostic/index.html.erb +17 -0
  12. data/app/views/admin_data/diagnostic/missing_index.html.erb +26 -0
  13. data/app/views/admin_data/feed/index.rss.builder +24 -0
  14. data/app/views/admin_data/main/all_models.html.erb +22 -0
  15. data/app/views/admin_data/main/association/_association_info.html.erb +10 -0
  16. data/app/views/admin_data/main/association/_belongs_to_info.html.erb +7 -0
  17. data/app/views/admin_data/main/association/_has_many_info.html.erb +7 -0
  18. data/app/views/admin_data/main/association/_has_one_info.html.erb +6 -0
  19. data/app/views/admin_data/main/edit.html.erb +38 -0
  20. data/app/views/admin_data/main/misc/_form.html.erb +25 -0
  21. data/app/views/admin_data/main/misc/_modify_record.html.erb +22 -0
  22. data/app/views/admin_data/main/new.html.erb +23 -0
  23. data/app/views/admin_data/main/show.html.erb +41 -0
  24. data/app/views/admin_data/main/table_structure.html.erb +55 -0
  25. data/app/views/admin_data/migration/index.html.erb +18 -0
  26. data/app/views/admin_data/migration/jstest.html.erb +51 -0
  27. data/app/views/admin_data/search/_search_base.html.erb +34 -0
  28. data/app/views/admin_data/search/advance_search.html.erb +3 -0
  29. data/app/views/admin_data/search/quick_search.html.erb +6 -0
  30. data/app/views/admin_data/search/search/_advance_search_form.html.erb +48 -0
  31. data/app/views/admin_data/search/search/_errors.html.erb +5 -0
  32. data/app/views/admin_data/search/search/_listing.html.erb +40 -0
  33. data/app/views/admin_data/search/search/_search_form.html.erb +28 -0
  34. data/app/views/admin_data/search/search/_sortby.html.erb +18 -0
  35. data/app/views/admin_data/search/search/_title.html.erb +34 -0
  36. data/app/views/admin_data/shared/_breadcrum.html.erb +10 -0
  37. data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
  38. data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
  39. data/app/views/admin_data/shared/_header.html.erb +23 -0
  40. data/app/views/admin_data/shared/_powered_by.html.erb +23 -0
  41. data/app/views/admin_data/shared/_secondary_navigation.html.erb +28 -0
  42. data/app/views/admin_data/validate_model/_bad.html.erb +1 -0
  43. data/app/views/admin_data/validate_model/tid.html.erb +2 -0
  44. data/app/views/admin_data/validate_model/validate.html.erb +67 -0
  45. data/app/views/layouts/admin_data.html.erb +60 -0
  46. data/config/routes.rb +34 -0
  47. data/init.rb +1 -0
  48. data/lib/admin_data.rb +34 -0
  49. data/lib/admin_data/chelper.rb +37 -0
  50. data/lib/admin_data/compatibility.rb +7 -0
  51. data/lib/admin_data/helpers.rb +222 -0
  52. data/lib/admin_data/railtie.rb +21 -0
  53. data/lib/admin_data/search.rb +186 -0
  54. data/lib/admin_data/settings.rb +72 -0
  55. data/lib/admin_data/util.rb +237 -0
  56. data/lib/admin_data/version.rb +3 -0
  57. data/lib/admin_data_date_validation.rb +79 -0
  58. data/lib/css/app.css +224 -0
  59. data/lib/css/base.css +1071 -0
  60. data/lib/css/header.css +65 -0
  61. data/lib/css/rounded.css +18 -0
  62. data/lib/css/themes/drastic-dark/style.css +374 -0
  63. data/lib/css/umbrella.css +34 -0
  64. data/lib/css/vendor/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
  65. data/lib/css/vendor/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
  66. data/lib/css/vendor/images/ui-bg_flat_0_333333_40x100.png +0 -0
  67. data/lib/css/vendor/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
  68. data/lib/css/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/lib/css/vendor/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
  70. data/lib/css/vendor/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
  71. data/lib/css/vendor/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
  72. data/lib/css/vendor/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
  73. data/lib/css/vendor/images/ui-icons_004276_256x240.png +0 -0
  74. data/lib/css/vendor/images/ui-icons_cc0000_256x240.png +0 -0
  75. data/lib/css/vendor/images/ui-icons_ffffff_256x240.png +0 -0
  76. data/lib/css/vendor/jquery-ui-1.7.2.custom.css +406 -0
  77. data/lib/css/vendor/qunit.css +119 -0
  78. data/lib/js/advance_search/act_on_result.js +47 -0
  79. data/lib/js/advance_search/adv_search.js +46 -0
  80. data/lib/js/advance_search/advance_search.js +60 -0
  81. data/lib/js/advance_search/advance_search_structure.js +79 -0
  82. data/lib/js/advance_search/ajaxify_advance_search.js +28 -0
  83. data/lib/js/advance_search/build_first_row.js +12 -0
  84. data/lib/js/advance_search/event_bindings.js +87 -0
  85. data/lib/js/advance_search/global_ajax_setting.js +10 -0
  86. data/lib/js/advance_search/trigger_submit_on_domready.js +6 -0
  87. data/lib/js/misc/drop_down_change.js +8 -0
  88. data/lib/js/misc/js_util.js +42 -0
  89. data/lib/js/misc/quick_search_input_focus.js +6 -0
  90. data/lib/js/test/act_on_result.js +120 -0
  91. data/lib/js/test/advance_search.js +80 -0
  92. data/lib/js/test/ajaxify_advance_search.js +29 -0
  93. data/lib/js/test/build_first_row.js +10 -0
  94. data/lib/js/test/event_bindings.js +100 -0
  95. data/lib/js/validate_model/ajaxify_form.js +66 -0
  96. data/lib/js/validate_model/select_all.js +15 -0
  97. data/lib/js/vendor/jack.js +903 -0
  98. data/lib/js/vendor/jquery-1.4.1.js +6078 -0
  99. data/lib/js/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
  100. data/lib/js/vendor/jquery.ba-isjquery.js +21 -0
  101. data/lib/js/vendor/jquery.form.js +814 -0
  102. data/lib/js/vendor/jquery.lint.js +604 -0
  103. data/lib/js/vendor/log.js +9 -0
  104. data/lib/js/vendor/qunit.js +1043 -0
  105. data/lib/tasks/admin_data_tasks.rake +7 -0
  106. data/lib/tasks/validate_models_bg.rake +23 -0
  107. data/test/factories/article.rb +9 -0
  108. data/test/factories/car.rb +4 -0
  109. data/test/factories/city.rb +4 -0
  110. data/test/factories/comment.rb +6 -0
  111. data/test/factories/door.rb +4 -0
  112. data/test/factories/engine.rb +4 -0
  113. data/test/functional/base_controller_test.rb +5 -0
  114. data/test/functional/feed_controller_test.rb +34 -0
  115. data/test/functional/main_controller_test.rb +421 -0
  116. data/test/functional/migration_controller_test.rb +30 -0
  117. data/test/functional/routes_test.rb +61 -0
  118. data/test/functional/search_controller_test.rb +814 -0
  119. data/test/helper/view_helper_test.rb +177 -0
  120. data/test/misc_tests/date_validation_test.rb +32 -0
  121. data/test/misc_tests/settings_test.rb +29 -0
  122. data/test/misc_tests/util_test.rb +83 -0
  123. data/test/rails_root/Gemfile +22 -0
  124. data/test/rails_root/Gemfile.lock +101 -0
  125. data/test/rails_root/Rakefile +7 -0
  126. data/test/rails_root/app/controllers/application_controller.rb +3 -0
  127. data/test/rails_root/app/helpers/application_helper.rb +2 -0
  128. data/test/rails_root/app/models/article.rb +25 -0
  129. data/test/rails_root/app/models/city.rb +15 -0
  130. data/test/rails_root/app/models/comment.rb +13 -0
  131. data/test/rails_root/app/models/tech_magazine.rb +2 -0
  132. data/test/rails_root/app/models/vehicle/car.rb +4 -0
  133. data/test/rails_root/app/models/vehicle/door.rb +3 -0
  134. data/test/rails_root/app/models/vehicle/engine.rb +3 -0
  135. data/test/rails_root/app/views/layouts/application.html.erb +14 -0
  136. data/test/rails_root/config.ru +4 -0
  137. data/test/rails_root/config/application.rb +42 -0
  138. data/test/rails_root/config/boot.rb +13 -0
  139. data/test/rails_root/config/database.yml +22 -0
  140. data/test/rails_root/config/environment.rb +5 -0
  141. data/test/rails_root/config/environments/development.rb +22 -0
  142. data/test/rails_root/config/environments/production.rb +49 -0
  143. data/test/rails_root/config/environments/test.rb +35 -0
  144. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  145. data/test/rails_root/config/initializers/inflections.rb +10 -0
  146. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  147. data/test/rails_root/config/initializers/secret_token.rb +7 -0
  148. data/test/rails_root/config/initializers/session_store.rb +8 -0
  149. data/test/rails_root/config/locales/en.yml +5 -0
  150. data/test/rails_root/config/routes.rb +58 -0
  151. data/test/rails_root/db/migrate/20090809061114_create_tables.rb +70 -0
  152. data/test/rails_root/db/schema.rb +74 -0
  153. data/test/rails_root/db/seeds.rb +7 -0
  154. data/test/rails_root/script/rails +6 -0
  155. data/test/rails_root/test/performance/browsing_test.rb +0 -0
  156. data/test/rails_root/test/test_helper.rb +13 -0
  157. data/test/support/assertions.rb +20 -0
  158. data/test/test_helper.rb +74 -0
  159. 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
+ }