simple_forum 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +17 -16
- data/app/assets/images/simple_forum/galdomedia-logo.png +0 -0
- data/app/assets/javascripts/simple_forum/application.js +5 -1
- data/app/assets/javascripts/simple_forum/moderators.js +40 -0
- data/app/assets/stylesheets/simple_forum/admin.css +15 -0
- data/app/assets/stylesheets/simple_forum/base.css +10 -0
- data/app/controllers/simple_forum/admin/base_controller.rb +7 -0
- data/app/controllers/simple_forum/admin/categories_controller.rb +70 -0
- data/app/controllers/simple_forum/admin/forums_controller.rb +88 -0
- data/app/controllers/simple_forum/application_controller.rb +29 -6
- data/app/controllers/simple_forum/forums_controller.rb +4 -4
- data/app/controllers/simple_forum/posts_controller.rb +2 -2
- data/app/controllers/simple_forum/topics_controller.rb +3 -3
- data/app/models/simple_forum/forum.rb +2 -10
- data/app/models/simple_forum/moderatorship.rb +1 -1
- data/app/models/simple_forum/post.rb +3 -3
- data/app/models/simple_forum/topic.rb +1 -9
- data/app/models/simple_forum/user_activity.rb +68 -61
- data/app/views/layouts/simple_forum.html.erb +22 -3
- data/app/views/layouts/simple_forum/admin.html.erb +70 -0
- data/app/views/simple_forum/admin/categories/_form.html.erb +9 -0
- data/app/views/simple_forum/admin/categories/edit.html.erb +18 -0
- data/app/views/simple_forum/admin/categories/index.html.erb +45 -0
- data/app/views/simple_forum/admin/categories/new.html.erb +17 -0
- data/app/views/simple_forum/admin/categories/show.html.erb +35 -0
- data/app/views/simple_forum/admin/forums/_form.html.erb +45 -0
- data/app/views/simple_forum/admin/forums/_moderator.html.erb +5 -0
- data/app/views/simple_forum/admin/forums/edit.html.erb +21 -0
- data/app/views/simple_forum/admin/forums/index.html.erb +77 -0
- data/app/views/simple_forum/admin/forums/new.html.erb +20 -0
- data/app/views/simple_forum/admin/forums/show.html.erb +55 -0
- data/app/views/simple_forum/forums/index.html.erb +4 -4
- data/app/views/simple_forum/forums/show.html.erb +4 -4
- data/app/views/simple_forum/posts/edit.html.erb +4 -10
- data/app/views/simple_forum/topics/_post.html.erb +4 -4
- data/app/views/simple_forum/topics/new.html.erb +1 -1
- data/app/views/simple_forum/topics/show.html.erb +3 -3
- data/config/locales/simple_forum.en.yml +130 -0
- data/config/locales/simple_forum.pl.yml +1 -0
- data/config/routes.rb +8 -0
- data/db/migrate/20110330123461_create_simple_forum_user_activities.rb +17 -0
- data/lib/generators/simple_forum/install_generator.rb +4 -5
- data/lib/generators/simple_forum/views_generator.rb +18 -0
- data/lib/generators/templates/simple_forum.rb +28 -24
- data/lib/simple_forum.rb +53 -30
- data/lib/simple_forum/configuration.rb +39 -0
- data/lib/simple_forum/engine.rb +8 -1
- data/lib/simple_forum/extensions/user.rb +18 -0
- data/lib/simple_forum/version.rb +2 -2
- metadata +97 -74
data/README.rdoc
CHANGED
@@ -6,41 +6,42 @@ Make sure you have model representing user. Default is User class. You can chang
|
|
6
6
|
User model must respond to 'name'.
|
7
7
|
|
8
8
|
Add simple_forum to your Rails 3 Gemfile
|
9
|
-
|
10
9
|
gem "simple_forum", :git => "git@github.com:galdomedia/mountable_forum.git"
|
11
10
|
|
11
|
+
And install gems with bundler
|
12
12
|
bundle install
|
13
13
|
|
14
|
-
Install the initializer
|
15
|
-
|
14
|
+
Install the initializer and mount engine in routes.rb
|
16
15
|
rails g simple_forum:install
|
17
16
|
|
18
17
|
Edit the initializer located in `config/initializers/simple_forum.rb` to satisfy your needs.
|
19
18
|
|
20
19
|
Copy migrations
|
21
|
-
rake
|
20
|
+
bundle exec rake simple_forum:install:migrations
|
22
21
|
|
23
22
|
Run migrations
|
24
|
-
rake db:migrate
|
23
|
+
bundle exec rake db:migrate
|
25
24
|
|
26
25
|
moderator can:
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
- close/open topics
|
27
|
+
- edit posts
|
28
|
+
- delete(mark as deleted) posts
|
29
|
+
|
30
30
|
TODO:
|
31
|
-
|
32
|
-
|
31
|
+
- edit topics
|
32
|
+
- delete topics (?)
|
33
33
|
|
34
34
|
signed in user can:
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
- create posts
|
36
|
+
- edit own posts(in specified period of time)
|
37
|
+
- delete(mark as deleted) own posts(in specified period of time)
|
38
38
|
|
39
39
|
When you are using friendly_id forums and topics will be automatically using it.
|
40
|
-
If not to_param method return something like
|
40
|
+
If not to_param method return something like:
|
41
|
+
"#{id}-#{name.parameterize}"
|
41
42
|
|
42
|
-
|
43
|
-
|
43
|
+
You can copy and customize views to your application by running generator:
|
44
|
+
rails g simple_forum:views
|
44
45
|
|
45
46
|
|
46
47
|
This project rocks and uses MIT-LICENSE.
|
Binary file
|
@@ -0,0 +1,40 @@
|
|
1
|
+
(function () {
|
2
|
+
var search_users_timeout;
|
3
|
+
|
4
|
+
var search_users = function (str) {
|
5
|
+
var params = {'user_name_like':str};
|
6
|
+
var $results = $('#search_users_result');
|
7
|
+
$results.html('');
|
8
|
+
$.getJSON(simple_forum.user_search_path, params, function (json) {
|
9
|
+
$.each(json, function (key, val) {
|
10
|
+
var $item = $('<li>' + val + ' <a href="#" class="add-moderator" data-user_id="' + key + '" data-user_name="' + val + '">[' + simple_forum.translations['add_moderator'] + ']</a></li>');
|
11
|
+
$results.append($item);
|
12
|
+
});
|
13
|
+
});
|
14
|
+
};
|
15
|
+
|
16
|
+
$(function () {
|
17
|
+
$('#search_users_input').keyup(function () {
|
18
|
+
var $input = $(this);
|
19
|
+
if (search_users_timeout) clearTimeout(search_users_timeout);
|
20
|
+
search_users_timeout = setTimeout(function () {
|
21
|
+
search_users($input.val());
|
22
|
+
}, 300);
|
23
|
+
});
|
24
|
+
|
25
|
+
$('a.add-moderator').live('click', function () {
|
26
|
+
var $this = $(this),
|
27
|
+
user_id = $this.data('user_id'),
|
28
|
+
user_name = $this.data('user_name');
|
29
|
+
var html = simple_forum.moderator_template.replace(/temp_user_id/g, user_id).replace(/temp_user_name/g, user_name);
|
30
|
+
$('#moderators').append(html);
|
31
|
+
return false;
|
32
|
+
});
|
33
|
+
|
34
|
+
$('a.remove-moderator').live('click', function () {
|
35
|
+
var $this = $(this);
|
36
|
+
$this.closest('li').remove();
|
37
|
+
return false;
|
38
|
+
});
|
39
|
+
});
|
40
|
+
})();
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require web-app-theme/base
|
12
|
+
*= require web-app-theme/themes/default/style
|
13
|
+
*= require formtastic.css
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module SimpleForum
|
2
|
+
module Admin
|
3
|
+
class CategoriesController < ::SimpleForum::Admin::BaseController
|
4
|
+
|
5
|
+
def index
|
6
|
+
@categories = SimpleForum::Category.default_order.all
|
7
|
+
|
8
|
+
respond_with(@categories)
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
|
13
|
+
respond_with([:admin, resource])
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit
|
17
|
+
|
18
|
+
respond_with([:admin, resource])
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
|
23
|
+
respond_with([:admin, resource])
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
success = resource.save
|
28
|
+
|
29
|
+
respond_with([:admin, resource]) do |format|
|
30
|
+
format.html do
|
31
|
+
if success
|
32
|
+
redirect_to [:admin, resource]
|
33
|
+
else
|
34
|
+
render :new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def update
|
41
|
+
success = resource.update_attributes(params[:category])
|
42
|
+
|
43
|
+
respond_with([:admin, resource]) do |format|
|
44
|
+
format.html do
|
45
|
+
if success
|
46
|
+
redirect_to [:admin, resource]
|
47
|
+
else
|
48
|
+
render :edit
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def destroy
|
55
|
+
resource.destroy
|
56
|
+
|
57
|
+
respond_with([:admin, resource])
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def resource
|
63
|
+
@category ||= params[:id] ? SimpleForum::Category.find(params[:id]) : SimpleForum::Category.new(params[:category])
|
64
|
+
end
|
65
|
+
|
66
|
+
helper_method :resource
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module SimpleForum
|
2
|
+
module Admin
|
3
|
+
class ForumsController < ::SimpleForum::Admin::BaseController
|
4
|
+
|
5
|
+
def search_users
|
6
|
+
user_class = instance_eval(&SimpleForum.invoke(:user_class))
|
7
|
+
@users = user_class.where(["#{user_class.quoted_table_name}.email LIKE ?", "%#{params[:user_name_like].to_s.gsub(/[\%\_]/) { |m| "\\#{m}" }}%"]).limit(16)
|
8
|
+
|
9
|
+
respond_to do |format|
|
10
|
+
format.json do
|
11
|
+
render :json => @users.inject({}) { |hash, u| hash[u.id] = u.name; hash }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def index
|
17
|
+
@categories = SimpleForum::Category.default_order.includes({:forums => [{:recent_post => [:user, :topic]}, :moderators]})
|
18
|
+
|
19
|
+
@forums = SimpleForum::Forum.default_order.includes({:recent_post => [:user, :topic]}, :moderators)
|
20
|
+
@forums_by_category = @categories.inject(ActiveSupport::OrderedHash.new) { |h, c| h[c] = []; h }
|
21
|
+
@forums.each do |f|
|
22
|
+
(@forums_by_category[@categories.detect { |c| c.try(:id) == f.category_id }] ||= []) << f
|
23
|
+
end
|
24
|
+
@forums_by_category.reject! { |c, forums| forums.blank? }
|
25
|
+
|
26
|
+
respond_with(@forums)
|
27
|
+
end
|
28
|
+
|
29
|
+
def show
|
30
|
+
|
31
|
+
respond_with([:admin, resource])
|
32
|
+
end
|
33
|
+
|
34
|
+
def edit
|
35
|
+
|
36
|
+
respond_with([:admin, resource])
|
37
|
+
end
|
38
|
+
|
39
|
+
def new
|
40
|
+
|
41
|
+
respond_with([:admin, resource])
|
42
|
+
end
|
43
|
+
|
44
|
+
def create
|
45
|
+
success = resource.save
|
46
|
+
|
47
|
+
respond_with([:admin, resource]) do |format|
|
48
|
+
format.html do
|
49
|
+
if success
|
50
|
+
redirect_to [:admin, resource]
|
51
|
+
else
|
52
|
+
render :new
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def update
|
59
|
+
success = resource.update_attributes(params[:forum])
|
60
|
+
|
61
|
+
respond_with([:admin, resource]) do |format|
|
62
|
+
format.html do
|
63
|
+
if success
|
64
|
+
redirect_to [:admin, resource]
|
65
|
+
else
|
66
|
+
render :edit
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def destroy
|
73
|
+
resource.destroy
|
74
|
+
|
75
|
+
respond_with([:admin, resource])
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def resource
|
81
|
+
@forum ||= params[:id] ? SimpleForum::Forum.find(params[:id]) : SimpleForum::Forum.new(params[:forum])
|
82
|
+
end
|
83
|
+
|
84
|
+
helper_method :resource
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,27 +1,50 @@
|
|
1
1
|
module SimpleForum
|
2
2
|
class ApplicationController < ::ApplicationController #::ActionController::Base
|
3
3
|
respond_to :html
|
4
|
-
protect_from_forgery
|
4
|
+
#protect_from_forgery
|
5
5
|
|
6
6
|
layout SimpleForum.layout
|
7
7
|
|
8
|
-
helper_method :authenticated_user, :user_authenticated?
|
8
|
+
helper_method :authenticated_user, :user_authenticated?, :forum_admin?
|
9
|
+
helper_method :simple_forum_recent_activity?
|
9
10
|
|
10
11
|
private
|
11
12
|
|
12
13
|
def authenticated_user
|
13
|
-
instance_eval &
|
14
|
+
instance_eval &SimpleForum.invoke(:authenticated_user)
|
14
15
|
end
|
15
16
|
|
16
17
|
def user_authenticated?
|
17
|
-
instance_eval &
|
18
|
+
instance_eval &SimpleForum.invoke(:user_authenticated?)
|
18
19
|
end
|
19
20
|
|
20
21
|
def authenticate_user
|
21
|
-
redirect_to :back, :alert =>
|
22
|
+
redirect_to :back, :alert => t('simple_forum.controllers.you_have_to_be_signed_in_to_perform_this_action') unless user_authenticated?
|
23
|
+
end
|
24
|
+
|
25
|
+
def forum_admin?
|
26
|
+
instance_eval(&SimpleForum.invoke(:forum_admin?))
|
27
|
+
end
|
28
|
+
|
29
|
+
def forum_admin_required
|
30
|
+
redirect_to simple_forum.root_path unless forum_admin?
|
31
|
+
end
|
32
|
+
|
33
|
+
def simple_forum_activity_checker
|
34
|
+
@_simple_forum_activity_checker ||= SimpleForum::UserActivity.recent_activity_for_user(authenticated_user)
|
35
|
+
end
|
36
|
+
|
37
|
+
def simple_forum_recent_activity?(forum_or_topic)
|
38
|
+
return false unless user_authenticated?
|
39
|
+
simple_forum_activity_checker.recent_activity?(forum_or_topic)
|
22
40
|
end
|
23
|
-
end
|
24
41
|
|
42
|
+
def bang_simple_forum_recent_activity(forum_or_topic)
|
43
|
+
return unless user_authenticated?
|
44
|
+
simple_forum_activity_checker.bang(forum_or_topic)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
25
48
|
end
|
26
49
|
|
27
50
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module SimpleForum
|
2
|
-
class ForumsController < ApplicationController
|
2
|
+
class ForumsController < ::SimpleForum::ApplicationController
|
3
3
|
|
4
4
|
before_filter :find_forum, :except => [:index]
|
5
5
|
|
@@ -10,8 +10,8 @@ module SimpleForum
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def show
|
13
|
-
@forum
|
14
|
-
|
13
|
+
bang_simple_forum_recent_activity(@forum)
|
14
|
+
|
15
15
|
scope = @forum.topics.includes([:user, {:recent_post => :user}])
|
16
16
|
@topics = scope.respond_to?(:paginate) ? scope.paginate(:page => params[:page], :per_page => params[:per_page]) : scope.all
|
17
17
|
|
@@ -25,4 +25,4 @@ module SimpleForum
|
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module SimpleForum
|
2
|
-
class PostsController < ApplicationController
|
2
|
+
class PostsController < ::SimpleForum::ApplicationController
|
3
3
|
|
4
4
|
before_filter :authenticate_user, :except => [:index, :show]
|
5
5
|
|
@@ -111,4 +111,4 @@ module SimpleForum
|
|
111
111
|
end
|
112
112
|
|
113
113
|
end
|
114
|
-
end
|
114
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module SimpleForum
|
2
|
-
class TopicsController < ApplicationController
|
2
|
+
class TopicsController < ::SimpleForum::ApplicationController
|
3
3
|
respond_to :html
|
4
4
|
|
5
5
|
before_filter :authenticate_user, :only => [:new, :create, :open, :close]
|
@@ -20,7 +20,7 @@ module SimpleForum
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def show
|
23
|
-
@topic
|
23
|
+
bang_simple_forum_recent_activity(@topic)
|
24
24
|
@topic.increment_views_count
|
25
25
|
|
26
26
|
@posts_search = @topic.posts.includes([:user, :deleted_by, :edited_by])
|
@@ -113,4 +113,4 @@ module SimpleForum
|
|
113
113
|
end
|
114
114
|
|
115
115
|
end
|
116
|
-
end
|
116
|
+
end
|
@@ -27,12 +27,12 @@ module SimpleForum
|
|
27
27
|
:through => :moderatorships,
|
28
28
|
:source => :user
|
29
29
|
|
30
|
-
scope :default_order, order("#{quoted_table_name}.position ASC")
|
30
|
+
scope :default_order, order("#{quoted_table_name}.position ASC, #{quoted_table_name}.id ASC")
|
31
31
|
|
32
32
|
validates :name, :presence => true
|
33
33
|
validates :position, :presence => true, :numericality => {:only_integer => true, :allow_nil => true}
|
34
34
|
|
35
|
-
attr_accessible :name, :body, :parent_id, :position, :moderator_ids, :category_id
|
35
|
+
attr_accessible :name, :body, :parent_id, :position, :moderator_ids, :category_id, :is_topicable
|
36
36
|
|
37
37
|
if respond_to?(:has_friendly_id)
|
38
38
|
has_friendly_id :name, :use_slug => true, :approximate_ascii => true
|
@@ -42,14 +42,6 @@ module SimpleForum
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def recent_activity?(user)
|
46
|
-
SimpleForum::UserActivity.new(user).recent_activity?(self)
|
47
|
-
end
|
48
|
-
|
49
|
-
def bang_recent_activity(user)
|
50
|
-
SimpleForum::UserActivity.new(user).bang(self)
|
51
|
-
end
|
52
|
-
|
53
45
|
def moderated_by?(user)
|
54
46
|
return false unless user
|
55
47
|
@moderated_by_cache ||= {}
|