refinerycms 0.9.6.7 → 0.9.6.8

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 (69) hide show
  1. data/Gemfile +13 -0
  2. data/VERSION +1 -1
  3. data/config/application.rb +92 -0
  4. data/config/environment.rb +4 -74
  5. data/config/preinitializer.rb +7 -4
  6. data/db/schema.rb +1 -1
  7. data/lib/attachment_fu_patch.rb +16 -0
  8. data/public/.htaccess +3 -3
  9. data/public/javascripts/refinery/admin.js +6 -1
  10. data/test/files/teng.pdf +0 -0
  11. data/test/fixtures/inquiries.yml +22 -0
  12. data/test/fixtures/news_items.yml +14 -0
  13. data/test/fixtures/pages.yml +10 -4
  14. data/test/fixtures/refinery_settings.yml +3 -0
  15. data/test/fixtures/resources.yml +4 -0
  16. data/test/fixtures/themes.yml +5 -0
  17. data/test/unit/image_test.rb +4 -2
  18. data/test/unit/inquiry_test.rb +41 -0
  19. data/test/unit/news_items_test.rb +33 -0
  20. data/test/unit/page_test.rb +12 -9
  21. data/test/unit/refinery_setting_test.rb +57 -0
  22. data/test/unit/resource_test.rb +33 -0
  23. data/test/unit/theme_test.rb +19 -0
  24. data/todo.md +9 -0
  25. data/vendor/cache/aasm-2.1.3.gem +0 -0
  26. data/vendor/cache/actionmailer-2.3.5.gem +0 -0
  27. data/vendor/cache/actionpack-2.3.5.gem +0 -0
  28. data/vendor/cache/activerecord-2.3.5.gem +0 -0
  29. data/vendor/cache/activeresource-2.3.5.gem +0 -0
  30. data/vendor/cache/activesupport-2.3.5.gem +0 -0
  31. data/vendor/cache/friendly_id-2.3.1.gem +0 -0
  32. data/vendor/cache/hpricot-0.8.2.gem +0 -0
  33. data/vendor/cache/rack-1.0.1.gem +0 -0
  34. data/vendor/cache/rails-2.3.5.gem +0 -0
  35. data/vendor/cache/rake-0.8.7.gem +0 -0
  36. data/vendor/cache/rubyzip-0.9.1.gem +0 -0
  37. data/vendor/cache/slim_scrooge-1.0.3.gem +0 -0
  38. data/vendor/cache/will_paginate-2.3.11.gem +0 -0
  39. data/vendor/plugins/authentication/app/models/user.rb +1 -0
  40. data/vendor/plugins/images/app/models/image.rb +23 -15
  41. data/vendor/plugins/images/rails/init.rb +1 -1
  42. data/vendor/plugins/inquiries/app/controllers/admin/inquiries_controller.rb +1 -1
  43. data/vendor/plugins/inquiries/app/models/inquiry.rb +6 -9
  44. data/vendor/plugins/inquiries/rails/init.rb +1 -1
  45. data/vendor/plugins/news/app/controllers/admin/news_items_controller.rb +1 -1
  46. data/vendor/plugins/news/app/controllers/news_items_controller.rb +3 -3
  47. data/vendor/plugins/news/app/models/news_item.rb +6 -8
  48. data/vendor/plugins/news/app/views/admin/news_items/_form.html.erb +4 -4
  49. data/vendor/plugins/news/app/views/admin/news_items/_news_item.html.erb +5 -4
  50. data/vendor/plugins/news/app/views/admin/news_items/edit.html.erb +1 -1
  51. data/vendor/plugins/news/rails/init.rb +1 -1
  52. data/vendor/plugins/pages/app/models/page.rb +2 -2
  53. data/vendor/plugins/pages/rails/init.rb +1 -1
  54. data/vendor/plugins/refinery/app/views/admin/_head.html.erb +2 -9
  55. data/vendor/plugins/refinery/app/views/shared/_content_page.html.erb +7 -6
  56. data/vendor/plugins/refinery/app/views/shared/_head.html.erb +1 -0
  57. data/vendor/plugins/refinery/app/views/shared/_menu_branch.html.erb +1 -1
  58. data/vendor/plugins/refinery/lib/crud.rb +2 -2
  59. data/vendor/plugins/refinery/lib/refinery/application_controller.rb +15 -15
  60. data/vendor/plugins/refinery/lib/refinery/application_helper.rb +12 -0
  61. data/vendor/plugins/refinery/lib/refinery/plugin.rb +1 -1
  62. data/vendor/plugins/refinery/plugins.md +2 -2
  63. data/vendor/plugins/refinery_settings/app/models/refinery_setting.rb +40 -18
  64. data/vendor/plugins/refinery_settings/rails/init.rb +1 -2
  65. data/vendor/plugins/resources/app/models/resource.rb +10 -2
  66. data/vendor/plugins/themes/app/models/theme.rb +1 -1
  67. data/vendor/plugins/themes/lib/theme_server.rb +13 -4
  68. data/vendor/plugins/themes/rails/init.rb +12 -1
  69. metadata +36 -2
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class NewsItemsTest < ActiveSupport::TestCase
4
+
5
+ fixtures :news_items
6
+
7
+ def setup
8
+ @new_news_item = NewsItem.new
9
+ @new_valid_news_item = NewsItem.new(:title => "valid post", :body => "yep looks valid", :publish_date => Date.today)
10
+ end
11
+
12
+ def test_should_not_save_without_title_and_body
13
+ assert !@new_news_item.save
14
+
15
+ assert_equal "can't be blank", @new_news_item.errors.on('title')
16
+ assert_equal "can't be blank", @new_news_item.errors.on('body')
17
+ assert_equal "can't be blank", @new_news_item.errors.on('publish_date')
18
+
19
+ assert @new_valid_news_item.save
20
+ end
21
+
22
+ def test_per_page
23
+ assert_equal 20, NewsItem.per_page
24
+ end
25
+
26
+ def test_named_scopes
27
+ assert_equal 2, NewsItem.published.size
28
+ assert NewsItem.latest.size < 10
29
+
30
+ assert_equal news_items(:new_team_member), NewsItem.latest.first
31
+ end
32
+
33
+ end
@@ -45,12 +45,13 @@ class PageTest < ActiveSupport::TestCase
45
45
  end
46
46
 
47
47
  def test_should_have_custom_url_override
48
- assert_equal "/inquiries/new", pages(:contact_us).url # the contact us page links to the inquiries plugin form
49
- assert_equal "/", pages(:home_page).url # the home page has a special "/" url
48
+ assert_equal({:controller => "/inquiries/new"}, pages(:contact_us).url) # the contact us page links to the inquiries plugin form
49
+ assert_equal({:controller => "/"}, pages(:home_page).url) # the home page has a special "/" url
50
+ assert_equal "http://www.resolvedigital.co.nz", pages(:resolve_digital_page).url # this page links to an external url
50
51
  end
51
52
 
52
53
  def test_should_have_regular_url
53
- assert pages(:services).url.include? "/pages/"
54
+ assert pages(:services).url[:controller] == "pages"
54
55
  # not sure how I get it to render the friendly_id url /pages/services
55
56
  # test seems to reduce the id instead e.g. /pages/234423
56
57
  end
@@ -86,22 +87,22 @@ class PageTest < ActiveSupport::TestCase
86
87
 
87
88
  def test_shown_siblings
88
89
  assert_equal 3, pages(:products).children.size
89
- assert_equal 3, pages(:products).shown_siblings.size
90
+ assert_equal 4, pages(:products).shown_siblings.size
90
91
  end
91
92
 
92
93
  def test_top_level_page_output
93
- assert_equal 4, Page.top_level.size
94
+ assert_equal 5, Page.top_level.size
94
95
 
95
96
  # testing the order of pages.
96
97
  assert_equal pages(:home_page), Page.top_level.first
97
- assert_equal pages(:contact_us), Page.top_level.last
98
- assert_equal pages(:products), Page.top_level[1]
99
- assert_equal pages(:services), Page.top_level[2]
98
+ assert_equal pages(:resolve_digital_page), Page.top_level.last
99
+ assert_equal pages(:products), Page.top_level.second
100
+ assert_equal pages(:services), Page.top_level.third
100
101
  end
101
102
 
102
103
  def test_order_of_children
103
104
  assert_equal pages(:blue_jelly), pages(:products).children.first
104
- assert_equal pages(:green_jelly), pages(:products).children[1]
105
+ assert_equal pages(:green_jelly), pages(:products).children.second
105
106
  assert_equal pages(:rainbow_jelly), pages(:products).children.last
106
107
  end
107
108
 
@@ -121,7 +122,9 @@ class PageTest < ActiveSupport::TestCase
121
122
 
122
123
  def test_page_parts
123
124
  assert_equal page_parts(:home_page_body).body, pages(:home_page)[:body]
125
+ assert_equal page_parts(:home_page_body).body, pages(:home_page)["BODY"]
124
126
  assert_equal page_parts(:home_page_side_body).body, pages(:home_page)[:side_body]
127
+ assert_equal page_parts(:home_page_side_body).body, pages(:home_page)["SidE BoDy"]
125
128
 
126
129
  # but make sure we can still access other fields through []
127
130
  assert_equal "Home Page", pages(:home_page)[:title]
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ class RefinerySettingTest < ActiveSupport::TestCase
4
+
5
+ fixtures :refinery_settings
6
+
7
+ def test_title
8
+ assert_equal "Site Name", refinery_settings(:site_name).title
9
+ end
10
+
11
+ def test_getter_method
12
+ assert_equal "My Site", RefinerySetting[:site_name]
13
+ assert_equal "My Site", RefinerySetting['site_name']
14
+ assert_equal "My Site", RefinerySetting.site_name
15
+ end
16
+
17
+ def test_find_or_set
18
+ # creating a new setting on the fly
19
+ assert_equal "test", RefinerySetting.find_or_set(:my_setting, "test")
20
+ assert_equal "test", RefinerySetting[:my_setting]
21
+ end
22
+
23
+ def test_setter_methods
24
+ assert_equal "My Site", RefinerySetting[:site_name]
25
+
26
+ # change the site name setting
27
+ RefinerySetting[:site_name] = "My New Site Name"
28
+ assert_equal "My New Site Name", RefinerySetting[:site_name]
29
+
30
+ # change the site name setting again this time with quotes not symbols
31
+ RefinerySetting['site_name'] = "My Site 2"
32
+ assert_equal "My Site 2", RefinerySetting[:site_name]
33
+ end
34
+
35
+ def test_per_page
36
+ assert_equal 10, RefinerySetting.per_page
37
+ end
38
+
39
+ def test_boolean_settings
40
+ RefinerySetting[:show_dashboard] = true
41
+ assert RefinerySetting[:show_dashboard]
42
+
43
+ RefinerySetting[:show_dashboard] = false
44
+ assert !RefinerySetting[:show_dashboard]
45
+ end
46
+
47
+ def test_hash_settings
48
+ RefinerySetting[:site_owner_information] = {:name => "david", :email => "dave@test.com"}
49
+ assert_equal "david", RefinerySetting[:site_owner_information][:name]
50
+ end
51
+
52
+ def test_integer_settings
53
+ RefinerySetting[:recent_activity_size] = 19
54
+ assert_equal 19, RefinerySetting[:recent_activity_size]
55
+ end
56
+
57
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class ResourceTest < ActiveSupport::TestCase
4
+
5
+ fixtures :resources
6
+
7
+ def test_titles
8
+ assert_equal "teng.pdf", resources(:pdf_document).filename
9
+ assert_equal "Teng", resources(:pdf_document).title
10
+ end
11
+
12
+ def test_per_page
13
+ assert_equal 12, Resource.per_page(dialog = true)
14
+ assert_equal 20, Resource.per_page # dialog = false
15
+ end
16
+
17
+ def test_attachment_fu_options
18
+ assert_equal 50.megabytes, Resource.attachment_options[:max_size]
19
+
20
+ if USE_S3_BACKEND
21
+ assert_equal :s3, Resource.attachment_options[:storage]
22
+ assert_nil Resource.attachment_options[:path_prefix]
23
+ else
24
+ assert_equal :file_system, Resource.attachment_options[:storage]
25
+ assert_equal 'public/system/resources', Resource.attachment_options[:path_prefix]
26
+ end
27
+ end
28
+
29
+ def test_type_of_content
30
+ assert_equal "application pdf", resources(:pdf_document).type_of_content
31
+ end
32
+
33
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class ThemeTest < ActiveSupport::TestCase
4
+
5
+ fixtures :themes
6
+
7
+ def test_folder_title
8
+ assert_equal 'my_theme', themes(:my_theme).folder_title
9
+ end
10
+
11
+ def test_theme_path
12
+ assert_equal "#{Rails.root}/themes/my_theme", themes(:my_theme).theme_path
13
+ end
14
+
15
+ def test_preview_image
16
+ assert_equal "#{Rails.root}/themes/my_theme/preview.png", themes(:my_theme).preview_image
17
+ end
18
+
19
+ end
data/todo.md ADDED
@@ -0,0 +1,9 @@
1
+ = Todo
2
+
3
+ What are some of the known things that need to be done?
4
+
5
+ == Tests
6
+
7
+ * Add unit test coverage for user, user plugin and user mailer
8
+ * Add unit test coverage for inquiry mailer and inquiry setting
9
+ * Add functional tests for the whole of Refinery.
@@ -1,4 +1,5 @@
1
1
  require 'digest/sha1'
2
+
2
3
  class User < ActiveRecord::Base
3
4
 
4
5
  # Hack: Allow "rake gems:install" to run when this class is missing its gem dependency.
@@ -1,26 +1,34 @@
1
1
  class Image < ActiveRecord::Base
2
2
 
3
+ # What is the max image size a user can upload
4
+ MAX_SIZE_IN_MB = 20
5
+
3
6
  # Docs for attachment_fu http://github.com/technoweenie/attachment_fu
4
7
  has_attachment :content_type => :image,
5
8
  :storage => (USE_S3_BACKEND ? :s3 : :file_system),
6
9
  :path_prefix => (USE_S3_BACKEND ? nil : 'public/system/images'),
7
10
  :processor => 'Rmagick',
8
11
  :thumbnails => ((((thumbnails = RefinerySetting.find_or_set(:image_thumbnails, {})).is_a?(Hash) ? thumbnails : (RefinerySetting[:image_thumbnails] = {}))) rescue {}),
9
- :max_size => 50.megabytes
10
-
11
- def validate
12
- if self.filename.nil?
13
- errors.add_to_base("You must choose an image to upload")
14
- else
15
- [:size, :content_type].each do |attr_name|
16
- enum = attachment_options[attr_name]
17
- unless enum.nil? || enum.include?(send(attr_name))
18
- errors.add_to_base("Images should be smaller than 50 MB in size") if attr_name == :size
19
- errors.add_to_base("Your image must be either a JPG, PNG or GIF") if attr_name == :content_type
20
- end
21
- end
22
- end
23
- end
12
+ :max_size => MAX_SIZE_IN_MB.megabytes
13
+
14
+ # we could use validates_as_attachment but it produces 4 odd errors like
15
+ # "size is not in list". So we basically here enforce the same validation
16
+ # rules here accept display the error messages we want
17
+ # This is a known bug in attachment_fu
18
+ def validate
19
+ if self.filename.nil?
20
+ errors.add_to_base("You must choose an image to upload")
21
+ else
22
+ [:size, :content_type].each do |attr_name|
23
+ enum = attachment_options[attr_name]
24
+
25
+ unless enum.nil? || enum.include?(send(attr_name))
26
+ errors.add_to_base("Images should be smaller than #{MAX_SIZE_IN_MB} MB in size") if attr_name == :size
27
+ errors.add_to_base("Your image must be either a JPG, PNG or GIF") if attr_name == :content_type
28
+ end
29
+ end
30
+ end
31
+ end
24
32
 
25
33
  # Docs for acts_as_indexed http://github.com/dougal/acts_as_indexed
26
34
  acts_as_indexed :fields => [:title],
@@ -2,7 +2,7 @@ Refinery::Plugin.register do |plugin|
2
2
  plugin.title = "Images"
3
3
  plugin.description = "Manage images"
4
4
  plugin.version = 1.0
5
- plugin.menu_match = /admin\/((images)|(image_dialogs))$/
5
+ plugin.menu_match = /admin\/image(_dialog)?s$/
6
6
  plugin.activity = {
7
7
  :class => Image,
8
8
  :title => 'title',
@@ -21,7 +21,7 @@ class Admin::InquiriesController < Admin::BaseController
21
21
  protected
22
22
 
23
23
  def find_all_inquiries
24
- @open_inquiries = Inquiry.opened
24
+ @open_inquiries = Inquiry.open
25
25
  @closed_inquiries = Inquiry.closed
26
26
  @inquiries = @open_inquiries
27
27
  end
@@ -7,13 +7,10 @@ class Inquiry < ActiveRecord::Base
7
7
 
8
8
  acts_as_indexed :fields => [:name, :email, :message, :phone],
9
9
  :index_file => [Rails.root.to_s, "tmp", "index"]
10
+
11
+ default_scope :order => 'created_at DESC'
12
+
13
+ named_scope :closed, :conditions => {:open => false}
14
+ named_scope :open, :conditions => {:open => true}
10
15
 
11
- def self.closed
12
- find_all_by_open(false, :order => "created_at DESC")
13
- end
14
-
15
- def self.opened
16
- find_all_by_open(true, :order => "created_at DESC")
17
- end
18
-
19
- end
16
+ end
@@ -2,7 +2,7 @@ Refinery::Plugin.register do |plugin|
2
2
  plugin.title = "Inquiries"
3
3
  plugin.description = "Provides a contact form and stores inquiries"
4
4
  plugin.version = 1.0
5
- plugin.menu_match = /admin\/((inquiries)|(inquiry_settings))$/
5
+ plugin.menu_match = /admin\/inquir(ies|y_settings)$/
6
6
  plugin.activity = [
7
7
  {:class => Inquiry, :title => "name", :url_prefix => "", :created_image => "user_comment.png", :updated_image => "user_edit.png"},
8
8
  {:class => InquirySetting, :url_prefix => "edit", :title => 'name', :url_prefix => 'edit', :created_image => "user_comment.png", :updated_image => "user_edit.png"}
@@ -2,4 +2,4 @@ class Admin::NewsItemsController < Admin::BaseController
2
2
 
3
3
  crudify :news_item, :order => "created_at DESC"
4
4
 
5
- end
5
+ end
@@ -6,15 +6,15 @@ class NewsItemsController < ApplicationController
6
6
  protected
7
7
 
8
8
  def find_latest_news_items
9
- @news_items = NewsItem.latest
9
+ @news_items = NewsItem.latest # 10 items
10
10
  end
11
11
 
12
12
  def find_news_item
13
- @news_item = NewsItem.find(params[:id], :conditions => ["publish_date < ?", Time.now])
13
+ @news_item = NewsItem.published.find(params[:id])
14
14
  end
15
15
 
16
16
  def find_page
17
17
  @page = Page.find_by_link_url("/news", :include => [:parts, :slugs])
18
18
  end
19
19
 
20
- end
20
+ end
@@ -1,17 +1,15 @@
1
1
  class NewsItem < ActiveRecord::Base
2
2
 
3
- validates_presence_of :title, :content
4
- alias_attribute :content, :body
3
+ validates_presence_of :title, :body, :publish_date
5
4
 
6
5
  has_friendly_id :title, :use_slug => true
7
6
 
8
7
  acts_as_indexed :fields => [:title, :body],
9
8
  :index_file => [Rails.root.to_s, "tmp", "index"]
10
-
11
- def self.latest(amount = 10)
12
- find(:all, :order => "publish_date DESC", :limit => amount,
13
- :conditions => ["publish_date < ?", Time.now])
14
- end
9
+
10
+ default_scope :order => "publish_date DESC"
11
+ named_scope :latest, :conditions => ["publish_date < ?", Time.now], :limit => 10
12
+ named_scope :published, :conditions => ["publish_date < ?", Time.now]
15
13
 
16
14
  def not_published? # has the published date not yet arrived?
17
15
  publish_date > Time.now
@@ -21,4 +19,4 @@ class NewsItem < ActiveRecord::Base
21
19
  20
22
20
  end
23
21
 
24
- end
22
+ end
@@ -10,10 +10,10 @@
10
10
  </div>
11
11
  <div class='clearfix' style='width:963px'>
12
12
  <div class='field'>
13
- <%= f.label :content %>
14
- <%= f.text_area :content, :rows => "20", :class => "wymeditor" %>
13
+ <%= f.label :body %>
14
+ <%= f.text_area :body, :rows => "20", :class => "wymeditor" %>
15
15
  </div>
16
16
  </div>
17
-
18
- <%= render :partial => "/shared/admin/form_actions", :locals => {:f => f, :continue_editing => true} %>
17
+ <%= render :partial => "/shared/admin/form_actions", :locals => {:f => f,
18
+ :continue_editing => true} %>
19
19
  <% end %>
@@ -2,13 +2,14 @@
2
2
  <span class='title'>
3
3
  <span class='actions'>
4
4
  <%= link_to refinery_icon_tag('application_go.png'), news_item_url(news_item),
5
- :title => 'View this news item live <br/><em>(opens in a new window)</em>', :target => "_blank" %>
5
+ :title => 'View this news item live <br/><em>(opens in a new window)</em>',
6
+ :target => "_blank" %>
6
7
  <%= link_to refinery_icon_tag('application_edit.png'), edit_admin_news_item_path(news_item),
7
8
  :title => 'Edit this news item' %>
8
9
  <%= link_to refinery_icon_tag('delete.png'), admin_news_item_path(news_item),
9
- :class => "cancel confirm-delete",
10
- :title => "Remove this news item forever" %>
10
+ :class => "cancel confirm-delete",
11
+ :title => "Remove this news item forever" %>
11
12
  </span>
12
13
  <%=h news_item.title %> <span class="preview">&nbsp;</span>
13
14
  </span>
14
- </li>
15
+ </li>
@@ -1 +1 @@
1
- <%= render :partial => "form" %>
1
+ <%= render :partial => "form" %>
@@ -2,7 +2,7 @@ Refinery::Plugin.register do |plugin|
2
2
  plugin.title = "News"
3
3
  plugin.description = "Provides a blog-like news section"
4
4
  plugin.version = 1.0
5
- plugin.menu_match = /admin\/((news)|(news_items))$/
5
+ plugin.menu_match = /admin\/news(_items)?$/
6
6
  plugin.activity = {
7
7
  :class => NewsItem,
8
8
  :title => 'title',