refinerycms 0.9.5.5 → 0.9.5.6

Sign up to get free protection for your applications and to get access to all the features.
data/bin/refinery CHANGED
@@ -17,10 +17,12 @@ unless (app_path = ARGV.shift).nil? or app_path.length == 0
17
17
  FileUtils::makedirs RAILS_ROOT
18
18
 
19
19
  # copy in all of the relevant directories and root files.
20
- to_copy = %w(app config db public script CONTRIBUTORS LICENSE Rakefile README).map do |dir|
20
+ to_copy = %w(app config db lib public script CONTRIBUTORS LICENSE Rakefile README).map do |dir|
21
21
  File.join REFINERY_ROOT, dir
22
22
  end
23
23
  FileUtils::cp_r to_copy, RAILS_ROOT, :verbose => false
24
+ # ensure lib/refinery_initializer.rb doesn't make it in.
25
+ FileUtils::rm File.join(RAILS_ROOT, %w(lib refinery_initializer.rb)) if File.exists?(File.join(RAILS_ROOT, %w(lib refinery_initializer.rb)))
24
26
 
25
27
  # add in the database config file.
26
28
  FileUtils::move File.join(RAILS_ROOT, %w(config database.yml.example)), File.join(RAILS_ROOT, %w(config database.yml))
@@ -66,4 +66,5 @@ eval("#{(defined? Refinery::Initializer) ? Refinery : Rails}::Initializer").run
66
66
  config.gem "rails", :version => ">= 2.3.4", :lib => "rails"
67
67
  config.gem "aasm", :version => ">= 2.1.3", :lib => "aasm", :source => "http://gemcutter.org"
68
68
  config.gem "unicode", :version => ">= 0.1", :lib => "unicode"
69
+ config.gem "slim_scrooge", :source => "http://gemcutter.org"
69
70
  end
@@ -0,0 +1,25 @@
1
+ class AddMissingIndexes < ActiveRecord::Migration
2
+ def self.up
3
+ add_index :pages, :parent_id
4
+ add_index :pages, :custom_title_image_id
5
+ add_index :pages, :image_id
6
+ add_index :images, :parent_id
7
+ add_index :page_parts, :page_id
8
+
9
+ add_index :pages, :id
10
+ add_index :page_parts, :id
11
+ add_index :users, :id
12
+ end
13
+
14
+ def self.down
15
+ remove_index :pages, :parent_id
16
+ remove_index :pages, :custom_title_image_id
17
+ remove_index :pages, :image_id
18
+ remove_index :images, :parent_id
19
+ remove_index :page_parts, :page_id
20
+
21
+ remove_index :pages, :id
22
+ remove_index :page_parts, :id
23
+ remove_index :users, :id
24
+ end
25
+ end
data/db/schema.rb CHANGED
@@ -9,7 +9,7 @@
9
9
  #
10
10
  # It's strongly recommended to check this file into your version control system.
11
11
 
12
- ActiveRecord::Schema.define(:version => 20091029034951) do
12
+ ActiveRecord::Schema.define(:version => 20091109012126) do
13
13
 
14
14
  create_table "images", :force => true do |t|
15
15
  t.integer "parent_id"
@@ -24,6 +24,8 @@ ActiveRecord::Schema.define(:version => 20091029034951) do
24
24
  t.datetime "updated_at"
25
25
  end
26
26
 
27
+ add_index "images", ["parent_id"], :name => "index_images_on_parent_id"
28
+
27
29
  create_table "inquiries", :force => true do |t|
28
30
  t.string "name"
29
31
  t.string "email"
@@ -60,6 +62,9 @@ ActiveRecord::Schema.define(:version => 20091029034951) do
60
62
  t.datetime "updated_at"
61
63
  end
62
64
 
65
+ add_index "page_parts", ["id"], :name => "index_page_parts_on_id"
66
+ add_index "page_parts", ["page_id"], :name => "index_page_parts_on_page_id"
67
+
63
68
  create_table "pages", :force => true do |t|
64
69
  t.string "title"
65
70
  t.integer "parent_id"
@@ -82,6 +87,11 @@ ActiveRecord::Schema.define(:version => 20091029034951) do
82
87
  t.boolean "skip_to_first_child", :default => false
83
88
  end
84
89
 
90
+ add_index "pages", ["custom_title_image_id"], :name => "index_pages_on_custom_title_image_id"
91
+ add_index "pages", ["id"], :name => "index_pages_on_id"
92
+ add_index "pages", ["image_id"], :name => "index_pages_on_image_id"
93
+ add_index "pages", ["parent_id"], :name => "index_pages_on_parent_id"
94
+
85
95
  create_table "refinery_settings", :force => true do |t|
86
96
  t.string "name"
87
97
  t.text "value"
@@ -137,4 +147,6 @@ ActiveRecord::Schema.define(:version => 20091029034951) do
137
147
  t.datetime "updated_at"
138
148
  end
139
149
 
150
+ add_index "users", ["id"], :name => "index_users_on_id"
151
+
140
152
  end
@@ -36,11 +36,9 @@ class Admin::ImagesController < Admin::BaseController
36
36
 
37
37
  def create
38
38
  @image = Image.create(params[:image])
39
- saved = @image.valid?
40
- flash.now[:notice] = "'#{@image.title}' was successfully created." if saved
41
-
42
39
  unless params[:insert]
43
- if saved
40
+ if @image.valid?
41
+ flash[:notice] = "'#{@image.title}' was successfully created."
44
42
  unless from_dialog?
45
43
  redirect_to :action => 'index'
46
44
  else
@@ -22,7 +22,7 @@
22
22
  <input type='hidden' name='update_image' value='<%= @update_image %>' />
23
23
  <input type='hidden' name='thumbnail' value='<%= @thumbnail %>' />
24
24
  <input type='hidden' name='callback' value='<%= @callback %>' />
25
- <input type='hidden' name='conditions' value='<%= @conditions %>' >
25
+ <input type='hidden' name='conditions' value='<%= @conditions %>' />
26
26
  <% end %>
27
27
  <% end %>
28
28
 
@@ -82,7 +82,7 @@
82
82
  });
83
83
 
84
84
  <% if @thickbox %>
85
- $('submit_button').observe('click', function(e)
85
+ $('dialog-form-actions').down('#submit_button').observe('click', function(e)
86
86
  {
87
87
  selected = null;
88
88
  $$('#existing_image_area_content ul li.selected img').each(function(selected_img)
@@ -91,19 +91,17 @@
91
91
  });
92
92
  if (selected != null)
93
93
  {
94
- if ('<%= @field %>'.length > 0)
94
+ <% unless @field.blank? %>
95
+ if ((field = parent.document.getElementById('<%= @field %>')) != null)
95
96
  {
96
- field = parent.document.getElementById('<%= @field %>');
97
- if (field != null)
98
- {
99
- field.value = selected.id.replace("image_", "");
100
- }
101
- if ((image = parent.document.getElementById('<%= @update_image %>')) != null)
102
- {
103
- image.src = selected.src.replace("_dialog_thumb", '<%= "_#{@thumbnail}" unless @thumbnail.blank? %>');
104
- $(image).writeAttribute("width", null).writeAttribute("height", null);
105
- }
97
+ field.value = selected.id.replace("image_", "");
106
98
  }
99
+ if ((image = parent.document.getElementById('<%= @update_image %>')) != null)
100
+ {
101
+ image.src = selected.src.replace("_dialog_thumb", '<%= "_#{@thumbnail}" unless @thumbnail.blank? %>');
102
+ $(image).writeAttribute("width", null).writeAttribute("height", null);
103
+ }
104
+ <% end %>
107
105
  <%= "self.parent.#{@callback}();" unless @callback.blank? %>
108
106
  self.parent.tb_remove();
109
107
  }
@@ -56,21 +56,13 @@
56
56
  </p>
57
57
  </div>
58
58
  <div id='custom_title_image' style='display: <%= @page.custom_title_type == 'image' ? 'block' : 'none' %>' class='clearfix'>
59
- <%= f.hidden_field :custom_title_image_id %>
60
- <div>
61
- <a id='current_image_link' href="<%= insert_admin_images_url %>?thickbox=true&amp;modal=true&amp;titlebar=true&amp;field=page_custom_title_image_id&amp;update_image=current_custom_title_image&amp;callback=custom_title_image_changed&amp;thumbnail=&amp;KeepThis=true&amp;TB_iframe=true&amp;width=950&amp;height=510" style='border: 0px' title='Change Image' name='Change Image' class='thickbox'>
62
- <% unless @page.custom_title_image.nil? %>
63
- <%= image_fu @page.custom_title_image, nil, {:class => "brown_border", :id => "current_custom_title_image"} %>
64
- <% else %>
65
- <img id="current_custom_title_image" class="" src="" alt="" />
66
- <% end %>
67
- <span id='no_custom_title_image_selected' <%= "style='display: none;'" unless @page.custom_title_image.nil? %>>
68
- There is currently no image selected. Click here to add one
69
- </span>
70
- </a>
71
- <br/>
72
- <%= link_to "Remove Current Image", "", :id => "remove_custom_title_image", :style => "margin-top:8px;display:inline-block;width:auto;#{"display:none;" if @page.custom_title_image.nil?}" %>
73
- </div>
59
+ <%= render :partial => "/shared/admin/image_picker", :locals =>
60
+ {
61
+ :f => f,
62
+ :field => :custom_title_image_id,
63
+ :image => @page.custom_title_image
64
+ }
65
+ %>
74
66
  </div>
75
67
  </div>
76
68
  <div class='field'>
@@ -136,7 +128,7 @@
136
128
  <div id='dialog-form-actions' class='form-actions'>
137
129
  <%= f.submit 'Save', :id => "new_page_part_save" %>
138
130
  or
139
- <%= link_to "Cancel", "#", :id => "new_page_part_cancel", :class => "close_dialog" %>
131
+ <%= link_to "Cancel", "", :id => "new_page_part_cancel", :class => "close_dialog" %>
140
132
  </div>
141
133
  </div>
142
134
  <% end %>
@@ -154,7 +146,7 @@
154
146
  $('toggle_advanced_options').observe('click', function(e)
155
147
  {
156
148
  $('more_options').toggle();
157
- e.stop();
149
+ e.preventDefault();
158
150
  });
159
151
 
160
152
  $$('input[type=radio]').each(function(radio)
@@ -167,22 +159,12 @@
167
159
  });
168
160
  }
169
161
  });
170
-
171
- $('remove_custom_title_image').observe('click', function(e)
172
- {
173
- $('current_custom_title_image').removeClassName('brown_border');
174
- $('current_custom_title_image').src = '';
175
- $('current_custom_title_image').alt = 'There is currently no image selected. Click here to add one.';
176
- $('page_custom_title_image_id').value = '';
177
- this.hide();
178
- e.stop();
179
- });
180
162
 
181
163
  <% if RefinerySetting.find_or_set(:new_page_parts, false) %>
182
164
  $('add_page_part').observe('click', function(e) {
183
165
  tb_show('Create Content Section', '#?auto_size_content=true&draggable=true&titlebar=true&inlineId=new_page_part_dialog&TB_inline=true&modal=true');
184
166
 
185
- e.stop();
167
+ e.preventDefault();
186
168
  });
187
169
 
188
170
  $('new_page_part_save').observe('click', function(e) {
@@ -224,7 +206,7 @@
224
206
  $('new_page_part_cancel').observe('click', function(e) {
225
207
  $('new_page_part_title').value = "";
226
208
  tb_remove();
227
- e.stop();
209
+ e.preventDefault();
228
210
  });
229
211
 
230
212
  $('delete_page_part').observe('click', function(e) {
@@ -250,17 +232,10 @@
250
232
  WYMeditor.loaded();
251
233
  }
252
234
 
253
- e.stop();
235
+ e.preventDefault();
254
236
  });
255
237
  <% end %>
256
238
  });
257
-
258
- custom_title_image_changed = function()
259
- {
260
- $('remove_custom_title_image').show();
261
- $('current_custom_title_image').addClassName('brown_border');
262
- $('no_custom_title_image_selected').hide();
263
- }
264
239
 
265
240
  // Hook into the loaded function. This will be called when WYMeditor has done its thing.
266
241
  WYMeditor.loaded = function()
@@ -1,9 +1,10 @@
1
1
  <% flash.each do |key, value| %>
2
2
  <div id="flash" class="flash_<%= key %>" style='display: none;' >
3
- <%= value %> (<%= link_to "close", "#", {:id => "close"} %>)
3
+ <%= value %> (<%= link_to "close", "", {:id => "close"} %>)
4
4
  <script type="text/javascript">
5
- $('close').observe('click', function(){
5
+ $('close').observe('click', function(e){
6
6
  $('flash').fade({ duration: 0.3 });
7
+ e.preventDefault();
7
8
  });
8
9
  </script>
9
10
  </div>
@@ -0,0 +1,42 @@
1
+ <%= f.hidden_field field %>
2
+ <div>
3
+ <a id='current_image_link' href="<%= insert_admin_images_url %>?thickbox=true&amp;modal=true&amp;titlebar=true&amp;field=<%= f.object.class.name.downcase %>_<%= field %>&amp;update_image=current_picked_image&amp;callback=picked_image_changed&amp;thumbnail=&amp;KeepThis=true&amp;TB_iframe=true&amp;width=<%= width ||= 950 %>&amp;height=<%= height ||= 510 %>" style='border: 0px' title='Change Image' name='Change Image' class='thickbox'>
4
+ <% unless image.nil? %>
5
+ <%= image_fu image, nil, {:class => "brown_border", :id => "current_picked_image"} %>
6
+ <% else %>
7
+ <img id="current_picked_image" class="" src="" alt="" style='display: none' />
8
+ <% end %>
9
+ <p id='no_picked_image_selected' <%= "style='display: none;'" unless image.nil? %>>
10
+ There is currently no image selected, please click here to add one.
11
+ </p>
12
+ </a>
13
+ <br/>
14
+ <%= link_to "Remove Current Image", "", :id => "remove_picked_image", :style => "margin-top:8px;display:inline-block;width:auto;#{"display:none;" if image.nil?}" %>
15
+ </div>
16
+ <% content_for :head do %>
17
+ <script type='text/javascript'>
18
+ picked_image_changed = function()
19
+ {
20
+ $('remove_picked_image').show();
21
+ $('current_picked_image').show();
22
+ $('current_picked_image').addClassName('brown_border');
23
+ $('no_picked_image_selected').hide();
24
+ }
25
+
26
+ FastInit.addOnLoad(function() {
27
+ $('remove_picked_image').observe('click', function(e)
28
+ {
29
+ $('current_picked_image').removeClassName('brown_border');
30
+ $('current_picked_image').src = '';
31
+ $('current_picked_image').alt = 'There is currently no image selected. Click here to add one.';
32
+ $('<%= f.object.class.name.downcase %>_<%= field %>').value = '';
33
+ $('current_picked_image').style.width = "auto";
34
+ $('current_picked_image').style.height = "auto";
35
+ $('no_picked_image_selected').show();
36
+ $('current_picked_image').hide();
37
+ this.hide();
38
+ e.stop();
39
+ });
40
+ });
41
+ </script>
42
+ <% end %>
@@ -0,0 +1,52 @@
1
+ <%= f.hidden_field field %>
2
+ <div>
3
+ <a id='current_resource_link' href="<%= insert_admin_resources_url %>?thickbox=true&amp;modal=true&amp;titlebar=true&amp;field=<%= "#{f.object.class.name.downcase}_#{field}" %><%= "&amp;current_link=#{resource.public_filename unless resource.nil?}" %>&amp;update_resource=current_resource&amp;update_text=current_resource_text&amp;callback=resource_changed&amp;thumbnail=&amp;KeepThis=true&amp;TB_iframe=true&amp;width=<%= width ||= 950 %>&amp;height=<%= height ||= 510 %>" style='border: 0px' title='Change Resource' name='Change Resource' class='thickbox'>
4
+ <span id='no_resource_selected' <%= "style='display: none;'" unless resource.nil? %>>
5
+ There is currently no message file selected, click here to add one.
6
+ </span>
7
+ </a>
8
+ <div id='current_resource_container'>
9
+ <% unless resource.nil? %>
10
+ Current message file:
11
+ <span id='current_resource_text'>
12
+ <%= "#{resource.title} (#{resource.public_filename})" %>
13
+ </span>
14
+ <br/>
15
+ <%= link_to "#{refinery_icon_tag("page_white_put.png")} Download current message file (<em>Opens in a new window</em>)", resource.public_filename,
16
+ :id => "current_resource",
17
+ :target => "_blank" %>
18
+ <% else %>
19
+ <%= link_to "#{refinery_icon_tag("page_white_put.png")} Download current message file (<em>Opens in a new window</em>)", "",
20
+ :id => "current_resource",
21
+ :style => "display:none;",
22
+ :target => "_blank" %>
23
+ <% end %>
24
+ </div>
25
+ <br/>
26
+ <%= link_to "Remove Current Resource", "",
27
+ :id => "remove_resource",
28
+ :style => "margin-top:8px;display:inline-block;width:auto;#{"display:none;" if resource.nil?}" %>
29
+ </div>
30
+
31
+ <% content_for :head do %>
32
+ <script type='text/javascript'>
33
+ resource_changed = function() {
34
+ $('current_resource_link').href = $('current_resource_link').href.gsub(/current_link=([^&])*&/, "current_link=" + $('current_resource').href + "&");
35
+ $('remove_resource').show();
36
+ $('current_resource_container').show();
37
+ $('no_resource_selected').hide();
38
+ }
39
+
40
+ FastInit.addOnLoad(function() {
41
+ $('remove_resource').observe('click', function(e) {
42
+ $('<%= f.object.class.name.downcase %>_<%= field %>').value = "";
43
+ $('current_resource_container').hide();
44
+ $('current_resource_text').innerHTML = '';
45
+ $('no_resource_selected').show();
46
+ $('current_resource_link').href = $('current_resource_link').href.gsub(/current_link=([^&])*&/, "current_link=&");
47
+ this.hide();
48
+ e.preventDefault();
49
+ });
50
+ });
51
+ </script>
52
+ <% end %>
@@ -9,6 +9,8 @@ class <%= migration_name %> < ActiveRecord::Migration
9
9
 
10
10
  t.timestamps
11
11
  end
12
+
13
+ add_index :<%= table_name %>, :id
12
14
 
13
15
  User.find(:all).each do |user|
14
16
  user.plugins.create(:title => "<%= class_name.pluralize.underscore.titleize %>", :position => (user.plugins.maximum(:position) || -1) +1)
@@ -17,8 +19,7 @@ class <%= migration_name %> < ActiveRecord::Migration
17
19
  page = Page.create(:title => "<%= class_name.pluralize.underscore.titleize %>", :link_url => "/<%= plural_name %>", :deletable => false, :position => ((Page.maximum(:position, :conditions => "parent_id IS NULL") || -1)+1))
18
20
  RefinerySetting.find_or_set(:default_page_parts, ["body", "side_body"]).each do |default_page_part|
19
21
  page.parts.create(:title => default_page_part, :body => nil)
20
- end
21
-
22
+ end
22
23
  end
23
24
 
24
25
  def self.down
@@ -1,13 +1,13 @@
1
- <%%= error_messages_for :<%= singular_name %> %>
2
- <%% form_for [:admin, @<%= singular_name %>] do |f| %>
1
+ <%%= error_messages_for :<%= singular_name %> -%>
2
+ <%% form_for [:admin, @<%= singular_name %>] do |f| -%>
3
3
  <% attributes.each do |attribute| -%>
4
4
  <div class='field'>
5
- <%%= f.label :<%= attribute.name %> %>
6
- <% if attribute.field_type.to_s == "text_area" %>
7
- <%%= f.text_area :<%= attribute.name %>, :rows => 20, :cols => 140, :class => 'wymeditor' %>
8
- <% else %>
9
- <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
10
- <% end %>
5
+ <%%= f.label :<%= attribute.name %> -%>
6
+ <% if attribute.field_type.to_s == "text_area" -%>
7
+ <%%= f.text_area :<%= attribute.name %>, :rows => 20, :cols => 140, :class => 'wymeditor' -%>
8
+ <% else -%>
9
+ <%%= f.<%= attribute.field_type -%> :<%= attribute.name -%> -%>
10
+ <% end -%>
11
11
  </div>
12
12
  <% end -%>
13
13
  <div class='form-actions'>
@@ -2,7 +2,8 @@
2
2
  <span class='title'>
3
3
  <span class='actions'>
4
4
  <%%= link_to refinery_icon_tag("application_go.png"), <%= singular_name %>_url(<%= singular_name %>),
5
- :title => 'View this <%= $title_name.downcase %>' %>
5
+ :title => 'View this <%= $title_name.downcase %><br/><em>Opens in a new window</em>',
6
+ :target => "_blank" %>
6
7
  <%%= link_to refinery_icon_tag("application_edit.png"), edit_admin_<%= singular_name %>_path(<%= singular_name %>),
7
8
  :title => 'Edit this <%= $title_name.downcase %>' %>
8
9
  <%%= link_to refinery_icon_tag("delete.png"), admin_<%= singular_name %>_path(<%= singular_name %>),
@@ -0,0 +1,280 @@
1
+ module Indexer
2
+
3
+
4
+ def self.sortalize(array)
5
+ Marshal.load(Marshal.dump(array)).each do |element|
6
+ element.sort! if element.is_a?(Array)
7
+ end
8
+ end
9
+
10
+ def self.check_for_indexes(migration_format = false)
11
+ model_names = []
12
+ Dir.chdir(Rails.root) do
13
+ model_names = Dir["**/app/models/*.rb"].collect {|filename| File.basename(filename) }.uniq
14
+ end
15
+
16
+ model_classes = []
17
+ model_names.each do |model_name|
18
+ class_name = model_name.sub(/\.rb$/,'').camelize
19
+ begin
20
+ klass = class_name.split('::').inject(Object){ |klass,part| klass.const_get(part) }
21
+ if klass < ActiveRecord::Base && !klass.abstract_class?
22
+ model_classes << klass
23
+ end
24
+ rescue
25
+ # No-op
26
+ end
27
+ end
28
+ puts "Found #{model_classes.size} Models"
29
+
30
+ @indexes_required = Hash.new([])
31
+ @index_migrations = Hash.new([])
32
+
33
+ model_classes.each do |class_name|
34
+
35
+ # check if this is an STI child instance
36
+ if class_name.base_class.name != class_name.name && (class_name.column_names.include?(class_name.base_class.inheritance_column) || class_name.column_names.include?(class_name.inheritance_column))
37
+ # add the inharitance column on the parent table
38
+ if !(migration_format)
39
+ @indexes_required[class_name.base_class.table_name] += [class_name.inheritance_column].sort unless @indexes_required[class_name.base_class.table_name].include?([class_name.inheritance_column].sort)
40
+ else
41
+ # index migration for STI should require both the primary key and the inheritance_column in a composite index.
42
+ @index_migrations[class_name.base_class.table_name] += [[class_name.inheritance_column, class_name.base_class.primary_key].sort] unless @index_migrations[class_name.base_class.table_name].include?([class_name.base_class.inheritance_column].sort)
43
+ end
44
+ end
45
+
46
+ class_name.reflections.each_pair do |reflection_name, reflection_options|
47
+ case reflection_options.macro
48
+ when :belongs_to
49
+ # polymorphic?
50
+ @table_name = class_name.table_name.to_s #(reflection_options.options.has_key?(:class_name) ? reflection_options.options[:class_name].constantize.table_name : )
51
+ if reflection_options.options.has_key?(:polymorphic) && (reflection_options.options[:polymorphic] == true)
52
+ poly_type = "#{reflection_options.name.to_s}_type"
53
+ poly_id = "#{reflection_options.name.to_s}_id"
54
+ if !(migration_format)
55
+ @indexes_required[@table_name.to_s] += [poly_type, poly_id].sort unless @indexes_required[@table_name.to_s].include?([poly_type, poly_id].sort)
56
+ else
57
+
58
+ @index_migrations[@table_name.to_s] += [[poly_type, poly_id].sort] unless @index_migrations[@table_name.to_s].include?([poly_type, poly_id].sort)
59
+ end
60
+ else
61
+
62
+ foreign_key = reflection_options.options[:foreign_key] ||= reflection_options.primary_key_name
63
+
64
+ if !(migration_format)
65
+ @indexes_required[@table_name.to_s] += [foreign_key] unless @indexes_required[@table_name.to_s].include?(foreign_key)
66
+ else
67
+ @index_migrations[@table_name.to_s] += [foreign_key] unless @index_migrations[@table_name.to_s].include?(foreign_key)
68
+ end
69
+ end
70
+ when :has_and_belongs_to_many
71
+ table_name = reflection_options.options[:join_table] ||= [class_name.table_name, reflection_name.to_s].sort.join('_')
72
+ association_foreign_key = reflection_options.options[:association_foreign_key] ||= "#{reflection_name.to_s.singularize}_id"
73
+ foreign_key = reflection_options.options[:foreign_key] ||= "#{class_name.name.tableize.singularize}_id"
74
+
75
+ if !(migration_format)
76
+ @indexes_required[table_name.to_s] += [association_foreign_key, foreign_key].sort unless @indexes_required[table_name].include?([association_foreign_key, foreign_key].sort)
77
+ else
78
+ @index_migrations[table_name.to_s] += [[association_foreign_key, foreign_key].sort] unless @index_migrations[table_name].include?([association_foreign_key, foreign_key].sort)
79
+ end
80
+ else
81
+ #nothing
82
+ end
83
+ end
84
+ end
85
+
86
+ @missing_indexes = {}
87
+ @indexes_required.each do |table_name, foreign_keys|
88
+
89
+ unless foreign_keys.blank?
90
+ existing_indexes = ActiveRecord::Base.connection.indexes(table_name.to_sym).collect(&:columns)
91
+ keys_to_add = self.sortalize(foreign_keys.uniq) - self.sortalize(existing_indexes)
92
+ @missing_indexes[table_name] = keys_to_add unless keys_to_add.empty?
93
+ end
94
+ end
95
+ if !(migration_format)
96
+ @missing_indexes
97
+ else
98
+ @index_migrations
99
+ end
100
+ end
101
+
102
+ def self.scan_finds
103
+ file_names = []
104
+ Dir.chdir(Rails.root) do
105
+ file_names = Dir["**/app/**/*.rb"].uniq.reject {|file_with_path| file_with_path.include?('test')}
106
+ end
107
+
108
+ puts "Found #{file_names.size} files."
109
+
110
+ @indexes_required = Hash.new([])
111
+ file_names.each do |file_name|
112
+ current_file = File.open(File.join(Rails.root, file_name), 'r')
113
+
114
+ current_file.each do |line|
115
+ find_regexp = Regexp.new(/([A-Z]{1}[A-Za-z]+).(find){1}((_all){0,1}(_by_){0,1}([A-Za-z_]+))?\(([0-9A-Za-z"\':=>. \[\]{},]*)\)/)
116
+ if matches = find_regexp.match(line)
117
+
118
+ model_name, column_names, options = matches[1], matches[6], matches[7]
119
+ # puts "Model: #{model_name}, columns: #{column_names}, options: #{options}"
120
+
121
+ if model_name.respond_to?(:constantize)
122
+ if model_name.constantize.respond_to?(:table_name)
123
+ table_name = model_name.constantize.table_name
124
+ else
125
+ puts "Unable to get the table_name for #{model_name.to_s}. it could be an ActiveResource"
126
+ next
127
+ end
128
+ else
129
+ puts "Unable to constantize #{model_name.to_s}, if you are sure that #{model_name.to_s} is a valid class name, please file an issue on\nhttp://github.com/eladmeidar/rails_indexes\nPlease supply the relevant code as well, thanks. =)"
130
+ next
131
+ end
132
+
133
+ if column_names.blank?
134
+ primary_key = model_name.constantize.primary_key
135
+ @indexes_required[table_name] += [primary_key] unless @indexes_required[table_name].include?(primary_key)
136
+ else
137
+ column_names = column_names.split('_and_')
138
+
139
+ # remove find_by_sql references.
140
+ # column_names.delete("sql")
141
+
142
+ column_names = model_name.constantize.column_names & column_names
143
+
144
+ # Check if there were more than 1 column
145
+ if column_names.size == 1
146
+ column_name = column_names.first
147
+ @indexes_required[table_name] += [column_name] unless @indexes_required[table_name].include?(column_name)
148
+ else
149
+ @indexes_required[table_name] += [column_names.sort] unless @indexes_required[table_name].include?(column_names.sort)
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ @missing_indexes = {}
156
+ @indexes_required.each do |table_name, foreign_keys|
157
+
158
+ unless foreign_keys.blank?
159
+ existing_indexes = ActiveRecord::Base.connection.indexes(table_name.to_sym).collect(&:columns)
160
+ keys_to_add = self.sortalize(foreign_keys.uniq) - self.sortalize(existing_indexes)
161
+ @missing_indexes[table_name] = keys_to_add unless keys_to_add.empty?
162
+ end
163
+ end
164
+
165
+ @indexes_required
166
+ end
167
+
168
+ def self.key_exists?(table,key_columns)
169
+ result = (key_columns.to_a - ActiveRecord::Base.connection.indexes(table).map { |i| i.columns }.flatten)
170
+ result.empty?
171
+ end
172
+
173
+ def self.simple_migration
174
+ migration_format = true
175
+ missing_indexes = check_for_indexes(migration_format)
176
+
177
+ unless missing_indexes.keys.empty?
178
+ add = []
179
+ remove = []
180
+ missing_indexes.each do |table_name, keys_to_add|
181
+ keys_to_add.each do |key|
182
+ next if key_exists?(table_name,key)
183
+ next if key.blank?
184
+ if key.is_a?(Array)
185
+ keys = key.collect {|k| ":#{k}"}
186
+ add << "add_index :#{table_name}, [#{keys.join(', ')}]"
187
+ remove << "remove_index :#{table_name}, :column => [#{keys.join(', ')}]"
188
+ else
189
+ add << "add_index :#{table_name}, :#{key}"
190
+ remove << "remove_index :#{table_name}, :#{key}"
191
+ end
192
+
193
+ end
194
+ end
195
+
196
+ migration = <<EOM
197
+ class AddMissingIndexes < ActiveRecord::Migration
198
+ def self.up
199
+
200
+ # These indexes were found by searching for AR::Base finds on your application
201
+ # It is strongly recommanded that you will consult a professional DBA about your infrastucture and implemntation before
202
+ # changing your database in that matter.
203
+ # There is a possibility that some of the indexes offered below is not required and can be removed and not added, if you require
204
+ # further assistance with your rails application, database infrastructure or any other problem, visit:
205
+ #
206
+ # http://www.railsmentors.org
207
+ # http://www.railstutor.org
208
+ # http://guides.rubyonrails.org
209
+
210
+
211
+ #{add.uniq.join("\n ")}
212
+ end
213
+
214
+ def self.down
215
+ #{remove.uniq.join("\n ")}
216
+ end
217
+ end
218
+ EOM
219
+
220
+ puts "## Drop this into a file in db/migrate ##"
221
+ puts migration
222
+ end
223
+ end
224
+
225
+ def self.indexes_list
226
+ check_for_indexes.each do |table_name, keys_to_add|
227
+ puts "Table '#{table_name}' => #{keys_to_add.to_sentence}"
228
+ end
229
+ end
230
+
231
+ def self.ar_find_indexes
232
+ find_indexes = self.scan_finds
233
+
234
+ unless find_indexes.keys.empty?
235
+ add = []
236
+ remove = []
237
+ find_indexes.each do |table_name, keys_to_add|
238
+ keys_to_add.each do |key|
239
+ next if key_exists?(table_name,key)
240
+ next if key.blank?
241
+ if key.is_a?(Array)
242
+ keys = key.collect {|k| ":#{k}"}
243
+ add << "add_index :#{table_name}, [#{keys.join(', ')}]"
244
+ remove << "remove_index :#{table_name}, :column => [#{keys.join(', ')}]"
245
+ else
246
+ add << "add_index :#{table_name}, :#{key}"
247
+ remove << "remove_index :#{table_name}, :#{key}"
248
+ end
249
+
250
+ end
251
+ end
252
+
253
+ migration = <<EOM
254
+ class AddFindsMissingIndexes < ActiveRecord::Migration
255
+ def self.up
256
+
257
+ # These indexes were found by searching for AR::Base finds on your application
258
+ # It is strongly recommanded that you will consult a professional DBA about your infrastucture and implemntation before
259
+ # changing your database in that matter.
260
+ # There is a possibility that some of the indexes offered below is not required and can be removed and not added, if you require
261
+ # further assistance with your rails application, database infrastructure or any other problem, visit:
262
+ #
263
+ # http://www.railsmentors.org
264
+ # http://www.railstutor.org
265
+ # http://guides.rubyonrails.org
266
+
267
+ #{add.uniq.join("\n ")}
268
+ end
269
+
270
+ def self.down
271
+ #{remove.uniq.join("\n ")}
272
+ end
273
+ end
274
+ EOM
275
+
276
+ puts "## Drop this into a file in db/migrate ##"
277
+ puts migration
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(REFINERY_ROOT, %w(vendor plugins refinery lib indexer.rb))
2
+
3
+ namespace :db do
4
+ desc "collect indexes based on AR::Base.find calls."
5
+ task :show_me_ar_find_indexes => :environment do
6
+ Indexer.ar_find_indexes
7
+ end
8
+
9
+ desc "scan for possible required indexes"
10
+ task :show_me_some_indexes => :environment do
11
+ # Indexer.indexes_list
12
+ puts "Sorry, simple report is deprecated.\nuse rake db:show_me_a_migration or db:show_me_ar_find_indexes instead"
13
+ end
14
+
15
+ task :show_me_a_migration => :environment do
16
+ Indexer.simple_migration
17
+ end
18
+ end
@@ -10,16 +10,58 @@ class Admin::ResourcesController < Admin::BaseController
10
10
 
11
11
  def create
12
12
  @resource = Resource.create params[:resource]
13
- if @resource.valid?
14
- flash[:notice] = "'#{@resource.title}' was successfully created."
15
- unless from_dialog?
16
- redirect_to :action => 'index'
17
- else
18
- render :text => "<script type='text/javascript'>parent.window.location = '#{admin_resources_url}';</script>"
19
- end
13
+
14
+ unless params[:insert]
15
+ if @resource.valid?
16
+ flash[:notice] = "'#{@resource.title}' was successfully created."
17
+ unless from_dialog?
18
+ redirect_to :action => 'index'
19
+ else
20
+ render :text => "<script type='text/javascript'>parent.window.location = '#{admin_resources_url}';</script>"
21
+ end
22
+ else
23
+ render :action => 'new'
24
+ end
20
25
  else
21
- render :action => 'new'
26
+ @resource_id = @resource.id
27
+ @resource = nil
28
+ self.insert
22
29
  end
23
30
  end
31
+
32
+ def insert
33
+ self.new if @resource.nil?
34
+ @dialog = from_dialog?
35
+ @thickbox = !params[:thickbox].blank?
36
+ @field = params[:field]
37
+ @update_resource = params[:update_resource]
38
+ @update_text = params[:update_text]
39
+ @thumbnail = params[:thumbnail]
40
+ @callback = params[:callback]
41
+ @conditions = params[:conditions]
42
+ @current_link = params[:current_link]
43
+ @url_override = admin_resources_url(:dialog => @dialog, :insert => true)
44
+
45
+ unless params[:conditions].blank?
46
+ extra_condition = params[:conditions].split(',')
47
+
48
+ extra_condition[1] = true if extra_condition[1] == "true"
49
+ extra_condition[1] = false if extra_condition[1] == "false"
50
+ extra_condition[1] = nil if extra_condition[1] == "nil"
51
+ paginate_resources({extra_condition[0].to_sym => extra_condition[1]})
52
+ else
53
+ paginate_resources
54
+ end
55
+ render :action => "insert"
56
+ end
57
+
58
+ protected
59
+
60
+ def paginate_resources(conditions={})
61
+ @resources = Resource.paginate :page => (@paginate_page_number ||= params[:page]),
62
+ :conditions => conditions,
63
+ :order => 'created_at DESC',
64
+ :per_page => Resource.per_page(from_dialog?)
65
+ end
24
66
 
25
67
  end
@@ -15,4 +15,15 @@
15
15
  or
16
16
  <%= link_to "Cancel", admin_resources_url, :title => "Cancelling will lose all changes you've made to this file", :class => "close_dialog" -%>
17
17
  </div>
18
+
19
+ <% if @thickbox %>
20
+ <input type='hidden' name='thickbox' value='<%= @thickbox %>' />
21
+ <input type='hidden' name='field' value='<%= @field %>' />
22
+ <input type='hidden' name='update_resource' value='<%= @update_resource %>' />
23
+ <input type='hidden' name='update_text' value='<%= @update_text %>' />
24
+ <input type='hidden' name='thumbnail' value='<%= @thumbnail %>' />
25
+ <input type='hidden' name='callback' value='<%= @callback %>' />
26
+ <input type='hidden' name='conditions' value='<%= @conditions %>' />
27
+ <input type='hidden' name='current_link' value='<%= @current_link %>' />
28
+ <% end %>
18
29
  <% end -%>
@@ -0,0 +1,110 @@
1
+ <div class='clearfix'>
2
+ <div id='dialog_menu_left'>
3
+ <% unless @resources.empty? %>
4
+ <span id='existing_resource_radio' class='radio'>
5
+ <input type='radio' name='resource_type' value='existing_resource' id='resource_type_existing' <%= "checked='true'" if @resource.errors.empty? %> />
6
+ <label for='resource_type_existing' class='stripped'>Existing File</label>
7
+ </span>
8
+ <% end %>
9
+ <span id='upload_resource_radio' class='radio<%= " selected_radio" if @resource.errors.size > 0 %>'>
10
+ <input type='radio' name='resource_type' value='upload_resource' id='resource_type_upload' <%= "checked='true'" if @resources.empty? or !@resource.errors.empty? %> />
11
+ <label for='resource_type_upload' class='stripped'>New File</label>
12
+ </span>
13
+ </div>
14
+
15
+ <div id='dialog_main'>
16
+ <% unless @resources.empty? %>
17
+ <div id='existing_resource_area' class='dialog_area' <%= "style='display:none;'" unless @resource.errors.empty? %>>
18
+ <input type='hidden' name='linked_resource' id='linked_resource' />
19
+ <div id='existing_resource_area_content' class='clearfix'>
20
+ <div id='pages_list'>
21
+ <ul class='link_list'>
22
+ <% @resources.each do |resource| -%>
23
+ <% resource_linked = (resource.public_filename == params[:current_link]) unless params[:current_link].blank? %>
24
+ <li<%= " class='linked'" if resource_linked %>>
25
+ <%= link_to "#{resource.title} (#{resource.public_filename})", resource.public_filename, :title => 'Link to this Resource',
26
+ :rel => resource.title, :class => 'page_link', :id => "resource_#{resource.id}" %>
27
+ </li>
28
+ <% end %>
29
+ </ul>
30
+ </div>
31
+ </div>
32
+ <%= will_paginate @resources, :previous_label => '&laquo; Previous', :next_label => 'Next &raquo;', :renderer => Refinery::LinkRenderer, :url => {:controller => "admin/resources", :action => "insert", :dialog => @dialog} unless @thickbox %>
33
+ </div>
34
+ <% end %>
35
+ <div id='upload_resource_area' class='dialog_area' <%= "style='display:none;'" if @resources.empty? %>>
36
+ <%= render :partial => "form", :locals => {:insert => true} %>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <% if @thickbox %>
41
+ <div id='dialog-form-actions' class='form-actions'>
42
+ <%= submit_tag 'Insert', :id => "submit_button" %>
43
+ or
44
+ <%= link_to "Cancel", "", :id => "cancel_button", :class => "close_dialog" %>
45
+
46
+ <%= will_paginate @resources, :previous_label => '&laquo; Previous', :next_label => 'Next &raquo;', :renderer => Refinery::LinkRenderer, :url => {:controller => "admin/resources", :action => "insert", :dialog => @dialog } %>
47
+ </div>
48
+ <% end %>
49
+ <% content_for :head do %>
50
+ <%= javascript_include_tag 'refinery/parse_url' %>
51
+ <script type='text/javascript'>
52
+ set_resource = function(anchor)
53
+ {
54
+ if (anchor != null) {
55
+ $$('#existing_resource_area_content ul li.linked').each(function(linked)
56
+ {
57
+ $(linked).removeClassName('linked');
58
+ });
59
+ $(anchor.parentNode).addClassName('linked');
60
+ }
61
+ }
62
+
63
+ FastInit.addOnLoad(function()
64
+ {
65
+ <% unless @resource_id.nil? %>
66
+ set_resource($('resource_<%= @resource_id %>'));
67
+ <% end %>
68
+ $$('#existing_resource_area_content ul li a').each(function(anchor)
69
+ {
70
+ anchor.observe('click', function(e){set_resource(this);e.preventDefault()});
71
+ });
72
+
73
+ <% if @thickbox %>
74
+ $('dialog-form-actions').down('#submit_button').observe('click', function(e)
75
+ {
76
+ linked = null;
77
+ $$('#existing_resource_area_content ul li.linked a').each(function(linked_anchor)
78
+ {
79
+ linked = linked_anchor;
80
+ });
81
+ if (linked != null)
82
+ {
83
+ <% unless @field.blank? %>
84
+ if ((field = parent.document.getElementById('<%= @field %>')) != null)
85
+ {
86
+ field.value = linked.id.replace("resource_", "");
87
+ }
88
+ if ((resource = parent.document.getElementById('<%= @update_resource %>')) != null)
89
+ {
90
+ resourceUrl = parseURL(linked.href);
91
+ relevant_href = resourceUrl.pathname;
92
+ // Add any alternate resource stores that need a absolute URL in the regex below
93
+ if( resourceUrl.hostname.match(/s3.amazonaws.com/) ) {
94
+ relevant_href = resourceUrl.protocol + '//' + resourceUrl.host + relevant_href;
95
+ }
96
+ resource.href = relevant_href;
97
+ }
98
+ if ((text = parent.document.getElementById('<%= @update_text %>')) != null) {
99
+ text.innerHTML = linked.innerHTML;
100
+ }
101
+ <% end %>
102
+ <%= "self.parent.#{@callback}();" unless @callback.blank? %>
103
+ self.parent.tb_remove();
104
+ }
105
+ e.stop();
106
+ });
107
+ <% end %>
108
+ });
109
+ </script>
110
+ <% end %>
@@ -2,6 +2,6 @@ ActionController::Routing::Routes.draw do |map|
2
2
  map.resources :resources
3
3
 
4
4
  map.namespace(:admin) do |admin|
5
- admin.resources :resources
5
+ admin.resources :resources, :collection => {:insert => :get}
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinerycms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5.5
4
+ version: 0.9.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Resolve Digital
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2009-11-09 00:00:00 +13:00
14
+ date: 2009-11-10 00:00:00 +13:00
15
15
  default_executable: refinery
16
16
  dependencies: []
17
17
 
@@ -45,6 +45,7 @@ files:
45
45
  - config/rackspace_cloudfiles.yml
46
46
  - config/routes.rb
47
47
  - db/migrate/20091029034951_remove_blurb_from_news_items.rb
48
+ - db/migrate/20091109012126_add_missing_indexes.rb
48
49
  - db/schema.rb
49
50
  - db/seeds.rb
50
51
  - public/.htaccess
@@ -422,6 +423,8 @@ files:
422
423
  - vendor/plugins/refinery/app/views/shared/_message.html.erb
423
424
  - vendor/plugins/refinery/app/views/shared/_submenu.html.erb
424
425
  - vendor/plugins/refinery/app/views/shared/_submenu_branch.html.erb
426
+ - vendor/plugins/refinery/app/views/shared/admin/_image_picker.html.erb
427
+ - vendor/plugins/refinery/app/views/shared/admin/_resource_picker.html.erb
425
428
  - vendor/plugins/refinery/app/views/shared/admin/_make_sortable.html.erb
426
429
  - vendor/plugins/refinery/app/views/shared/admin/_search.html.erb
427
430
  - vendor/plugins/refinery/app/views/shared/admin/_sortable_list.html.erb
@@ -456,7 +459,9 @@ files:
456
459
  - vendor/plugins/refinery/lib/refinery/link_renderer.rb
457
460
  - vendor/plugins/refinery/lib/refinery/plugin.rb
458
461
  - vendor/plugins/refinery/lib/refinery/plugins.rb
462
+ - vendor/plugins/refinery/lib/indexer.rb
459
463
  - vendor/plugins/refinery/lib/refinery.rb
464
+ - vendor/plugins/refinery/lib/tasks/indexer.rake
460
465
  - vendor/plugins/refinery/lib/tasks/refinery.rake
461
466
  - vendor/plugins/refinery_dialogs/app/controllers/admin/dialogs_controller.rb
462
467
  - vendor/plugins/refinery_dialogs/app/views/admin/dialogs/show.html.erb
@@ -479,6 +484,7 @@ files:
479
484
  - vendor/plugins/resources/app/views/admin/resources/_resource.html.erb
480
485
  - vendor/plugins/resources/app/views/admin/resources/edit.html.erb
481
486
  - vendor/plugins/resources/app/views/admin/resources/index.html.erb
487
+ - vendor/plugins/resources/app/views/admin/resources/insert.html.erb
482
488
  - vendor/plugins/resources/app/views/admin/resources/new.html.erb
483
489
  - vendor/plugins/resources/config/routes.rb
484
490
  - vendor/plugins/resources/init.rb