simple_forum 0.0.2 → 0.0.4
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/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 ||= {}
|