ack-mongoid-forums 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +35 -0
- data/app/assets/javascripts/mongoid_forums/admin/base.js +2 -0
- data/app/assets/javascripts/mongoid_forums/admin/categories.js +2 -0
- data/app/assets/javascripts/mongoid_forums/admin/forums.js +2 -0
- data/app/assets/javascripts/mongoid_forums/admin/groups.js +2 -0
- data/app/assets/javascripts/mongoid_forums/admin/users.js +2 -0
- data/app/assets/javascripts/mongoid_forums/application.js +15 -0
- data/app/assets/javascripts/mongoid_forums/forums.js +2 -0
- data/app/assets/javascripts/mongoid_forums/posts.js +2 -0
- data/app/assets/javascripts/mongoid_forums/topics.js +2 -0
- data/app/assets/stylesheets/mongoid_forums/admin/base.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/admin/categories.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/admin/forums.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/admin/groups.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/admin/users.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/application.css +15 -0
- data/app/assets/stylesheets/mongoid_forums/forums.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/posts.css +4 -0
- data/app/assets/stylesheets/mongoid_forums/topics.css +4 -0
- data/app/assets/stylesheets/scaffold.css +56 -0
- data/app/controllers/mongoid_forums/admin/base_controller.rb +18 -0
- data/app/controllers/mongoid_forums/admin/categories_controller.rb +83 -0
- data/app/controllers/mongoid_forums/admin/forums_controller.rb +83 -0
- data/app/controllers/mongoid_forums/admin/groups_controller.rb +83 -0
- data/app/controllers/mongoid_forums/admin/topics_controller.rb +48 -0
- data/app/controllers/mongoid_forums/admin/users_controller.rb +34 -0
- data/app/controllers/mongoid_forums/application_controller.rb +57 -0
- data/app/controllers/mongoid_forums/forums_controller.rb +66 -0
- data/app/controllers/mongoid_forums/posts_controller.rb +133 -0
- data/app/controllers/mongoid_forums/redirect_controller.rb +33 -0
- data/app/controllers/mongoid_forums/topics_controller.rb +83 -0
- data/app/decorators/lib/mongoid_forums/user_class_decorator.rb +1 -0
- data/app/helpers/mongoid_forums/admin/base_helper.rb +4 -0
- data/app/helpers/mongoid_forums/admin/categories_helper.rb +4 -0
- data/app/helpers/mongoid_forums/admin/forums_helper.rb +4 -0
- data/app/helpers/mongoid_forums/admin/groups_helper.rb +4 -0
- data/app/helpers/mongoid_forums/admin/users_helper.rb +4 -0
- data/app/helpers/mongoid_forums/application_helper.rb +20 -0
- data/app/helpers/mongoid_forums/formatting_helper.rb +28 -0
- data/app/helpers/mongoid_forums/forums_helper.rb +15 -0
- data/app/helpers/mongoid_forums/posts_helper.rb +4 -0
- data/app/helpers/mongoid_forums/topics_helper.rb +4 -0
- data/app/models/mongoid_forums/ability.rb +65 -0
- data/app/models/mongoid_forums/alert.rb +80 -0
- data/app/models/mongoid_forums/category.rb +31 -0
- data/app/models/mongoid_forums/concerns/subscribable.rb +76 -0
- data/app/models/mongoid_forums/concerns/viewable.rb +60 -0
- data/app/models/mongoid_forums/forum.rb +67 -0
- data/app/models/mongoid_forums/group.rb +15 -0
- data/app/models/mongoid_forums/post.rb +40 -0
- data/app/models/mongoid_forums/subscription.rb +65 -0
- data/app/models/mongoid_forums/topic.rb +55 -0
- data/app/models/mongoid_forums/view.rb +30 -0
- data/app/views/layouts/mongoid_forums/application.haml +21 -0
- data/app/views/mongoid_forums/admin/base/index.haml +6 -0
- data/app/views/mongoid_forums/admin/categories/edit.haml +4 -0
- data/app/views/mongoid_forums/admin/categories/index.haml +21 -0
- data/app/views/mongoid_forums/admin/categories/new.haml +4 -0
- data/app/views/mongoid_forums/admin/categories/show.haml +21 -0
- data/app/views/mongoid_forums/admin/forums/edit.haml +5 -0
- data/app/views/mongoid_forums/admin/forums/index.haml +25 -0
- data/app/views/mongoid_forums/admin/forums/new.haml +5 -0
- data/app/views/mongoid_forums/admin/forums/show.haml +21 -0
- data/app/views/mongoid_forums/admin/groups/edit.haml +4 -0
- data/app/views/mongoid_forums/admin/groups/index.haml +23 -0
- data/app/views/mongoid_forums/admin/groups/new.haml +5 -0
- data/app/views/mongoid_forums/admin/groups/show.haml +26 -0
- data/app/views/mongoid_forums/admin/users/index.haml +24 -0
- data/app/views/mongoid_forums/forums/index.haml +46 -0
- data/app/views/mongoid_forums/forums/new.haml +15 -0
- data/app/views/mongoid_forums/forums/show.haml +47 -0
- data/app/views/mongoid_forums/posts/_form.haml +4 -0
- data/app/views/mongoid_forums/posts/_post.haml +24 -0
- data/app/views/mongoid_forums/posts/_quoted.haml +9 -0
- data/app/views/mongoid_forums/posts/edit.haml +17 -0
- data/app/views/mongoid_forums/posts/new.haml +17 -0
- data/app/views/mongoid_forums/topics/_topic.haml +2 -0
- data/app/views/mongoid_forums/topics/my_posts.haml +6 -0
- data/app/views/mongoid_forums/topics/my_subscriptions.haml +5 -0
- data/app/views/mongoid_forums/topics/my_topics.haml +6 -0
- data/app/views/mongoid_forums/topics/show.haml +16 -0
- data/config/locales/en.yml +196 -0
- data/config/routes.rb +62 -0
- data/lib/ack_mongoid_forums.rb +1 -0
- data/lib/generators/mongoid_forums/install/templates/initializer.rb +5 -0
- data/lib/generators/mongoid_forums/install_generator.rb +90 -0
- data/lib/generators/mongoid_forums/views_generator.rb +27 -0
- data/lib/mongoid_forums.rb +53 -0
- data/lib/mongoid_forums/default_permissions.rb +63 -0
- data/lib/mongoid_forums/engine.rb +20 -0
- data/lib/mongoid_forums/sanitizer.rb +10 -0
- data/lib/mongoid_forums/version.rb +3 -0
- data/lib/tasks/mongoid_forums_tasks.rake +4 -0
- data/test/controllers/mongoid_forums/admin/base_controller_test.rb +11 -0
- data/test/controllers/mongoid_forums/admin/categories_controller_test.rb +31 -0
- data/test/controllers/mongoid_forums/admin/forums_controller_test.rb +31 -0
- data/test/controllers/mongoid_forums/admin/groups_controller_test.rb +41 -0
- data/test/controllers/mongoid_forums/admin/users_controller_test.rb +11 -0
- data/test/controllers/mongoid_forums/forums_controller_test.rb +16 -0
- data/test/controllers/mongoid_forums/posts_controller_test.rb +36 -0
- data/test/controllers/mongoid_forums/topics_controller_test.rb +36 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/javascripts/welcome.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/test/dummy/app/assets/stylesheets/welcome.css +4 -0
- data/test/dummy/app/controllers/application_controller.rb +11 -0
- data/test/dummy/app/controllers/welcome_controller.rb +4 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/welcome_helper.rb +2 -0
- data/test/dummy/app/models/concerns/zero_oid_fix.rb +10 -0
- data/test/dummy/app/models/user.rb +43 -0
- data/test/dummy/app/views/layouts/application.haml +13 -0
- data/test/dummy/app/views/partials/_nav.haml +6 -0
- data/test/dummy/app/views/welcome/index.html.erb +2 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +29 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +76 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/devise.rb +259 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/kaminari_config.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/mongoid_forums.rb +5 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/simple_form.rb +166 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
- data/test/dummy/config/locales/devise.en.yml +60 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/locales/simple_form.en.yml +31 -0
- data/test/dummy/config/mongoid.yml +69 -0
- data/test/dummy/config/routes.rb +7 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/controllers/welcome_controller_test.rb +9 -0
- data/test/dummy/test/fixtures/users.yml +11 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/fixtures/mongoid_forums/categories.yml +11 -0
- data/test/fixtures/mongoid_forums/forums.yml +11 -0
- data/test/fixtures/mongoid_forums/posts.yml +11 -0
- data/test/fixtures/mongoid_forums/ranks.yml +11 -0
- data/test/fixtures/mongoid_forums/topics.yml +11 -0
- data/test/integration/navigation_test.rb +9 -0
- data/test/models/mongoid_forums/category_test.rb +9 -0
- data/test/models/mongoid_forums/forum_test.rb +9 -0
- data/test/models/mongoid_forums/post_test.rb +9 -0
- data/test/models/mongoid_forums/rank_test.rb +9 -0
- data/test/models/mongoid_forums/topic_test.rb +9 -0
- data/test/mongoid_forums_test.rb +7 -0
- data/test/test_helper.rb +17 -0
- metadata +442 -0
@@ -0,0 +1 @@
|
|
1
|
+
MongoidForums.decorate_user_class! if MongoidForums.user_class
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
module ApplicationHelper
|
3
|
+
include FormattingHelper
|
4
|
+
# processes text with installed markup formatter
|
5
|
+
def mongoid_forums_format(text, *options)
|
6
|
+
as_formatted_html(text)
|
7
|
+
end
|
8
|
+
|
9
|
+
def mongoid_forums_quote(text)
|
10
|
+
as_quoted_text(text)
|
11
|
+
end
|
12
|
+
|
13
|
+
def mongoid_forums_markdown(text, *options)
|
14
|
+
#TODO: delete deprecated method
|
15
|
+
Rails.logger.warn("DEPRECATION: mongoid_forums_markdown is replaced by mongoid_forums_format(), and will be removed")
|
16
|
+
forem_format(text)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
module FormattingHelper
|
3
|
+
# override with desired markup formatter, e.g. textile or markdown
|
4
|
+
def as_formatted_html(text)
|
5
|
+
if MongoidForums.formatter
|
6
|
+
MongoidForums.formatter.format(as_sanitized_text(text))
|
7
|
+
else
|
8
|
+
MongoidForums::Sanitizer.sanitize(text).html_safe
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def as_quoted_text(text)
|
13
|
+
if MongoidForums.formatter && MongoidForums.formatter.respond_to?(:blockquote)
|
14
|
+
MongoidForums.formatter.blockquote(as_sanitized_text(text)).html_safe
|
15
|
+
else
|
16
|
+
"<blockquote>#{(h(text))}</blockquote>\n\n".html_safe
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def as_sanitized_text(text)
|
21
|
+
if MongoidForums.formatter.respond_to?(:sanitize)
|
22
|
+
MongoidForums.formatter.sanitize(text)
|
23
|
+
else
|
24
|
+
MongoidForums::Sanitizer.sanitize(text)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
module ForumsHelper
|
3
|
+
def topics_count(forum)
|
4
|
+
forum.topics.count
|
5
|
+
end
|
6
|
+
|
7
|
+
def posts_count(forum)
|
8
|
+
if forum.posts_count == nil
|
9
|
+
forum.posts_count = forum.topics.inject(0) {|sum, topic| topic.posts.count + sum }
|
10
|
+
forum.save
|
11
|
+
end
|
12
|
+
forum.posts_count
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
class Ability
|
3
|
+
include CanCan::Ability
|
4
|
+
class_attribute :abilities
|
5
|
+
self.abilities = Set.new
|
6
|
+
|
7
|
+
# Allows us to go beyond the standard cancan initialize method which makes it difficult for engines to
|
8
|
+
# modify the default +Ability+ of an application. The +ability+ argument must be a class that includes
|
9
|
+
# the +CanCan::Ability+ module. The registered ability should behave properly as a stand-alone class
|
10
|
+
# and therefore should be easy to test in isolation.
|
11
|
+
def self.register_ability(ability)
|
12
|
+
self.abilities.add(ability)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.remove_ability(ability)
|
16
|
+
self.abilities.delete(ability)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(user)
|
20
|
+
user ||= MongoidForums.user_class.new
|
21
|
+
|
22
|
+
can :read, MongoidForums::Category do |category|
|
23
|
+
user.can_read_mongoid_forums_category?(category)
|
24
|
+
end
|
25
|
+
|
26
|
+
can :read, MongoidForums::Topic do |topic|
|
27
|
+
user.can_read_mongoid_forums_forum?(topic.forum) && user.can_read_mongoid_forums_topic?(topic)
|
28
|
+
end
|
29
|
+
|
30
|
+
if user.can_read_mongoid_forums_forums?
|
31
|
+
can :read, MongoidForums::Forum do |forum|
|
32
|
+
user.can_read_mongoid_forums_category?(forum.category) && user.can_read_mongoid_forums_forum?(forum)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
can :create_topic, MongoidForums::Forum do |forum|
|
37
|
+
can?(:read, forum) && user.can_create_mongoid_forums_topics?(forum)
|
38
|
+
end
|
39
|
+
|
40
|
+
can :reply, MongoidForums::Topic do |topic|
|
41
|
+
can?(:read, topic.forum) && user.can_reply_to_mongoid_forums_topic?(topic)
|
42
|
+
end
|
43
|
+
|
44
|
+
can :edit_post, MongoidForums::Forum do |forum|
|
45
|
+
user.can_edit_mongoid_forums_posts?(forum)
|
46
|
+
end
|
47
|
+
|
48
|
+
can :destroy_post, MongoidForums::Forum do |forum|
|
49
|
+
user.can_destroy_mongoid_forums_posts?(forum)
|
50
|
+
end
|
51
|
+
|
52
|
+
can :moderate, MongoidForums::Forum do |forum|
|
53
|
+
user.can_moderate_mongoid_forums_forum?(forum) || user.mongoid_forums_admin?
|
54
|
+
end
|
55
|
+
|
56
|
+
#include any abilities registered by extensions, etc.
|
57
|
+
Ability.abilities.each do |clazz|
|
58
|
+
ability = clazz.send(:new, user)
|
59
|
+
@rules = rules + ability.send(:rules)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Copyright 2011 Ryan Bigg, Philip Arndt and Josh Adams
|
4
|
+
|
5
|
+
This code was obtained from: https://github.com/kultus/forem-2/blob/master/app/models/forem/alert.rb
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
|
26
|
+
|
27
|
+
=end
|
28
|
+
|
29
|
+
|
30
|
+
module MongoidForums
|
31
|
+
class Alert
|
32
|
+
include Mongoid::Document
|
33
|
+
include Mongoid::Timestamps
|
34
|
+
include ActionView::Helpers::DateHelper
|
35
|
+
|
36
|
+
field :read, :type => Boolean, :default => false
|
37
|
+
field :read_at, :type => DateTime
|
38
|
+
|
39
|
+
# MongoidForums::Topic
|
40
|
+
field :mongoid_forums_topic_replier
|
41
|
+
field :mongoid_forums_topic_count, :default => 0
|
42
|
+
belongs_to :mongoid_forums_topic_post, :class_name => "MongoidForums::Post"
|
43
|
+
|
44
|
+
# Relations
|
45
|
+
belongs_to :subscription, :class_name => "MongoidForums::Subscription"
|
46
|
+
belongs_to :user, :index => true, :class_name => MongoidForums.user_class.to_s
|
47
|
+
|
48
|
+
def link
|
49
|
+
str = ""
|
50
|
+
case self.subscription.subscribable_type
|
51
|
+
when "MongoidForums::Topic"
|
52
|
+
str += "/forums/"
|
53
|
+
if self.mongoid_forums_topic_post == nil
|
54
|
+
str += "topics/" + self.subscription.subscribable.id.to_s
|
55
|
+
else
|
56
|
+
str += "posts/" + self.mongoid_forums_topic_post_id.to_s
|
57
|
+
end
|
58
|
+
else
|
59
|
+
str
|
60
|
+
end
|
61
|
+
str
|
62
|
+
end
|
63
|
+
|
64
|
+
def text
|
65
|
+
str = ""
|
66
|
+
case self.subscription.subscribable_type
|
67
|
+
when "MongoidForums::Topic"
|
68
|
+
str += self.mongoid_forums_topic_replier
|
69
|
+
if self.mongoid_forums_topic_count > 0
|
70
|
+
str += " and " + self.mongoid_forums_topic_count.to_s + " other" + (self.mongoid_forums_topic_count > 1 ? "s" : "")
|
71
|
+
end
|
72
|
+
str += " replied to " + self.subscription.subscribable.name
|
73
|
+
else
|
74
|
+
str
|
75
|
+
end
|
76
|
+
return str
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
class Category
|
3
|
+
include Mongoid::Document
|
4
|
+
|
5
|
+
has_many :forums, :class_name => "MongoidForums::Forum", dependent: :destroy
|
6
|
+
has_and_belongs_to_many :moderator_groups, :class_name => "MongoidForums::Group", inverse_of: nil
|
7
|
+
|
8
|
+
|
9
|
+
field :name
|
10
|
+
validates :name, :presence => true
|
11
|
+
|
12
|
+
field :position, :type => Integer, :default => 0
|
13
|
+
validates :position, numericality: { only_integer: true }
|
14
|
+
|
15
|
+
def moderator?(user)
|
16
|
+
return false unless user
|
17
|
+
moderator_groups.each do |group|
|
18
|
+
return true if group.moderator && group.members.include?(user.id)
|
19
|
+
end
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def moderators
|
24
|
+
array = Array.new
|
25
|
+
self.moderator_groups.each do |g|
|
26
|
+
array << g.group.members
|
27
|
+
end
|
28
|
+
return array
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Copyright 2011 Ryan Bigg, Philip Arndt and Josh Adams
|
4
|
+
|
5
|
+
This code was obtained from: https://github.com/kultus/forem-2/blob/master/app/models/forem/concerns/subscribable.rb
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
|
26
|
+
|
27
|
+
=end
|
28
|
+
|
29
|
+
require 'active_support/concern'
|
30
|
+
|
31
|
+
module MongoidForums
|
32
|
+
module Concerns
|
33
|
+
module Subscribable
|
34
|
+
extend ActiveSupport::Concern
|
35
|
+
|
36
|
+
included do
|
37
|
+
has_many :subscriptions, :as => :subscribable, :class_name => "MongoidForums::Subscription"
|
38
|
+
end
|
39
|
+
|
40
|
+
def subscribe_creator
|
41
|
+
subscribe_user(self.user_id)
|
42
|
+
end
|
43
|
+
|
44
|
+
def subscribe_user(user_id)
|
45
|
+
if user_id && !subscriber?(user_id)
|
46
|
+
if sub = subscriptions.where(:subscriber_id => user_id, :unsubscribed => true).first
|
47
|
+
sub.unsubscribed = false
|
48
|
+
sub.save
|
49
|
+
else
|
50
|
+
subscriptions.create(:subscriber_id => user_id)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def unsubscribe_user(user_id)
|
56
|
+
sub = subscriptions.where(:subscriber_id => user_id).first
|
57
|
+
sub.unsubscribed = true
|
58
|
+
sub.save
|
59
|
+
end
|
60
|
+
|
61
|
+
def subscriber?(user_id)
|
62
|
+
subscriptions.where(:subscriber_id => user_id, :unsubscribed => false).count > 0
|
63
|
+
end
|
64
|
+
|
65
|
+
def subscription_for user_id
|
66
|
+
subscriptions.first(:conditions => { :subscriber_id=>user_id })
|
67
|
+
end
|
68
|
+
|
69
|
+
def alert_subscribers(*args)
|
70
|
+
subscriptions.where(:unsubscribed => false).each do |sub|
|
71
|
+
sub.alert_subscriber(args)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Copyright 2011 Ryan Bigg, Philip Arndt and Josh Adams
|
4
|
+
|
5
|
+
This code was obtained from: https://github.com/kultus/forem-2/blob/master/app/models/forem/concerns/viewable.rb
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
|
26
|
+
|
27
|
+
=end
|
28
|
+
|
29
|
+
require 'active_support/concern'
|
30
|
+
|
31
|
+
module MongoidForums
|
32
|
+
module Concerns
|
33
|
+
module Viewable
|
34
|
+
extend ActiveSupport::Concern
|
35
|
+
|
36
|
+
included do
|
37
|
+
field :views_count
|
38
|
+
has_many :views, :as => :viewable, :class_name => "MongoidForums::View"
|
39
|
+
end
|
40
|
+
|
41
|
+
def view_for(user)
|
42
|
+
views.where(:user_id => user.id).first
|
43
|
+
end
|
44
|
+
|
45
|
+
# Track when users last viewed topics
|
46
|
+
def register_view_by(user)
|
47
|
+
return unless user
|
48
|
+
|
49
|
+
view = views.find_or_create_by(:user_id => user.id)
|
50
|
+
view.user_id = user.id
|
51
|
+
view.inc(count: 1)
|
52
|
+
inc(views_count: 1)
|
53
|
+
|
54
|
+
view.past_viewed_at = view.current_viewed_at
|
55
|
+
view.current_viewed_at = Time.now
|
56
|
+
view.save
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module MongoidForums
|
2
|
+
class Forum
|
3
|
+
include Mongoid::Document
|
4
|
+
include MongoidForums::Concerns::Viewable
|
5
|
+
|
6
|
+
belongs_to :category, :class_name => "MongoidForums::Category"
|
7
|
+
validates :category, :presence => true
|
8
|
+
|
9
|
+
has_many :topics, :class_name => "MongoidForums::Topic", dependent: :destroy
|
10
|
+
|
11
|
+
# Caching
|
12
|
+
field :posts_count, :type => Integer
|
13
|
+
|
14
|
+
field :name
|
15
|
+
|
16
|
+
has_and_belongs_to_many :moderator_groups, :class_name => "MongoidForums::Group", inverse_of: nil
|
17
|
+
|
18
|
+
validates :category, :name, :presence => true
|
19
|
+
field :position, :type => Integer, :default => 0
|
20
|
+
validates :position, numericality: { only_integer: true }
|
21
|
+
|
22
|
+
def unread_topic_count(user)
|
23
|
+
view = View.where(:viewable_id => id, :user_id => user.id).first
|
24
|
+
return topics.count unless view.present?
|
25
|
+
count = 0
|
26
|
+
topics.each do |topics|
|
27
|
+
if topics.created_at > view.current_viewed_at
|
28
|
+
count+=1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
return count
|
32
|
+
end
|
33
|
+
|
34
|
+
def count_of_posts
|
35
|
+
topics.inject(0) {|sum, topic| topic.posts.count + sum }
|
36
|
+
end
|
37
|
+
|
38
|
+
def increment_posts_count
|
39
|
+
if self.posts_count == nil
|
40
|
+
self.posts_count = 1
|
41
|
+
else
|
42
|
+
self.posts_count += 1
|
43
|
+
end
|
44
|
+
self.save
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
def moderator?(user)
|
49
|
+
return false unless user
|
50
|
+
return true if category.moderator?(user)
|
51
|
+
moderator_groups.each do |group|
|
52
|
+
return true if group.moderator && group.members.include?(user.id)
|
53
|
+
end
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def moderators
|
58
|
+
array = Array.new
|
59
|
+
self.moderator_groups.each do |g|
|
60
|
+
array << g.group.members
|
61
|
+
end
|
62
|
+
return array
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|