tb_blog 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +29 -0
- data/Readme.markdown +130 -0
- data/app/assets/images/spud/admin/news_thumb.png +0 -0
- data/app/assets/images/spud/admin/news_thumb@2x.png +0 -0
- data/app/assets/images/spud/admin/posts_thumb.png +0 -0
- data/app/assets/javascripts/spud/admin/post_categories.js +116 -0
- data/app/assets/javascripts/spud/admin/posts.js +71 -0
- data/app/assets/javascripts/spud/blog/sitemaps.js +2 -0
- data/app/assets/javascripts/spud/blog.js +41 -0
- data/app/assets/stylesheets/news.css +4 -0
- data/app/assets/stylesheets/spud/admin/posts.css +113 -0
- data/app/assets/stylesheets/spud/blog/sitemaps.css +4 -0
- data/app/assets/stylesheets/spud/blog/validity.css +3 -0
- data/app/controllers/blog_controller.rb +135 -0
- data/app/controllers/news_controller.rb +80 -0
- data/app/controllers/spud/admin/news_posts_controller.rb +62 -0
- data/app/controllers/spud/admin/post_categories_controller.rb +59 -0
- data/app/controllers/spud/admin/post_comments_controller.rb +68 -0
- data/app/controllers/spud/admin/posts_controller.rb +62 -0
- data/app/controllers/spud/blog/sitemaps_controller.rb +9 -0
- data/app/helpers/blog_helper.rb +25 -0
- data/app/helpers/news_helper.rb +2 -0
- data/app/helpers/spud/admin/news_posts_helper.rb +2 -0
- data/app/helpers/spud/admin/post_categories_helper.rb +2 -0
- data/app/helpers/spud/admin/post_comments_helper.rb +2 -0
- data/app/helpers/spud/admin/posts_helper.rb +22 -0
- data/app/helpers/spud/blog/sitemaps_helper.rb +2 -0
- data/app/models/spud_post.rb +171 -0
- data/app/models/spud_post_categories_post.rb +5 -0
- data/app/models/spud_post_category.rb +70 -0
- data/app/models/spud_post_category_sweeper.rb +41 -0
- data/app/models/spud_post_comment.rb +19 -0
- data/app/models/spud_post_comment_sweeper.rb +33 -0
- data/app/models/spud_post_site.rb +9 -0
- data/app/models/spud_post_sweeper.rb +47 -0
- data/app/views/blog/_comment.html.erb +4 -0
- data/app/views/blog/_comment_form.html.erb +20 -0
- data/app/views/blog/index.html.erb +35 -0
- data/app/views/blog/index.rss.builder +18 -0
- data/app/views/blog/show.html.erb +37 -0
- data/app/views/news/index.html.erb +35 -0
- data/app/views/news/index.rss.builder +18 -0
- data/app/views/news/show.html.erb +27 -0
- data/app/views/spud/admin/news_posts/edit.html.erb +3 -0
- data/app/views/spud/admin/news_posts/index.html.erb +44 -0
- data/app/views/spud/admin/news_posts/new.html.erb +3 -0
- data/app/views/spud/admin/post_categories/_category.html.erb +14 -0
- data/app/views/spud/admin/post_categories/_form.html.erb +23 -0
- data/app/views/spud/admin/post_categories/edit.html.erb +1 -0
- data/app/views/spud/admin/post_categories/index.html.erb +9 -0
- data/app/views/spud/admin/post_categories/new.html.erb +1 -0
- data/app/views/spud/admin/post_comments/index.html.erb +47 -0
- data/app/views/spud/admin/posts/_category.html.erb +9 -0
- data/app/views/spud/admin/posts/_form.html.erb +117 -0
- data/app/views/spud/admin/posts/edit.html.erb +3 -0
- data/app/views/spud/admin/posts/index.html.erb +50 -0
- data/app/views/spud/admin/posts/new.html.erb +3 -0
- data/app/views/spud/blog/sitemaps/show.xml.builder +16 -0
- data/config/routes.rb +94 -0
- data/db/migrate/20120125180945_create_spud_posts.rb +15 -0
- data/db/migrate/20120125181022_create_spud_post_categories.rb +13 -0
- data/db/migrate/20120125181359_create_spud_post_comments.rb +13 -0
- data/db/migrate/20120127143054_add_url_to_spud_posts.rb +6 -0
- data/db/migrate/20120127144942_add_url_to_spud_post_categories.rb +8 -0
- data/db/migrate/20120210165540_add_is_news_to_spud_posts.rb +6 -0
- data/db/migrate/20120309181917_add_meta_to_posts.rb +6 -0
- data/db/migrate/20120413020437_add_comments_counter_to_spud_posts.rb +12 -0
- data/db/migrate/20120713150446_create_spud_post_sites.rb +11 -0
- data/db/migrate/20120825142547_add_spam_fields_to_spud_post_comments.rb +8 -0
- data/db/migrate/20120825144506_add_permalink_to_spud_post_comments.rb +5 -0
- data/db/migrate/20121113135812_add_nested_set_to_post_categories.rb +21 -0
- data/db/migrate/20130120151857_add_content_format_to_spud_posts.rb +5 -0
- data/db/migrate/20130121130612_add_content_processed_to_spud_post.rb +5 -0
- data/lib/generators/spud/blog/random_posts_generator.rb +60 -0
- data/lib/generators/spud/blog/views_generator.rb +19 -0
- data/lib/spud_blog/configuration.rb +25 -0
- data/lib/spud_blog/engine.rb +64 -0
- data/lib/spud_blog/version.rb +5 -0
- data/lib/tasks/spud_blog_tasks.rake +4 -0
- data/lib/tb_blog.rb +6 -0
- data/test/fixtures/spud_post_sites.yml +9 -0
- data/test/unit/spud_post_site_test.rb +7 -0
- metadata +338 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= form_for @post_category, :url => (@post_category.new_record? ? spud_admin_post_categories_path : spud_admin_post_category_path(@post_category)), :html => {:class => 'form-horizontal spud_post_category_form'} do |f| %>
|
2
|
+
|
3
|
+
<%= error_messages_for(f.object) %>
|
4
|
+
|
5
|
+
<fieldset>
|
6
|
+
<div class="control-group">
|
7
|
+
<%= f.label :name,"Name",:class => "control-label" %>
|
8
|
+
<div class="controls">
|
9
|
+
<%= f.text_field :name %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<div class="control-group">
|
13
|
+
<%= label_tag :parent,'Parent',:class => "control-label" %>
|
14
|
+
<div class="controls">
|
15
|
+
<select name="spud_post_category[parent_id]">
|
16
|
+
<option value="">No Parent</option>
|
17
|
+
<%= options_for_select(SpudPostCategory.options_for_categories(:filter => @post_category.id), @post_category.parent_id) %>
|
18
|
+
</select>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</fieldset>
|
22
|
+
|
23
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => 'form' %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="spud_blog_category_manager">
|
2
|
+
<%= link_to "New Post Category", new_spud_admin_post_category_path, :class => "btn btn-small btn-primary spud_blog_category_add_new", :title => "New Post Category" %>
|
3
|
+
<ul class="spud_blog_category_manager_list">
|
4
|
+
<% if @post_categories.length == 0 %>
|
5
|
+
<li class="spud_blog_category_manager_empty">You do not have any Post Categories at this time.</li>
|
6
|
+
<% end %>
|
7
|
+
<%= render :partial => 'category', :collection => @post_categories[nil] %>
|
8
|
+
</ul>
|
9
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => 'form', :locals => {:path => spud_admin_post_categories_path} %>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<%= content_for :data_controls do %>
|
2
|
+
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<%=content_for :detail do %>
|
6
|
+
<table class="admin-table">
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
|
10
|
+
<th>Author</th>
|
11
|
+
<th>Comment</th>
|
12
|
+
<th>Attached To</th>
|
13
|
+
<th>Status</th>
|
14
|
+
<th> </th>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
<% @post_comments.each do |comment| %>
|
19
|
+
<tr>
|
20
|
+
<td><%= comment.author %></td>
|
21
|
+
<td>
|
22
|
+
<span class='submitted-on'>Submitted: <%=timestamp(comment.created_at)%></span>
|
23
|
+
<%= comment.content %>
|
24
|
+
</td>
|
25
|
+
<td><%= link_to comment.post.title, blog_post_path(comment.post.url_name)%></td>
|
26
|
+
<td>
|
27
|
+
<% if comment.spam %>
|
28
|
+
Spam
|
29
|
+
<% else %>
|
30
|
+
Approved
|
31
|
+
<% end %>
|
32
|
+
</td>
|
33
|
+
<td align="right">
|
34
|
+
<%= link_to 'Approve', approve_spud_admin_post_comment_path(comment), :class => 'btn btn-success btn-small' %>
|
35
|
+
<%= link_to 'Spam', spam_spud_admin_post_comment_path(comment), :class => 'btn btn-warning btn-small' %>
|
36
|
+
<%= link_to 'Delete', spud_admin_post_comment_path(comment), :method => :delete, :confirm => 'Are you sure you want to delete this comment?', :class => 'btn btn-danger btn-small' %>
|
37
|
+
</td>
|
38
|
+
</tr>
|
39
|
+
<%end%>
|
40
|
+
</tbody>
|
41
|
+
</table>
|
42
|
+
<div class="spud_admin_pagination">
|
43
|
+
<%= will_paginate @post_comments%>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
|
47
|
+
<%end%>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= content_tag :li, :class => 'spud_post_form_category', 'data-id' => category.id do %>
|
2
|
+
<%= check_box_tag 'spud_post[category_ids][]', category.id, @post.category_ids.include?(category.id), :id => "spud_post_category_#{category.id}" %>
|
3
|
+
<%= label_tag "spud_post_category_#{category.id}", category.name %>
|
4
|
+
<ul>
|
5
|
+
<% if @categories[category.id] %>
|
6
|
+
<%= render :partial => '/spud/admin/posts/category', :collection => @categories[category.id] %>
|
7
|
+
<% end %>
|
8
|
+
</ul>
|
9
|
+
<% end %>
|
@@ -0,0 +1,117 @@
|
|
1
|
+
<%=error_messages_for(f.object)%>
|
2
|
+
|
3
|
+
<fieldset>
|
4
|
+
<div class="control-group">
|
5
|
+
<%= f.label :title, :required=>true,:style =>"display:none;" %>
|
6
|
+
<%= f.text_field :title, :class => "full-width",:placeholder=>"Enter title here" %>
|
7
|
+
</div>
|
8
|
+
</fieldset>
|
9
|
+
<%if Spud::Blog.config.enable_markdown%>
|
10
|
+
<div class="control-group">
|
11
|
+
<div class="controls">
|
12
|
+
<%=f.select :content_format,[["HTML"],["Markdown"]], {:include_blank => false}, :class => "pull-right", "data-formatter" => "spud_post_content"%>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<%end%>
|
16
|
+
<div style="clear:both;">
|
17
|
+
<%= f.text_area :content,:style => "width:100%;", :class => 'tinymce full-width', "data-format" => f.object.content_format%>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<% if Spud::Blog.config.has_custom_fields %>
|
21
|
+
<fieldset>
|
22
|
+
<legend>Custom Fields</legend>
|
23
|
+
<%= render :partial => '/spud/admin/posts/custom_fields', :locals => {:f => f} %>
|
24
|
+
</fieldset>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<fieldset class="spud_post_form_fieldset">
|
28
|
+
<legend>Advanced</legend>
|
29
|
+
|
30
|
+
<div class="spud_post_form_col">
|
31
|
+
<h4>Meta Data</h4>
|
32
|
+
|
33
|
+
<div class="spud_post_form_row">
|
34
|
+
<%= f.label :published_at, 'Publish Date' %>
|
35
|
+
<%= f.text_field :published_at,:value => f.object.published_at.strftime("%Y-%m-%d %H:%M") , :class => 'spud_form_date_picker' %>
|
36
|
+
<span class="time_select">
|
37
|
+
<%= f.time_select :published_at, :ignore_date => true,:ampm => true%>
|
38
|
+
</span>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<% if @current_user.super_admin %>
|
42
|
+
<div class="spud_post_form_row">
|
43
|
+
<%= f.label :spud_user_id, 'Author' %>
|
44
|
+
<%= f.select :spud_user_id,options_for_select(SpudUser.order(:first_name,:last_name,:login).all.collect{|user| [user.full_name,user.id]},f.object.spud_user_id)%>
|
45
|
+
</div>
|
46
|
+
<% else %>
|
47
|
+
<%= f.hidden_field :spud_user_id %>
|
48
|
+
<% end %>
|
49
|
+
|
50
|
+
<% if Spud::Core.config.multisite_mode_enabled %>
|
51
|
+
<div class="spud_post_form_row">
|
52
|
+
<%= f.label :sites, 'Websites to Publish' %>
|
53
|
+
<div class="spud_post_form_input_group">
|
54
|
+
<%= spud_post_site_check_box_tag(Spud::Core.default_site_config, @post) %>
|
55
|
+
<%= spud_post_site_label_tag(Spud::Core.default_site_config) %>
|
56
|
+
<% Spud::Core.config.multisite_config.each do |site| %>
|
57
|
+
<%= spud_post_site_check_box_tag(site, @post) %>
|
58
|
+
<%= spud_post_site_label_tag(site) %>
|
59
|
+
<% end %>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
<% end %>
|
63
|
+
|
64
|
+
<div class="spud_post_form_row">
|
65
|
+
<%= f.label :visible %>
|
66
|
+
<div class="spud_post_form_input_group">
|
67
|
+
<%= f.radio_button :visible, true %>
|
68
|
+
<label class="radio inline" for="spud_post_visible_true">Yes</label>
|
69
|
+
<%= f.radio_button :visible, false %>
|
70
|
+
<label class="radio inline" for="spud_post_visible_false">No</label>
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
|
74
|
+
<% unless @post.is_news %>
|
75
|
+
<div class="spud_post_form_row">
|
76
|
+
<%= f.label :comments_enabled,"Comments Enabled" %>
|
77
|
+
<div class="spud_post_form_input_group">
|
78
|
+
<%= f.radio_button :comments_enabled, true %>
|
79
|
+
<label class="radio inline" for="spud_post_comments_enabled_true">Yes</label>
|
80
|
+
<%= f.radio_button :comments_enabled, false %>
|
81
|
+
<label class="radio inline" for="spud_post_comments_enabled_false">No</label>
|
82
|
+
</div>
|
83
|
+
</div>
|
84
|
+
<% end %>
|
85
|
+
|
86
|
+
<div class="spud_post_form_row">
|
87
|
+
<%= f.label :meta_keywords, 'Keywords' %>
|
88
|
+
<%= f.text_field :meta_keywords %>
|
89
|
+
<span class="spud_post_form_help_block">A Comma seperated list of keywords for search engines. Keep it short (no more than 10 keywords)</span>
|
90
|
+
</div>
|
91
|
+
|
92
|
+
<div class="spud_post_form_row">
|
93
|
+
<%= f.label :meta_description, 'Description' %>
|
94
|
+
<%= f.text_area :meta_description %>
|
95
|
+
<span class="spud_post_form_help_block">A short description of the article. This is what appears on a search engines search result page.</span>
|
96
|
+
</div>
|
97
|
+
</div>
|
98
|
+
|
99
|
+
<div class="spud_post_form_col">
|
100
|
+
<h4>Categories</h4>
|
101
|
+
<%= link_to 'Add Category', new_spud_admin_post_category_path, :class => 'btn btn-mini spud_post_add_category' %>
|
102
|
+
<input type="hidden" name="spud_post[category_ids][]" value="" />
|
103
|
+
<ul class="spud_post_categories_form">
|
104
|
+
<%= render :partial => '/spud/admin/posts/category', :collection => @categories[nil] %>
|
105
|
+
</ul>
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</fieldset>
|
109
|
+
<%= f.hidden_field :is_news %>
|
110
|
+
|
111
|
+
<div class="form-actions">
|
112
|
+
<%=f.submit "Save Post", :class=>"btn btn-primary form-btn","data-loading-text"=>"Saving..."%> or <%=link_to "cancel",request.referer, :class => "btn"%>
|
113
|
+
</div>
|
114
|
+
|
115
|
+
<script type="text/javascript">
|
116
|
+
$(document).ready(spud.admin.posts.edit);
|
117
|
+
</script>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
<%= content_for :data_controls do %>
|
2
|
+
<%= link_to "Manage Categories", spud_admin_post_categories_path, :class => 'btn spud_blog_manage_categories', :title => 'Manage Categories' %>
|
3
|
+
<%= link_to "Manage Comments", spud_admin_post_comments_path, :class => 'btn', :title => 'Manage Comments' %>
|
4
|
+
<%= link_to "New Post", new_spud_admin_post_path, :class => "btn btn-primary", :title => "New Post" %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%=content_for :detail do %>
|
8
|
+
<table class="admin-table">
|
9
|
+
<thead>
|
10
|
+
<tr>
|
11
|
+
<th>Title</th>
|
12
|
+
<th>Author</th>
|
13
|
+
<th>Published At</th>
|
14
|
+
<th>Comments</th>
|
15
|
+
<th> </th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<% @posts.each do |post| %>
|
20
|
+
<tr>
|
21
|
+
<td>
|
22
|
+
<%= link_to edit_spud_admin_post_path(post) do %>
|
23
|
+
<%=post.title%>
|
24
|
+
<%if !post.visible%>
|
25
|
+
<span class="badge">Draft</span>
|
26
|
+
<%end%>
|
27
|
+
<%end%>
|
28
|
+
</td>
|
29
|
+
<td><%= post.author.full_name %></td>
|
30
|
+
<td><%= link_to(post.published_at.strftime('%m/%d/%Y'), blog_post_path(post.url_name)) %></td>
|
31
|
+
<td>
|
32
|
+
Approved: <%=link_to post.visible_comments.count, spud_admin_post_post_comments_path(:post_id => post.id) %>
|
33
|
+
<br/>
|
34
|
+
Spam: <%=link_to post.spam_comments.count, spud_admin_post_post_comments_path(:post_id => post.id) %>
|
35
|
+
</td>
|
36
|
+
<td align="right">
|
37
|
+
<%= link_to 'Delete', spud_admin_post_path(post), :method => :delete, :confirm => 'Are you sure you want to delete this post?', :class => 'btn btn-danger' %>
|
38
|
+
</td>
|
39
|
+
</tr>
|
40
|
+
<%end%>
|
41
|
+
</tbody>
|
42
|
+
</table>
|
43
|
+
<div class="spud_admin_pagination">
|
44
|
+
<%= will_paginate @posts %>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<script>
|
48
|
+
$(document).ready(spud.admin.post_categories.index);
|
49
|
+
</script>
|
50
|
+
<%end%>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8'
|
3
|
+
|
4
|
+
# create the urlset
|
5
|
+
xml.urlset :xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9' do
|
6
|
+
@posts.each do |post|
|
7
|
+
xml.url do
|
8
|
+
if post.is_news
|
9
|
+
xml.loc news_post_url(post.url_name)
|
10
|
+
else
|
11
|
+
xml.loc blog_post_url(post.url_name)
|
12
|
+
end
|
13
|
+
xml.lastmod post.published_at.xmlschema
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
|
3
|
+
namespace :spud do
|
4
|
+
namespace :admin do
|
5
|
+
resources :posts do
|
6
|
+
resources :post_comments, :path => 'comments', :only => :index
|
7
|
+
end
|
8
|
+
resources :news_posts
|
9
|
+
resources :post_comments, :except => [:new, :create, :edit, :update] do
|
10
|
+
member do
|
11
|
+
get 'approve'
|
12
|
+
get 'spam'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
resources :post_categories
|
16
|
+
end
|
17
|
+
namespace :blog do
|
18
|
+
resource :sitemap,:only => "show"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
if Spud::Blog.config.blog_enabled
|
23
|
+
scope Spud::Blog.config.blog_path do
|
24
|
+
|
25
|
+
# Blog Post Categories
|
26
|
+
get 'category/:category_url_name(/page/:page)',
|
27
|
+
:controller => 'blog',
|
28
|
+
:action => 'category',
|
29
|
+
:as => 'blog_category',
|
30
|
+
:defaults => {:page => 1}
|
31
|
+
get 'category/:category_url_name/:archive_date(/page/:page)',
|
32
|
+
:controller => 'blog',
|
33
|
+
:action => 'category',
|
34
|
+
:as => 'blog_category_archive',
|
35
|
+
:defaults => {:page => 1}
|
36
|
+
|
37
|
+
# Blog Post Archives
|
38
|
+
get 'archive/:archive_date(/page/:page)',
|
39
|
+
:controller => 'blog',
|
40
|
+
:action => 'archive',
|
41
|
+
:as => 'blog_archive',
|
42
|
+
:defaults => {:page => 1}
|
43
|
+
|
44
|
+
# Category/Archive filtering
|
45
|
+
post '/', :controller => 'blog', :action => 'filter'
|
46
|
+
|
47
|
+
# Blog Posts
|
48
|
+
get '/(page/:page)',
|
49
|
+
:controller => 'blog',
|
50
|
+
:action => 'index',
|
51
|
+
:as => 'blog',
|
52
|
+
:defaults => {:page => 1}
|
53
|
+
resources :blog_posts, :path => '/', :controller => 'blog', :only => [:show] do
|
54
|
+
post '/', :on => :member, :controller => 'blog', :action => 'create_comment'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if Spud::Blog.config.news_enabled
|
60
|
+
scope Spud::Blog.config.news_path do
|
61
|
+
|
62
|
+
# News Post Categories
|
63
|
+
get 'category/:category_url_name(/page/:page)',
|
64
|
+
:controller => 'news',
|
65
|
+
:action => 'category',
|
66
|
+
:as => 'news_category',
|
67
|
+
:defaults => {:page => 1}
|
68
|
+
get 'category/:category_url_name/:archive_date(/page/:page)',
|
69
|
+
:controller => 'news',
|
70
|
+
:action => 'category',
|
71
|
+
:as => 'news_category_archive',
|
72
|
+
:defaults => {:page => 1}
|
73
|
+
|
74
|
+
# News Post Archives
|
75
|
+
get 'archive/:archive_date(/page/:page)',
|
76
|
+
:controller => 'news',
|
77
|
+
:action => 'archive',
|
78
|
+
:as => 'news_archive',
|
79
|
+
:defaults => {:page => 1}
|
80
|
+
|
81
|
+
# Category/Archive filtering
|
82
|
+
post '/', :controller => 'news', :action => 'filter'
|
83
|
+
|
84
|
+
# News Posts
|
85
|
+
get '/(page/:page)',
|
86
|
+
:controller => 'news',
|
87
|
+
:action => 'index',
|
88
|
+
:as => 'news',
|
89
|
+
:defaults => {:page => 1}
|
90
|
+
resources :news_posts, :path => '/', :controller => 'news', :only => [:show]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateSpudPosts < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spud_posts do |t|
|
4
|
+
t.integer :spud_user_id
|
5
|
+
t.string :title
|
6
|
+
t.text :content
|
7
|
+
t.boolean :comments_enabled, :default => false
|
8
|
+
t.boolean :visible, :default => true
|
9
|
+
t.datetime :published_at
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
add_index :spud_posts, :spud_user_id
|
13
|
+
add_index :spud_posts, :visible
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateSpudPostCategories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spud_post_categories do |t|
|
4
|
+
t.string :name
|
5
|
+
t.timestamps
|
6
|
+
end
|
7
|
+
create_table :spud_post_categories_posts, :id => false do |t|
|
8
|
+
t.integer :spud_post_id
|
9
|
+
t.integer :spud_post_category_id
|
10
|
+
end
|
11
|
+
add_index :spud_post_categories_posts, :spud_post_category_id
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateSpudPostComments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spud_post_comments do |t|
|
4
|
+
t.integer :spud_post_id
|
5
|
+
t.string :author
|
6
|
+
t.text :content
|
7
|
+
t.boolean :approved, :default => false
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
add_index :spud_post_comments, :spud_post_id
|
11
|
+
add_index :spud_post_comments, :approved
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class AddUrlToSpudPostCategories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spud_post_categories, :parent_id, :integer, :default => 0
|
4
|
+
add_column :spud_post_categories, :url_name, :string
|
5
|
+
add_index :spud_post_categories, :parent_id
|
6
|
+
add_index :spud_post_categories, :url_name
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class AddCommentsCounterToSpudPosts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :spud_posts, :comments_count, :integer, :default => 0
|
4
|
+
SpudPost.find_each do |post|
|
5
|
+
post.comments_count = post.comments.count
|
6
|
+
post.save
|
7
|
+
end
|
8
|
+
end
|
9
|
+
def self.down
|
10
|
+
remove_column :spud_posts, :comments_count
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateSpudPostSites < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spud_post_sites do |t|
|
4
|
+
t.integer :spud_post_id, :null => false
|
5
|
+
t.integer :spud_site_id, :null => false
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
add_index :spud_post_sites, :spud_post_id
|
9
|
+
add_index :spud_post_sites, :spud_site_id
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class AddSpamFieldsToSpudPostComments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spud_post_comments, :spam, :boolean
|
4
|
+
add_column :spud_post_comments, :user_ip, :string
|
5
|
+
add_column :spud_post_comments, :user_agent, :string
|
6
|
+
add_column :spud_post_comments, :referrer, :string
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class AddNestedSetToPostCategories < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
change_table :spud_post_categories do |t|
|
4
|
+
t.integer :lft
|
5
|
+
t.integer :rgt
|
6
|
+
t.integer :depth
|
7
|
+
end
|
8
|
+
|
9
|
+
# Populates lft, rgt, and depth values for nested set
|
10
|
+
SpudPostCategory.where(:parent_id => 0).update_all({:parent_id => nil})
|
11
|
+
SpudPostCategory.rebuild!
|
12
|
+
end
|
13
|
+
|
14
|
+
def down
|
15
|
+
change_table :spud_post_categories do |t|
|
16
|
+
t.remove :ltf
|
17
|
+
t.remove :rgt
|
18
|
+
t.remove :depth
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
class Spud::Blog::RandomPostsGenerator < ::Rails::Generators::Base
|
4
|
+
|
5
|
+
def generate
|
6
|
+
if Spud::Blog.config.blog_enabled
|
7
|
+
puts 'Generating random blog posts...'
|
8
|
+
random_posts(false)
|
9
|
+
end
|
10
|
+
if Spud::Blog.config.news_enabled
|
11
|
+
puts 'Generating random news posts...'
|
12
|
+
random_posts(true)
|
13
|
+
end
|
14
|
+
puts 'Assigning categories...'
|
15
|
+
category_ids = SpudPostCategory.all.collect{ |c| c.id }
|
16
|
+
SpudPost.all.each do |p|
|
17
|
+
p.category_ids = [category_ids[rand(category_ids.length)]]
|
18
|
+
p.save
|
19
|
+
end
|
20
|
+
puts 'Done!'
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def random_posts(is_news)
|
26
|
+
100.times do
|
27
|
+
post = SpudPost.create({
|
28
|
+
:title => random_title,
|
29
|
+
:content => random_content,
|
30
|
+
:published_at => random_time,
|
31
|
+
:visible => 1,
|
32
|
+
:spud_user_id => 1,
|
33
|
+
:is_news => is_news
|
34
|
+
})
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def random_word
|
39
|
+
chars = 'abcdefghjkmnpqrstuvwxyz'
|
40
|
+
length = rand(8) + 1
|
41
|
+
return (1..length).collect{ chars[rand(chars.length)] }.join('')
|
42
|
+
end
|
43
|
+
|
44
|
+
def random_title
|
45
|
+
return (1..4).collect{ random_word.capitalize }.join(' ')
|
46
|
+
end
|
47
|
+
|
48
|
+
def random_content
|
49
|
+
content = ''
|
50
|
+
3.times do |i|
|
51
|
+
content += '<p>' + (1..30).collect{ random_word }.join(' ').capitalize + '.</p>'
|
52
|
+
end
|
53
|
+
return content
|
54
|
+
end
|
55
|
+
|
56
|
+
def random_time
|
57
|
+
return Time.at(1.year.ago + rand * (Time.now.to_f - 1.year.ago.to_f))
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
class Spud::Blog::ViewsGenerator < ::Rails::Generators::Base
|
4
|
+
|
5
|
+
source_root File.expand_path('../../../../../app/views', __FILE__)
|
6
|
+
|
7
|
+
def install
|
8
|
+
if Spud::Blog.config.blog_enabled
|
9
|
+
copy_file 'blog/_comment.html.erb', 'app/views/blog/_comment.html.erb'
|
10
|
+
copy_file 'blog/_comment_form.html.erb', 'app/views/blog/_comment_form.html.erb'
|
11
|
+
copy_file 'blog/index.html.erb', 'app/views/blog/index.html.erb'
|
12
|
+
copy_file 'blog/show.html.erb', 'app/views/blog/show.html.erb'
|
13
|
+
end
|
14
|
+
if Spud::Blog.config.news_enabled
|
15
|
+
copy_file 'news/index.html.erb', 'app/views/news/index.html.erb'
|
16
|
+
copy_file 'news/show.html.erb', 'app/views/news/show.html.erb'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Spud
|
2
|
+
module Blog
|
3
|
+
include ActiveSupport::Configurable
|
4
|
+
config_accessor(
|
5
|
+
:base_layout, :news_layout, :blog_enabled,
|
6
|
+
:news_enabled, :posts_per_page, :blog_path,
|
7
|
+
:news_path, :enable_sitemap, :has_custom_fields,
|
8
|
+
:cache_mode, :action_caching_duration,
|
9
|
+
:enable_rakismet, :enable_markdown
|
10
|
+
)
|
11
|
+
self.base_layout = 'application'
|
12
|
+
self.news_layout = nil
|
13
|
+
self.news_enabled = false
|
14
|
+
self.blog_enabled = true
|
15
|
+
self.posts_per_page = 5
|
16
|
+
self.blog_path = 'blog'
|
17
|
+
self.news_path = 'news'
|
18
|
+
self.enable_sitemap = true
|
19
|
+
self.has_custom_fields = false
|
20
|
+
self.cache_mode = nil #options :full_page, :action
|
21
|
+
self.action_caching_duration = 3600
|
22
|
+
self.enable_rakismet = false
|
23
|
+
self.enable_markdown = false
|
24
|
+
end
|
25
|
+
end
|