comfortable_mexican_sofa 0.0.18 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. data/.gitignore +8 -8
  2. data/Gemfile +11 -0
  3. data/Gemfile.lock +91 -0
  4. data/README.md +4 -0
  5. data/Rakefile +28 -57
  6. data/VERSION +1 -1
  7. data/app/controllers/application_controller.rb +5 -0
  8. data/app/controllers/cms_admin/base_controller.rb +1 -21
  9. data/app/controllers/cms_admin/layouts_controller.rb +23 -38
  10. data/app/controllers/cms_admin/pages_controller.rb +24 -40
  11. data/app/controllers/cms_admin/snippets_controller.rb +26 -34
  12. data/app/controllers/cms_admin/uploads_controller.rb +27 -0
  13. data/app/controllers/cms_content_controller.rb +22 -19
  14. data/app/models/cms_block.rb +20 -6
  15. data/app/models/cms_layout.rb +34 -80
  16. data/app/models/cms_page.rb +44 -102
  17. data/app/models/cms_snippet.rb +12 -7
  18. data/app/models/cms_upload.rb +36 -0
  19. data/app/views/cms_admin/layouts/_form.html.erb +6 -0
  20. data/app/views/cms_admin/layouts/_index_branch.html.erb +24 -0
  21. data/app/views/cms_admin/layouts/edit.html.erb +6 -0
  22. data/app/views/cms_admin/layouts/index.html.erb +6 -0
  23. data/app/views/cms_admin/layouts/new.html.erb +6 -0
  24. data/app/views/cms_admin/pages/_form.html.erb +14 -0
  25. data/app/views/cms_admin/pages/_form_blocks.html.erb +7 -0
  26. data/app/views/cms_admin/pages/_index_branch.html.erb +27 -0
  27. data/app/views/cms_admin/pages/edit.html.erb +6 -0
  28. data/app/views/cms_admin/pages/form_blocks.js.erb +1 -0
  29. data/app/views/cms_admin/pages/index.html.erb +6 -0
  30. data/app/views/cms_admin/pages/new.html.erb +6 -0
  31. data/app/views/cms_admin/snippets/_form.html.erb +2 -0
  32. data/app/views/cms_admin/snippets/edit.html.erb +6 -0
  33. data/app/views/cms_admin/snippets/index.html.erb +3 -0
  34. data/app/views/cms_admin/snippets/new.html.erb +6 -0
  35. data/app/views/cms_admin/uploads/_index.html.erb +8 -0
  36. data/app/views/cms_admin/uploads/_upload.html.erb +11 -0
  37. data/app/views/cms_admin/uploads/destroy.js.erb +3 -0
  38. data/app/views/cms_admin/uploads/index.html.erb +2 -0
  39. data/app/views/layouts/cms_admin.html.erb +36 -0
  40. data/comfortable_mexican_sofa.gemspec +141 -197
  41. data/config.ru +4 -0
  42. data/config/application.rb +44 -0
  43. data/config/boot.rb +13 -0
  44. data/{test/rails_root/config → config}/database.yml +0 -0
  45. data/config/environment.rb +5 -0
  46. data/config/environments/development.rb +22 -0
  47. data/config/environments/production.rb +49 -0
  48. data/config/environments/test.rb +35 -0
  49. data/{test/rails_root/config → config}/initializers/backtrace_silencers.rb +2 -2
  50. data/{test/rails_root/config → config}/initializers/inflections.rb +1 -1
  51. data/{test/rails_root/config → config}/initializers/mime_types.rb +0 -0
  52. data/config/initializers/paperclip.rb +3 -0
  53. data/config/initializers/secret_token.rb +7 -0
  54. data/config/initializers/session_store.rb +8 -0
  55. data/{test/rails_root/config → config}/locales/en.yml +1 -1
  56. data/config/routes.rb +20 -0
  57. data/db/migrate/01_create_cms.rb +73 -0
  58. data/db/seeds.rb +7 -0
  59. data/doc/README_FOR_APP +95 -0
  60. data/lib/comfortable_mexican_sofa.rb +34 -39
  61. data/lib/comfortable_mexican_sofa/cms_acts_as_tree.rb +42 -49
  62. data/lib/comfortable_mexican_sofa/cms_form_builder.rb +107 -0
  63. data/lib/comfortable_mexican_sofa/cms_rails_extensions.rb +25 -5
  64. data/lib/comfortable_mexican_sofa/cms_tag.rb +90 -85
  65. data/lib/comfortable_mexican_sofa/cms_tag/field_datetime.rb +26 -0
  66. data/lib/comfortable_mexican_sofa/cms_tag/field_integer.rb +26 -0
  67. data/lib/comfortable_mexican_sofa/cms_tag/field_string.rb +26 -0
  68. data/lib/comfortable_mexican_sofa/cms_tag/field_text.rb +26 -0
  69. data/lib/comfortable_mexican_sofa/cms_tag/page_datetime.rb +22 -0
  70. data/lib/comfortable_mexican_sofa/cms_tag/page_integer.rb +22 -0
  71. data/lib/comfortable_mexican_sofa/cms_tag/page_string.rb +22 -0
  72. data/lib/comfortable_mexican_sofa/cms_tag/page_text.rb +22 -0
  73. data/lib/comfortable_mexican_sofa/cms_tag/partial.rb +20 -0
  74. data/lib/comfortable_mexican_sofa/cms_tag/snippet.rb +18 -0
  75. data/{generators/cms/templates → lib/generators}/README +0 -20
  76. data/lib/generators/cms_generator.rb +28 -0
  77. data/public/404.html +26 -0
  78. data/public/422.html +26 -0
  79. data/public/500.html +26 -0
  80. data/{test/rails_root/public → public}/favicon.ico +0 -0
  81. data/public/images/comfortable_mexican_sofa/body_bg.jpg +0 -0
  82. data/{generators/cms/templates/images → public/images/comfortable_mexican_sofa}/icon_regular.gif +0 -0
  83. data/public/javascripts/comfortable_mexican_sofa/cms.js +53 -0
  84. data/public/javascripts/comfortable_mexican_sofa/jquery-ui.js +325 -0
  85. data/public/javascripts/comfortable_mexican_sofa/jquery.js +154 -0
  86. data/public/javascripts/comfortable_mexican_sofa/plupload/plupload.full.min.js +1 -0
  87. data/public/javascripts/comfortable_mexican_sofa/plupload/plupload.html4.min.js +1 -0
  88. data/public/javascripts/comfortable_mexican_sofa/plupload/plupload.html5.min.js +1 -0
  89. data/public/javascripts/comfortable_mexican_sofa/rails.js +132 -0
  90. data/public/javascripts/comfortable_mexican_sofa/uploader.js +47 -0
  91. data/{test/rails_root/public → public}/robots.txt +0 -0
  92. data/public/stylesheets/comfortable_mexican_sofa/jquery-ui.css +305 -0
  93. data/public/stylesheets/comfortable_mexican_sofa/reset.css +1 -0
  94. data/public/stylesheets/comfortable_mexican_sofa/structure.css +194 -0
  95. data/public/stylesheets/comfortable_mexican_sofa/typography.css +20 -0
  96. data/script/rails +6 -0
  97. data/test/fixtures/README.md +22 -0
  98. data/test/fixtures/cms_blocks.yml +10 -34
  99. data/test/fixtures/cms_layouts.yml +37 -33
  100. data/test/fixtures/cms_pages.yml +11 -32
  101. data/test/fixtures/cms_snippets.yml +2 -6
  102. data/test/fixtures/cms_uploads.yml +4 -0
  103. data/test/fixtures/files/invalid_file.gif +9 -0
  104. data/test/fixtures/files/valid_image.jpg +0 -0
  105. data/test/functional/cms_admin/base_controller_test.rb +9 -0
  106. data/test/functional/cms_admin/layouts_controller_test.rb +61 -46
  107. data/test/functional/cms_admin/pages_controller_test.rb +201 -102
  108. data/test/functional/cms_admin/snippets_controller_test.rb +46 -39
  109. data/test/functional/cms_admin/uploads_controller_test.rb +32 -0
  110. data/test/functional/cms_content_controller_test.rb +37 -32
  111. data/test/test_helper.rb +29 -9
  112. data/test/unit/cms_block_test.rb +60 -0
  113. data/test/unit/cms_layout_test.rb +48 -0
  114. data/test/unit/cms_page_test.rb +122 -0
  115. data/test/unit/cms_snippet_test.rb +23 -0
  116. data/test/unit/cms_tag_test.rb +149 -0
  117. data/test/unit/cms_tags/field_datetime_test.rb +36 -0
  118. data/test/unit/cms_tags/field_integer_test.rb +35 -0
  119. data/test/unit/cms_tags/field_string_test.rb +35 -0
  120. data/test/unit/cms_tags/field_text_test.rb +34 -0
  121. data/test/unit/cms_tags/page_datetime_test.rb +36 -0
  122. data/test/unit/cms_tags/page_integer_test.rb +35 -0
  123. data/test/unit/cms_tags/page_string_test.rb +35 -0
  124. data/test/unit/cms_tags/page_text_test.rb +36 -0
  125. data/test/unit/cms_tags/partial_test.rb +30 -0
  126. data/test/unit/cms_tags/snippet_test.rb +34 -0
  127. data/test/unit/cms_upload_test.rb +30 -0
  128. metadata +176 -215
  129. data/CHANGELOG.rdoc +0 -2
  130. data/LICENSE +0 -20
  131. data/README.rdoc +0 -55
  132. data/app/controllers/cms_admin/attachments_controller.rb +0 -55
  133. data/app/controllers/cms_admin/categories_controller.rb +0 -69
  134. data/app/controllers/cms_admin/sections_controller.rb +0 -17
  135. data/app/controllers/cms_common/render_page.rb +0 -47
  136. data/app/helpers/cms_helper.rb +0 -12
  137. data/app/models/cms_attachment.rb +0 -17
  138. data/app/models/cms_attachment_categorization.rb +0 -5
  139. data/app/models/cms_category.rb +0 -36
  140. data/app/models/cms_page_categorization.rb +0 -6
  141. data/app/views/cms_admin/attachments/_details.html.haml +0 -27
  142. data/app/views/cms_admin/attachments/_form.html.haml +0 -24
  143. data/app/views/cms_admin/attachments/edit.html.haml +0 -10
  144. data/app/views/cms_admin/attachments/index.html.haml +0 -36
  145. data/app/views/cms_admin/attachments/new.html.haml +0 -8
  146. data/app/views/cms_admin/categories/_category.html.haml +0 -21
  147. data/app/views/cms_admin/categories/_category_subform.html.haml +0 -12
  148. data/app/views/cms_admin/categories/_form.html.haml +0 -18
  149. data/app/views/cms_admin/categories/_new.html.haml +0 -7
  150. data/app/views/cms_admin/categories/_toggle_link.html.haml +0 -9
  151. data/app/views/cms_admin/categories/_tree_branch.html.haml +0 -36
  152. data/app/views/cms_admin/categories/children.js.rjs +0 -10
  153. data/app/views/cms_admin/categories/create.js.rjs +0 -9
  154. data/app/views/cms_admin/categories/edit.html.haml +0 -10
  155. data/app/views/cms_admin/categories/index.html.haml +0 -7
  156. data/app/views/cms_admin/categories/new.html.haml +0 -8
  157. data/app/views/cms_admin/categories/show.html.haml +0 -17
  158. data/app/views/cms_admin/layouts/_details.html.haml +0 -6
  159. data/app/views/cms_admin/layouts/_form.html.haml +0 -19
  160. data/app/views/cms_admin/layouts/_toggle_link.html.haml +0 -9
  161. data/app/views/cms_admin/layouts/_tree_branch.html.haml +0 -39
  162. data/app/views/cms_admin/layouts/children.js.rjs +0 -10
  163. data/app/views/cms_admin/layouts/edit.html.haml +0 -10
  164. data/app/views/cms_admin/layouts/index.html.haml +0 -7
  165. data/app/views/cms_admin/layouts/new.html.haml +0 -8
  166. data/app/views/cms_admin/pages/_details.html.haml +0 -25
  167. data/app/views/cms_admin/pages/_form.html.haml +0 -45
  168. data/app/views/cms_admin/pages/_form_blocks.html.haml +0 -48
  169. data/app/views/cms_admin/pages/_toggle_link.html.haml +0 -10
  170. data/app/views/cms_admin/pages/_tree_branch.html.haml +0 -41
  171. data/app/views/cms_admin/pages/children.js.rjs +0 -10
  172. data/app/views/cms_admin/pages/edit.html.haml +0 -11
  173. data/app/views/cms_admin/pages/form_blocks.js.rjs +0 -1
  174. data/app/views/cms_admin/pages/index.html.haml +0 -6
  175. data/app/views/cms_admin/pages/new.html.haml +0 -9
  176. data/app/views/cms_admin/sections/show.html.haml +0 -23
  177. data/app/views/cms_admin/snippets/_form.html.haml +0 -10
  178. data/app/views/cms_admin/snippets/edit.html.haml +0 -10
  179. data/app/views/cms_admin/snippets/index.html.haml +0 -26
  180. data/app/views/cms_admin/snippets/new.html.haml +0 -8
  181. data/app/views/cms_content/show.xml.rxml +0 -27
  182. data/app/views/cms_content/sitemap.xml.rxml +0 -16
  183. data/app/views/layouts/cms_admin.html.haml +0 -44
  184. data/config/cms_routes.rb +0 -25
  185. data/generators/cms/cms_generator.rb +0 -55
  186. data/generators/cms/templates/images/arrow_bottom.gif +0 -0
  187. data/generators/cms/templates/images/arrow_right.gif +0 -0
  188. data/generators/cms/templates/images/icon_attachment.gif +0 -0
  189. data/generators/cms/templates/images/icon_category.gif +0 -0
  190. data/generators/cms/templates/images/icon_draft.gif +0 -0
  191. data/generators/cms/templates/images/icon_layout.gif +0 -0
  192. data/generators/cms/templates/images/icon_move.gif +0 -0
  193. data/generators/cms/templates/images/icon_snippet.gif +0 -0
  194. data/generators/cms/templates/images/logo.png +0 -0
  195. data/generators/cms/templates/initializers/cms.rb +0 -14
  196. data/generators/cms/templates/initializers/paperclip.rb +0 -14
  197. data/generators/cms/templates/javascripts/codemirror_init.js +0 -16
  198. data/generators/cms/templates/javascripts/mce_init.js +0 -17
  199. data/generators/cms/templates/javascripts/utilities.js +0 -27
  200. data/generators/cms/templates/migrations/create_cms.rb +0 -113
  201. data/generators/cms/templates/stylesheets/cms_master.sass +0 -414
  202. data/init.rb +0 -1
  203. data/lib/comfortable_mexican_sofa/acts_as_categorized.rb +0 -87
  204. data/lib/comfortable_mexican_sofa/acts_as_published.rb +0 -60
  205. data/lib/comfortable_mexican_sofa/cms_tags/attachment.rb +0 -3
  206. data/lib/comfortable_mexican_sofa/cms_tags/block.rb +0 -117
  207. data/lib/comfortable_mexican_sofa/cms_tags/helper.rb +0 -3
  208. data/lib/comfortable_mexican_sofa/cms_tags/page_block.rb +0 -119
  209. data/lib/comfortable_mexican_sofa/cms_tags/partial.rb +0 -19
  210. data/lib/comfortable_mexican_sofa/cms_tags/snippet.rb +0 -19
  211. data/rails/init.rb +0 -1
  212. data/test/fixtures/cms_attachment_categorizations.yml +0 -7
  213. data/test/fixtures/cms_attachments.yml +0 -6
  214. data/test/fixtures/cms_categories.yml +0 -19
  215. data/test/fixtures/cms_page_categorizations.yml +0 -15
  216. data/test/fixtures/files/upload_file.txt +0 -1
  217. data/test/functional/cms_admin/attachments_controller_test.rb +0 -63
  218. data/test/functional/cms_admin/categories_controller_test.rb +0 -86
  219. data/test/functional/cms_admin/sections_controller_test.rb +0 -9
  220. data/test/models/cms_attachment_test.rb +0 -16
  221. data/test/models/cms_block_test.rb +0 -11
  222. data/test/models/cms_categorization_test.rb +0 -39
  223. data/test/models/cms_category_test.rb +0 -71
  224. data/test/models/cms_layout_test.rb +0 -44
  225. data/test/models/cms_page_test.rb +0 -55
  226. data/test/models/cms_snippet_test.rb +0 -16
  227. data/test/models/cms_tag_test.rb +0 -70
  228. data/test/rails_root/README +0 -243
  229. data/test/rails_root/Rakefile +0 -10
  230. data/test/rails_root/app/controllers/application_controller.rb +0 -10
  231. data/test/rails_root/app/helpers/application_helper.rb +0 -3
  232. data/test/rails_root/app/views/cms/under-development.html.haml +0 -1
  233. data/test/rails_root/app/views/complex_page/_example.html.erb +0 -1
  234. data/test/rails_root/config/boot.rb +0 -110
  235. data/test/rails_root/config/environment.rb +0 -48
  236. data/test/rails_root/config/environments/development.rb +0 -17
  237. data/test/rails_root/config/environments/production.rb +0 -28
  238. data/test/rails_root/config/environments/test.rb +0 -28
  239. data/test/rails_root/config/initializers/new_rails_defaults.rb +0 -19
  240. data/test/rails_root/config/initializers/session_store.rb +0 -15
  241. data/test/rails_root/config/routes.rb +0 -43
  242. data/test/rails_root/doc/README_FOR_APP +0 -2
  243. data/test/rails_root/public/404.html +0 -30
  244. data/test/rails_root/public/422.html +0 -30
  245. data/test/rails_root/public/500.html +0 -30
  246. data/test/rails_root/public/images/rails.png +0 -0
  247. data/test/rails_root/public/index.html +0 -275
  248. data/test/rails_root/public/javascripts/application.js +0 -2
  249. data/test/rails_root/public/javascripts/controls.js +0 -963
  250. data/test/rails_root/public/javascripts/dragdrop.js +0 -973
  251. data/test/rails_root/public/javascripts/effects.js +0 -1128
  252. data/test/rails_root/public/javascripts/prototype.js +0 -4320
  253. data/test/rails_root/public/stylesheets/sass/cms_master.sass +0 -414
  254. data/test/rails_root/script/about +0 -4
  255. data/test/rails_root/script/console +0 -3
  256. data/test/rails_root/script/dbconsole +0 -3
  257. data/test/rails_root/script/destroy +0 -3
  258. data/test/rails_root/script/generate +0 -3
  259. data/test/rails_root/script/performance/benchmarker +0 -3
  260. data/test/rails_root/script/performance/profiler +0 -3
  261. data/test/rails_root/script/plugin +0 -3
  262. data/test/rails_root/script/runner +0 -3
  263. data/test/rails_root/script/server +0 -3
@@ -1,58 +1,50 @@
1
1
  class CmsAdmin::SnippetsController < CmsAdmin::BaseController
2
-
3
- before_filter :load_snippet, :only => [:edit, :update, :destroy]
4
-
2
+ before_filter :build_cms_snippet,
3
+ :only => [:new, :create]
4
+ before_filter :load_cms_snippet,
5
+ :only => [:edit, :update, :destroy]
6
+
5
7
  def index
6
- @snippets = CmsSnippet.paginate :page => params[:page]
8
+ @cms_snippets = CmsSnippet.all(:order => 'label')
7
9
  end
8
10
 
9
11
  def new
10
- # ...
11
- end
12
-
13
- def edit
14
- # ...
15
12
  end
16
13
 
17
14
  def create
18
- @snippet = CmsSnippet.new(params[:snippet])
19
- @snippet.save!
20
-
21
- flash[:notice] = 'Snippet created'
22
- redirect_to :action => :edit, :id => @snippet
23
-
15
+ @cms_snippet.save!
16
+ flash[:notice] = 'Snippet saved'
17
+ redirect_to :action => :edit, :id => @cms_snippet
24
18
  rescue ActiveRecord::RecordInvalid
25
19
  render :action => :new
26
20
  end
27
21
 
22
+ def edit
23
+ end
24
+
28
25
  def update
29
- @snippet.update_attributes!(params[:snippet])
30
-
31
- flash[:notice] = 'Snippet updated'
32
- redirect_to :action => :edit, :id => @snippet
33
-
26
+ @cms_snippet.update_attributes!(params[:cms_snippet])
27
+ flash[:notice] = 'Snippet saved'
28
+ redirect_to :action => :edit, :id => @cms_snippet
34
29
  rescue ActiveRecord::RecordInvalid
35
30
  render :action => :edit
36
31
  end
37
32
 
38
33
  def destroy
39
- @snippet.destroy
40
-
41
- flash[:notice] = 'Snippet removed'
34
+ @cms_snippet.destroy
35
+ flash[:notice] = 'Snippet deleted'
42
36
  redirect_to :action => :index
43
37
  end
44
-
45
- def reorder
46
- params[:snippet_list].each_with_index do |id, position|
47
- CmsSnippet.find(id).update_attribute(:position, position)
48
- end
49
- render :nothing => true
50
- end
51
-
52
- protected
53
38
 
54
- def load_snippet
55
- @snippet = CmsSnippet.find_by_id(params[:id])
39
+ protected
40
+ def build_cms_snippet
41
+ @cms_snippet = CmsSnippet.new(params[:cms_snippet])
56
42
  end
57
43
 
44
+ def load_cms_snippet
45
+ @cms_snippet = CmsSnippet.find(params[:id])
46
+ rescue ActiveRecord::RecordNotFound
47
+ flash[:error] = 'Snippet not found'
48
+ redirect_to :action => :index
49
+ end
58
50
  end
@@ -0,0 +1,27 @@
1
+ class CmsAdmin::UploadsController < CmsAdmin::BaseController
2
+ before_filter :load_cms_upload,
3
+ :only => :destroy
4
+
5
+ def index
6
+ end
7
+
8
+ def create
9
+ @cms_upload = CmsUpload.new(:uploaded_file => params[:file])
10
+ if @cms_upload.save
11
+ render(:partial => 'cms_admin/uploads/upload', :object => @cms_upload)
12
+ else
13
+ render :nothing => true
14
+ end
15
+ end
16
+
17
+ def destroy
18
+ @cms_upload.destroy
19
+ end
20
+
21
+ protected
22
+ def load_cms_upload
23
+ @cms_upload = CmsUpload.find(params[:id])
24
+ rescue ActiveRecord::RecordNotFound
25
+ render :nothing => true
26
+ end
27
+ end
@@ -1,30 +1,33 @@
1
1
  class CmsContentController < ApplicationController
2
2
 
3
- include CmsCommon::RenderPage
4
-
5
- unloadable
3
+ before_filter :load_cms_page, :only => :render_html
4
+ before_filter :load_cms_layout, :only => [:render_css, :render_js]
5
+
6
+ def render_html
7
+ layout = @cms_page.cms_layout.app_layout.blank?? false : @cms_page.cms_layout.app_layout
8
+ render :inline => @cms_page.content, :layout => layout
9
+ end
6
10
 
7
- before_filter :parse_path, :only => :show
11
+ def render_css
12
+ render :text => @cms_layout.merged_css, :content_type => 'text/css'
13
+ end
8
14
 
9
- def show
10
- @cms_page_slug = params[:path].join('/')
11
- @cms_page = CmsPage.published.find_by_full_path(@cms_page_slug)
12
- render_page
15
+ def render_js
16
+ render :text => @cms_layout.merged_js, :content_type => 'text/javascript'
13
17
  end
18
+
19
+ protected
14
20
 
15
- def sitemap
16
- respond_to do |format|
17
- format.xml do
18
- @cms_pages = CmsPage.all
19
- end
20
- end
21
+ def load_cms_page
22
+ @cms_page = CmsPage.find_by_full_path!("/#{params[:cms_path]}")
23
+ rescue ActiveRecord::RecordNotFound
24
+ render :text => 'Page not found', :status => 404
21
25
  end
22
26
 
23
- protected
24
-
25
- def parse_path
26
- params[:format] = (params[:path].last && (match = params[:path].last.match(/\.(.*?)$/)) && match[1]) || 'html'
27
- params[:path].last && params[:path].last.gsub!(/\.(.*?)$/, '')
27
+ def load_cms_layout
28
+ @cms_layout = CmsLayout.find(params[:id])
29
+ rescue ActiveRecord::RecordNotFound
30
+ render :nothing => true, :status => 404
28
31
  end
29
32
 
30
33
  end
@@ -4,12 +4,26 @@ class CmsBlock < ActiveRecord::Base
4
4
  belongs_to :cms_page
5
5
 
6
6
  # -- Validations ----------------------------------------------------------
7
- validates_presence_of :label
8
- validates_uniqueness_of :label, :scope => :cms_page_id
7
+ validates :label,
8
+ :presence => true,
9
+ :uniqueness => { :scope => :cms_page_id }
9
10
 
10
- # -- Scopes ---------------------------------------------------------------
11
- named_scope :with_label, lambda{ |name|{
12
- :conditions => {:label => name}
13
- }}
11
+ # -- Class Methods --------------------------------------------------------
12
+ class << self
13
+ # making sure that the correct class is initialized based on :type passed
14
+ # primarily important for form processing
15
+ def new_with_cast(*args, &block)
16
+ if (h = args.first).is_a?(Hash) && (type = h[:type] || h['type']) && (klass = type.constantize) != self
17
+ return klass.new(*args, &block)
18
+ end
19
+ new_without_cast(*args, &block)
20
+ end
21
+ alias_method_chain :new, :cast
22
+
23
+ def initialize_or_find(cms_page, label)
24
+ cms_page.cms_blocks.detect{ |b| b.label == label.to_s } ||
25
+ self.new(:label => label.to_s, :type => self.name, :cms_page => cms_page)
26
+ end
27
+ end
14
28
 
15
29
  end
@@ -1,102 +1,56 @@
1
1
  class CmsLayout < ActiveRecord::Base
2
2
 
3
+ acts_as_tree
4
+
3
5
  # -- Relationships --------------------------------------------------------
4
- acts_as_tree :counter_cache => :children_count
5
6
  has_many :cms_pages, :dependent => :nullify
6
7
 
7
8
  # -- Validations ----------------------------------------------------------
8
- validates_presence_of :label
9
- validates_uniqueness_of :label
10
- validate :validate_block_presence,
11
- :validate_proper_relationship
12
-
13
- # -- AR Callbacks ---------------------------------------------------------
14
- before_save :flag_as_extendable,
15
- :update_page_blocks
16
-
17
- # -- Scopes ---------------------------------------------------------------
18
- default_scope :order => 'position ASC'
19
- named_scope :extendable, :conditions => { :is_extendable => true }
20
-
9
+ validates :label,
10
+ :presence => true
11
+ validates :content,
12
+ :presence => true
13
+
21
14
  # -- Class Methods --------------------------------------------------------
22
- def self.options_for_select
23
- [['---', nil]] + CmsLayout.all.collect{ |l| [l.label, l.id]}
15
+ # Tree-like structure for layouts
16
+ def self.options_for_select(cms_layout = nil, current_layout = nil, depth = 0, spacer = '. . ')
17
+ out = []
18
+ [current_layout || CmsLayout.roots].flatten.each do |layout|
19
+ next if cms_layout == layout
20
+ out << [ "#{spacer*depth}#{layout.label}", layout.id ]
21
+ layout.children.each do |child|
22
+ out += options_for_select(cms_layout, child, depth + 1, spacer)
23
+ end
24
+ end
25
+ return out.compact
24
26
  end
25
27
 
28
+ # List of available application layouts
26
29
  def self.app_layouts_for_select
27
- path = "#{RAILS_ROOT}/app/views/layouts"
28
- regex = /^([a-z0-9]\w+)\.html/i
29
-
30
- app_layouts = begin
31
- Dir.entries(path).collect{|l| l.match(regex).try(:captures)}.compact.flatten
32
- rescue
33
- # no app layouts
34
- end
35
-
36
- !app_layouts.blank? ? [['---', nil]] + app_layouts : [['---', nil]]
30
+ Dir.glob(File.expand_path('app/views/layouts/*.html.*', Rails.root)).collect do |filename|
31
+ match = filename.match(/\w*.html.\w*$/)
32
+ match && match[0]
33
+ end.compact
37
34
  end
38
35
 
39
36
  # -- Instance Methods -----------------------------------------------------
40
- def content
37
+ # magical merging tag is <cms:page:content> If parent layout has this tag
38
+ # defined its content will be merged. If no such tag found, parent content
39
+ # is ignored.
40
+ def merged_content
41
41
  if parent
42
- parent.content.gsub(/\{\{\s*cms_page_block:default:.*?\}\}/, self.read_attribute(:content))
42
+ c = parent.merged_content.gsub CmsTag::PageText.regex_tag_signature('content'), content
43
+ c == parent.merged_content ? content : c
43
44
  else
44
- read_attribute(:content)
45
+ content
45
46
  end
46
47
  end
47
48
 
48
- def app_layout
49
- this_layout = read_attribute(:app_layout)
50
- if this_layout.blank?
51
- parent && parent.app_layout
52
- else
53
- this_layout
54
- end
49
+ def merged_css
50
+ self.parent ? self.parent.merged_css + self.css : self.css.to_s
55
51
  end
56
52
 
57
- def extendable_for_select
58
- [['---', nil]] + CmsLayout.extendable.all.reject{|l| ([self]+self.descendants).member?(l)}.collect{ |l| [l.label, l.id] }
59
- end
60
-
61
- def tags(options = {})
62
- CmsTag::parse_tags(self.content, options)
63
- end
64
-
65
- protected
66
-
67
- def validate_block_presence
68
- self.errors.add(:content, 'does not have any cms_blocks defined') if self.tags.empty?
69
- end
70
-
71
- def validate_proper_relationship
72
- if self.descendants.member?(parent) || self.parent == self
73
- self.errors.add(:parent_id, 'layout is invalid')
74
- end
75
- end
76
-
77
- def validate_children_against_extendable
78
- # todo
79
- end
80
-
81
- def flag_as_extendable
82
- self.is_extendable = !self.tags.select{|t| t.tag_type == 'cms_page_block' && t.label == 'default'}.blank?
83
- true
84
- end
85
-
86
- def update_page_blocks
87
- return if new_record? || !content_changed?
88
-
89
- old_tags = CmsTag::parse_tags(content_was).select{|t| ['cms_block', 'cms_page_block'].member?(t.tag_type)}.collect{|t| t.label}
90
- new_tags = CmsTag::parse_tags(content).select{|t| ['cms_block', 'cms_page_block'].member?(t.tag_type)}.collect{|t| t.label}
91
-
92
- # creating new cms_blocks for all pages using this layout
93
- labels_for_blocks = new_tags - old_tags
94
- if !labels_for_blocks.blank?
95
- cms_pages.each do |cms_page|
96
- labels_for_blocks.each do |label|
97
- cms_page.cms_blocks.create(:label => label)
98
- end
99
- end
100
- end
53
+ def merged_js
54
+ self.parent ? self.parent.merged_js + self.js : self.js.to_s
101
55
  end
102
56
  end
@@ -1,125 +1,67 @@
1
1
  class CmsPage < ActiveRecord::Base
2
2
 
3
- attr_accessor :rendered_content
4
-
5
- # -- Relationships --------------------------------------------------------
3
+ # -- AR Extensions --------------------------------------------------------
6
4
  acts_as_tree :counter_cache => :children_count
7
- acts_as_published
8
- acts_as_categorized
9
-
10
- belongs_to :cms_layout
11
- has_many :cms_blocks,
12
- :dependent => :destroy
13
- belongs_to :redirect_to_page,
14
- :class_name => 'CmsPage',
15
- :foreign_key => :redirect_to_page_id
16
- has_one :redirected_from_page,
17
- :class_name => 'CmsPage',
18
- :foreign_key => :redirect_to_page_id
19
5
 
20
- #-- Validations -----------------------------------------------------------
21
- validates_presence_of :cms_layout_id,
22
- :unless => lambda{|p| p.redirect_to_page}
23
- validates_presence_of :label
24
- validates_presence_of :slug,
25
- :unless => lambda{|p| CmsPage.count == 0 || p == CmsPage.root}
26
- validates_format_of :slug,
27
- :with => /^\w[a-z0-9_-]*$/i,
28
- :unless => lambda{|p| CmsPage.count == 0 || p == CmsPage.root}
29
- validates_uniqueness_of :full_path
6
+ attr_accessor :cms_tags
30
7
 
31
- validate :validate_redirect_to
8
+ # -- Relationships --------------------------------------------------------
9
+ belongs_to :cms_layout
10
+ has_many :cms_blocks,
11
+ :dependent => :destroy
12
+ accepts_nested_attributes_for :cms_blocks
32
13
 
33
- # -- AR Callbacks ---------------------------------------------------------
14
+ # -- Callbacks ------------------------------------------------------------
34
15
  before_validation :assign_full_path
35
- after_save :save_blocks,
36
- :sync_child_slugs
16
+ after_save :sync_child_pages
17
+
18
+ # -- Validations ----------------------------------------------------------
19
+ validates :label,
20
+ :presence => true
21
+ validates :slug,
22
+ :presence => true,
23
+ :format => /^\w[a-z0-9_-]*$/i,
24
+ :unless => lambda{ |p| p == CmsPage.root || CmsPage.count == 0 }
25
+ validates :cms_layout,
26
+ :presence => true
27
+ validates :full_path,
28
+ :presence => true,
29
+ :uniqueness => true
37
30
 
38
- # -- Scopes ---------------------------------------------------------------
39
- default_scope :order => 'position ASC'
40
- named_scope :sections,
41
- :conditions => {:is_section => true}
42
-
43
31
  # -- Class Methods --------------------------------------------------------
44
- def self.[](slug)
45
- CmsPage.find_by_slug!(slug)
46
- end
47
-
48
- # -- Instance Methods -----------------------------------------------------
49
- def content
50
- # TODO: Add column to cache the render output. pointless to run it all the time
51
- render_content
52
- end
53
-
54
- # FIX: Recursive Tag/Content Replacement
55
- # Works, but potentionally dangerous and not particularly efficient
56
- def render_content(content = nil)
57
- content = cms_layout.content.dup if !content
58
- while (!(tags = CmsTag::parse_tags(content, :page => self).sort_by{|t| t.class.render_priority}).blank?)
59
- tags.each do |tag|
60
- content.gsub!(tag.regex) { tag.render }
61
- end
62
- end
63
- content
64
- end
65
-
66
- def blocks=(blocks)
67
- blocks.each do |label, params|
68
- if !self.new_record? && !(block = self.cms_blocks.select{|b| b.label == label}.first).blank?
69
- block.attributes = params
70
- else
71
- self.cms_blocks.build({:label => label}.merge(params))
72
- end
32
+ # Tree-like structure for pages
33
+ def self.options_for_select(cms_page = nil, current_page = nil, depth = 0, spacer = '. . ')
34
+ return [] if (current_page ||= CmsPage.root) == cms_page || !current_page
35
+ out = [[ "#{spacer*depth}#{current_page.label}", current_page.id ]]
36
+ current_page.children.each do |child|
37
+ out += options_for_select(cms_page, child, depth + 1, spacer)
73
38
  end
39
+ return out.compact
74
40
  end
75
41
 
76
- def pages_for_select(page = CmsPage.root, level = 0, exclude_self = false)
77
- page ||= CmsPage.root
78
- return [] if !page || (page == self && exclude_self)
79
- out = [["#{". . " * level} #{page.label}", page.id]]
80
- page.children.each do |child|
81
- if child.children.count > 0
82
- out += pages_for_select(child, level + 1, exclude_self)
83
- else
84
- unless (child == self && exclude_self)
85
- out += [["#{". . " * (level + 1)} #{child.label}", child.id]]
86
- end
87
- end
88
- end
89
- out
90
- end
91
-
92
- def full_path
93
- "/#{read_attribute(:full_path)}"
42
+ # -- Instance Methods -----------------------------------------------------
43
+ # Processing content will return rendered content and will populate
44
+ # self.cms_tags with instances of CmsTag
45
+ def content
46
+ cms_layout ? CmsTag.process_content(self, cms_layout.merged_content) : ''
94
47
  end
95
48
 
96
- def cms_block_content(label, content)
97
- self.cms_blocks.select{|b| b.label.to_s == label.to_s}.first.try(content)
49
+ # Array of cms_tags for a page. Content generation is called if forced.
50
+ # These also include initialized cms_blocks if present
51
+ def cms_tags(force = false)
52
+ self.content if force
53
+ @cms_tags ||= []
98
54
  end
99
55
 
100
56
  protected
101
57
 
102
58
  def assign_full_path
103
- self.full_path = (self.ancestors.reverse.collect{|p| p.slug}.compact + [self.slug]).join('/')
59
+ self.full_path = self.parent ? "#{self.parent.full_path}/#{self.slug}".squeeze('/') : '/'
104
60
  end
105
61
 
106
- def validate_redirect_to
107
- if self.redirect_to_page && (self == self.redirect_to_page || self.redirect_to_page.redirect_to_page)
108
- self.errors.add(:redirect_to_page_id)
109
- end
62
+ # Forcing re-saves for child pages so they can update full_paths
63
+ def sync_child_pages
64
+ children.each{ |p| p.save! } if full_path_changed?
110
65
  end
111
66
 
112
- def save_blocks
113
- self.cms_blocks.each do |b|
114
- b.save! if b.changed?
115
- end
116
- end
117
-
118
- def sync_child_slugs
119
- if slug_changed?
120
- children.each do |child|
121
- child.save!
122
- end
123
- end
124
- end
125
- end
67
+ end