spree_essential_cms 0.3.0.rc1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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