simple_forum 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rails", "3.1.0"
4
+ #gem "rails", :git => "git://github.com/rails/rails.git"
5
+ #gem "arel", :git => "git://github.com/rails/arel.git"
6
+ #gem "rack", :git => "git://github.com/rack/rack.git"
7
+
8
+ gem "devise"
9
+
10
+ gem "sqlite3"
11
+
12
+ #group :development, :test do
13
+ gem "capybara", ">= 0.4.0"
14
+ gem "rspec-rails", ">= 2.0.0.beta"
15
+ gem "factory_girl"
16
+ #end
17
+
18
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ = SimpleForum
2
+
3
+ ### Instalation
4
+
5
+ Make sure you have model representing user. Default is User class. You can change this.
6
+ User model must respond to 'name'.
7
+
8
+ Add simple_forum to your Rails 3 Gemfile
9
+
10
+ gem "simple_forum", :git => "git@github.com:galdomedia/mountable_forum.git"
11
+
12
+ bundle install
13
+
14
+ Install the initializer
15
+
16
+ rails g simple_forum:install
17
+
18
+ Edit the initializer located in `config/initializers/simple_forum.rb` to satisfy your needs.
19
+
20
+ Copy assets & migrations
21
+ rake simple_forum_engine:install
22
+
23
+ or rake simple_forum:install if rake simple_forum_engine:install doesn't work(rails version < 3.1)
24
+
25
+ Run migrations
26
+ rake db:migrate
27
+
28
+
29
+ moderator can:
30
+ - close/open topics
31
+ - edit posts
32
+ - delete(mark as deleted) posts
33
+ TODO:
34
+ - edit topics
35
+ - delete topics (?)
36
+
37
+ signed in user can:
38
+ - create posts
39
+ - edit own posts(in specified period of time)
40
+ - delete(mark as deleted) own posts(in specified period of time)
41
+
42
+ When you are using friendly_id forums and topics will be automatically using it.
43
+ If not to_param method return something like "#{id}-#{name.parameterize}".
44
+
45
+ TODO:
46
+ - add generator or rake task to copy views to user application
47
+
48
+
49
+ This project rocks and uses MIT-LICENSE.
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rake'
10
+ require 'rake/rdoctask'
11
+
12
+ require 'rspec/core'
13
+ require 'rspec/core/rake_task'
14
+
15
+ RSpec::Core::RakeTask.new(:spec)
16
+
17
+ task :default => :spec
18
+
19
+ Rake::RDocTask.new(:rdoc) do |rdoc|
20
+ rdoc.rdoc_dir = 'rdoc'
21
+ rdoc.title = 'SimpleForum'
22
+ rdoc.options << '--line-numbers' << '--inline-source'
23
+ rdoc.rdoc_files.include('README.rdoc')
24
+ rdoc.rdoc_files.include('lib/**/*.rb')
25
+ end
26
+
27
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,27 @@
1
+ module SimpleForum
2
+ class ApplicationController < ::ApplicationController #::ActionController::Base
3
+ protect_from_forgery
4
+
5
+ layout SimpleForum.layout
6
+
7
+ helper_method :authenticated_user, :user_authenticated?
8
+
9
+ private
10
+
11
+ def authenticated_user
12
+ instance_eval &AbstractAuth.invoke(:authenticated_user)
13
+ end
14
+
15
+ def user_authenticated?
16
+ instance_eval &AbstractAuth.invoke(:user_authenticated?)
17
+ end
18
+
19
+ def authenticate_user
20
+ redirect_to :back, :alert => "You have to be logged in" unless user_authenticated?
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+
27
+
@@ -0,0 +1,29 @@
1
+ module SimpleForum
2
+ class ForumsController < ApplicationController
3
+ respond_to :html
4
+
5
+ before_filter :find_forum, :except => [:index]
6
+
7
+ def index
8
+ @categories = SimpleForum::Category.default_order.includes({:forums => [{:recent_post => [:user, :topic]}, :moderators]})
9
+
10
+ respond_to :html
11
+ end
12
+
13
+ def show
14
+ @forum.bang_recent_activity(authenticated_user)
15
+
16
+ scope = @forum.topics.includes([:user, {:recent_post => :user}])
17
+ @topics = scope.respond_to?(:paginate) ? scope.paginate(:page => params[:page], :per_page => params[:per_page]) : scope.all
18
+
19
+ respond_to :html
20
+ end
21
+
22
+ private
23
+
24
+ def find_forum
25
+ @forum = SimpleForum::Forum.find params[:id]
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,114 @@
1
+ module SimpleForum
2
+ class PostsController < ApplicationController
3
+
4
+ before_filter :authenticate_user, :except => [:index, :show]
5
+
6
+ before_filter :find_forum
7
+ before_filter :find_topic
8
+ before_filter :find_post, :except => [:index, :new, :create, :preview]
9
+ before_filter :build_post, :only => [:new, :create, :preview]
10
+ before_filter :post_must_be_editable_by_authenticate_user, :only => [:edit, :update]
11
+
12
+ def index
13
+
14
+ respond_to do |format|
15
+ format.html do
16
+ redirect_to simple_forum_forum_topic_url(@forum, @topic), :status => :moved_permanently
17
+ end
18
+ end
19
+ end
20
+
21
+ def show
22
+
23
+ respond_to do |format|
24
+ format.html { redirect_to simple_forum_forum_topic_url(@forum, @topic, :page => @post.on_page, :anchor => "post-#{@post.id}") }
25
+ end
26
+ end
27
+
28
+ def create
29
+ success = @post.save
30
+
31
+ respond_to do |format|
32
+ format.html do
33
+ if success
34
+ redirect_to simple_forum_forum_topic_url(@forum, @topic, :page => @post.on_page, :anchor => "post-#{@post.id}"),
35
+ :notice => t('simple_forum.controllers.posts.post_created')
36
+ else
37
+ redirect_to simple_forum_forum_topic_url(@forum, @topic, :page => @topic.last_page, :anchor => (@topic.recent_post ? "post-#{@topic.recent_post.id}" : nil)),
38
+ :alert => @post.errors.full_messages.join(', ')
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ def preview
45
+ @post.created_at, @post.updated_at = Time.now
46
+
47
+ respond_to do |format|
48
+ format.js { render :partial => 'simple_forum/topics/post', :locals => {:post => @post, :preview => true} }
49
+ end
50
+ end
51
+
52
+ def edit
53
+
54
+ respond_to :html
55
+ end
56
+
57
+ def update
58
+ @post.edited_by = authenticated_user
59
+ @post.edited_at = Time.now
60
+ success = @post.update_attributes(params[:post])
61
+
62
+ respond_to do |format|
63
+ format.html do
64
+ if success
65
+ redirect_to simple_forum_forum_topic_url(@forum, @topic, :page => @post.on_page, :anchor => "post-#{@post.id}"),
66
+ :notice => t('simple_forum.controllers.posts.post_updated')
67
+ else
68
+ redirect_to :back, :alert => @post.errors.full_messages.join(', ')
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+
75
+ def delete
76
+ success = @post.mark_as_deleted_by(authenticated_user) #check if post is deletable by authenticated_user in mark_as_deleted_by method
77
+
78
+ respond_to do |format|
79
+ format.html do
80
+ if success
81
+ redirect_to :back, :notice => t('simple_forum.controllers.posts.post_deleted')
82
+ else
83
+ redirect_to :back, :alert => t('simple_forum.controllers.posts.post_cant_be_deleted')
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def find_forum
92
+ @forum = SimpleForum::Forum.find params[:forum_id]
93
+ end
94
+
95
+ def find_topic
96
+ @topic = @forum.topics.find params[:topic_id]
97
+ end
98
+
99
+ def find_post
100
+ @post = @topic.posts.find params[:id]
101
+ end
102
+
103
+ def build_post
104
+ @post = @topic.posts.new params[:post] do |post|
105
+ post.user = authenticated_user
106
+ end
107
+ end
108
+
109
+ def post_must_be_editable_by_authenticate_user
110
+ redirect_to :back, :alert => t('simple_forum.controllers.posts.post_cant_be_edited') unless @post.editable_by?(authenticated_user, nil)
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,116 @@
1
+ module SimpleForum
2
+ class TopicsController < ApplicationController
3
+ respond_to :html
4
+
5
+ before_filter :authenticate_user, :only => [:new, :create, :open, :close]
6
+
7
+ before_filter :find_forum
8
+ before_filter :find_topic, :except => [:index, :new, :create]
9
+ before_filter :build_topic, :only => [:new, :create]
10
+
11
+ before_filter :moderator_required, :only => [:open, :close]
12
+
13
+ def index
14
+
15
+ respond_to do |format|
16
+ format.html do
17
+ redirect_to simple_forum_forum_url(@forum), :status => :moved_permanently
18
+ end
19
+ end
20
+ end
21
+
22
+ def show
23
+ @topic.bang_recent_activity(authenticated_user)
24
+ @topic.increment_views_count
25
+
26
+ @posts_search = @topic.posts.includes([:user, :deleted_by, :edited_by])
27
+ @posts = @posts_search.respond_to?(:paginate) ?
28
+ @posts_search.paginate(:page => params[:page], :per_page => params[:per_page] || SimpleForum::Post.per_page) :
29
+ @posts_search.all
30
+
31
+ @post = SimpleForum::Post.new
32
+
33
+ respond_with(@topic)
34
+ end
35
+
36
+ def new
37
+
38
+ respond_with(@topic)
39
+ end
40
+
41
+ def create
42
+ success = @topic.save
43
+
44
+ respond_to do |format|
45
+ format.html do
46
+ if success
47
+ flash[:notice] = t('simple_forum.controllers.topics.topic_created')
48
+ redirect_to simple_forum_forum_topic_url(@forum, @topic)
49
+ else
50
+ flash.now[:alert] = @topic.errors.full_messages.join(' ')
51
+ render :new
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def open
58
+ success = if @topic.is_open?
59
+ false
60
+ else
61
+ @topic.open!
62
+ true
63
+ end
64
+
65
+ respond_to do |format|
66
+ format.html do
67
+ if success
68
+ redirect_to :back, :notice => t('simple_forum.controllers.topics.topic_opened')
69
+ else
70
+ redirect_to :back, :alert => t('simple_forum.controllers.topics.topic_already_opened')
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ def close
77
+ success = if @topic.is_open?
78
+ @topic.close!
79
+ true
80
+ else
81
+ false
82
+ end
83
+
84
+ respond_to do |format|
85
+ format.html do
86
+ if success
87
+ redirect_to :back, :notice => t('simple_forum.controllers.topics.topic_closed')
88
+ else
89
+ redirect_to :back, :alert => t('simple_forum.controllers.topics.topic_already_closed')
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def find_forum
98
+ @forum = SimpleForum::Forum.find params[:forum_id]
99
+ end
100
+
101
+ def find_topic
102
+ @topic = @forum.topics.find params[:id]
103
+ end
104
+
105
+ def build_topic
106
+ @topic = @forum.topics.new params[:topic] do |topic|
107
+ topic.user = authenticated_user
108
+ end
109
+ end
110
+
111
+ def moderator_required
112
+ redirect_to :back, :alert => t('simple_forum.controllers.you_are_not_permitted_to_perform_this_action') unless @forum.moderated_by?(authenticated_user)
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1,6 @@
1
+ module SimpleForum
2
+ def self.table_name_prefix
3
+ 'simple_forum_'
4
+ end
5
+
6
+ end
@@ -0,0 +1,28 @@
1
+ module SimpleForum
2
+ class Category < ::ActiveRecord::Base
3
+
4
+ set_table_name 'simple_forum_categories' #should work table_name_prefix in SimpleForum module but it's not!'
5
+
6
+ has_many :forums,
7
+ :order => "#{SimpleForum::Forum.quoted_table_name}.position ASC",
8
+ :dependent => :nullify,
9
+ :class_name => "SimpleForum::Forum"
10
+
11
+
12
+ scope :default_order, order("#{quoted_table_name}.position ASC")
13
+
14
+ validates :name, :presence => true
15
+ validates :position, :presence => true, :numericality => {:only_integer => true, :allow_nil => true}
16
+
17
+ attr_accessible :name, :body, :position
18
+
19
+ if respond_to?(:has_friendly_id)
20
+ has_friendly_id :name, :use_slug => true, :approximate_ascii => true
21
+ else
22
+ def to_param
23
+ "#{id}-#{name.to_s.parameterize}"
24
+ end
25
+ end
26
+
27
+ end
28
+ end