refinerycms-pages 1.0.11 → 2.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 (126) hide show
  1. data/app/controllers/refinery/admin/page_parts_controller.rb +26 -0
  2. data/app/controllers/refinery/admin/pages_controller.rb +77 -0
  3. data/app/controllers/refinery/admin/pages_dialogs_controller.rb +91 -0
  4. data/app/controllers/refinery/page_sweeper.rb +29 -0
  5. data/app/controllers/refinery/pages_controller.rb +103 -0
  6. data/app/helpers/refinery/pages/content_pages_helper.rb +26 -0
  7. data/app/helpers/refinery/pages_helper.rb +4 -0
  8. data/app/models/refinery/page.rb +467 -0
  9. data/app/models/refinery/page_part.rb +33 -0
  10. data/app/presenters/refinery/page_presenter.rb +7 -0
  11. data/app/views/admin/pages/_sortable_list.html.erb +7 -4
  12. data/app/views/{admin → refinery/admin}/pages/_actions.html.erb +5 -4
  13. data/app/views/refinery/admin/pages/_form.html.erb +63 -0
  14. data/app/views/{admin → refinery/admin}/pages/_form_advanced_options.html.erb +35 -16
  15. data/app/views/refinery/admin/pages/_form_advanced_options_seo.html.erb +3 -0
  16. data/app/views/{admin → refinery/admin}/pages/_form_fields_after_title.html.erb +0 -0
  17. data/app/views/{admin → refinery/admin}/pages/_form_new_page_parts.html.erb +5 -7
  18. data/app/views/{admin → refinery/admin}/pages/_form_page_parts.html.erb +19 -11
  19. data/app/views/{admin → refinery/admin}/pages/_locale_picker.html.erb +3 -3
  20. data/app/views/refinery/admin/pages/_page.html.erb +48 -0
  21. data/app/views/{admin → refinery/admin}/pages/_page_part_field.html.erb +1 -1
  22. data/app/views/refinery/admin/pages/_records.html.erb +14 -0
  23. data/app/views/refinery/admin/pages/_sortable_list.html.erb +4 -0
  24. data/app/views/refinery/admin/pages/children.html.erb +1 -0
  25. data/app/views/refinery/admin/pages/edit.html.erb +1 -0
  26. data/app/views/refinery/admin/pages/index.html.erb +9 -0
  27. data/app/views/refinery/admin/pages/new.html.erb +1 -0
  28. data/app/views/refinery/admin/pages_dialogs/_page_link.html.erb +20 -0
  29. data/app/views/{admin → refinery/admin}/pages_dialogs/link_to.html.erb +31 -36
  30. data/app/views/refinery/pages/home.html.erb +1 -0
  31. data/app/views/refinery/pages/show.html.erb +1 -0
  32. data/config/locales/bg.yml +81 -73
  33. data/config/locales/cs.yml +71 -72
  34. data/config/locales/da.yml +69 -72
  35. data/config/locales/de.yml +69 -72
  36. data/config/locales/el.yml +70 -72
  37. data/config/locales/en.yml +88 -73
  38. data/config/locales/es.yml +70 -73
  39. data/config/locales/fi.yml +70 -73
  40. data/config/locales/fr.yml +69 -72
  41. data/config/locales/it.yml +92 -89
  42. data/config/locales/ja.yml +72 -0
  43. data/config/locales/ko.yml +83 -0
  44. data/config/locales/lt.yml +71 -73
  45. data/config/locales/lv.yml +71 -74
  46. data/config/locales/nb.yml +69 -72
  47. data/config/locales/nl.yml +68 -71
  48. data/config/locales/pl.yml +70 -73
  49. data/config/locales/pt-BR.yml +70 -73
  50. data/config/locales/pt-PT.yml +75 -0
  51. data/config/locales/rs.yml +69 -72
  52. data/config/locales/ru.yml +77 -96
  53. data/config/locales/sk.yml +69 -72
  54. data/config/locales/sl.yml +68 -71
  55. data/config/locales/sv.yml +69 -72
  56. data/config/locales/vi.yml +69 -72
  57. data/config/locales/zh-CN.yml +75 -72
  58. data/config/locales/zh-TW.yml +69 -72
  59. data/config/routes.rb +10 -5
  60. data/db/migrate/20100913234708_create_refinerycms_pages_schema.rb +49 -43
  61. data/db/seeds.rb +41 -0
  62. data/lib/generators/refinery/pages/pages_generator.rb +21 -0
  63. data/lib/generators/refinery/pages/templates/config/initializers/refinery/pages.rb.erb +44 -0
  64. data/lib/refinery/pages/admin/instance_methods.rb +10 -8
  65. data/lib/refinery/pages/configuration.rb +44 -0
  66. data/lib/refinery/pages/content_page_presenter.rb +33 -0
  67. data/lib/refinery/pages/content_presenter.rb +56 -0
  68. data/lib/refinery/pages/engine.rb +73 -0
  69. data/lib/refinery/pages/instance_methods.rb +12 -26
  70. data/lib/refinery/pages/page_part_section_presenter.rb +19 -0
  71. data/lib/refinery/pages/section_presenter.rb +69 -0
  72. data/lib/{pages/tabs.rb → refinery/pages/tab.rb} +0 -0
  73. data/lib/refinery/pages/title_section_presenter.rb +14 -0
  74. data/lib/refinery/pages/type.rb +17 -0
  75. data/lib/refinery/pages/types.rb +32 -0
  76. data/lib/refinery/pages.rb +55 -0
  77. data/lib/refinerycms-pages.rb +1 -61
  78. data/refinerycms-pages.gemspec +17 -118
  79. data/spec/factories/pages.rb +5 -0
  80. data/spec/helpers/refinery/pages/content_pages_helper_spec.rb +44 -0
  81. data/spec/lib/generators/refinery/pages/pages_generator_spec.rb +29 -0
  82. data/spec/lib/pages/content_page_presenter_spec.rb +43 -0
  83. data/spec/lib/pages/content_presenter_spec.rb +97 -0
  84. data/spec/lib/pages/page_part_section_presenter_spec.rb +35 -0
  85. data/spec/lib/pages/section_presenter_spec.rb +86 -0
  86. data/spec/lib/pages/title_section_presenter_spec.rb +21 -0
  87. data/spec/lib/pages_spec.rb +26 -0
  88. data/spec/models/refinery/page_spec.rb +415 -0
  89. data/spec/requests/refinery/admin/pages_spec.rb +581 -0
  90. data/spec/requests/refinery/pages_spec.rb +302 -0
  91. metadata +162 -153
  92. data/app/controllers/admin/page_parts_controller.rb +0 -24
  93. data/app/controllers/admin/pages_controller.rb +0 -68
  94. data/app/controllers/admin/pages_dialogs_controller.rb +0 -85
  95. data/app/controllers/pages_controller.rb +0 -33
  96. data/app/helpers/pages_helper.rb +0 -2
  97. data/app/models/page.rb +0 -391
  98. data/app/models/page_part.rb +0 -29
  99. data/app/presenters/page_presenter.rb +0 -7
  100. data/app/views/admin/pages/_form.html.erb +0 -61
  101. data/app/views/admin/pages/_form_advanced_options_seo.html.erb +0 -4
  102. data/app/views/admin/pages/_page.html.erb +0 -33
  103. data/app/views/admin/pages/_records.html.erb +0 -14
  104. data/app/views/admin/pages/edit.html.erb +0 -1
  105. data/app/views/admin/pages/index.html.erb +0 -11
  106. data/app/views/admin/pages/new.html.erb +0 -1
  107. data/app/views/admin/pages_dialogs/_page_link.html.erb +0 -14
  108. data/app/views/pages/home.html.erb +0 -1
  109. data/app/views/pages/show.html.erb +0 -1
  110. data/config/locales/jp.yml +0 -75
  111. data/config/locales/lolcat.yml +0 -76
  112. data/db/migrate/20101214040815_translate_page_plugin.rb +0 -29
  113. data/db/migrate/20101216194133_remove_cached_slug_from_pages.rb +0 -11
  114. data/db/migrate/20110307025652_translate_custom_title_on_pages.rb +0 -26
  115. data/db/migrate/20110314213540_remove_translated_fields_from_pages.rb +0 -13
  116. data/db/migrate/20110329080451_create_seo_meta.rb +0 -89
  117. data/db/seeds/pages.rb +0 -42
  118. data/features/manage_pages.feature +0 -48
  119. data/features/step_definitions/page_steps.rb +0 -72
  120. data/features/support/paths.rb +0 -28
  121. data/features/translate_pages.feature +0 -40
  122. data/features/visit_pages.feature +0 -68
  123. data/lib/gemspec.rb +0 -40
  124. data/lib/generators/refinerycms_pages_generator.rb +0 -8
  125. data/lib/pages/marketable_routes.rb +0 -12
  126. data/spec/models/page_spec.rb +0 -235
@@ -0,0 +1,26 @@
1
+ module ::Refinery
2
+ module Admin
3
+ class PagePartsController < ::Refinery::AdminController
4
+
5
+ def new
6
+ render :partial => '/refinery/admin/pages/page_part_field', :locals => {
7
+ :part => ::Refinery::PagePart.new(:title => params[:title], :body => params[:body]),
8
+ :new_part => true,
9
+ :part_index => params[:part_index]
10
+ }
11
+ end
12
+
13
+ def destroy
14
+ part = ::Refinery::PagePart.find(params[:id])
15
+ page = part.page
16
+ if part.destroy
17
+ page.reposition_parts!
18
+ render :text => "'#{part.title}' deleted."
19
+ else
20
+ render :text => "'#{part.title}' not deleted."
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,77 @@
1
+ module Refinery
2
+ module Admin
3
+ class PagesController < Refinery::AdminController
4
+ cache_sweeper Refinery::PageSweeper
5
+
6
+ crudify :'refinery/page',
7
+ :order => "lft ASC",
8
+ :include => [:translations, :children],
9
+ :paging => false
10
+
11
+ after_filter lambda{::Refinery::Page.expire_page_caching}, :only => [:update_positions]
12
+
13
+ before_filter :load_valid_templates, :only => [:edit, :new]
14
+
15
+ before_filter :restrict_access, :only => [:create, :update, :update_positions, :destroy],
16
+ :if => proc { Refinery.i18n_enabled? }
17
+
18
+ def new
19
+ @page = Refinery::Page.new(params.except(:controller, :action, :switch_locale))
20
+ Refinery::Pages.default_parts_for(@page).each_with_index do |page_part, index|
21
+ @page.parts << Refinery::PagePart.new(:title => page_part, :position => index)
22
+ end
23
+ end
24
+
25
+ def children
26
+ @page = find_page
27
+ render :layout => false
28
+ end
29
+
30
+ protected
31
+
32
+ def find_page
33
+ @page = Refinery::Page.find_by_path_or_id(params[:path], params[:id])
34
+ end
35
+ alias_method :page, :find_page
36
+
37
+ # We can safely assume ::Refinery::I18n is defined because this method only gets
38
+ # Invoked when the before_filter from the plugin is run.
39
+ def globalize!
40
+ unless action_name.to_s == 'index'
41
+ super
42
+
43
+ # Needs to take into account that slugs are translated now
44
+ # # Check whether we need to override e.g. on the pages form.
45
+ # unless params[:switch_locale] || @page.nil? || @page.new_record? || @page.slugs.where({
46
+ # :locale => Refinery::I18n.current_locale
47
+ # }).empty?
48
+ # @page.slug = @page.slugs.first if @page.slug.nil? && @page.slugs.any?
49
+ # Thread.current[:globalize_locale] = @page.slug.locale if @page.slug
50
+ # end
51
+ else
52
+ # Always display the tree of pages from the default frontend locale.
53
+ Thread.current[:globalize_locale] = params[:switch_locale].try(:to_sym) || Refinery::I18n.default_frontend_locale
54
+ end
55
+ end
56
+
57
+ def load_valid_templates
58
+ @valid_layout_templates = Refinery::Pages.layout_template_whitelist &
59
+ Refinery::Pages.valid_templates('app', 'views', '{layouts,refinery/layouts}', '*html*')
60
+
61
+ @valid_view_templates = Refinery::Pages.view_template_whitelist &
62
+ Refinery::Pages.valid_templates('app', 'views', '{pages,refinery/pages}', '*html*')
63
+ end
64
+
65
+ def restrict_access
66
+ if current_refinery_user.has_role?(:translator) && !current_refinery_user.has_role?(:superuser) &&
67
+ (params[:switch_locale].blank? || params[:switch_locale] == Refinery::I18n.default_frontend_locale.to_s)
68
+ flash[:error] = t('translator_access', :scope => 'refinery.admin.pages')
69
+ redirect_to refinery.admin_pages_path
70
+ end
71
+
72
+ return true
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,91 @@
1
+ require 'net/http'
2
+
3
+ module ::Refinery
4
+ module Admin
5
+ class PagesDialogsController < ::Refinery::Admin::DialogsController
6
+
7
+ def link_to
8
+ # Get the switch_local variable to determine the locale we're currently editing
9
+ # Set up Globalize with our current locale
10
+ if ::Refinery.i18n_enabled?
11
+ Thread.current[:globalize_locale] = params[:switch_locale] || Refinery::I18n.default_locale
12
+ end
13
+
14
+ @pages = ::Refinery::Page.roots.paginate(:page => params[:page], :per_page => ::Refinery::Page.per_page(true))
15
+
16
+ @pages = @pages.with_globalize if ::Refinery.i18n_enabled?
17
+
18
+ if ::Refinery::Plugins.registered.names.include?('refinery_files')
19
+ @resources = Resource.paginate(:page => params[:resource_page], :per_page => Resource.per_page(true)).
20
+ order('created_at DESC')
21
+
22
+ # resource link
23
+ if params[:current_link].present?
24
+ is_resource_link = params[:current_link].include?("/system/resources")
25
+ end
26
+ end
27
+
28
+ # web address link
29
+ @web_address_text = "http://"
30
+ @web_address_text = params[:current_link] if params[:current_link].to_s =~ /^http:\/\//
31
+ @web_address_target_blank = (params[:target_blank] == "true")
32
+
33
+ # mailto link
34
+ if params[:current_link].present?
35
+ if params[:current_link] =~ /^mailto:/
36
+ @email_address_text = params[:current_link].split("mailto:")[1].split('?')[0]
37
+ end
38
+ @email_default_subject_text = params[:current_link].split('?subject=')[1] || params[:subject]
39
+ @email_default_body_text = params[:current_link].split('?body=')[1] || params[:body]
40
+ end
41
+
42
+ if params[:paginating].present?
43
+ @page_area_selected = (params[:paginating] == "your_page")
44
+ @resource_area_selected = (params[:paginating] == "resource_file")
45
+ else
46
+ @page_area_selected = (!is_resource_link and @web_address_text == "http://" and @email_address_text.blank?)
47
+ @web_address_area_selected = (@web_address_text != "http://")
48
+ @email_address_area_selected = @email_address_text.present?
49
+ @resource_area_selected = is_resource_link
50
+ end
51
+ end
52
+
53
+ def test_url
54
+ begin
55
+ timeout(5) do
56
+ unless params[:url].blank?
57
+ url = URI.parse(params[:url])
58
+ if url.host.nil? && params[:url].start_with?('/')
59
+ url.host = URI.parse(request.url).host
60
+ end
61
+
62
+ result = case Net::HTTP.get_response(url)
63
+ when Net::HTTPSuccess, Net::HTTPRedirection
64
+ 'success'
65
+ else
66
+ 'failure'
67
+ end
68
+
69
+ render :json => {:result => result}
70
+ end
71
+ end
72
+ rescue
73
+ render :json => {:result => 'failure'}
74
+ end
75
+ end
76
+
77
+ def test_email
78
+ if params[:email].present?
79
+ valid = params[:email] =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
80
+
81
+ render :json => if valid
82
+ {:result => 'success'}
83
+ else
84
+ {:result => 'failure'}
85
+ end
86
+ end
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,29 @@
1
+ module Refinery
2
+ class PageSweeper < ActionController::Caching::Sweeper
3
+ observe Page
4
+
5
+ def after_create(page)
6
+ expire_cache
7
+ end
8
+
9
+ def after_update(page)
10
+ expire_cache
11
+ end
12
+
13
+ def after_destroy(page)
14
+ expire_cache
15
+ end
16
+
17
+ protected
18
+ def expire_cache
19
+ # TODO: Where does page_cache_directory come from??
20
+ return unless page_cache_directory
21
+ page_cache_directory = Pathname.new(page_cache_directory.to_s)
22
+
23
+ # Delete the full Cache
24
+ if (cache_root = page_cache_directory.join('refinery', 'cache', 'pages')).directory?
25
+ cache_root.rmdir
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,103 @@
1
+ module Refinery
2
+ class PagesController < ::ApplicationController
3
+ before_filter :find_page, :except => [:preview]
4
+
5
+ # Save whole Page after delivery
6
+ after_filter { |c| c.write_cache? }
7
+
8
+ # This action is usually accessed with the root path, normally '/'
9
+ def home
10
+ render_with_templates?
11
+ end
12
+
13
+ # This action can be accessed normally, or as nested pages.
14
+ # Assuming a page named "mission" that is a child of "about",
15
+ # you can access the pages with the following URLs:
16
+ #
17
+ # GET /pages/about
18
+ # GET /about
19
+ #
20
+ # GET /pages/mission
21
+ # GET /about/mission
22
+ #
23
+ def show
24
+ if current_user_can_view_page?
25
+ if should_skip_to_first_child?
26
+ redirect_to refinery.url_for(first_live_child.url)
27
+ elsif page.link_url.present?
28
+ redirect_to page.link_url
29
+ else
30
+ if requested_friendly_id != page.friendly_id
31
+ redirect_to refinery.url_for(page.url), :status => 301
32
+ else
33
+ render_with_templates?
34
+ end
35
+ end
36
+ else
37
+ error_404
38
+ end
39
+ end
40
+
41
+ def preview
42
+ if page(fallback_to_404 = false)
43
+ # Preview existing pages
44
+ @page.attributes = params[:page]
45
+ elsif params[:page]
46
+ # Preview a non-persisted page
47
+ @page = Page.new(params[:page])
48
+ end
49
+
50
+ render_with_templates?(:action => :show)
51
+ end
52
+
53
+ protected
54
+
55
+ def requested_friendly_id
56
+ "#{params[:path]}/#{params[:id]}".split('/').last
57
+ end
58
+
59
+ def should_skip_to_first_child?
60
+ page.skip_to_first_child && first_live_child
61
+ end
62
+
63
+ def current_user_can_view_page?
64
+ page.live? || current_refinery_user_can_access?("refinery_pages")
65
+ end
66
+
67
+ def current_refinery_user_can_access?(plugin)
68
+ refinery_user? && current_refinery_user.authorized_plugins.include?(plugin)
69
+ end
70
+
71
+ def first_live_child
72
+ page.children.order('lft ASC').live.first
73
+ end
74
+
75
+ def find_page(fallback_to_404 = true)
76
+ @page ||= case action_name
77
+ when "home"
78
+ Refinery::Page.where(:link_url => '/').first
79
+ when "show", "preview"
80
+ Refinery::Page.find_by_path_or_id(params[:path], params[:id])
81
+ end
82
+ @page || (error_404 if fallback_to_404)
83
+ end
84
+
85
+ alias_method :page, :find_page
86
+
87
+ def render_with_templates?(render_options = {})
88
+ if Refinery::Pages.use_layout_templates && page.layout_template.present?
89
+ render_options[:layout] = page.layout_template
90
+ end
91
+ if Refinery::Pages.use_view_templates && page.view_template.present?
92
+ render_options[:action] = page.view_template
93
+ end
94
+ render render_options if render_options.any?
95
+ end
96
+
97
+ def write_cache?
98
+ if Refinery::Pages.cache_pages_full
99
+ cache_page(response.body, File.join('', 'refinery', 'cache', 'pages', request.path.sub("//", "/")).to_s)
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,26 @@
1
+ module ::Refinery
2
+ module Pages
3
+ module ContentPagesHelper
4
+ # Build the html for a Refinery CMS page object by creating a ContentPagePresenter. This is a
5
+ # specialised type of ContentPresenter, so the object is then passed to render_content_presenter
6
+ # to get its html. The options are passed to that method, so see render_content_presenter for
7
+ # more details.
8
+ def render_content_page(page, options = {})
9
+ content_page_presenter = Refinery::Pages::ContentPagePresenter.new(page, page_title)
10
+ render_content_presenter(content_page_presenter, options)
11
+ end
12
+
13
+ # Pass the options into a ContentPresenter object and return its html. For more
14
+ # details see Refinery::Pages::ContentPresenter (and its subclasses).
15
+ # This method also checks for template overrides. Any template rendered by the
16
+ # current action may specify content_for a section using the section's id. For this
17
+ # reason, sections should not have an ID which you would normally be using for content_for,
18
+ # so avoid common layout names such as :header, :footer, etc.
19
+ def render_content_presenter(content_page, options = {})
20
+ content_page.hide_sections(options[:hide_sections]) if options[:hide_sections]
21
+ content_page.fetch_template_overrides {|section_id| content_for(section_id)}
22
+ content_page.to_html(options[:can_use_fallback])
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ module ::Refinery
2
+ module PagesHelper
3
+ end
4
+ end