tb_blog 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|