beef-articles 0.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.
Files changed (38) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +7 -0
  5. data/Rakefile +58 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/articles_controller.rb +89 -0
  8. data/app/controllers/admin/categories_controller.rb +83 -0
  9. data/app/controllers/admin/comments_controller.rb +30 -0
  10. data/app/controllers/articles_controller.rb +55 -0
  11. data/app/controllers/comments_controller.rb +50 -0
  12. data/app/helpers/articles_helper.rb +92 -0
  13. data/app/helpers/comments_helper.rb +7 -0
  14. data/app/models/article.rb +37 -0
  15. data/app/models/category.rb +17 -0
  16. data/app/models/comment.rb +16 -0
  17. data/app/views/admin/articles/index.html.erb +45 -0
  18. data/app/views/admin/articles/preview.js.rjs +1 -0
  19. data/app/views/admin/articles/show.html.erb +58 -0
  20. data/app/views/admin/categories/index.html.erb +31 -0
  21. data/app/views/admin/categories/show.html.erb +18 -0
  22. data/app/views/admin/comments/index.html.erb +33 -0
  23. data/app/views/articles/_article.html.erb +12 -0
  24. data/app/views/articles/index.html.erb +40 -0
  25. data/app/views/articles/index.rss.builder +18 -0
  26. data/app/views/articles/show.html.erb +55 -0
  27. data/app/views/comments/_comment.html.erb +4 -0
  28. data/app/views/comments/_form.html.erb +25 -0
  29. data/app/views/comments/new.html.erb +4 -0
  30. data/articles.gemspec +79 -0
  31. data/config/routes.rb +32 -0
  32. data/generators/articles_migration/articles_migration_generator.rb +11 -0
  33. data/generators/articles_migration/templates/migration.rb +45 -0
  34. data/lib/articles.rb +7 -0
  35. data/rails/init.rb +9 -0
  36. data/test/articles_test.rb +7 -0
  37. data/test/test_helper.rb +10 -0
  38. metadata +110 -0
@@ -0,0 +1,7 @@
1
+ module CommentsHelper
2
+
3
+ def comments_list(commentable)
4
+ content_tag :ul, render(:partial => commentable.comments, :locals => { :commentable => commentable }), :id => 'comment-list' unless commentable.comments.empty?
5
+ end
6
+
7
+ end
@@ -0,0 +1,37 @@
1
+ class Article < ActiveRecord::Base
2
+ belongs_to :category
3
+
4
+ acts_as_content_node
5
+ acts_as_commentable
6
+ has_assets
7
+ acts_as_textiled :body
8
+ acts_as_taggable_on :tags
9
+
10
+ named_scope :categorised, lambda { |category|
11
+ return {} if category.nil?
12
+ category = Category.find(category) unless category.nil? or category.is_a? Category
13
+ { :conditions => { :category_id => category.id } }
14
+ }
15
+
16
+ named_scope :in_time_delta, lambda { |year, month, day|
17
+ return {} if year.blank?
18
+ from = Time.mktime(year, month || 1, day || 1)
19
+ to = from + 1.year
20
+ to = from + 1.month unless month.blank?
21
+ to = from + 1.day unless day.blank?
22
+ to = to.tomorrow unless month.blank?
23
+ { :conditions => ['published_at BETWEEN ? AND ?', from, to ] }
24
+ }
25
+
26
+ validates_presence_of :body, :description, :tag_list, :if => :publish
27
+
28
+ # Finds one article which was posted on a certain date and matches the supplied dashed-title
29
+ def self.find_by_permalink(year, month, day, permalink)
30
+ if result = in_time_delta(year, month, day).first( :conditions => ["permalink = ?", permalink] )
31
+ result
32
+ else
33
+ raise ActiveRecord::RecordNotFound, "Couldn't find article with permalink #{permalink} on #{year}.#{month}.#{day}}"
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,17 @@
1
+ class Category < ActiveRecord::Base
2
+
3
+ has_many :articles
4
+
5
+ validates_presence_of :title
6
+ validates_uniqueness_of :title
7
+
8
+ named_scope :with, lambda { |many| {:joins => many.to_sym, :group => 'categories.id'} }
9
+
10
+ before_save :set_url
11
+
12
+ private
13
+
14
+ def set_url
15
+ write_attribute :permalink, title.parameterize
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ class Comment < ActiveRecord::Base
2
+ belongs_to :commentable, :polymorphic => true
3
+
4
+ acts_as_textiled :body => [:hard_breaks, :filter_html, :filter_styles]
5
+
6
+ validates_presence_of :name, :comment
7
+ validates_acceptance_of :spam_filter, :accept => true, :on => :create, :allow_nil => false, :message => "believes message to be spam."
8
+ validates_format_of :email, :with => %r{.+@.+\..+}
9
+
10
+ attr_accessor :spam_filter
11
+
12
+ def website=(url)
13
+ write_attribute :website, url.gsub(/^http\:\/\//, '') unless url.blank?
14
+ end
15
+
16
+ end
@@ -0,0 +1,45 @@
1
+ <h1>Listing articles</h1>
2
+
3
+ <ul class="choices">
4
+ <li><%= link_to 'New article', new_admin_article_path %></li>
5
+ </ul>
6
+
7
+ <table>
8
+ <thead>
9
+ <tr>
10
+ <%= sortable_table_header :name => "Title", :sort => "title" %>
11
+ <th>Status</th>
12
+ <th>Author</th>
13
+ <%= sortable_table_header :name => "Updated", :sort => "updated_at" %>
14
+ <%= sortable_table_header :name => "Published At", :sort => "published_at" %>
15
+ <%= sortable_table_header :name => "Published To", :sort => "published_to" %>
16
+ <th colspan="3">Actions</th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <% @articles.each do |article| %>
21
+ <tr id="article-<%= article.id %>">
22
+ <td><%=h article.title %></td>
23
+ <td><%= content_status(article) %></td>
24
+ <td><%= article.author %></td>
25
+ <td><%= article.updated_at.strftime('%d %b') %></td>
26
+ <td><%= article.published_at.strftime('%d %b') unless article.published_at.nil? %></td>
27
+ <td><%= article.published_to.strftime('%d %b') unless article.published_to.nil? %></td>
28
+ <td><%= link_to 'Show', article_permalink(article), :class => 'show' if article.published? %></td>
29
+ <td><%= link_to 'Edit', admin_article_path(article), :class => 'edit' %></td>
30
+ <td><%= link_to 'Destroy', admin_article_path(article), :confirm => 'Are you sure?', :method => :delete, :class => 'delete' %></td>
31
+ </tr>
32
+ <% end %>
33
+ </tbody>
34
+ <tfoot>
35
+ <tr>
36
+ <%= sortable_table_header :name => "Title", :sort => "title" %>
37
+ <th>Status</th>
38
+ <th>Author</th>
39
+ <%= sortable_table_header :name => "Updated", :sort => "updated_at" %>
40
+ <%= sortable_table_header :name => "Published At", :sort => "published_at" %>
41
+ <%= sortable_table_header :name => "Published To", :sort => "published_to" %>
42
+ <th colspan="3">Actions</th>
43
+ </tr>
44
+ </tfoot>
45
+ </table>
@@ -0,0 +1 @@
1
+ page << "myLightWindow.activateWindow({href: '#{preview_articles_path}', title: 'This is only a preview'});"
@@ -0,0 +1,58 @@
1
+ <% content_for :header do %>
2
+ <%= javascript_include_tag 'lightwindow' %>
3
+ <%= stylesheet_link_tag 'lightwindow' %>
4
+ <% end -%>
5
+
6
+ <h1><%= @article.new_record? ? 'New' : 'Editing' %> article</h1>
7
+
8
+ <% form_for([:admin, @article], :html => {:id => 'has-assets-form'}) do |f| %>
9
+ <%= f.error_messages %>
10
+
11
+ <p>
12
+ <%= f.label :title %><br/>
13
+ <%= f.text_field :title, :class => 'title' %>
14
+ </p>
15
+
16
+ <p>
17
+ <%= f.label :body %><br />
18
+ <%= f.text_area :body, :class => 'editor' %>
19
+ </p>
20
+ <p>
21
+ <%= f.label :description %><br />
22
+ <%= f.text_area :description, :rows => 3 %>
23
+ </p>
24
+ <p>
25
+ <%= f.label :tag_list %><br />
26
+ <%= f.text_field :tag_list, :class => 'long' %>
27
+ </p>
28
+ <p>
29
+ <%= f.label :category %>
30
+ <%= f.collection_select :category_id, Category.all, :id, :title, :prompt => true %>
31
+ </p>
32
+ <p>
33
+ <%= f.label :allow_comments %><br />
34
+ <%= f.check_box :allow_comments %>
35
+ </p>
36
+
37
+ <%= publish_select(f) %>
38
+
39
+ <p class="submission">
40
+ <%= preview_link(@article) %>
41
+ <%= f.submit 'Publish', :name => 'article[publish]' %>
42
+ <%= f.submit 'Save as draft', :name => 'article[hide]' %>
43
+ or <%= link_to 'Cancel', admin_articles_path %>
44
+ </p>
45
+ <% end %>
46
+
47
+
48
+ <% content_for :sub_content do %>
49
+
50
+ <%= asset_list(@article) %>
51
+
52
+ <h2>File Library</h2>
53
+ <%= asset_browser(true) %>
54
+
55
+ <h2>File Upload</h2>
56
+ <%= asset_upload_form %>
57
+
58
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <h1>Listing categories</h1>
2
+
3
+ <ul class="choices">
4
+ <li><%= link_to 'New category', new_admin_category_path %></li>
5
+ </ul>
6
+
7
+ <table>
8
+ <thead>
9
+ <tr>
10
+ <%= sortable_table_header :name => "Title", :sort => "title" %>
11
+ <%= sortable_table_header :name => "Description", :sort => "description" %>
12
+ <th colspan="2">Actions</th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ <% @categories.each do |category| %>
17
+ <tr id="category-<%= category.id %>">
18
+ <td><%= link_to category.title, admin_category_path(category) %></td>
19
+ <td><%=h category.description %></td>
20
+ <td><%= link_to 'Edit', admin_category_path(category), :class => 'edit' %></td>
21
+ <td><%= link_to 'Destroy', admin_category_path(category), :confirm => 'Are you sure?', :method => :delete, :class => 'delete' %></td>
22
+ </tr>
23
+ <% end %>
24
+ </tbody>
25
+ <tfoot>
26
+ <tr>
27
+ <%= sortable_table_header :name => "Title", :sort => "title" %>
28
+ <%= sortable_table_header :name => "Description", :sort => "description" %>
29
+ </tr>
30
+ </tfoot>
31
+ </table>
@@ -0,0 +1,18 @@
1
+ <h1><%= @category.new_record? ? 'New' : 'Editing' %> category</h1>
2
+
3
+ <% form_for([:admin, @category]) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <p>
7
+ <%= f.label :title %><br />
8
+ <%= f.text_field :title %>
9
+ </p>
10
+ <p>
11
+ <%= f.label :description %><br />
12
+ <%= f.text_area :description, :rows => 3 %>
13
+ </p>
14
+ <p class="submission">
15
+ <%= f.submit @category.new_record? ? 'Create' : 'Update', :disable_with => 'Submitting...' %> or <%= link_to 'Back', admin_categories_path %>
16
+ </p>
17
+ <% end %>
18
+
@@ -0,0 +1,33 @@
1
+ <h1>Listing comments</h1>
2
+
3
+ <table>
4
+ <thead>
5
+ <tr>
6
+ <% if @commentable.nil? -%>
7
+ <th>Article</th>
8
+ <% end -%>
9
+ <%= sortable_table_header :name => "Name", :sort => "name" %>
10
+ <%= sortable_table_header :name => "Comment", :sort => "comment" %>
11
+ <%= sortable_table_header :name => "Created", :sort => "created_at" %>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% @comments.each do |comment| %>
16
+ <tr id="comment-<%= comment.id %>">
17
+ <% if @commentable.nil? -%>
18
+ <td class="title"><%= link_to comment.commentable.title, [:admin, comment.commentable] %></td>
19
+ <% end -%>
20
+ <td><%= mail_to comment.email, comment.name %></td>
21
+ <td><%=h comment.comment %></td>
22
+ <td class="date"><%= comment.created_at.to_formatted_s(:short) %></td>
23
+ <td><%= link_to 'Destroy', admin_comment_path(comment), :confirm => 'Are you sure?', :method => :delete, :class => 'delete' %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ <tfoot>
28
+ <tr>
29
+ <%= sortable_table_header :name => "Name", :sort => "name" %>
30
+ <%= sortable_table_header :name => "Comment", :sort => "comment" %>
31
+ </tr>
32
+ </tfoot>
33
+ </table>
@@ -0,0 +1,12 @@
1
+ <!-- so:post -->
2
+ <dt>
3
+ <%= link_to h(article.title), article_permalink(article) %>
4
+ <%= link_to(image_tag(article.assets.images.first.public_filename(:medium)), article_permalink(article)) unless article.assets.images.first.nil? %>
5
+ </dt>
6
+ <dd>
7
+ <p class="post-meta">
8
+ <span class="date"><%= article.published_at.to_formatted_s(:short_dot) %></span> | posted by <%= link_to article.author, articles_authored_path(article.created_by) %>
9
+ </p>
10
+ <p><%=h article.description %></p>
11
+ </dd>
12
+ <!-- eo:post -->
@@ -0,0 +1,40 @@
1
+ <% content_for 'header' do %>
2
+ <%= auto_discovery_link_tag :rss, {:tag => params[:tag], :page => nil, :format => 'rss'} unless params[:year] %>
3
+ <% end %>
4
+
5
+ <h1>Articles</h1>
6
+
7
+ <%= link_to 'RSS', {:tag => params[:tag], :page => nil, :format => 'rss'} unless params[:year] %>
8
+
9
+
10
+ <!-- so:main-content -->
11
+ <div id="main-content">
12
+
13
+ <dl id="articles">
14
+ <%= render :partial => @articles %>
15
+ </dl>
16
+
17
+ <%= will_paginate %>
18
+
19
+ </div>
20
+ <!-- eo:main-content -->
21
+
22
+ <!-- so:supporting-content -->
23
+ <div id="supporting-content">
24
+ <%= article_categories %>
25
+
26
+ <h2>Archive</h2>
27
+ <%= archive %>
28
+
29
+ <h2>Latest Posts</h2>
30
+ <%= recent_articles %>
31
+
32
+ <h2>Tagcloud</h2>
33
+ <ul class="tag-cloud">
34
+ <% @tags.each do |tag| %>
35
+ <li><%= link_to tag.name, articles_tagged_path( tag.name ), :class => "css-class-#{tag.count}" %></li>
36
+ <% end %>
37
+ </ul>
38
+
39
+ </div>
40
+ <!-- eo:supporting-content -->
@@ -0,0 +1,18 @@
1
+ xml.instruct! :xml, :version=>"1.0"
2
+ xml.rss(:version=>"2.0") do
3
+ xml.channel do
4
+ xml.title("#{Settings.site_name} - #{page_title}")
5
+ xml.link(url_for {} )
6
+ xml.language('en-gb')
7
+ for article in @articles
8
+ xml.item do
9
+ xml.title(article.title)
10
+ xml.category(article.tag_list)
11
+ xml.description(article.description)
12
+ xml.pubDate(article.published_at.rfc822)
13
+ xml.link(article_permalink(article, :only_path => false))
14
+ xml.guid(article_permalink(article, :only_path => false))
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ <% content_for 'header' do %>
2
+ <%= auto_discovery_link_tag :rss, articles_path(:rss) %>
3
+ <% end %>
4
+
5
+ <div id="main-content">
6
+ <h1>News</h1>
7
+ <%= link_to 'RSS', articles_path(:rss), :class => 'rss' %>
8
+ <div class="post">
9
+ <h2><%=h @article.title %></h2>
10
+ <p class="post-meta">
11
+ on <span class="date"><%= @article.published_at.to_formatted_s(:short_dot) %></span> by <%= link_to @article.author, articles_authored_path(@article.created_by) %>
12
+ </p>
13
+ <%= @article.body %>
14
+
15
+ <% unless @article.assets.documents.empty? -%>
16
+ <ul>
17
+ <% for document in @article.assets.documents %>
18
+ <li><%= link_to document.filename %></li>
19
+ <% end %>
20
+ </ul>
21
+ <% end -%>
22
+
23
+ <a href="#" id="share-title" title="Share This Article">Share This</a>
24
+ <p class="share-links">
25
+ <%= mail_link @article %> <%= digg_link @article %> <%= delicious_link @article %> <%= facebook_link @article %> <%= stumble_link @article %> <%= twitter_link @article %> <%= reddit_link @article %> <%= technorati_link @article %>
26
+ </p>
27
+ </div><!-- eo:post -->
28
+
29
+
30
+ <% if @article.allow_comments? or !@article.comments.empty? -%>
31
+ <div id="comments">
32
+ <h2>Comments</h2>
33
+
34
+ <% if @article.comments.empty? -%>
35
+ <p class="no-comments">There are currently no comments.</p>
36
+ <% else -%>
37
+ <%= comments_list @article %>
38
+ <% end -%>
39
+
40
+ <% if @article.allow_comments? %>
41
+ <h2 id="respond">Leave a Comment</h2>
42
+ <%= render :partial => 'comments/form', :locals => { :commentable => @article } %>
43
+ <% end -%>
44
+ </div>
45
+ <% end -%>
46
+
47
+ </div><!-- eo:main-content -->
48
+
49
+ <div id="supporting-content">
50
+ <h3>Latest Posts</h3>
51
+ <%= recent_articles %>
52
+
53
+ <h3>Archive</h3>
54
+ <%= archive %>
55
+ </div><!-- eo: supporting-content -->
@@ -0,0 +1,4 @@
1
+ <li id="comment-<%= comment.id %>">
2
+ <%= sanitize comment.comment, :tags => Settings.allowed_html_tags_for_UGC.to_s.split(' '), :attributes => Settings.allowed_html_attributes_for_UGC.to_s.split(' ') %>
3
+ <a href="<%= article_permalink(commentable, :anchor => "comment-#{comment.id}") %>" title="Permalink to this comment"><%= comment.created_at.to_formatted_s(:short_dot)%></a> | posted by <%= link_to_unless comment.website.blank?, comment.name, "http://#{comment.website}" %>
4
+ </li>
@@ -0,0 +1,25 @@
1
+ <% form_for([commentable, (@comment || Comment.new)], :html => {:id=>"comment-form"} ) do |f| %>
2
+ <%= f.error_messages %>
3
+ <p>
4
+ <%= f.label :name, "Name" %><br/>
5
+ <%= f.text_field :name %>
6
+ </p>
7
+
8
+ <p>
9
+ <%= f.label :email %><br/>
10
+ <%= f.text_field :email %>
11
+ </p>
12
+
13
+ <p>
14
+ <%= f.label :website, 'Website' %><br/>
15
+ <%= f.text_field :website %>
16
+ </p>
17
+
18
+ <p>
19
+ <%= f.label :comment, "Comment" %><br/>
20
+ <%= f.text_area :comment, :rows => 5 %>
21
+ </p>
22
+
23
+ <p class="buttons"><%= f.submit 'Submit', :id => 'submit' %></p>
24
+
25
+ <% end -%>