publinator 0.0.2 → 0.0.4

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 (143) hide show
  1. data/README.rdoc +7 -1
  2. data/app/assets/javascripts/publinator/manage/sections.js +2 -0
  3. data/app/assets/stylesheets/publinator/manage/sections.css +4 -0
  4. data/app/controllers/publinator/application_controller.rb +5 -5
  5. data/app/controllers/publinator/home_controller.rb +4 -4
  6. data/app/controllers/publinator/manage/publishable_controller.rb +14 -10
  7. data/app/controllers/publinator/manage/sections_controller.rb +29 -0
  8. data/app/controllers/publinator/publishable_controller.rb +3 -3
  9. data/app/controllers/publinator/section_controller.rb +36 -0
  10. data/app/helpers/publinator/manage/sections_helper.rb +4 -0
  11. data/app/models/publinator/domain_name.rb +13 -0
  12. data/app/models/publinator/page.rb +7 -0
  13. data/app/models/publinator/publication.rb +19 -16
  14. data/app/models/publinator/publishable.rb +52 -11
  15. data/app/models/publinator/publishable_type.rb +1 -1
  16. data/app/models/publinator/section.rb +25 -0
  17. data/app/models/publinator/site.rb +5 -4
  18. data/app/views/publinator/home/index.html.erb +1 -1
  19. data/app/views/publinator/manage/publishable/_form.html.erb +4 -1
  20. data/app/views/publinator/manage/sections/_form.html.erb +10 -0
  21. data/app/views/publinator/manage/sections/edit.html.erb +3 -0
  22. data/app/views/publinator/manage/sections/index.html.erb +16 -0
  23. data/app/views/publinator/manage/sections/new.html.erb +3 -0
  24. data/app/views/publinator/manage/sections/show.html.erb +2 -0
  25. data/config/routes.rb +41 -25
  26. data/db/migrate/20121011191348_create_publinator_sections.rb +13 -0
  27. data/db/migrate/20121017134533_create_publinator_pages.rb +14 -0
  28. data/lib/generators/publishable/publishable_generator.rb +1 -1
  29. data/lib/generators/publishable/templates/app/models/publishable_migration.rb.erb +5 -3
  30. data/lib/publinator/engine.rb +1 -0
  31. data/lib/publinator/version.rb +1 -1
  32. metadata +68 -228
  33. data/test/dummy/README.rdoc +0 -261
  34. data/test/dummy/Rakefile +0 -7
  35. data/test/dummy/app/assets/javascripts/application.js +0 -15
  36. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  37. data/test/dummy/app/controllers/application_controller.rb +0 -3
  38. data/test/dummy/app/helpers/application_helper.rb +0 -2
  39. data/test/dummy/app/models/article.rb +0 -5
  40. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  41. data/test/dummy/config/application.rb +0 -56
  42. data/test/dummy/config/boot.rb +0 -10
  43. data/test/dummy/config/database.yml +0 -25
  44. data/test/dummy/config/environment.rb +0 -5
  45. data/test/dummy/config/environments/development.rb +0 -37
  46. data/test/dummy/config/environments/production.rb +0 -67
  47. data/test/dummy/config/environments/test.rb +0 -37
  48. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  49. data/test/dummy/config/initializers/inflections.rb +0 -15
  50. data/test/dummy/config/initializers/mime_types.rb +0 -5
  51. data/test/dummy/config/initializers/secret_token.rb +0 -7
  52. data/test/dummy/config/initializers/session_store.rb +0 -8
  53. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  54. data/test/dummy/config/locales/en.yml +0 -5
  55. data/test/dummy/config/routes.rb +0 -3
  56. data/test/dummy/config.ru +0 -4
  57. data/test/dummy/db/development.sqlite3 +0 -0
  58. data/test/dummy/db/migrate/20120725204706_create_publinator_sites.publinator.rb +0 -17
  59. data/test/dummy/db/migrate/20120725204707_create_publinator_domain_names.publinator.rb +0 -14
  60. data/test/dummy/db/migrate/20120725204708_create_publinator_publications.publinator.rb +0 -16
  61. data/test/dummy/db/migrate/20120725204709_create_publinator_publication_states.publinator.rb +0 -10
  62. data/test/dummy/db/migrate/20120725204710_create_publinator_workflows.publinator.rb +0 -10
  63. data/test/dummy/db/migrate/20120725204711_create_publinator_workflow_steps.publinator.rb +0 -15
  64. data/test/dummy/db/migrate/20120725204712_create_publinator_site_workflows.publinator.rb +0 -12
  65. data/test/dummy/db/migrate/20120725204713_create_publinator_publishables.publinator.rb +0 -10
  66. data/test/dummy/db/migrate/20120727005853_create_versions.publinator.rb +0 -19
  67. data/test/dummy/db/migrate/20120727005854_create_publinator_publishable_types.publinator.rb +0 -10
  68. data/test/dummy/db/migrate/20120824145846_create_articles.rb +0 -19
  69. data/test/dummy/db/schema.rb +0 -113
  70. data/test/dummy/db/seeds.rb +0 -39
  71. data/test/dummy/db/test.sqlite3 +0 -0
  72. data/test/dummy/features/multiple_home_pages.feature +0 -14
  73. data/test/dummy/log/development.log +0 -40231
  74. data/test/dummy/log/test.log +0 -7
  75. data/test/dummy/public/404.html +0 -26
  76. data/test/dummy/public/422.html +0 -26
  77. data/test/dummy/public/500.html +0 -25
  78. data/test/dummy/public/favicon.ico +0 -0
  79. data/test/dummy/script/rails +0 -6
  80. data/test/dummy/tmp/cache/assets/C4F/360/sprockets%2F8f1f223e5a170f82017965822b6f7430 +0 -0
  81. data/test/dummy/tmp/cache/assets/C50/CE0/sprockets%2F76132a75085ce5f547460e8535ca5340 +0 -0
  82. data/test/dummy/tmp/cache/assets/C63/990/sprockets%2F11618b29357ca8c1c450722c20c91a00 +0 -0
  83. data/test/dummy/tmp/cache/assets/C72/990/sprockets%2F8be9281634a42c7a01308b333b17737b +0 -0
  84. data/test/dummy/tmp/cache/assets/C85/060/sprockets%2F95985a6ff38f2781686e6429e569778b +0 -0
  85. data/test/dummy/tmp/cache/assets/CA9/470/sprockets%2F0407014b0507e7755ef657d61f712ebc +0 -0
  86. data/test/dummy/tmp/cache/assets/CC0/FC0/sprockets%2F3c56105da246486092d2bbe0a4a0d033 +0 -0
  87. data/test/dummy/tmp/cache/assets/CC2/7B0/sprockets%2Fc4c32d2ab19d396689f357ef76364436 +0 -0
  88. data/test/dummy/tmp/cache/assets/CDE/040/sprockets%2Fba0451e56a8d59da297777a7280ab063 +0 -0
  89. data/test/dummy/tmp/cache/assets/D03/310/sprockets%2F525cf5b3d9e3504ba06702b64e0c681e +0 -0
  90. data/test/dummy/tmp/cache/assets/D08/DE0/sprockets%2Ff4a1d4922a38c27425da2e144e59c6d3 +0 -0
  91. data/test/dummy/tmp/cache/assets/D0B/2F0/sprockets%2Ff8b70628b691a6a3ecb709217a326a8b +0 -0
  92. data/test/dummy/tmp/cache/assets/D0C/310/sprockets%2Ffadeb95307575f00dda19890ec423415 +0 -0
  93. data/test/dummy/tmp/cache/assets/D12/780/sprockets%2F89400fbaf52d569e932128a538e6bf0a +0 -0
  94. data/test/dummy/tmp/cache/assets/D13/710/sprockets%2Fa59760c5818192f8007fec314febb7b3 +0 -0
  95. data/test/dummy/tmp/cache/assets/D17/C20/sprockets%2F706c0f4966a7c7fdd66a074d94a57d11 +0 -0
  96. data/test/dummy/tmp/cache/assets/D32/E40/sprockets%2F7ced78249d4c98d883ae91f492668a6b +0 -0
  97. data/test/dummy/tmp/cache/assets/D34/C20/sprockets%2Fed4da822bde7632ba05dae4472824813 +0 -0
  98. data/test/dummy/tmp/cache/assets/D39/EA0/sprockets%2F81ec8f71e453a02b8c9a40157afe0f71 +0 -0
  99. data/test/dummy/tmp/cache/assets/D3A/FA0/sprockets%2F6d1270d85395029a2c06c5c2eb4dece8 +0 -0
  100. data/test/dummy/tmp/cache/assets/D3B/EA0/sprockets%2F539fc0d8da407130f2f1f2bf088b85d3 +0 -0
  101. data/test/dummy/tmp/cache/assets/D42/9F0/sprockets%2F5eca1a27a78455737f92e6af1ade0448 +0 -0
  102. data/test/dummy/tmp/cache/assets/D42/B60/sprockets%2Fac22072df4e4aeae78d396f60468d227 +0 -0
  103. data/test/dummy/tmp/cache/assets/D42/DE0/sprockets%2Faadf8c86a222ee8e83d2821583ea0593 +0 -0
  104. data/test/dummy/tmp/cache/assets/D43/F50/sprockets%2Fc5e61a881bfc3b9e25f72694535ec40a +0 -0
  105. data/test/dummy/tmp/cache/assets/D4D/390/sprockets%2Ffe227bf86af573e51927e4d2e7436c4c +0 -0
  106. data/test/dummy/tmp/cache/assets/D5E/540/sprockets%2F00723322beecdc3eea7481c3ca15683f +0 -0
  107. data/test/dummy/tmp/cache/assets/D61/700/sprockets%2Ff5caf7e7779724575d9ad98e18e9c1e0 +0 -0
  108. data/test/dummy/tmp/cache/assets/D64/970/sprockets%2Fc82da8e1a6ea89aa065031be36b2c576 +0 -0
  109. data/test/dummy/tmp/cache/assets/D68/2E0/sprockets%2F0c4374b9e9b2aaaaa263b17b9a77f088 +0 -0
  110. data/test/dummy/tmp/cache/assets/D6C/C50/sprockets%2F712fd91829ab4f5c53bb6fa3b3d245a9 +0 -0
  111. data/test/dummy/tmp/cache/assets/D70/C60/sprockets%2Fca98bff3da133a465c5b4748a3b38f37 +0 -0
  112. data/test/dummy/tmp/cache/assets/D7B/730/sprockets%2Fa90b20db3a5c66c85d7986f4d91c9eb6 +0 -0
  113. data/test/dummy/tmp/cache/assets/D81/D70/sprockets%2F6a010131cebe8c0543864eba3cc3fdb0 +0 -0
  114. data/test/dummy/tmp/cache/assets/DA4/020/sprockets%2Fb7f430f48a4573d8975b2fb4b2ba5def +0 -0
  115. data/test/dummy/tmp/cache/assets/DA6/300/sprockets%2Fb8cef7a3ac9c4221e9c5bc582c86e149 +0 -0
  116. data/test/dummy/tmp/cache/assets/DAA/5B0/sprockets%2F9ac396884b5f7f4085dbfbf1f3bd82b0 +0 -0
  117. data/test/dummy/tmp/cache/assets/DAB/000/sprockets%2F3c9acfeb145fc77ef7932bc7b498a118 +0 -0
  118. data/test/dummy/tmp/cache/assets/DD7/DB0/sprockets%2F2e3dee6c113e8b9d5c3ffd508ea3e829 +0 -0
  119. data/test/dummy/tmp/cache/assets/DDC/610/sprockets%2Fb7e49f851b32a93fa0af9cf7be9fc283 +0 -0
  120. data/test/dummy/tmp/cache/assets/E08/B70/sprockets%2F682afca4b65d8e03784ff5da7fae4e6a +0 -0
  121. data/test/dummy/tmp/cache/assets/E38/BE0/sprockets%2Ffb2fafc55f60fd5d9a99e12a0fc53f9d +0 -0
  122. data/test/dummy/tmp/restart.txt +0 -0
  123. data/test/fixtures/publinator/publication_states.yml +0 -7
  124. data/test/fixtures/publinator/publications.yml +0 -19
  125. data/test/fixtures/publinator/publishable_types.yml +0 -7
  126. data/test/fixtures/publinator/publishables.yml +0 -7
  127. data/test/fixtures/publinator/site_workflows.yml +0 -11
  128. data/test/fixtures/publinator/workflow_steps.yml +0 -17
  129. data/test/fixtures/publinator/workflows.yml +0 -7
  130. data/test/functional/publinator/home_controller_test.rb +0 -16
  131. data/test/integration/navigation_test.rb +0 -10
  132. data/test/publinator_test.rb +0 -7
  133. data/test/test_helper.rb +0 -10
  134. data/test/unit/helpers/publinator/home_helper_test.rb +0 -6
  135. data/test/unit/publinator/domain_name_test.rb +0 -9
  136. data/test/unit/publinator/publication_state_test.rb +0 -9
  137. data/test/unit/publinator/publication_test.rb +0 -9
  138. data/test/unit/publinator/publishable_test.rb +0 -9
  139. data/test/unit/publinator/publishable_type_test.rb +0 -9
  140. data/test/unit/publinator/site_test.rb +0 -9
  141. data/test/unit/publinator/site_workflow_test.rb +0 -9
  142. data/test/unit/publinator/workflow_step_test.rb +0 -9
  143. data/test/unit/publinator/workflow_test.rb +0 -9
data/README.rdoc CHANGED
@@ -1,3 +1,9 @@
1
1
  = Publinator
2
2
 
3
- This project rocks and uses MIT-LICENSE.
3
+ Changes Pending:
4
+
5
+ * downcase classname as needed in generator
6
+
7
+ Recent changes:
8
+
9
+ * create page model inside publinator
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,23 +1,23 @@
1
1
  module Publinator
2
2
  class ApplicationController < ActionController::Base
3
3
  layout :current_layout
4
-
4
+
5
5
  helper_method :current_site, :current_domain, :current_layout, :current_site_name
6
-
6
+
7
7
  def current_site_name
8
8
  return "Publinator" if current_site.nil?
9
9
  @current_site_name ||= current_site.name
10
10
  end
11
-
11
+
12
12
  def current_site
13
13
  return nil if current_domain.nil?
14
14
  @current_site ||= current_domain.site
15
15
  end
16
-
16
+
17
17
  def current_domain
18
18
  @current_domain ||= DomainName.get_by_domain_name(request)
19
19
  end
20
-
20
+
21
21
  def current_layout
22
22
  if current_site.nil?
23
23
  "publinator/publinator"
@@ -1,15 +1,15 @@
1
1
  require_dependency "publinator/application_controller"
2
2
 
3
3
  module Publinator
4
- class HomeController < ApplicationController
4
+ class HomeController < Publinator::ApplicationController
5
5
  def index
6
6
  begin
7
7
  render "home/index"
8
8
  rescue ActionView::MissingTemplate
9
- render "publinator/home/index"
10
- end
9
+ render "publinator/home/index", :layout => current_layout
10
+ end
11
11
  end
12
-
12
+
13
13
  def page
14
14
  @publication = Publinator::Publication.get_by_slug(params[:slug])
15
15
  if @publication.nil?
@@ -3,16 +3,16 @@ require_dependency "publinator/application_controller"
3
3
  module Publinator
4
4
  class Manage::PublishableController < ApplicationController
5
5
  layout "publinator/manage"
6
-
6
+
7
7
  def index
8
8
  @publishables = Publinator::Publication.for_site(current_site.id).where(:publishable_type => params["publishable_type"].singularize.capitalize).order("updated_at desc")
9
9
  begin
10
- render "#{params[:publishable_type]}/index"
10
+ render "manage/#{params[:publishable_type]}/index"
11
11
  rescue ActionView::MissingTemplate
12
12
  render "publinator/manage/publishable/index"
13
13
  end
14
14
  end
15
-
15
+
16
16
  def show
17
17
  @publication = Publinator::Publication.find_by_publishable_type_and_slug(params[:publishable_type].singularize.capitalize, params[:id])
18
18
  @publishable = @publication.publishable_type.singularize.capitalize.constantize.send(:find, @publication.publishable_id)
@@ -22,23 +22,26 @@ module Publinator
22
22
  render "publinator/manage/publishable/show"
23
23
  end
24
24
  end
25
-
25
+
26
26
  def new
27
+ publishable_class = params['publishable_type'].singularize.capitalize.constantize
27
28
  #@publication = Publinator::Publication.find_by_publishable_type_and_publishable_id(params[:publishable_type].singularize.capitalize, params[:id])
28
- @publishable = params['publishable_type'].singularize.capitalize.constantize.send(:new, {
29
+ @publishable = publishable_class.send(:new, {
29
30
  :publication => Publinator::Publication.new(
30
31
  :publish_at => 1.day.from_now.beginning_of_day + 8.hours,
31
32
  :archive_at => 31.days.from_now.beginning_of_day,
32
- :site_id => current_site.id
33
+ :site_id => current_site.id,
34
+ :publishable_type => params['publishable_type'].singularize.capitalize
33
35
  )
34
36
  })
37
+ @field_names = (publishable_class.attribute_names - ["id", "created_at", "updated_at"]).collect{ |an| an.to_sym }
35
38
  begin
36
39
  render "#{params[:publishable_type]}/new"
37
40
  rescue ActionView::MissingTemplate
38
41
  render "publinator/manage/publishable/new"
39
42
  end
40
43
  end
41
-
44
+
42
45
  def edit
43
46
  @publication = Publinator::Publication.find_by_publishable_type_and_slug(params[:publishable_type].singularize.capitalize, params[:id])
44
47
  @publishable = @publication.publishable_type.singularize.capitalize.constantize.send(:find, @publication.publishable_id)
@@ -46,18 +49,19 @@ module Publinator
46
49
  render "#{params[:publishable_type]}/edit"
47
50
  rescue ActionView::MissingTemplate
48
51
  render "publinator/manage/publishable/edit"
49
- end
52
+ end
50
53
  end
51
-
54
+
52
55
  def create
53
56
  @publishable_type = PublishableType.find_by_name(params['publishable_type'].singularize.capitalize)
54
57
  @publishable_class = @publishable_type.name.capitalize.constantize
55
58
  publishable_params = params[@publishable_type.name.downcase.to_sym]
56
59
  publication_params = publishable_params.delete('publication').merge({ :site_id => current_site.id, :publishable_type => @publishable_type.name.capitalize })
60
+ publication_params.merge({:section_id => publishable_params[:section_id]}) if publishable_params[:section_id]
57
61
  @publication = Publinator::Publication.create!(publication_params)
58
62
  @publishable = @publishable_type.name.capitalize.constantize.send(:new, publishable_params, :publication => @publication)
59
63
 
60
- if @publishable.save
64
+ if @publishable.save
61
65
  @publication.publishable_id = @publishable.id
62
66
  @publication.save
63
67
  redirect_to "/manage/#{params[:publishable_type]}", :notice => "#{@publishable_type.name} created."
@@ -0,0 +1,29 @@
1
+ require_dependency "publinator/application_controller"
2
+
3
+ module Publinator
4
+ class Manage::SectionsController < ApplicationController
5
+
6
+ before_filter :get_section, :except => [:index, :new]
7
+
8
+ def index
9
+ @sections = current_site.sections
10
+ end
11
+
12
+ def show
13
+ end
14
+
15
+ def edit
16
+ end
17
+
18
+ def new
19
+ @section = Section.new(:site_id => current_site.id)
20
+ end
21
+
22
+ private
23
+
24
+ def get_section
25
+ @section = current_site.sections.find_by_id(params[:id])
26
+ end
27
+ end
28
+ end
29
+
@@ -1,7 +1,7 @@
1
1
  require_dependency "publinator/application_controller"
2
2
 
3
3
  module Publinator
4
- class PublishableController < ApplicationController
4
+ class PublishableController < Publinator::ApplicationController
5
5
  def index
6
6
  @publishables = current_site.publications('published', 'updated_at desc', params["publishable_type"].singularize.capitalize)
7
7
  begin
@@ -10,9 +10,9 @@ module Publinator
10
10
  render "publinator/publishable/index"
11
11
  end
12
12
  end
13
-
13
+
14
14
  def show
15
- @publication = Publinator::Publication.find_by_publishable_type_and_publishable_id(params[:publishable_type].singularize.capitalize, params[:id])
15
+ @publication = Publinator::Publication.find_by_publishable_type_and_slug(params[:publishable_type].singularize.capitalize, params[:id])
16
16
  @publishable = @publication.publishable
17
17
  begin
18
18
  render "#{params[:publishable_type]}/index"
@@ -0,0 +1,36 @@
1
+ require_dependency "publinator/application_controller"
2
+
3
+ module Publinator
4
+ class SectionController < ApplicationController
5
+ before_filter :get_section
6
+
7
+ def index
8
+ @publication = Publinator::Publication.find_by_section_id_and_slug(@section.id, 'index')
9
+ @publishable = @publication.publishable
10
+ begin
11
+ render "#{params[:section]}/index"
12
+ rescue ActionView::MissingTemplate
13
+ render "publinator/publishable/show"
14
+ end
15
+ rescue Exception => e
16
+ logger.info e.to_yaml
17
+ # redirect_to root_url, :notice => "Page not found." if @publication.nil?
18
+ end
19
+
20
+ def show
21
+ @publication = Publinator::Publication.find(:first, :conditions => ["section_id = ? and slug = ?", @section.id, params[:id]])
22
+ @publishable = @publication.publishable
23
+ begin
24
+ render "#{params[:section]}/show"
25
+ rescue ActionView::MissingTemplate
26
+ render "publinator/publishable/show"
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def get_section
33
+ @section = Publinator::Section.find(:first, :conditions => ["site_id = ? AND name = ?", current_site.id, params[:section]])
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,4 @@
1
+ module Publinator
2
+ module Manage::SectionsHelper
3
+ end
4
+ end
@@ -10,7 +10,14 @@ module Publinator
10
10
  # @param [Request]
11
11
  # @return [Domain]
12
12
  def self.get_by_domain_name(request)
13
+ @sites = Site.all.collect{ |s| s.name }
14
+ logger.info "Sites (#{Site.count}) -- #{@sites}"
15
+
16
+ @domain_names = DomainName.all.collect{ |dn| "#{dn.subdomain}.#{dn.name}"}
17
+ logger.info "DomainNames (#{DomainName.count}) -- #{@domain_names}"
18
+
13
19
  if request.env['x-forwarded-for']
20
+ logger.info "processing forwarded request..."
14
21
  origin = request.env['x-forwarded-for'].to_s
15
22
  domain_array = origin.split('.')
16
23
  domain_array_length = origin.length
@@ -22,20 +29,26 @@ module Publinator
22
29
  request_domain = "#{domain_array[domain_array_length - 2]}.#{domain_array[domain_array_length - 1]}"
23
30
  end
24
31
  else
32
+ logger.info "processing direct request..."
25
33
  request_subdomain = request.subdomain
26
34
  request_domain = request.domain
27
35
  end
28
36
  if request_domain.present?
37
+ logger.info "request_domain is #{request_domain}..."
29
38
  if request_subdomain.blank? || request_subdomain == 'www'
39
+ logger.info "request_subdomain is #{request_subdomain}..."
30
40
  @domain = self.find(:first, :conditions => ["name = ? AND (subdomain is null or subdomain = '')", request_domain])
31
41
  elsif request_subdomain.present? && request_subdomain != 'www'
42
+ logger.info "non-www request_subdomain is #{request_subdomain}..."
32
43
  @domain = self.find(:first, :conditions => ["name = ? AND subdomain = ?", request_domain, request_subdomain])
33
44
  else
34
45
  @domain = self.find(:first, :conditions => ["name = ? AND subdomain = 'www' AND anchor = ?", request_domain, true])
35
46
  end
36
47
  else
48
+ logger.info "request_domain was not found. finding default site..."
37
49
  @domain = Site.default.domain_names.detect { |d| d.default }
38
50
  end
51
+ logger.info @domain.to_yaml
39
52
  return @domain
40
53
  end
41
54
  end
@@ -0,0 +1,7 @@
1
+ module Publinator
2
+ class Page < Publishable
3
+ self.table_name = 'publinator_pages'
4
+ attr_accessible :body, :kicker, :section_id, :subtitle, :teaser, :title
5
+ belongs_to :section, :class_name => "Publinator::Section"
6
+ end
7
+ end
@@ -1,34 +1,37 @@
1
1
  module Publinator
2
2
  class Publication < ActiveRecord::Base
3
3
  # has_paper_trail
4
- attr_accessible :custom_slug, :parent_id, :publication_state_id,
4
+ attr_accessible :custom_slug, :parent_id, :publication_state_id,
5
5
  :publishable_id, :publishable_type, :site_id, :slug, :publish_at,
6
- :unpublish_at, :archive_at
6
+ :unpublish_at, :archive_at, :section_id, :default, :publishable
7
7
  belongs_to :publishable, :polymorphic => true
8
+ belongs_to :section
8
9
  belongs_to :site
9
-
10
+
10
11
  validates_uniqueness_of :custom_slug, :scope => :site_id, :allow_blank => true
11
- validates_uniqueness_of :slug, :scope => [:site_id, :publishable_type]
12
- validates_presence_of :slug, :site_id
13
- #, :publishable_type, :publishable_id
12
+ validates_presence_of :slug
13
+ validates_uniqueness_of :slug, :scope => [:site_id, :publishable_type, :section_id]
14
+ validates_presence_of :site_id
14
15
 
16
+ before_validation :generate_slug
17
+
15
18
  scope :published, where(:publication_state_id => 1)
16
19
  scope :for_site, lambda { |site_id| where("site_id = ?", site_id) }
17
-
18
- before_validation :generate_slug
19
-
20
+
20
21
  def generate_slug
21
- if self.slug.blank? || self.slug == "Temporary Title"
22
- if self.custom_slug.present?
23
- self.slug = self.custom_slug
24
- elsif publishable.present?
25
- self.slug = title.trim.gsub(" ", "-")
22
+ if slug.blank? || slug == "temporary_slug"
23
+ if custom_slug.present?
24
+ self.slug = custom_slug
25
+ elsif publishable.present? && publishable.title.present?
26
+ self.slug = publishable.title.strip.downcase.gsub(" ", "-")
27
+ elsif publishable.present? && publishable.section_id.present?
28
+ self.slug = 'index'
26
29
  else
27
- self.slug = "Temporary Title"
30
+ self.slug = "temporary_slug"
28
31
  end
29
32
  end
30
33
  end
31
-
34
+
32
35
  def self.get_by_slug(slug)
33
36
  self.published.where(:slug => slug)
34
37
  end
@@ -1,23 +1,64 @@
1
1
  module Publinator
2
2
  class Publishable < ActiveRecord::Base
3
-
4
- # has_paper_trail
5
- has_one :publication, :class_name => 'Publinator::Publication'
3
+ has_one :publication, :as => :publishable, :class_name => "Publinator::Publication"
4
+
6
5
  accepts_nested_attributes_for :publication
7
- #validates_associated :publication
6
+ attr_accessible :site_id, :section_id, :custom_slug
7
+ attr_accessor :site_id, :section_id, :custom_slug
8
+
9
+ validates_presence_of :publication
10
+ validates_associated :publication
8
11
 
12
+ before_validation :prepare_publication
13
+
9
14
  def editable_fields
10
- attribute_names - ["id", "created_at", "updated_at"]
15
+ attribute_names - ["id", "created_at", "updated_at"]
16
+ end
17
+
18
+ def section_id=(section_int)
19
+ @section = Section.find(section_int)
20
+ add_publication if publication.nil?
21
+ self.publication.section_id = @section.id if @section
22
+ self.publication.site_id = @section.site.id if @section.site
23
+ end
24
+
25
+ def section_id
26
+ publication.section_id if publication
27
+ end
28
+
29
+ def site_id=(site_int)
30
+ @site = Site.find(site_int)
31
+ add_publication if publication.nil?
32
+ self.publication.site_id = @site.id if @site
33
+ end
34
+
35
+ def site_id
36
+ publication.site_id if publication
11
37
  end
12
38
 
39
+ def prepare_publication
40
+ logger.info "preparing publication"
41
+ my_name = self.class.to_s
42
+ logger.info "My name is #{my_name}"
43
+ add_publication if publication.nil?
44
+ publication.generate_slug
45
+ publication.publishable_type = my_name
46
+ end
13
47
 
48
+ def custom_slug=(slug_string)
49
+ add_publication if publication.nil?
50
+ publication.custom_slug = slug_string
51
+ end
52
+
53
+ def custom_slug
54
+ publication.custom_slug unless publication.nil?
55
+ end
14
56
 
57
+ private
15
58
 
16
- # def self.publishable_classes
17
- # PublishableType.all.each do |pt|
18
- # class_name = pt.name.capitalize!
19
- #
20
- # end
21
- # end
59
+ def add_publication
60
+ logger.info "creating publication"
61
+ self.publication = Publinator::Publication.new(:publishable => self)
62
+ end
22
63
  end
23
64
  end
@@ -1,7 +1,7 @@
1
1
  module Publinator
2
2
  class PublishableType < ActiveRecord::Base
3
3
  attr_accessible :name, :sluggable
4
-
4
+
5
5
  def self.matches?(request)
6
6
  pt = self.find_by_name(request.path_parameters[:publishable_type].singularize.capitalize)
7
7
  return pt.present?
@@ -0,0 +1,25 @@
1
+ # TODO Validate new sections - can't conflict with publishable_types
2
+ module Publinator
3
+ class Section < ActiveRecord::Base
4
+ attr_accessible :layout, :name, :parent_id, :site_id
5
+ belongs_to :site
6
+ has_many :publications
7
+ before_create :generate_slug
8
+
9
+ def self.matches?(request)
10
+ pt = self.find(:first, :conditions => ["slug = ?", request.path_parameters[:section]])
11
+ return pt.present?
12
+ end
13
+
14
+ # current_site.id, params[:section]
15
+ def self.get_by_site_id_and_slug(site_id, section_name)
16
+ Section.find(:first, :conditions => ["site_id = ? and name = ?", site_id, section_name])
17
+ end
18
+
19
+ private
20
+
21
+ def generate_slug
22
+ self.slug = name.downcase.gsub(" ", "_")
23
+ end
24
+ end
25
+ end
@@ -2,9 +2,10 @@ module Publinator
2
2
  class Site < ActiveRecord::Base
3
3
  attr_accessible :abbr, :description, :name, :parent_id, :state, :title, :default
4
4
  has_many :domain_names
5
-
5
+ has_many :sections
6
+
6
7
  # get the layout for the site
7
- #
8
+ #
8
9
  # @todo add ability to use a custom layout
9
10
  def layout
10
11
  begin
@@ -13,12 +14,12 @@ module Publinator
13
14
  "publinator/site"
14
15
  end
15
16
  end
16
-
17
+
17
18
  def parent
18
19
  return nil unless parent_id.present?
19
20
  Site.find(self.parent_id)
20
21
  end
21
-
22
+
22
23
  def publications(scope = 'published', sort = 'updated_at desc', publishable_type)
23
24
  if publishable_type.nil?
24
25
  pubs = Publication.for_site(self.id).send(scope).order(sort)
@@ -1,2 +1,2 @@
1
1
  <h1>Home Page</h1>
2
- <p>Welcome to our Site!</p>
2
+ <p>Welcome to <%= current_site.name %>!</p>
@@ -6,7 +6,9 @@
6
6
  <% end %>
7
7
  <% end %>
8
8
  <%= form.inputs @publishable.class.to_s do %>
9
- <%= form.inputs :title, :body %>
9
+ <% @field_names.each do |field| %>
10
+ <%= form.input field %>
11
+ <% end %>
10
12
  <% end %>
11
13
  <%= form.semantic_fields_for @publishable.publication do |pub| %>
12
14
  <%= pub.inputs "Publication Settings" do %>
@@ -14,6 +16,7 @@
14
16
  <%= pub.input :publish_at, :as => :datetime_select, :required => false %>
15
17
  <%= pub.input :unpublish_at, :as => :datetime_select, :required => false %>
16
18
  <%= pub.input :archive_at, :as => :datetime_select, :required => false %>
19
+ <%= pub.input :section_id, :as => :select, :required => false, :collection => current_site.sections unless current_site.sections.length == 0 %>
17
20
  <% end %>
18
21
  <% end %>
19
22
  <%= form.actions do %>
@@ -0,0 +1,10 @@
1
+ <%= semantic_form_for [:manage, @section], :method => :post do |form| %>
2
+ <%= form.inputs do %>
3
+ <%= form.input :name %>
4
+ <%= form.input :layout %>
5
+ <% end %>
6
+ <%= form.actions do %>
7
+ <%= form.action :submit, :as => :button %>
8
+ <%= form.action :cancel, :as => :link %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <h1>Manage Sections :: Edit <%= @section.name %></h1>
2
+
3
+ <%= render :partial => "form" %>
@@ -0,0 +1,16 @@
1
+ <h1>Manage Sections </h1>
2
+
3
+ <table>
4
+ <% @sections.each do |section| %>
5
+ <tr>
6
+ <td>
7
+ <%= section.name %>
8
+ </td>
9
+ <td>
10
+ <%= link_to 'edit', edit_manage_section_path(section) %>
11
+ </td>
12
+ </tr>
13
+ <% end %>
14
+ </table>
15
+
16
+ <%= link_to "Add Section", new_manage_section_path %>
@@ -0,0 +1,3 @@
1
+ <h1>Manage Sections :: Create New Section</h1>
2
+
3
+ <%= render :partial => "form" %>
@@ -0,0 +1,2 @@
1
+ <h1>Manage::Sections#show</h1>
2
+ <p>Find me in app/views/publinator/manage/sections/show.html.erb</p>
data/config/routes.rb CHANGED
@@ -1,52 +1,68 @@
1
1
  Publinator::Engine.routes.draw do
2
-
3
-
4
- root :to => "home#index"
5
2
 
6
- match '/' => 'home#index'
7
-
3
+ root :to => "home#index"
4
+ match '/' => 'home#index'
5
+
8
6
  namespace :manage do
9
7
  match "/" => 'manage#index'
10
8
  resources :sites
9
+ resources :sections
11
10
  constraints(Publinator::PublishableType) do
12
11
  match '/:publishable_type/' => "publishable#index", :requirements => {
13
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
12
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
14
13
  }, :as => "publishables"
15
-
14
+
16
15
  match '/:publishable_type/new' => "publishable#new", :requirements => {
17
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
16
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
18
17
  }
19
-
18
+
20
19
  match '/:publishable_type/create' => "publishable#create", :requirements => {
21
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
20
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
22
21
  }, :as => "create_publishable"
23
-
22
+
24
23
  match '/:publishable_type/:id/edit' => "publishable#edit", :requirements => {
25
- :id => /\A\d*\z/i,
26
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
24
+ :id => /\A\d*\z/i,
25
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
27
26
  }, :as => "edit_publishable"
28
-
27
+
29
28
  match '/:publishable_type/:id' => "publishable#show", :requirements => {
30
- :id => /\A\d*\z/i,
31
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
29
+ :id => /\A\d*\z/i,
30
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
32
31
  }, :as => "publishable"
33
32
  end
34
33
  end
35
-
34
+
35
+ constraints(Publinator::Section) do
36
+ match '/:section/' => "section#index", :requirements => {
37
+ :section => /\A([a-zA-Z0-9]+[a-zA-Z0-9\-_]*)\z/i
38
+ }
39
+
40
+ match '/:section/:id' => "section#show", :requirements => {
41
+ :id => /\A\d*\z/i,
42
+ :section => /\A([a-zA-Z0-9]+[a-zA-Z0-9\-_]*)\z/i
43
+ }, :as => "publishable"
44
+ end
45
+
46
+
36
47
  constraints(Publinator::PublishableType) do
37
48
  match '/:publishable_type/' => "publishable#index", :requirements => {
38
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
49
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
39
50
  }
40
-
51
+
41
52
  match '/:publishable_type/:id' => "publishable#show", :requirements => {
42
- :id => /\A\d*\z/i,
43
- :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
53
+ :id => /\A\d*\z/i,
54
+ :publishable_type => /\A([a-zA-Z]+[a-zA-Z_]*)\z/i
44
55
  }, :as => "publishable"
45
-
46
56
  end
47
-
48
- match "/:slug", :controller => :home, :action => :page, :requirements => {
49
- :slug => /\A([a-zA-Z]+[a-zA-Z\-_]*)\z/i
57
+
58
+ match "/:section/:slug", :controller => :sections, :action => :page, :requirements => {
59
+ :section => /\A([a-zA-Z0-9]+[a-zA-Z0-9\-_]*)\z/i,
60
+ :slug => /\A([a-zA-Z]+[a-zA-Z\-_]*)\z/i
61
+ }
62
+
63
+
64
+ match "/:slug", :controller => :home, :action => :page, :requirements => {
65
+ :slug => /\A([a-zA-Z]+[a-zA-Z\-_]*)\z/i
50
66
  }
51
67
 
52
68
  end