wheelhouse-blog 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +28 -0
- data/app/assets/images/wheelhouse-blog/blog.png +0 -0
- data/app/assets/images/wheelhouse-blog/post.png +0 -0
- data/app/assets/stylesheets/wheelhouse-blog/admin.css.sass +15 -0
- data/app/controllers/blog/blogs_controller.rb +8 -0
- data/app/controllers/blog/posts_controller.rb +11 -0
- data/app/handlers/blog/blog_handler.rb +34 -0
- data/app/handlers/blog/post_handler.rb +7 -0
- data/app/helpers/blog/blog_helper.rb +5 -0
- data/app/models/blog/blog.rb +58 -0
- data/app/models/blog/post.rb +84 -0
- data/app/templates/blog/_layout.html.haml +6 -0
- data/app/templates/blog/_post.html.haml +9 -0
- data/app/templates/blog/archive.html.haml +5 -0
- data/app/templates/blog/category.html.haml +5 -0
- data/app/templates/blog/feed.xml.builder +33 -0
- data/app/templates/blog/index.html.haml +6 -0
- data/app/templates/blog/post.html.haml +6 -0
- data/app/templates/blog/tag.html.haml +5 -0
- data/app/views/blog/blogs/_posts.haml +23 -0
- data/app/views/blog/blogs/form.haml +22 -0
- data/app/views/blog/posts/form.haml +25 -0
- data/config/locales/en.yml +19 -0
- data/config/routes.rb +7 -0
- data/lib/wheelhouse-blog.rb +30 -0
- metadata +86 -0
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Blog Plugin for Wheelhouse CMS
|
2
|
+
==============================
|
3
|
+
|
4
|
+
This gem makes it easy to integrate a blog or news feed into your Wheelhouse CMS site.
|
5
|
+
|
6
|
+
It currently supports:
|
7
|
+
|
8
|
+
- RSS feed
|
9
|
+
- tags
|
10
|
+
- categories
|
11
|
+
- archives
|
12
|
+
- multiple blogs
|
13
|
+
|
14
|
+
It does not yet support commenting but this will be implemented in the near future. In the meanwhile, it is fairly easy to integrate comments using a third-party JavaScript library such as [Disqus](http://disqus.com/) or [Facebook Comments](https://developers.facebook.com/docs/reference/plugins/comments/).
|
15
|
+
|
16
|
+
|
17
|
+
Installation & Usage
|
18
|
+
--------------------
|
19
|
+
|
20
|
+
**1. Add `wheelhouse-blog` to your Gemfile:**
|
21
|
+
|
22
|
+
gem "wheelhouse-blog"
|
23
|
+
|
24
|
+
Then run `bundle install`.
|
25
|
+
|
26
|
+
**2. Create a new blog from the New Page dropdown.**
|
27
|
+
|
28
|
+
**3. Copy the templates from `app/templates/blog` to your theme templates folder to customize.**
|
Binary file
|
Binary file
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Blog::PostsController < Wheelhouse::ResourceController
|
2
|
+
belongs_to :blog, :class_name => Blog::Blog
|
3
|
+
defaults :resource_class => Blog::Post, :collection_name => :all_posts
|
4
|
+
|
5
|
+
manage_site_breadcrumb
|
6
|
+
breadcrumb { [parent.label, blog_path(parent)] }
|
7
|
+
|
8
|
+
def section
|
9
|
+
Blog::Plugin.config.wheelhouse.blog.sections ? @blog.label : super
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Blog::BlogHandler < Wheelhouse::ResourceHandler
|
2
|
+
get :cache => true do
|
3
|
+
# Nothing extra required
|
4
|
+
end
|
5
|
+
|
6
|
+
get "/feed.xml", :cache => true do
|
7
|
+
request.format = :xml
|
8
|
+
render :template => "feed.xml", :layout => false
|
9
|
+
end
|
10
|
+
|
11
|
+
get '/tag/:tag', :cache => true do
|
12
|
+
@posts = @blog.posts.tagged_with(params[:tag])
|
13
|
+
render :template => "tag.html"
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/category/:category', :cache => true do
|
17
|
+
@posts = @blog.posts.in_category(params[:category])
|
18
|
+
render :template => "category.html"
|
19
|
+
end
|
20
|
+
|
21
|
+
get "/:year/:month/:permalink", :cache => true do
|
22
|
+
@post = @blog.find_post(params[:year], params[:month], params[:permalink])
|
23
|
+
render @post
|
24
|
+
end
|
25
|
+
|
26
|
+
get "/:year/:month", :cache => true do
|
27
|
+
@year = params[:year].to_i
|
28
|
+
@month = params[:month].to_i
|
29
|
+
raise ActionController::RoutingError, "No route matches #{request.path.inspect}" if @year.zero? || @month.zero?
|
30
|
+
|
31
|
+
@posts = @blog.posts.in_year_and_month(@year, @month)
|
32
|
+
render :template => "archive.html"
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class Blog::Blog < Wheelhouse::Resource
|
2
|
+
include Wheelhouse::Resource::Addressable
|
3
|
+
include Wheelhouse::Resource::Content
|
4
|
+
|
5
|
+
property :title, String, :translate => true, :required => true
|
6
|
+
|
7
|
+
has_many :posts, :class => "Blog::Post", :conditions => { :state => 'Published' }, :order => :published_at.desc
|
8
|
+
has_many :all_posts, :class => "Blog::Post", :order => :created_at.desc
|
9
|
+
|
10
|
+
activities :all
|
11
|
+
|
12
|
+
icon "wheelhouse-blog/blog.png"
|
13
|
+
|
14
|
+
self.default_template = "blog/index"
|
15
|
+
|
16
|
+
def handler
|
17
|
+
Blog::BlogHandler
|
18
|
+
end
|
19
|
+
|
20
|
+
def find_post(year, month, permalink)
|
21
|
+
posts.find_by_year_and_month_and_permalink!(year.to_i, month.to_i, permalink)
|
22
|
+
end
|
23
|
+
|
24
|
+
def tag_path(tag)
|
25
|
+
path('tag', tag.parameterize)
|
26
|
+
end
|
27
|
+
|
28
|
+
def category_path(category)
|
29
|
+
path('category', category.parameterize)
|
30
|
+
end
|
31
|
+
|
32
|
+
def archive_path(year, month)
|
33
|
+
path(year.to_i, month.to_i)
|
34
|
+
end
|
35
|
+
|
36
|
+
def archives
|
37
|
+
selector = MongoModel::MongoOptions.new(posts.klass, posts.finder_options).to_a.first
|
38
|
+
posts.collection.group(:key => [:year, :month], :cond => selector, :initial => { :count => 0 }, :reduce => "function(doc, out) { out.count++ }").map { |hash|
|
39
|
+
year, month, count = hash["year"], hash["month"], hash["count"]
|
40
|
+
|
41
|
+
[Date.civil(year, month, 1), archive_path(year, month), count.to_i]
|
42
|
+
}.sort { |a, b| b.first <=> a.first }
|
43
|
+
end
|
44
|
+
|
45
|
+
def tags
|
46
|
+
selector = MongoModel::MongoOptions.new(posts.klass, posts.finder_options).to_a.first
|
47
|
+
posts.collection.distinct(:tags, selector)
|
48
|
+
end
|
49
|
+
|
50
|
+
def categories
|
51
|
+
selector = MongoModel::MongoOptions.new(posts.klass, posts.finder_options).to_a.first
|
52
|
+
posts.collection.distinct(:categories, selector)
|
53
|
+
end
|
54
|
+
|
55
|
+
def additional_children
|
56
|
+
posts
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
class Blog::Post < Wheelhouse::Resource
|
2
|
+
include Wheelhouse::Resource::Renderable
|
3
|
+
include Wheelhouse::Resource::Versioned
|
4
|
+
include Wheelhouse::Resource::Content
|
5
|
+
|
6
|
+
belongs_to :blog, :class => "Blog::Blog"
|
7
|
+
|
8
|
+
property :title, String, :translate => true, :required => true
|
9
|
+
property :permalink, String, :required => true
|
10
|
+
property :state, String, :default => 'Published'
|
11
|
+
property :published_at, Time
|
12
|
+
property :year, Integer
|
13
|
+
property :month, Integer
|
14
|
+
|
15
|
+
property :tags, Wheelhouse::Tags
|
16
|
+
property :categories, Wheelhouse::Tags
|
17
|
+
|
18
|
+
index :_tags
|
19
|
+
before_save { attributes[:_tags] = tags.map(&:parameterize) }
|
20
|
+
|
21
|
+
index :_categories
|
22
|
+
before_save { attributes[:_categories] = categories.map(&:parameterize) }
|
23
|
+
|
24
|
+
activities :all, :resource_name => :title
|
25
|
+
|
26
|
+
icon "wheelhouse-blog/post.png"
|
27
|
+
|
28
|
+
validates_uniqueness_of :permalink, :scope => :blog_id
|
29
|
+
|
30
|
+
scope :tagged_with, lambda { |tag| where(:_tags => tag.parameterize) }
|
31
|
+
scope :in_category, lambda { |category| where(:_categories => category.parameterize) }
|
32
|
+
scope :in_year_and_month, lambda { |year, month| where(:year => year, :month => month) }
|
33
|
+
|
34
|
+
scope :properties_for_admin, select(:id, :type, :title, :state, :published_at, :created_by_id, :author_name, :blog_id)
|
35
|
+
|
36
|
+
before_save :set_published_timestamp, :if => :published?
|
37
|
+
before_save :cache_author_name
|
38
|
+
|
39
|
+
delegate :site, :to => :blog
|
40
|
+
after_save :clear_cache!
|
41
|
+
after_destroy :clear_cache!
|
42
|
+
|
43
|
+
self.parent_resource = :blog
|
44
|
+
self.default_template = "post"
|
45
|
+
|
46
|
+
def published?
|
47
|
+
state == 'Published'
|
48
|
+
end
|
49
|
+
|
50
|
+
def path
|
51
|
+
blog.path(published_at.year, published_at.month, permalink)
|
52
|
+
end
|
53
|
+
|
54
|
+
def author_name
|
55
|
+
read_attribute(:author_name) || (author && author.name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def author
|
59
|
+
created_by
|
60
|
+
end
|
61
|
+
|
62
|
+
def published_at
|
63
|
+
read_attribute(:published_at) || Time.now
|
64
|
+
end
|
65
|
+
|
66
|
+
def admin_path
|
67
|
+
persisted? ? blog_post_path(blog_id, self) : blog_posts_path(blog_id)
|
68
|
+
end
|
69
|
+
|
70
|
+
def handler
|
71
|
+
Blog::PostHandler
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def set_published_timestamp
|
76
|
+
self.published_at = published_at
|
77
|
+
self.year = published_at.year
|
78
|
+
self.month = published_at.month
|
79
|
+
end
|
80
|
+
|
81
|
+
def cache_author_name
|
82
|
+
write_attribute(:author_name, author.name) if author
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
- title ["Category: #{params[:category].titlecase}", @blog.title].join(' - ')
|
2
|
+
- breadcrumb "Category: #{params[:category].titlecase}"
|
3
|
+
|
4
|
+
= render :layout => "layout", :locals => { :description => "Posts in category: #{params[:category].titlecase}" } do
|
5
|
+
= render :partial => "post", :collection => @posts
|
@@ -0,0 +1,33 @@
|
|
1
|
+
xml.instruct!
|
2
|
+
|
3
|
+
xml.rss :version => '2.0', 'xmlns:atom' => 'http://www.w3.org/2005/Atom' do
|
4
|
+
xml.channel do
|
5
|
+
xml.title site.name
|
6
|
+
xml.description @blog.title
|
7
|
+
xml.link url(@blog)
|
8
|
+
xml.tag! 'atom:link', :href => request.url, :rel => 'self', :type => 'application/rss+xml'
|
9
|
+
|
10
|
+
@blog.posts.each do |post|
|
11
|
+
xml.item do
|
12
|
+
xml.title post.title
|
13
|
+
xml.author "#{post.author.email} (#{post.author.name})"
|
14
|
+
xml.pubDate post.published_at.to_s(:rss)
|
15
|
+
|
16
|
+
xml.description do
|
17
|
+
xml.cdata!(post.content.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
post.categories.each do |category|
|
21
|
+
xml.category do
|
22
|
+
xml.cdata!(category)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
xml.link url(post)
|
27
|
+
xml.guid url(post)
|
28
|
+
|
29
|
+
# xml.comments url(post.comments_path) if blog.comments_enabled?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
- content_for(:head) do
|
2
|
+
= stylesheet_link_tag "wheelhouse-blog/admin"
|
3
|
+
|
4
|
+
.buttons
|
5
|
+
= link_to "New Post", new_blog_post_path(@blog), :class => 'add'
|
6
|
+
|
7
|
+
- @posts = @blog.all_posts.properties_for_admin.paginate(:page => params[:p])
|
8
|
+
|
9
|
+
= table_for Blog::Post, :id => "blog-posts" do |table|
|
10
|
+
- table.rows(@posts) do |row, post|
|
11
|
+
- row.resource = post
|
12
|
+
|
13
|
+
= row.column(:title, :link => true)
|
14
|
+
= row.column(:author) { post.author_name || 'None' }
|
15
|
+
= row.column(:published_at) { post.published? ? post.published_at.to_s(:short) : 'Draft' }
|
16
|
+
= row.controls do |c|
|
17
|
+
= c.delete
|
18
|
+
|
19
|
+
- table.empty do
|
20
|
+
No blog posts have been created.
|
21
|
+
= link_to "Create a new post.", new_blog_post_path(@blog)
|
22
|
+
|
23
|
+
= will_paginate @posts
|
@@ -0,0 +1,22 @@
|
|
1
|
+
- tab :posts => 'posts' if @blog.persisted?
|
2
|
+
|
3
|
+
- tab :blog_settings do
|
4
|
+
= field :title do
|
5
|
+
= form.text_field :title, :title => true
|
6
|
+
|
7
|
+
= content
|
8
|
+
|
9
|
+
- sidebar do
|
10
|
+
.buttons
|
11
|
+
= button "Save Settings", :icon => :publish, :submit => true, :id => "save-and-publish"
|
12
|
+
|
13
|
+
%hr
|
14
|
+
|
15
|
+
%dl
|
16
|
+
= navigation_options
|
17
|
+
= template_options
|
18
|
+
|
19
|
+
- if @blog.persisted?
|
20
|
+
%hr
|
21
|
+
= owner
|
22
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
- content_for(:head) do
|
2
|
+
= stylesheet_link_tag "wheelhouse-blog/admin"
|
3
|
+
|
4
|
+
- form! [@blog, @post], :as => :post, :url => @post.admin_path
|
5
|
+
|
6
|
+
- tab :post do
|
7
|
+
= field :title do
|
8
|
+
= form.text_field :title, :title => true
|
9
|
+
|
10
|
+
= content
|
11
|
+
|
12
|
+
- sidebar(:options) do
|
13
|
+
= sidebar_expander "Publishing Options" do
|
14
|
+
= field :published_at do
|
15
|
+
= form.datetime :published_at, :value => @post.read_attribute(:published_at) || ""
|
16
|
+
|
17
|
+
= field :permalink do
|
18
|
+
= form.permalink :permalink
|
19
|
+
|
20
|
+
= sidebar_expander "Tags & Categories" do
|
21
|
+
= field :categories do
|
22
|
+
= form.checkboxes :categories, @blog.categories, :editable => true, :placeholder => "Add a category..."
|
23
|
+
|
24
|
+
= field :tags do
|
25
|
+
= form.tags :tags, @blog.tags, :placeholder => "Add a tag..."
|
@@ -0,0 +1,19 @@
|
|
1
|
+
en:
|
2
|
+
resource:
|
3
|
+
models:
|
4
|
+
blog/post: Blog Post
|
5
|
+
|
6
|
+
helpers:
|
7
|
+
label:
|
8
|
+
blog:
|
9
|
+
title: Blog Title
|
10
|
+
|
11
|
+
post:
|
12
|
+
title: Post Title
|
13
|
+
content: Post Content
|
14
|
+
tags_string: Tags
|
15
|
+
published_at: Publish Date
|
16
|
+
|
17
|
+
tabs:
|
18
|
+
blog/blog:
|
19
|
+
blog_settings: Blog Settings
|
data/config/routes.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require "wheelhouse"
|
2
|
+
|
3
|
+
module Blog
|
4
|
+
class Plugin < Wheelhouse::Plugin
|
5
|
+
config.wheelhouse.blog = ActiveSupport::OrderedOptions.new
|
6
|
+
|
7
|
+
# Enable blog sections by default
|
8
|
+
config.wheelhouse.blog.sections = true
|
9
|
+
|
10
|
+
isolate_namespace Blog
|
11
|
+
|
12
|
+
resources do
|
13
|
+
::Blog::Blog.select(:id, :label).map do |b|
|
14
|
+
Resource(::Blog::Post, :sublabel => b.label, :url => blog.new_blog_post_path(b))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
resource { Resource(::Blog::Blog) }
|
19
|
+
|
20
|
+
sections do
|
21
|
+
::Blog::Blog.select(:id, :label).map do |blog|
|
22
|
+
Section(blog.label, blog)
|
23
|
+
end if ::Blog::Plugin.config.wheelhouse.blog.sections
|
24
|
+
end
|
25
|
+
|
26
|
+
initializer "precompile assets" do |app|
|
27
|
+
app.config.assets.precompile << "wheelhouse-blog/admin.*"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wheelhouse-blog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sam Pohlenz
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: wheelhouse
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
description: Integrates blogs into your Wheelhouse CMS site.
|
31
|
+
email: info@wheelhousecms.com
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- app/assets/images/wheelhouse-blog/blog.png
|
37
|
+
- app/assets/images/wheelhouse-blog/post.png
|
38
|
+
- app/assets/stylesheets/wheelhouse-blog/admin.css.sass
|
39
|
+
- app/controllers/blog/blogs_controller.rb
|
40
|
+
- app/controllers/blog/posts_controller.rb
|
41
|
+
- app/handlers/blog/blog_handler.rb
|
42
|
+
- app/handlers/blog/post_handler.rb
|
43
|
+
- app/helpers/blog/blog_helper.rb
|
44
|
+
- app/models/blog/blog.rb
|
45
|
+
- app/models/blog/post.rb
|
46
|
+
- app/templates/blog/_layout.html.haml
|
47
|
+
- app/templates/blog/_post.html.haml
|
48
|
+
- app/templates/blog/archive.html.haml
|
49
|
+
- app/templates/blog/category.html.haml
|
50
|
+
- app/templates/blog/feed.xml.builder
|
51
|
+
- app/templates/blog/index.html.haml
|
52
|
+
- app/templates/blog/post.html.haml
|
53
|
+
- app/templates/blog/tag.html.haml
|
54
|
+
- app/views/blog/blogs/_posts.haml
|
55
|
+
- app/views/blog/blogs/form.haml
|
56
|
+
- app/views/blog/posts/form.haml
|
57
|
+
- config/locales/en.yml
|
58
|
+
- config/routes.rb
|
59
|
+
- lib/wheelhouse-blog.rb
|
60
|
+
- README.md
|
61
|
+
homepage: https://www.wheelhousecms.com
|
62
|
+
licenses: []
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 1.8.7
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 1.3.6
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.8.24
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Wheelhouse CMS Blog Plugin
|
85
|
+
test_files: []
|
86
|
+
has_rdoc:
|