publinator 0.0.4 → 0.0.6

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.
@@ -3,18 +3,21 @@ require_dependency "publinator/application_controller"
3
3
  module Publinator
4
4
  class SectionController < ApplicationController
5
5
  before_filter :get_section
6
-
6
+
7
7
  def index
8
+ logger.info "#{@section.id}"
8
9
  @publication = Publinator::Publication.find_by_section_id_and_slug(@section.id, 'index')
9
- @publishable = @publication.publishable
10
+ logger.info Publication.all.collect{ |p| "/#{@section.section_slug}/#{p.slug}" }
11
+ logger.info @publication.to_yaml
12
+ @publishable = @publication.content
10
13
  begin
11
14
  render "#{params[:section]}/index"
12
15
  rescue ActionView::MissingTemplate
13
16
  render "publinator/publishable/show"
14
17
  end
15
- rescue Exception => e
16
- logger.info e.to_yaml
17
- # redirect_to root_url, :notice => "Page not found." if @publication.nil?
18
+ # rescue Exception => e
19
+ # logger.info e.to_yaml
20
+ # redirect_to root_url, :notice => "Page not found." if @publication.nil?
18
21
  end
19
22
 
20
23
  def show
@@ -26,11 +29,11 @@ module Publinator
26
29
  render "publinator/publishable/show"
27
30
  end
28
31
  end
29
-
32
+
30
33
  private
31
-
34
+
32
35
  def get_section
33
- @section = Publinator::Section.find(:first, :conditions => ["site_id = ? AND name = ?", current_site.id, params[:section]])
36
+ @section = Publinator::Section.find(:first, :conditions => ["site_id = ? AND section_slug = ?", current_site.id, params[:section]])
34
37
  end
35
38
  end
36
39
  end
@@ -1,4 +1,54 @@
1
1
  module Publinator
2
+ require 'rdiscount'
3
+
2
4
  module ApplicationHelper
5
+ def link_to_page(link_text, section, slug)
6
+ link_to link_text, "/#{section}/#{slug}"
7
+ end
8
+
9
+ def m(markdown_text)
10
+ RDiscount.new(markdown_text).to_html.html_safe
11
+ end
12
+
13
+ def menu(array)
14
+ menu = content_tag(:ul, :class => 'nav_menu') do
15
+ menu_content = ""
16
+ array.each do |obj|
17
+ menu_content += menu_item(obj)
18
+ end
19
+ menu_content.html_safe
20
+ end
21
+ menu.html_safe
22
+ end
23
+
24
+ def menu_item(obj)
25
+ logger.info "ready to create entry for #{obj.class} #{obj.id}"
26
+ if obj.class == Publinator::Publication
27
+ logger.info "publication's publishable is #{obj.publishable.class} #{obj.publishable.id}"
28
+ end
29
+ raise "No publishable found for #{obj.class} #{obj.id}" if !obj.publishable
30
+ tag_content = content_tag(:li) do
31
+ li_content = link_to obj.publishable.title, obj.publishable.path
32
+ if obj.respond_to? :publications
33
+ li_content += content_tag(:div, :class => "submenu") do
34
+ if obj.publications && obj.publications.length && obj.publications.length > 0
35
+ submenu_content = content_tag(:ul) do
36
+ sub_content = ""
37
+ obj.publications.each do |pub|
38
+ logger.info "ready to create entry for #{pub.publishable_type} #{pub.publishable_id} #{pub.slug}"
39
+ unless pub.slug == 'index'
40
+ sub_content += menu_item(pub)
41
+ end
42
+ end
43
+ sub_content.html_safe
44
+ end
45
+ li_content += submenu_content
46
+ end
47
+ end
48
+ end
49
+ li_content.html_safe
50
+ end
51
+ tag_content
52
+ end
3
53
  end
4
54
  end
@@ -2,22 +2,15 @@ module Publinator
2
2
  # Ideas:
3
3
  # * after_create adds link in ~/.pow in development
4
4
  class DomainName < ActiveRecord::Base
5
- attr_accessible :default, :name, :shared, :site_id, :subdomain
5
+ attr_accessible :default, :name, :shared, :site, :subdomain
6
6
  belongs_to :site
7
-
7
+
8
8
  # lookup site based on the request
9
- #
9
+ #
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
-
19
13
  if request.env['x-forwarded-for']
20
- logger.info "processing forwarded request..."
21
14
  origin = request.env['x-forwarded-for'].to_s
22
15
  domain_array = origin.split('.')
23
16
  domain_array_length = origin.length
@@ -29,26 +22,20 @@ module Publinator
29
22
  request_domain = "#{domain_array[domain_array_length - 2]}.#{domain_array[domain_array_length - 1]}"
30
23
  end
31
24
  else
32
- logger.info "processing direct request..."
33
25
  request_subdomain = request.subdomain
34
26
  request_domain = request.domain
35
27
  end
36
28
  if request_domain.present?
37
- logger.info "request_domain is #{request_domain}..."
38
29
  if request_subdomain.blank? || request_subdomain == 'www'
39
- logger.info "request_subdomain is #{request_subdomain}..."
40
30
  @domain = self.find(:first, :conditions => ["name = ? AND (subdomain is null or subdomain = '')", request_domain])
41
31
  elsif request_subdomain.present? && request_subdomain != 'www'
42
- logger.info "non-www request_subdomain is #{request_subdomain}..."
43
32
  @domain = self.find(:first, :conditions => ["name = ? AND subdomain = ?", request_domain, request_subdomain])
44
33
  else
45
34
  @domain = self.find(:first, :conditions => ["name = ? AND subdomain = 'www' AND anchor = ?", request_domain, true])
46
35
  end
47
36
  else
48
- logger.info "request_domain was not found. finding default site..."
49
37
  @domain = Site.default.domain_names.detect { |d| d.default }
50
38
  end
51
- logger.info @domain.to_yaml
52
39
  return @domain
53
40
  end
54
41
  end
@@ -1,7 +1,7 @@
1
1
  module Publinator
2
- class Page < Publishable
2
+ class Page < ActiveRecord::Base
3
3
  self.table_name = 'publinator_pages'
4
- attr_accessible :body, :kicker, :section_id, :subtitle, :teaser, :title
5
- belongs_to :section, :class_name => "Publinator::Section"
4
+ acts_as_publishable
5
+ attr_accessible :body, :kicker, :subtitle, :teaser, :title, :section
6
6
  end
7
7
  end
@@ -2,34 +2,40 @@ module Publinator
2
2
  class Publication < ActiveRecord::Base
3
3
  # has_paper_trail
4
4
  attr_accessible :custom_slug, :parent_id, :publication_state_id,
5
- :publishable_id, :publishable_type, :site_id, :slug, :publish_at,
6
- :unpublish_at, :archive_at, :section_id, :default, :publishable
5
+ :publishable_id, :publishable_type, :slug, :publish_at,
6
+ :unpublish_at, :archive_at, :section, :default, :publishable, :site
7
7
  belongs_to :publishable, :polymorphic => true
8
- belongs_to :section
8
+ belongs_to :section, :class_name => "Publinator::Section"
9
9
  belongs_to :site
10
10
 
11
- validates_uniqueness_of :custom_slug, :scope => :site_id, :allow_blank => true
12
- validates_presence_of :slug
13
- validates_uniqueness_of :slug, :scope => [:site_id, :publishable_type, :section_id]
14
- validates_presence_of :site_id
15
-
11
+ validates_uniqueness_of :custom_slug, :scope => [:site_id, :section_id, :publishable_type], :allow_blank => true
12
+ validates_uniqueness_of :slug, :scope => [:site_id, :section_id, :publishable_type]
13
+ validates_presence_of :site
14
+
16
15
  before_validation :generate_slug
16
+ before_save :generate_slug
17
17
 
18
18
  scope :published, where(:publication_state_id => 1)
19
19
  scope :for_site, lambda { |site_id| where("site_id = ?", site_id) }
20
20
 
21
+ def content
22
+ publishable_type.constantize.find(publishable_id)
23
+ end
24
+
21
25
  def generate_slug
22
- if slug.blank? || slug == "temporary_slug"
23
- if custom_slug.present?
26
+ logger.info "generating slug"
27
+ if self.slug.blank? || slug =~ /temporary_slug\d?/
28
+ if default
29
+ self.slug = 'index'
30
+ elsif custom_slug.present?
24
31
  self.slug = custom_slug
25
32
  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'
33
+ self.slug = self.publishable.title.strip.downcase.gsub(/[^a-zA-Z0-9\-\_]/, '_')
29
34
  else
30
- self.slug = "temporary_slug"
35
+ self.slug = "temporary_slug_#{rand(100000)}"
31
36
  end
32
37
  end
38
+ logger.info "slug is #{ slug }"
33
39
  end
34
40
 
35
41
  def self.get_by_slug(slug)
@@ -1,25 +1,36 @@
1
1
  # TODO Validate new sections - can't conflict with publishable_types
2
2
  module Publinator
3
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
4
+ attr_accessible :layout, :name, :parent_id, :site, :section_slug
5
+ belongs_to :site, :class_name => "Publinator::Site"
6
+ has_many :publications, :class_name => "Publinator::Publication"
7
+ before_create :generate_section_slug
8
+ alias_attribute :title, :name
8
9
 
9
10
  def self.matches?(request)
10
- pt = self.find(:first, :conditions => ["slug = ?", request.path_parameters[:section]])
11
+ pt = self.find(:first, :conditions => ["section_slug = ?", request.path_parameters[:section]])
11
12
  return pt.present?
12
13
  end
13
-
14
+
14
15
  # current_site.id, params[:section]
15
16
  def self.get_by_site_id_and_slug(site_id, section_name)
16
17
  Section.find(:first, :conditions => ["site_id = ? and name = ?", site_id, section_name])
17
18
  end
18
19
 
19
- private
20
-
21
- def generate_slug
22
- self.slug = name.downcase.gsub(" ", "_")
23
- end
20
+ def index_item
21
+ Publinator::Publication.find_by_section_id_and_slug(id, 'index')
22
+ end
23
+
24
+ def path
25
+ "/#{section_slug}"
26
+ end
27
+
28
+ def publishable
29
+ self
30
+ end
31
+
32
+ def generate_section_slug
33
+ self.section_slug = name.strip.downcase.gsub(/[^a-zA-Z0-9\-\_]/, '_') if section_slug.blank?
34
+ end
24
35
  end
25
36
  end
@@ -3,6 +3,7 @@ module Publinator
3
3
  attr_accessible :abbr, :description, :name, :parent_id, :state, :title, :default
4
4
  has_many :domain_names
5
5
  has_many :sections
6
+ has_many :publications
6
7
 
7
8
  # get the layout for the site
8
9
  #
@@ -2,4 +2,4 @@
2
2
  <%= @publishable.title %>
3
3
  </h1>
4
4
 
5
- <%= @publishable.body %>
5
+ <%= m(@publishable.body) %>
@@ -1,21 +1,21 @@
1
1
  class CreatePublinatorPublications < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :publinator_publications do |t|
4
- t.integer :site_id
5
- t.integer :publication_state_id
6
- t.integer :parent_id
7
- t.string :custom_slug
8
- t.string :slug
9
- t.datetime :publish_at
10
- t.datetime :unpublish_at
11
- t.datetime :archive_at
12
- t.string :publishable_type
13
- t.integer :publishable_id
4
+ t.integer :site_id
5
+ t.integer :publication_state_id
6
+ t.integer :parent_id
7
+ t.integer :section_id
8
+ t.string :custom_slug
9
+ t.string :slug
10
+ t.datetime :publish_at
11
+ t.datetime :unpublish_at
12
+ t.datetime :archive_at
13
+ t.references :publishable, :polymorphic => true
14
+ t.boolean :default
14
15
 
15
16
  t.timestamps
16
17
  end
17
18
  add_index :publinator_publications, :site_id
18
19
  add_index :publinator_publications, :publication_state_id
19
- add_index :publinator_publications, :publishable_id
20
20
  end
21
21
  end
@@ -5,7 +5,7 @@ class CreatePublinatorSections < ActiveRecord::Migration
5
5
  t.integer :parent_id
6
6
  t.boolean :layout
7
7
  t.integer :site_id
8
- t.string :slug
8
+ t.string :section_slug
9
9
 
10
10
  t.timestamps
11
11
  end
@@ -1,12 +1,13 @@
1
1
  class CreatePublinatorPages < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :publinator_pages do |t|
4
- t.string :title
5
- t.string :subtitle
6
- t.string :kicker
7
- t.string :teaser
8
- t.text :body
9
- t.integer :section_id
4
+ t.integer :site_id
5
+ t.string :title
6
+ t.string :subtitle
7
+ t.string :kicker
8
+ t.string :teaser
9
+ t.string :custom_slug
10
+ t.text :body
10
11
 
11
12
  t.timestamps
12
13
  end
@@ -1,3 +1,3 @@
1
1
  module Publinator
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/publinator.rb CHANGED
@@ -1,4 +1,58 @@
1
1
  require "publinator/engine"
2
2
 
3
3
  module Publinator
4
+ module ActsAsPublishable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ end
9
+
10
+ module ClassMethods
11
+ def acts_as_publishable(options = {})
12
+ has_one :publication,
13
+ :as => :publishable,
14
+ :class_name => "Publinator::Publication",
15
+ :foreign_key => :publishable_id
16
+
17
+ accepts_nested_attributes_for :publication
18
+ validates_presence_of :publication
19
+ validates_associated :publication
20
+
21
+ before_validation :verify_publication
22
+ belongs_to :site, :class_name => "Publinator::Site"
23
+ belongs_to :section, :class_name => "Publinator::Section"
24
+
25
+ attr_accessible :site, :publication, :section, :default
26
+ attr_accessor :default
27
+
28
+ scope :non_index, joins(:publication).where("publication.slug != 'index'")
29
+ end
30
+ end
31
+
32
+ def editable_fields
33
+ attribute_names - ["id", "created_at", "updated_at"]
34
+ end
35
+
36
+ def path
37
+ raise "publication not found" if !self.publication
38
+ if self.publication.section
39
+ "/#{self.publication.section.section_slug}/#{self.publication.slug}"
40
+ else
41
+ "/#{self.class.to_s.pluralize}/#{self.publication.slug}"
42
+ end
43
+ end
44
+
45
+ def verify_publication
46
+ logger.info "verifying publication"
47
+ if publication.nil?
48
+ self.publication = Publinator::Publication.new(:publishable => self)
49
+ end
50
+ self.publication.site = site
51
+ self.publication.section = section unless !section
52
+ self.publication.default = default
53
+ end
54
+ end
4
55
  end
56
+
57
+ ActiveRecord::Base.send :include, Publinator::ActsAsPublishable
58
+
@@ -1,9 +1,9 @@
1
1
  namespace :publinator do
2
2
  desc "Dump DB, then repopulate it."
3
3
  task :repopulate => :environment do
4
- ["db:drop", "db:create", "db:migrate", "publinator:install:migrations", "db:seed"].each do |t|
4
+ ["db:drop", "publinator:install:migrations", "db:create", "db:migrate", "db:seed"].each do |t|
5
5
  Rake::Task[t].execute
6
6
  `touch tmp/restart.txt`
7
7
  end
8
8
  end
9
- end
9
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: publinator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-17 00:00:00.000000000 Z
12
+ date: 2012-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -250,7 +250,6 @@ files:
250
250
  - app/models/publinator/page.rb
251
251
  - app/models/publinator/publication.rb
252
252
  - app/models/publinator/publication_state.rb
253
- - app/models/publinator/publishable.rb
254
253
  - app/models/publinator/publishable_type.rb
255
254
  - app/models/publinator/section.rb
256
255
  - app/models/publinator/site.rb
@@ -288,7 +287,6 @@ files:
288
287
  - db/migrate/20120725202127_create_publinator_workflows.rb
289
288
  - db/migrate/20120725202425_create_publinator_workflow_steps.rb
290
289
  - db/migrate/20120725202718_create_publinator_site_workflows.rb
291
- - db/migrate/20120725204133_create_publinator_publishables.rb
292
290
  - db/migrate/20120726234227_create_versions.rb
293
291
  - db/migrate/20120726234703_create_publinator_publishable_types.rb
294
292
  - db/migrate/20121011191348_create_publinator_sections.rb
@@ -319,7 +317,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
319
317
  version: '0'
320
318
  segments:
321
319
  - 0
322
- hash: 150634555584711764
320
+ hash: -1778146319537863038
323
321
  required_rubygems_version: !ruby/object:Gem::Requirement
324
322
  none: false
325
323
  requirements:
@@ -328,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
328
326
  version: '0'
329
327
  segments:
330
328
  - 0
331
- hash: 150634555584711764
329
+ hash: -1778146319537863038
332
330
  requirements: []
333
331
  rubyforge_project:
334
332
  rubygems_version: 1.8.24
@@ -1,64 +0,0 @@
1
- module Publinator
2
- class Publishable < ActiveRecord::Base
3
- has_one :publication, :as => :publishable, :class_name => "Publinator::Publication"
4
-
5
- accepts_nested_attributes_for :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
11
-
12
- before_validation :prepare_publication
13
-
14
- def editable_fields
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
37
- end
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
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
56
-
57
- private
58
-
59
- def add_publication
60
- logger.info "creating publication"
61
- self.publication = Publinator::Publication.new(:publishable => self)
62
- end
63
- end
64
- end
@@ -1,9 +0,0 @@
1
- class CreatePublinatorPublishables < ActiveRecord::Migration
2
- def change
3
- create_table :publinator_publishables do |t|
4
- t.integer :publication_id
5
-
6
- t.timestamps
7
- end
8
- end
9
- end