admin_data 1.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.
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
+ }