thredded 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a5e4586746eb175f9abdee9164cba73afdbf5d2
4
- data.tar.gz: 49ff149e997cc823e4ebdf231f7b710e3c4b4f7c
3
+ metadata.gz: f5bbfffd3928efffdf26597640c19eb5f9d52f24
4
+ data.tar.gz: 1c1fd24a8c1d0d52d01bea3727539b99bf5898f7
5
5
  SHA512:
6
- metadata.gz: 672530495e5d3ed43d6cb93283e56e4a6fa2a6be6ba2cefc593cc49b79c3073e246f1a4c2516a179d10e1f6a808d31886dd3fa3a740a64a26d6795d8fac20b71
7
- data.tar.gz: 9fe0b3d1e977e15e4e984abb7e2c20c1d637c78566360041891a7b1c7e6e2f164a593853155015e6f0baab388bc24ec3f7d240158a5b28bf40517b296a092b6c
6
+ metadata.gz: c98c1f4eacd78aa4df72ab88b92d9fa4f08ae12aff4118ba5c67013c58a6410eac3a46da923fcac53fd5a68820d3b603dc834c2c20cbefd8676950a4f3b4baad
7
+ data.tar.gz: e503d2a13970801509b6aada495bcee7308c32547074bc18b3f3d561089825d7131120ea66d2a9dce586f6ddda63c6ea6b0b3c60cadece68b926a7d31e88814c
@@ -3,7 +3,7 @@ module Thredded
3
3
  before_filter :messageboard, only: :show
4
4
 
5
5
  def index
6
- @messageboards = Messageboard.where(closed: false)
6
+ @messageboards = Messageboard.where(closed: false).decorate
7
7
  end
8
8
  end
9
9
  end
@@ -12,7 +12,7 @@ module Thredded
12
12
  authorize! :read, topic
13
13
 
14
14
  @posts = topic.posts.page(current_page)
15
- @post = messageboard.posts.build(topic: topic, filter: post_filter)
15
+ @post = messageboard.posts.build(topic: topic)
16
16
 
17
17
  update_read_status!
18
18
  end
@@ -41,6 +41,7 @@ module Thredded
41
41
  ip: request.remote_ip,
42
42
  user: current_user,
43
43
  messageboard: messageboard,
44
+ filter: messageboard.filter,
44
45
  )
45
46
  end
46
47
 
@@ -60,7 +61,11 @@ module Thredded
60
61
  end
61
62
 
62
63
  def topic
63
- @topic ||= messageboard.topics.find_by_slug(params[:topic_id])
64
+ @topic ||= topic_with_eager_loaded_user_topic_reads
65
+ end
66
+
67
+ def topic_with_eager_loaded_user_topic_reads
68
+ messageboard.topics.find_by_slug(params[:topic_id])
64
69
  end
65
70
 
66
71
  def user_topic
@@ -71,10 +76,6 @@ module Thredded
71
76
  @post ||= topic.posts.find(params[:id])
72
77
  end
73
78
 
74
- def post_filter
75
- messageboard.preferences_for(current_user).filter
76
- end
77
-
78
79
  def current_page
79
80
  params[:page].nil? ? 1 : params[:page].to_i
80
81
  end
@@ -26,7 +26,7 @@ module Thredded
26
26
  @topic = messageboard.topics.build
27
27
  @topic
28
28
  .posts
29
- .build(filter: messageboard.preferences_for(current_user).filter)
29
+ .build
30
30
 
31
31
  unless can? :create, @topic
32
32
  error = 'Sorry, you are not authorized to post on this messageboard.'
@@ -58,7 +58,7 @@ module Thredded
58
58
 
59
59
  def topic
60
60
  if messageboard
61
- @topic ||= messageboard.topics.where(slug: params[:id]).first
61
+ @topic ||= messageboard.topics.friendly.find(params[:id])
62
62
  end
63
63
  end
64
64
 
@@ -84,6 +84,7 @@ module Thredded
84
84
  messageboard: messageboard,
85
85
  ip: request.remote_ip,
86
86
  user: current_user,
87
+ filter: messageboard.filter,
87
88
  }
88
89
  }
89
90
  })
@@ -0,0 +1,74 @@
1
+ module Thredded
2
+ class MessageboardDecorator < SimpleDelegator
3
+ include ActionView::Helpers::NumberHelper
4
+ include ActionView::Helpers::TagHelper
5
+
6
+ def initialize(messageboard)
7
+ super
8
+ @messageboard = messageboard
9
+ end
10
+
11
+ def original
12
+ messageboard
13
+ end
14
+
15
+ def meta
16
+ topics_count = number_to_human(messageboard.topics_count)
17
+ posts_count = number_to_human(messageboard.posts_count)
18
+
19
+ "#{topics_count} topics, #{posts_count} posts".downcase
20
+ end
21
+
22
+ def description
23
+ if messageboard.description.blank?
24
+ ''
25
+ else
26
+ content_tag :p, messageboard.description
27
+ end
28
+ end
29
+
30
+ def latest_topic_timeago
31
+ if latest_topic.updated_at.nil?
32
+ <<-eohtml.html_safe
33
+ <abbr>
34
+ a little while ago
35
+ </abbr>
36
+ eohtml
37
+ else
38
+ <<-eohtml.html_safe
39
+ <abbr class="timeago" title="#{topic_updated_at_utc}">
40
+ #{topic_updated_at_str}
41
+ </abbr>
42
+ eohtml
43
+ end
44
+ end
45
+
46
+ def latest_topic
47
+ @latest_topic ||= messageboard.topics.order('updated_at DESC').first || Thredded::NullTopic.new
48
+ end
49
+
50
+ def latest_user
51
+ latest_topic.last_user
52
+ end
53
+
54
+ def category_options
55
+ messageboard.categories.map { |cat| [cat.name, cat.id] }
56
+ end
57
+
58
+ def users_options
59
+ messageboard.users.map { |user| [user.to_s, user.id] }
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :messageboard
65
+
66
+ def topic_updated_at_utc
67
+ latest_topic.updated_at.getutc.iso8601
68
+ end
69
+
70
+ def topic_updated_at_str
71
+ latest_topic.updated_at.to_s
72
+ end
73
+ end
74
+ end
@@ -2,20 +2,27 @@ module Thredded
2
2
  class Messageboard < ActiveRecord::Base
3
3
  SECURITY = %w{private logged_in public}
4
4
  PERMISSIONS = %w{members logged_in anonymous}
5
+ FILTERS = %w{markdown bbcode}
5
6
 
6
7
  extend FriendlyId
7
8
  friendly_id :name
8
9
 
9
- validates_numericality_of :topics_count
10
- validates_inclusion_of :security, in: SECURITY
11
- validates_inclusion_of :posting_permission, in: PERMISSIONS
12
- validates_presence_of :name
13
- validates_format_of :name, with: /\A[\w\-]+\z/, on: :create,
10
+ validates :filter, presence: true
11
+ validates :filter, inclusion: { in: FILTERS }
12
+ validates :name, format: {
13
+ with: /\A[\w\-]+\z/,
14
+ on: :create,
14
15
  message: 'should be letters, nums, dash, underscore only.'
15
- validates_uniqueness_of :name,
16
- message: 'must be a unique board name. Try again.'
17
- validates_length_of :name, within: 1..16,
16
+ }
17
+ validates :name, length: {
18
+ within: 1..16,
18
19
  message: 'should be between 1 and 16 characters'
20
+ }
21
+ validates :name, presence: true
22
+ validates :name, uniqueness: { message: 'must be a unique board name.' }
23
+ validates :posting_permission, inclusion: { in: PERMISSIONS }
24
+ validates :security, inclusion: { in: SECURITY }
25
+ validates :topics_count, numericality: true
19
26
 
20
27
  has_many :categories
21
28
  has_many :messageboard_preferences
@@ -29,9 +36,15 @@ module Thredded
29
36
  where(closed: false).order('topics_count DESC')
30
37
  end
31
38
 
39
+ def self.decorate
40
+ all.map do |messageboard|
41
+ MessageboardDecorator.new(messageboard)
42
+ end
43
+ end
44
+
32
45
  def preferences_for(user)
33
46
  @preferences_for ||=
34
- messageboard_preferences.where(user_id: user).first || NullMessageboardPreference.new
47
+ messageboard_preferences.where(user_id: user).first_or_create
35
48
  end
36
49
 
37
50
  def active_users
@@ -0,0 +1,16 @@
1
+ module Thredded
2
+ class NullTopic
3
+ def updated_at
4
+ Time.now
5
+ end
6
+
7
+ def user
8
+ 'Anonymous User'
9
+ end
10
+
11
+ def last_user
12
+ 'Anonymous User'
13
+ end
14
+ end
15
+ end
16
+
@@ -5,7 +5,6 @@ module Thredded
5
5
  class Post < ActiveRecord::Base
6
6
  include Gravtastic
7
7
  include Thredded::Filter::Base
8
- include Thredded::Filter::Textile
9
8
  include Thredded::Filter::Bbcode
10
9
  include Thredded::Filter::Markdown
11
10
  include Thredded::Filter::Attachment
@@ -80,8 +80,11 @@ module Thredded
80
80
  end
81
81
 
82
82
  def self.find_by_slug(slug)
83
- where(slug: slug).includes(:user_topic_reads).first or
83
+ begin
84
+ includes(:user_topic_reads).friendly.find(slug)
85
+ rescue ActiveRecord::RecordNotFound
84
86
  raise Thredded::Errors::TopicNotFound
87
+ end
85
88
  end
86
89
 
87
90
  def decorate
@@ -1,16 +1,19 @@
1
- <% if can? :read, messageboard %>
1
+ <% if can? :read, messageboard.original %>
2
2
  <div class="messageboard">
3
3
  <header>
4
- <h2><%= link_or_text_to(messageboard) %></h2>
5
- <div class="meta"><%= meta_for(messageboard) %></div>
4
+ <h2>
5
+ <%= link_to messageboard.name, messageboard_topics_path(messageboard) %>
6
+ </h2>
7
+
8
+ <div class="meta"><%= messageboard.meta %></div>
6
9
  </header>
7
10
 
8
- <% content_tag :p, messageboard.description if messageboard.description %>
11
+ <%= messageboard.description %>
9
12
 
10
13
  <footer>
11
14
  <p>
12
- <%= latest_thread_for(messageboard) %>
13
- <cite>by <%= latest_user_for(messageboard) %></cite>
15
+ <%= messageboard.latest_topic_timeago %>
16
+ <cite>by <%= messageboard.latest_user %></cite>
14
17
  </p>
15
18
  </footer>
16
19
  </div>
@@ -15,11 +15,3 @@
15
15
  <%= f.link_to_add 'Add an attachment', :attachments,
16
16
  { class: :add_attachment } %>
17
17
  </li>
18
-
19
- <li>
20
- <%= f.select :filter, Thredded::Post.filters, {} %>
21
- <a href="#pseudo-help"
22
- title="huh?"
23
- class="hide-for-small filter-help"
24
- id="filter-help">?</a>
25
- </li>
@@ -13,10 +13,6 @@
13
13
  <%= f.label :notify_on_message, 'Notify me when I am included in a private topic' %>
14
14
  <%= f.check_box :notify_on_message %>
15
15
  </li>
16
- <li>
17
- <%= f.label :filter, 'Preferred post filter' %>
18
- <%= f.select :filter, Thredded::Post.filters %>
19
- </li>
20
16
  <li class="submit"><%= f.submit 'Update Preferences' %></li>
21
17
  </ul>
22
18
  <% end %>
@@ -0,0 +1,11 @@
1
+ class MoveFilterToMessageboards < ActiveRecord::Migration
2
+ def up
3
+ add_column :thredded_messageboards, :filter, :string, null: false, default: 'markdown'
4
+ remove_column :thredded_messageboard_preferences, :filter
5
+ end
6
+
7
+ def down
8
+ add_column :thredded_messageboard_preferences, :filter, :string, null: false, default: 'markdown'
9
+ remove_column :thredded_messageboards, :filter
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class ConvertTextileToMarkdown < ActiveRecord::Migration
2
+ def up
3
+ execute <<-sql
4
+ UPDATE thredded_posts SET filter='markdown' WHERE filter == 'textile'
5
+ sql
6
+ end
7
+ end
@@ -8,12 +8,12 @@ require 'nested_form'
8
8
  require 'thredded/email_processor'
9
9
  require 'thredded/errors'
10
10
  require 'thredded/filter/base'
11
+ require 'thredded/at_notifier'
11
12
  require 'thredded/filter/at_notification'
12
13
  require 'thredded/filter/attachment'
13
14
  require 'thredded/filter/bbcode'
14
15
  require 'thredded/filter/emoji'
15
16
  require 'thredded/filter/markdown'
16
- require 'thredded/filter/textile'
17
17
  require 'thredded/messageboard_user_permissions'
18
18
  require 'thredded/post_user_permissions'
19
19
  require 'thredded/private_topic_user_permissions'
@@ -1,3 +1,3 @@
1
1
  module Thredded
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thredded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Oliveira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-24 00:00:00.000000000 Z
11
+ date: 2013-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: RedCloth
14
+ name: bb-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '>='
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bb-ruby
28
+ name: cancan
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: cancan
42
+ name: carrierwave
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '>='
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: carrierwave
56
+ name: escape_utils
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '>='
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: escape_utils
70
+ name: unf
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '>='
@@ -391,11 +391,11 @@ files:
391
391
  - app/controllers/thredded/private_topics_controller.rb
392
392
  - app/controllers/thredded/setups_controller.rb
393
393
  - app/controllers/thredded/topics_controller.rb
394
+ - app/decorators/thredded/messageboard_decorator.rb
394
395
  - app/decorators/thredded/post_decorator.rb
395
396
  - app/decorators/thredded/topic_decorator.rb
396
397
  - app/decorators/thredded/user_topic_decorator.rb
397
398
  - app/helpers/thredded/application_helper.rb
398
- - app/helpers/thredded/messageboard_helper.rb
399
399
  - app/helpers/thredded/posts_helper.rb
400
400
  - app/helpers/thredded/topics_helper.rb
401
401
  - app/mailers/thredded/post_mailer.rb
@@ -405,10 +405,9 @@ files:
405
405
  - app/models/thredded/category.rb
406
406
  - app/models/thredded/image.rb
407
407
  - app/models/thredded/messageboard.rb
408
- - app/models/thredded/messageboard_decorator.rb
409
408
  - app/models/thredded/messageboard_preference.rb
410
- - app/models/thredded/null_messageboard_preference.rb
411
409
  - app/models/thredded/null_preference.rb
410
+ - app/models/thredded/null_topic.rb
412
411
  - app/models/thredded/null_topic_read.rb
413
412
  - app/models/thredded/null_user.rb
414
413
  - app/models/thredded/post.rb
@@ -464,6 +463,8 @@ files:
464
463
  - db/migrate/20131005032727_prevent_null_sticky_and_locked.rb
465
464
  - db/migrate/20131014014258_uniqs_on_user_topic_read.rb
466
465
  - db/migrate/20131019014258_index_necessary_columns.rb
466
+ - db/migrate/20131026202621_move_filter_to_messageboards.rb
467
+ - db/migrate/20131029034507_convert_textile_to_markdown.rb
467
468
  - lib/tasks/thredded_tasks.rake
468
469
  - lib/thredded/at_notification_extractor.rb
469
470
  - lib/thredded/at_notifier.rb
@@ -478,7 +479,6 @@ files:
478
479
  - lib/thredded/filter/emoji.rb
479
480
  - lib/thredded/filter/markdown.rb
480
481
  - lib/thredded/filter/syntax.rb
481
- - lib/thredded/filter/textile.rb
482
482
  - lib/thredded/filter.rb
483
483
  - lib/thredded/messageboard_user_permissions.rb
484
484
  - lib/thredded/post_sql_builder.rb
@@ -516,7 +516,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
516
516
  version: '0'
517
517
  requirements: []
518
518
  rubyforge_project:
519
- rubygems_version: 2.0.3
519
+ rubygems_version: 2.0.7
520
520
  signing_key:
521
521
  specification_version: 4
522
522
  summary: A forum engine
@@ -1,44 +0,0 @@
1
- module Thredded
2
- module MessageboardHelper
3
- def link_or_text_to(messageboard)
4
- if can? :read, messageboard
5
- link_to messageboard.name, messageboard_topics_path(messageboard)
6
- else
7
- messageboard.name
8
- end
9
- end
10
-
11
- def meta_for(messageboard)
12
- topics = messageboard.topics_count
13
- posts = messageboard.posts_count
14
- "#{number_to_human topics} topics,
15
- #{number_to_human posts} posts".downcase
16
- end
17
-
18
- def latest_thread_for(messageboard)
19
- topic = messageboard.topics.first
20
-
21
- if topic.present?
22
- abbr = content_tag :abbr, class: 'updated_at timeago', title: topic.updated_at.strftime('%Y-%m-%dT%H:%M:%S') do
23
- topic.updated_at.strftime('%b %d, %Y %I:%M:%S %Z')
24
- end
25
-
26
- if can? :read, messageboard
27
- link_to abbr , messageboard_topic_posts_path(messageboard, topic)
28
- else
29
- abbr
30
- end
31
- else
32
- ''
33
- end
34
- end
35
-
36
- def latest_user_for(messageboard)
37
- if messageboard.topics.first.present? && messageboard.topics.first.user.present?
38
- messageboard.topics.first.last_user.to_s
39
- else
40
- ''
41
- end
42
- end
43
- end
44
- end
@@ -1,18 +0,0 @@
1
- module Thredded
2
- class MessageboardDecorator < SimpleDelegator
3
- attr_reader :messageboard
4
-
5
- def initialize(messageboard)
6
- super
7
- @messageboard = messageboard
8
- end
9
-
10
- def category_options
11
- messageboard.categories.map { |cat| [cat.name, cat.id] }
12
- end
13
-
14
- def users_options
15
- messageboard.users.map { |user| [user.to_s, user.id] }
16
- end
17
- end
18
- end
@@ -1,7 +0,0 @@
1
- module Thredded
2
- class NullMessageboardPreference
3
- def filter
4
- 'markdown'
5
- end
6
- end
7
- end
@@ -1,21 +0,0 @@
1
- require 'redcloth'
2
-
3
- module Thredded
4
- module Filter
5
- module Textile
6
- def self.included(base)
7
- base.class_eval do
8
- Thredded::Post::Filters << :textile
9
- end
10
- end
11
-
12
- def filtered_content
13
- if filter.to_sym == :textile
14
- @filtered_content = RedCloth.new(super).to_html.html_safe
15
- else
16
- @filtered_content = super
17
- end
18
- end
19
- end
20
- end
21
- end