spree_essential_cms 0.3.0.rc1 → 0.4.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 (69) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +15 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/README.md +64 -5
  6. data/Versionfile +8 -0
  7. data/app/controllers/spree/admin/contents_controller.rb +4 -4
  8. data/app/controllers/spree/admin/pages_controller.rb +6 -12
  9. data/app/controllers/spree/base_controller_decorator.rb +15 -0
  10. data/app/controllers/spree/home_controller_decorator.rb +23 -0
  11. data/app/controllers/spree/pages_controller.rb +2 -11
  12. data/app/models/spree/content.rb +40 -39
  13. data/app/models/spree/page.rb +21 -10
  14. data/app/models/spree/page_image.rb +10 -15
  15. data/app/views/spree/admin/contents/_form.html.erb +9 -4
  16. data/app/views/spree/admin/contents/edit.html.erb +0 -2
  17. data/app/views/spree/admin/contents/index.html.erb +22 -23
  18. data/app/views/spree/admin/contents/new.html.erb +0 -2
  19. data/app/views/spree/admin/contents/show.html.erb +0 -1
  20. data/app/views/spree/admin/page_images/edit.html.erb +1 -3
  21. data/app/views/spree/admin/page_images/index.html.erb +25 -25
  22. data/app/views/spree/admin/page_images/new.html.erb +3 -1
  23. data/app/views/spree/admin/pages/edit.html.erb +0 -2
  24. data/app/views/spree/admin/pages/index.html.erb +26 -26
  25. data/app/views/spree/admin/pages/new.html.erb +1 -1
  26. data/app/views/spree/admin/pages/show.html.erb +0 -2
  27. data/app/views/spree/pages/home.html.erb +10 -0
  28. data/app/views/spree/shared/_main_menu.html.erb +3 -7
  29. data/app/views/spree/shared/_main_menu_items.html.erb +6 -0
  30. data/config/locales/en.yml +1 -0
  31. data/config/locales/it.yml +63 -0
  32. data/config/routes.rb +10 -12
  33. data/{lib/generators/templates/db/migrate/create_pages.rb → db/migrate/20120306185628_create_pages.rb} +0 -0
  34. data/{lib/generators/templates/db/migrate/create_contents.rb → db/migrate/20120306185638_create_contents.rb} +0 -0
  35. data/{lib/generators/templates/db/migrate/add_spree_namespace.rb → db/migrate/20120306185648_add_spree_namespace.rb} +0 -0
  36. data/lib/generators/spree_essentials/cms_generator.rb +3 -8
  37. data/lib/spree_essential_cms.rb +5 -19
  38. data/lib/spree_essential_cms/engine.rb +16 -0
  39. data/lib/spree_essential_cms/version.rb +1 -1
  40. data/lib/tasks/sample.rake +9 -13
  41. data/spree_essential_cms.gemspec +34 -0
  42. data/test/dummy_hooks/after_app_generator.rb +17 -0
  43. data/test/dummy_hooks/after_migrate.rb.sample +1 -0
  44. data/test/dummy_hooks/before_migrate.rb +11 -0
  45. data/test/dummy_hooks/templates/assets/javascripts/admin/all.js +1 -0
  46. data/test/dummy_hooks/templates/assets/javascripts/store/all.js +1 -0
  47. data/test/dummy_hooks/templates/assets/stylesheets/admin/all.css +3 -0
  48. data/test/dummy_hooks/templates/assets/stylesheets/store/all.css +3 -0
  49. data/test/dummy_hooks/templates/assets/stylesheets/store/screen.css +749 -0
  50. data/test/dummy_hooks/templates/initializers/spree_user_error_fix.rb +3 -0
  51. data/test/dummy_hooks/templates/overrides/main_menu.rb +6 -0
  52. data/test/integration/spree/admin/contents_integration_test.rb +116 -0
  53. data/test/integration/spree/admin/page_images_integration_test.rb +94 -0
  54. data/test/integration/spree/admin/pages_integration_test.rb +131 -0
  55. data/test/integration/spree/home_integration_test.rb +54 -0
  56. data/test/integration/spree/pages_integration_test.rb +122 -0
  57. data/test/support/factories.rb +21 -0
  58. data/test/support/files/1.jpg +0 -0
  59. data/test/support/files/2.jpg +0 -0
  60. data/test/support/helpers.rb +13 -0
  61. data/test/test_helper.rb +19 -0
  62. data/test/unit/spree/content_test.rb +39 -0
  63. data/test/unit/spree/essential_test.rb +9 -0
  64. data/test/unit/spree/page_image_test.rb +47 -0
  65. data/test/unit/spree/page_test.rb +53 -0
  66. metadata +117 -48
  67. data/app/assets/stylesheets/essentials/cms.css +0 -39
  68. data/app/controllers/spree/page_controller.rb +0 -20
  69. data/app/controllers/spree/spree_base_controller_decorator.rb +0 -12
@@ -0,0 +1,8 @@
1
+ *.gem
2
+ .bundle
3
+ .DS_Store
4
+ coverage
5
+ Gemfile.lock
6
+ pkg/*
7
+ test/dummy_hooks/after_migrate.rb
8
+ test/dummy
@@ -0,0 +1,15 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ree
6
+
7
+ branches:
8
+ only:
9
+ - master
10
+
11
+ before_script:
12
+ - "sh -e /etc/init.d/xvfb start"
13
+ - "bundle exec dummier"
14
+
15
+ script: "DISPLAY=:99.0 bundle exec rake"
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Spencer Steffen and Citrus Media Group.
1
+ Copyright (c) 2011 - 2012 Spencer Steffen and Citrus Media Group.
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
data/README.md CHANGED
@@ -14,7 +14,17 @@ Otherwise, follow these steps to get up and running with SpreeEssentialCms:
14
14
  Add spree_essential_cms to your Gemfile:
15
15
 
16
16
  ```ruby
17
- gem 'spree_essential_cms', '>= 0.2.1'
17
+ # Spree 1.1.x
18
+ gem 'spree_essential_cms', '~> 0.4.0'
19
+
20
+ # Spree 1.0.x
21
+ gem 'spree_essential_cms', '~> 0.3.0.rc1'
22
+
23
+ # Spree 0.70.x
24
+ gem 'spree_essential_cms', '~> 0.2.1'
25
+
26
+ # Spree 0.60.x and below
27
+ gem 'spree_essential_cms', '~> 0.1.2'
18
28
  ```
19
29
 
20
30
  Now, bundle up with:
@@ -42,6 +52,19 @@ Boot your server and checkout the admin at `localhost:3000/admin`!
42
52
  bundle exec rails s
43
53
  ```
44
54
 
55
+ ### To use the built in main menu create a deface override in your application that looks like this:
56
+
57
+ ```ruby
58
+ # app/overrides/main_menu.rb
59
+ Deface::Override.new(:virtual_path => "spree/shared/_store_menu",
60
+ :name => "spree_essential_cms_main_menu_items",
61
+ :insert_after => "#home-link[data-hook]",
62
+ :partial => "spree/shared/main_menu_items",
63
+ :disabled => false)
64
+ ```
65
+
66
+ This example override can be found in `test/dummy_hooks/templates/main_menu.rb`
67
+
45
68
 
46
69
  ------------------------------------------------------------------------------
47
70
  Usage
@@ -80,7 +103,7 @@ Use a content decorator when you want different contexts to have their own image
80
103
 
81
104
  # app/models/content_decorator.rb
82
105
 
83
- Content.class_eval do
106
+ Spree::Content.class_eval do
84
107
 
85
108
  # override default image sizes
86
109
  def default_attachment_sizes
@@ -107,12 +130,18 @@ Content.class_eval do
107
130
  end
108
131
  ```
109
132
 
133
+ ### Custom Home Page
134
+
135
+ This extension modifies the `Spree::HomeController.index` method and redirects to `/products`
136
+ if no root page is defined in the spree CMS. In order to define a custom home page you'll need to use another view
137
+ off of the `Spree::HomeController` class such as `splash`, add the root route
138
+ (`root :to => 'spree/home#splash'`) to your `config/routes.rb`, and add a blank page with path "/" in the spree CMS.
110
139
 
111
140
  ------------------------------------------------------------------------------
112
141
  Demo
113
142
  ------------------------------------------------------------------------------
114
143
 
115
- You can easily use the test/dummy app as a demo of spree_essential_cms. Just `cd` to where you develop and run:
144
+ You can easily use the `test/dummy` app as a demo of spree_essential_cms. Just `cd` to where you develop and run:
116
145
 
117
146
  ```bash
118
147
  git clone git://github.com/citrus/spree_essential_cms.git
@@ -125,11 +154,40 @@ bundle exec rails s
125
154
  ```
126
155
 
127
156
 
157
+ ------------------------------------------------------------------------------
158
+ Testing
159
+ ------------------------------------------------------------------------------
160
+
161
+ Testing for spree_essential_cms is done with unit tests and capybara integration tests. To get setup, run the commands below:
162
+
163
+ ```bash
164
+ git clone git://github.com/citrus/spree_essential_cms.git
165
+ cd spree_essential_cms
166
+ bundle install
167
+ bundle exec dummier
168
+ ```
169
+
170
+
171
+ Now you've got a test app setup in `test/dummy`. Now you can run the tests with:
172
+
173
+ ```bash
174
+ bundle exec rake
175
+ ```
176
+
177
+
178
+ If for any reason you want to re-create your `test/dummy` app, just re-run `bundle exec dummier`.
179
+
180
+
128
181
  ------------------------------------------------------------------------------
129
182
  Change Log
130
183
  ------------------------------------------------------------------------------
131
184
 
132
- **2012/1/16**
185
+ **0.4.0 - 2012/5/1**
186
+
187
+ * Add support for Spree 1.1.x
188
+
189
+
190
+ **0.3.0.rc1 - 2012/1/16**
133
191
 
134
192
  * Add support for Spree 1.0.x
135
193
 
@@ -166,7 +224,6 @@ Change Log
166
224
  To Do
167
225
  ------------------------------------------------------------------------------
168
226
 
169
- * more tests... many many more.
170
227
  * optimizations
171
228
  * A 'create translation' button that clones the current page's contents into another language
172
229
  * add widgets that you can drop into any page
@@ -180,7 +237,9 @@ Contributors
180
237
  ------------------------------------------------------------------------------
181
238
 
182
239
  * Spencer Steffen ([@citrus](https://github.com/citrus))
240
+ * Stéphane Bounmy ([@sbounmy](https://github.com/sbounmy))
183
241
  * Kyle West ([@kylewest](https://github.com/kylewest))
242
+ * Derek Ethier ([@ethier](https://github.com/ethier))
184
243
  * [@kpitn](https://github.com/kpitn)
185
244
 
186
245
 
@@ -0,0 +1,8 @@
1
+ "1.1.x" => { :version => "0.4.0" }
2
+ "1.0.x" => { :version => "0.3.0.rc1" }
3
+ "0.70.x" => { :version => "0.2.1" }
4
+ "0.60.x" => { :version => "0.1.2" }
5
+ "0.50.x" => { :version => "0.1.2" }
6
+ "0.40.x" => {}
7
+ "0.30.x" => {}
8
+ "0.10.x" => {}
@@ -29,10 +29,10 @@ class Spree::Admin::ContentsController < Spree::Admin::ResourceController
29
29
  end
30
30
 
31
31
  def collection
32
- params[:search] ||= {}
33
- params[:search][:meta_sort] ||= "page.asc"
34
- @search = parent.contents.metasearch(params[:search])
35
- @collection = @search.page(params[:page]).per(Spree::Config[:orders_per_page])
32
+ params[:q] ||= {}
33
+ params[:q][:sort] ||= "page.asc"
34
+ @search = parent.contents.search(params[:q])
35
+ @collection = @search.result.page(params[:page]).per(Spree::Config[:orders_per_page])
36
36
  end
37
37
 
38
38
  end
@@ -1,11 +1,5 @@
1
1
  class Spree::Admin::PagesController < Spree::Admin::ResourceController
2
2
 
3
- before_filter :load_resource
4
-
5
- def index
6
- @pages = collection
7
- end
8
-
9
3
  def location_after_save
10
4
  case params[:action]
11
5
  when "create"
@@ -30,12 +24,12 @@ class Spree::Admin::PagesController < Spree::Admin::ResourceController
30
24
  def find_resource
31
25
  @page ||= ::Spree::Page.find_by_path(params[:id])
32
26
  end
33
-
27
+
34
28
  def collection
35
- params[:search] ||= {}
36
- params[:search][:meta_sort] ||= "page.asc"
37
- @search = Spree::Page.metasearch(params[:search])
38
- @collection = @search.page(params[:page]).per(Spree::Config[:orders_per_page])
29
+ params[:q] ||= {}
30
+ params[:q][:sort] ||= "page.asc"
31
+ @search = Spree::Page.search(params[:q])
32
+ @collection = @search.result.page(params[:page]).per(Spree::Config[:orders_per_page])
39
33
  end
40
34
 
41
- end
35
+ end
@@ -0,0 +1,15 @@
1
+ Spree::BaseController.class_eval do
2
+
3
+ before_filter :get_pages
4
+ helper_method :current_page
5
+
6
+ def current_page
7
+ @page ||= Spree::Page.find_by_path(request.fullpath)
8
+ end
9
+
10
+ def get_pages
11
+ return if request.path =~ /^\/+admin/
12
+ @pages ||= Spree::Page.visible.order(:position).all
13
+ end
14
+
15
+ end
@@ -0,0 +1,23 @@
1
+ Spree::HomeController.class_eval do
2
+
3
+ before_filter :get_homepage
4
+
5
+ def index
6
+ @searcher = Spree::Config.searcher_class.new(params)
7
+ @products = @searcher.retrieve_products
8
+ render :template => "spree/pages/home"
9
+ end
10
+
11
+ private
12
+
13
+ def get_homepage
14
+ @page = Spree::Page.find_by_path("/")
15
+ redirect_to products_url if @page.nil?
16
+ @page
17
+ end
18
+
19
+ def accurate_title
20
+ @page.meta_title unless @page.nil?
21
+ end
22
+
23
+ end
@@ -1,8 +1,8 @@
1
1
  class Spree::PagesController < Spree::BaseController
2
-
3
- before_filter :get_page, :only => :show
4
2
 
5
3
  def show
4
+ @page = current_page
5
+ raise ActionController::RoutingError.new("No route matches [GET] #{request.fullpath}") if @page.nil?
6
6
  if @page.root?
7
7
  @posts = Spree::Post.live.limit(5) if SpreeEssentials.has?(:blog)
8
8
  @articles = Spree::Article.live.limit(5) if SpreeEssentials.has?(:news)
@@ -12,15 +12,6 @@ class Spree::PagesController < Spree::BaseController
12
12
 
13
13
  private
14
14
 
15
- def get_page
16
- @page = Spree::Page.includes(:images, :contents).active.find_by_path(page_path) rescue nil
17
- raise ActionController::RoutingError.new(page_path) if @page.nil?
18
- end
19
-
20
- def page_path
21
- params[:page_path].blank? ? "/" : params[:page_path]
22
- end
23
-
24
15
  def accurate_title
25
16
  @page.meta_title
26
17
  end
@@ -1,62 +1,54 @@
1
1
  class Spree::Content < ActiveRecord::Base
2
-
2
+
3
+ attr_accessor :delete_attachment
4
+ attr_accessible :page_id, :title, :path, :body, :hide_title, :link, :link_text, :context, :attachment, :delete_attachment
5
+
3
6
  belongs_to :page
4
7
  validates_associated :page
5
8
  validates_presence_of :title, :page
6
9
 
7
10
  default_scope order(:position)
8
-
9
- if defined?(SpreeHeroku)
10
- has_attached_file :attachment,
11
- :styles => Proc.new{ |clip| clip.instance.attachment_sizes },
12
- :default_style => :preview,
13
- :path => "assets/contents/:id/:style/:basename.:extension",
14
- :storage => "s3",
15
- :s3_credentials => "#{Rails.root}/config/s3.yml"
16
- else
17
- has_attached_file :attachment,
18
- :styles => Proc.new{ |clip| clip.instance.attachment_sizes },
19
- :default_style => :preview,
20
- :url => "/assets/contents/:id/:style/:basename.:extension",
21
- :path => ":rails_root/public/assets/contents/:id/:style/:basename.:extension"
22
- end
23
-
11
+
12
+ has_attached_file :attachment,
13
+ :styles => Proc.new{ |clip| clip.instance.attachment_sizes },
14
+ :default_style => :preview,
15
+ :url => "/spree/contents/:id/:style/:basename.:extension",
16
+ :path => ":rails_root/public/spree/contents/:id/:style/:basename.:extension"
24
17
 
25
18
  cattr_reader :per_page
26
19
  @@per_page = 10
27
-
28
-
20
+
29
21
  scope :for, Proc.new{|context| where(:context => context)}
30
-
31
-
22
+
23
+ before_update :delete_attachment!, :if => :delete_attachment
24
+ before_update :reprocess_images_if_context_changed
25
+
32
26
  [ :link_text, :link, :body ].each do |property|
33
27
  define_method "has_#{property.to_s}?" do
34
28
  has_value property
35
29
  end
36
30
  end
37
-
31
+
38
32
  def has_full_link?
39
33
  has_link? && has_link_text?
40
34
  end
41
-
35
+
42
36
  def has_image?
43
37
  has_value(:attachment_file_name) && attachment_file_name.match(/gif|jpg|png/i)
44
38
  end
45
-
39
+
46
40
  def hide_title?
47
41
  self.hide_title == true
48
42
  end
49
-
50
-
43
+
51
44
  def rendered_body
52
45
  RDiscount.new(body.to_s).to_html.html_safe
53
46
  end
54
-
55
-
47
+
56
48
  def default_attachment_sizes
57
49
  { :mini => '48x48>', :medium => '427x287>' }
58
50
  end
59
-
51
+
60
52
  def attachment_sizes
61
53
  case self.context
62
54
  when 'slideshow'
@@ -66,18 +58,27 @@ class Spree::Content < ActiveRecord::Base
66
58
  end
67
59
  sizes
68
60
  end
69
-
70
-
71
-
61
+
72
62
  def context=(value)
73
63
  write_attribute :context, value.to_s.parameterize
74
64
  end
75
65
 
76
- private
77
-
78
- def has_value(selector)
79
- v = self.send selector
80
- v && !v.to_s.blank?
81
- end
66
+ private
67
+
68
+ def delete_attachment!
69
+ del = delete_attachment.to_s
70
+ self.attachment = nil if del == "1" || del == "true"
71
+ true
72
+ end
73
+
74
+ def reprocess_images_if_context_changed
75
+ return unless context_changed? && attachment_file_name.present?
76
+ attachment.reprocess!
77
+ end
78
+
79
+ def has_value(selector)
80
+ v = self.send selector
81
+ v && !v.to_s.blank?
82
+ end
82
83
 
83
- end
84
+ end
@@ -1,5 +1,15 @@
1
1
  class Spree::Page < ActiveRecord::Base
2
2
 
3
+ class << self
4
+
5
+ def find_by_path(_path)
6
+ return super('/') if _path == "_home_" && self.exists?(:path => "/")
7
+ super _path.to_s.sub(/^\/*/, "/").gsub("--", "/")
8
+ end
9
+
10
+ end
11
+
12
+ attr_accessible :title, :path, :nav_title, :meta_title, :meta_description, :meta_keywords, :accessible, :visible
3
13
  alias_attribute :name, :title
4
14
 
5
15
  validates_presence_of :title
@@ -11,19 +21,14 @@ class Spree::Page < ActiveRecord::Base
11
21
  scope :visible, active.where(:visible => true)
12
22
 
13
23
  has_many :contents, :order => :position, :dependent => :destroy
14
- has_many :images, :as => :viewable, :class_name => 'Spree::PageImage', :order => :position, :dependent => :destroy
24
+ has_many :images, :as => :viewable, :class_name => "Spree::PageImage", :order => :position, :dependent => :destroy
15
25
 
16
26
  before_validation :set_defaults
17
27
  after_create :create_default_content
18
-
19
- def self.find_by_path(_path)
20
- return super('/') if _path == '_home_' && self.exists?(:path => '/')
21
- super _path.to_s.sub(/^\/*/, '/').gsub('--', '/')
22
- end
23
-
28
+
24
29
  def to_param
25
- return '_home_' if path == '/'
26
- path.sub(/^\//, '').gsub('/', '--')
30
+ return "_home_" if path == "/"
31
+ path.sub(/^\/*/, "")
27
32
  end
28
33
 
29
34
  def meta_title
@@ -47,6 +52,12 @@ class Spree::Page < ActiveRecord::Base
47
52
  self.path == "/"
48
53
  end
49
54
 
55
+ def path=(value)
56
+ value = value.to_s.strip
57
+ value.gsub!(/[\/\-\_]+$/, "") unless value == "/"
58
+ write_attribute :path, value
59
+ end
60
+
50
61
  private
51
62
 
52
63
  def set_defaults
@@ -54,7 +65,7 @@ class Spree::Page < ActiveRecord::Base
54
65
  #return errors.add(:path, "is reserved. Please use another") if path.to_s =~ /home/
55
66
  self.nav_title = title if nav_title.blank?
56
67
  self.path = nav_title.parameterize if path.blank?
57
- self.path = "/" + path.sub(/^\//, '')
68
+ self.path = "/" + path.sub(/^\//, "")
58
69
  end
59
70
 
60
71
  def create_default_content