community_engine 3.0.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +4 -1
  3. data/.travis.yml +5 -2
  4. data/CHANGELOG.markdown +270 -0
  5. data/Gemfile +3 -0
  6. data/README.markdown +20 -21
  7. data/Rakefile +8 -6
  8. data/TODO.markdown +3 -0
  9. data/UPGRADING.markdown +46 -36
  10. data/app/assets/javascripts/active_admin.js.coffee +19 -0
  11. data/app/assets/javascripts/ckeditor/configs/ads.js.coffee +175 -0
  12. data/app/assets/javascripts/ckeditor/configs/comments.js.coffee +2 -0
  13. data/app/assets/javascripts/ckeditor/configs/posts.js.coffee +248 -0
  14. data/app/assets/javascripts/ckeditor/rte/rte.ads.js.coffee +7 -0
  15. data/app/assets/javascripts/ckeditor/rte/rte.comments.js.coffee +8 -0
  16. data/app/assets/javascripts/ckeditor/rte/rte.js.coffee +20 -0
  17. data/app/assets/javascripts/ckeditor/rte/rte.posts.js.coffee +14 -0
  18. data/app/assets/javascripts/community_engine.js +114 -123
  19. data/{vendor → app}/assets/javascripts/jcrop/jquery.Jcrop.js +0 -0
  20. data/{vendor → app}/assets/javascripts/jcrop/jquery.color.js +0 -0
  21. data/{vendor → app}/assets/javascripts/tag-it/tag-it.js +0 -0
  22. data/app/assets/stylesheets/active_admin.css.scss +27 -0
  23. data/{vendor → app}/assets/stylesheets/jcrop/Jcrop.gif +0 -0
  24. data/{vendor → app}/assets/stylesheets/jcrop/jquery.Jcrop.min.css +0 -0
  25. data/{vendor → app}/assets/stylesheets/tag-it/tag-it.css +0 -0
  26. data/{vendor → app}/assets/stylesheets/tag-it/tagit.ui-zendesk.css +0 -0
  27. data/app/controllers/activities_controller.rb +4 -4
  28. data/app/controllers/albums_controller.rb +13 -18
  29. data/app/controllers/authorizations_controller.rb +1 -1
  30. data/app/controllers/base_controller.rb +9 -32
  31. data/app/controllers/categories_controller.rb +1 -78
  32. data/app/controllers/clippings_controller.rb +3 -7
  33. data/app/controllers/comments_controller.rb +4 -24
  34. data/app/controllers/events_controller.rb +3 -12
  35. data/app/controllers/favorites_controller.rb +2 -2
  36. data/app/controllers/forums_controller.rb +5 -9
  37. data/app/controllers/invitations_controller.rb +1 -1
  38. data/app/controllers/messages_controller.rb +4 -8
  39. data/app/controllers/moderators_controller.rb +1 -1
  40. data/app/controllers/monitorships_controller.rb +1 -1
  41. data/app/controllers/pages_controller.rb +0 -62
  42. data/app/controllers/password_resets_controller.rb +2 -2
  43. data/app/controllers/photo_manager_controller.rb +3 -3
  44. data/app/controllers/photos_controller.rb +43 -14
  45. data/app/controllers/posts_controller.rb +7 -14
  46. data/app/controllers/rsvps_controller.rb +3 -3
  47. data/app/controllers/sb_posts_controller.rb +20 -20
  48. data/app/controllers/sessions_controller.rb +1 -1
  49. data/app/controllers/tags_controller.rb +4 -52
  50. data/app/controllers/topics_controller.rb +15 -10
  51. data/app/controllers/users_controller.rb +9 -16
  52. data/app/controllers/votes_controller.rb +2 -2
  53. data/app/helpers/base_helper.rb +4 -14
  54. data/app/models/acts_as_taggable_on/tag.rb +9 -41
  55. data/app/models/clipping.rb +1 -1
  56. data/app/models/forum.rb +2 -2
  57. data/app/models/photo.rb +1 -1
  58. data/app/models/post.rb +1 -1
  59. data/app/models/sb_post.rb +19 -15
  60. data/app/models/topic.rb +10 -10
  61. data/app/models/user.rb +1 -1
  62. data/app/policies/active_admin/page_policy.rb +11 -0
  63. data/app/policies/application_policy.rb +59 -0
  64. data/app/policies/post_policy.rb +13 -0
  65. data/app/policies/sb_post_policy.rb +15 -0
  66. data/app/policies/topic_policy.rb +23 -0
  67. data/app/views/ckeditor/pictures/index.html.haml +15 -0
  68. data/app/views/ckeditor/shared/_asset.html.haml +9 -0
  69. data/app/views/ckeditor/shared/_asset_tmpl.html.erb +14 -0
  70. data/app/views/comments/approve.js.haml +1 -1
  71. data/app/views/comments/create.js.erb +1 -1
  72. data/app/views/comments/edit.js.erb +2 -1
  73. data/app/views/events/_subscribe.html.haml +1 -1
  74. data/app/views/forums/show.html.haml +8 -4
  75. data/app/views/posts/show.html.haml +4 -0
  76. data/app/views/sb_posts/_edit_script.js.erb +2 -3
  77. data/app/views/sb_posts/_reply_script.js.erb +2 -4
  78. data/app/views/sb_posts/_sb_post.html.haml +7 -6
  79. data/app/views/sb_posts/create.js.erb +4 -4
  80. data/app/views/sb_posts/edit.js.erb +2 -1
  81. data/app/views/sessions/_menu_item.html.haml +4 -4
  82. data/app/views/shared/_end_javascript.html.haml +1 -2
  83. data/app/views/shared/_login_sidebar.html.haml +2 -2
  84. data/app/views/tags/show.html.haml +3 -3
  85. data/app/views/topics/show.html.haml +1 -1
  86. data/app/views/users/_profile_user_info_sidebar.html.haml +2 -2
  87. data/app/views/users/destroy.js.erb +3 -0
  88. data/app/views/users/new.html.haml +1 -1
  89. data/app/views/users/show.html.haml +1 -1
  90. data/app/views/users/signup_completed.html.haml +1 -1
  91. data/community_engine.gemspec +14 -11
  92. data/config/initializers/active_admin.rb +239 -0
  93. data/config/initializers/ckeditor.rb +8 -0
  94. data/config/initializers/ransack_bootstrap_fix.rb +25 -0
  95. data/config/locales/de-DE.yml +1 -0
  96. data/config/locales/en.yml +3 -0
  97. data/config/routes.rb +14 -19
  98. data/config/spring.rb +1 -0
  99. data/db/migrate/083_create_active_admin_comments.rb +19 -0
  100. data/lib/community_engine.rb +7 -3
  101. data/lib/community_engine/admin/ads.rb +3 -0
  102. data/lib/community_engine/admin/categories.rb +20 -0
  103. data/lib/community_engine/admin/comments.rb +4 -0
  104. data/lib/community_engine/admin/dashboard.rb +38 -0
  105. data/lib/community_engine/admin/events.rb +3 -0
  106. data/lib/community_engine/admin/forums.rb +3 -0
  107. data/lib/community_engine/admin/homepage_features.rb +25 -0
  108. data/lib/community_engine/admin/metro_areas.rb +4 -0
  109. data/lib/community_engine/admin/pages.rb +26 -0
  110. data/lib/community_engine/admin/posts.rb +92 -0
  111. data/lib/community_engine/admin/tags.rb +21 -0
  112. data/lib/community_engine/admin/users.rb +54 -0
  113. data/lib/community_engine/authenticated_system.rb +5 -20
  114. data/lib/community_engine/engine.rb +5 -0
  115. data/lib/community_engine/version.rb +1 -1
  116. data/lib/resource_feeder/atom.rb +2 -0
  117. data/lib/resource_feeder/rss.rb +2 -0
  118. data/lib/white_list.rb +6 -11
  119. data/test/fixtures/events.yml +10 -0
  120. data/test/fixtures/tags.yml +6 -5
  121. data/test/functional/activities_controller_test.rb +19 -19
  122. data/test/functional/admin/posts_controller_test.rb +16 -0
  123. data/test/functional/admin_controller_test.rb +82 -82
  124. data/test/functional/categories_controller_test.rb +0 -39
  125. data/test/functional/comments_controller_test.rb +14 -7
  126. data/test/functional/favorites_controller_test.rb +15 -16
  127. data/test/functional/pages_controller_test.rb +0 -71
  128. data/test/functional/posts_controller_test.rb +21 -2
  129. data/test/functional/sb_posts_controller_test.rb +3 -3
  130. data/test/functional/sessions_controller_test.rb +2 -2
  131. data/test/functional/tags_controller_test.rb +9 -20
  132. data/test/functional/users_controller_test.rb +0 -8
  133. data/test/functional/votes_controller_test.rb +1 -1
  134. data/test/testapp/config/spring.rb +1 -0
  135. data/test/testapp/db/schema.rb +16 -1
  136. data/test/unit/event_test.rb +1 -1
  137. metadata +204 -170
  138. data/CHANGELOG +0 -144
  139. data/app/controllers/admin_controller.rb +0 -80
  140. data/app/controllers/ads_controller.rb +0 -90
  141. data/app/controllers/homepage_features_controller.rb +0 -74
  142. data/app/controllers/metro_areas_controller.rb +0 -74
  143. data/app/controllers/statistics_controller.rb +0 -35
  144. data/app/views/admin/comments.html.haml +0 -53
  145. data/app/views/admin/events.html.haml +0 -26
  146. data/app/views/admin/messages.html.haml +0 -3
  147. data/app/views/admin/update.js.erb +0 -1
  148. data/app/views/admin/users.html.haml +0 -57
  149. data/app/views/ads/_form.html.haml +0 -21
  150. data/app/views/ads/edit.html.haml +0 -7
  151. data/app/views/ads/index.html.haml +0 -29
  152. data/app/views/ads/new.html.haml +0 -6
  153. data/app/views/ads/show.html.haml +0 -19
  154. data/app/views/categories/_form.html.haml +0 -8
  155. data/app/views/categories/edit.html.haml +0 -4
  156. data/app/views/categories/index.html.haml +0 -20
  157. data/app/views/categories/new.html.haml +0 -4
  158. data/app/views/homepage_features/_form.html.haml +0 -6
  159. data/app/views/homepage_features/edit.html.haml +0 -6
  160. data/app/views/homepage_features/index.html.haml +0 -24
  161. data/app/views/homepage_features/new.html.haml +0 -2
  162. data/app/views/homepage_features/show.html.haml +0 -27
  163. data/app/views/metro_areas/_form.html.haml +0 -6
  164. data/app/views/metro_areas/edit.html.haml +0 -8
  165. data/app/views/metro_areas/index.html.haml +0 -21
  166. data/app/views/metro_areas/new.html.haml +0 -6
  167. data/app/views/metro_areas/show.html.haml +0 -14
  168. data/app/views/pages/_form.html.haml +0 -18
  169. data/app/views/pages/edit.html.haml +0 -4
  170. data/app/views/pages/index.html.haml +0 -34
  171. data/app/views/pages/new.html.haml +0 -7
  172. data/app/views/shared/_admin_nav.html.haml +0 -17
  173. data/app/views/shared/_load_tinymce.js.erb +0 -15
  174. data/app/views/statistics/activities.xml.builder +0 -33
  175. data/app/views/statistics/index.html.haml +0 -48
  176. data/app/views/tags/edit.html.haml +0 -12
  177. data/app/views/tags/manage.html.haml +0 -30
  178. data/app/views/users/update.js.erb +0 -1
  179. data/test/functional/ads_controller_test.rb +0 -51
  180. data/test/functional/homepage_features_controller_test.rb +0 -69
  181. data/test/functional/metro_areas_controller_test.rb +0 -63
  182. data/test/functional/statistics_controller_test.rb +0 -18
  183. data/test/unit/acts_as_taggable_on/tag_test.rb +0 -22
  184. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/README +0 -3
  185. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/Rakefile +0 -22
  186. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/generators/publishing/publishing_generator.rb +0 -34
  187. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/generators/publishing/templates/migration.rb +0 -13
  188. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/install.rb +0 -3
  189. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/test/acts_as_publishable_test.rb +0 -8
  190. data/vendor/converted2.3plugins_to_lib_leftovers/acts_as_publishable/uninstall.rb +0 -1
  191. data/vendor/converted2.3plugins_to_lib_leftovers/resource_feeder/README +0 -4
  192. data/vendor/converted2.3plugins_to_lib_leftovers/resource_feeder/Rakefile +0 -22
  193. data/vendor/converted2.3plugins_to_lib_leftovers/resource_feeder/test/atom_feed_test.rb +0 -85
  194. data/vendor/converted2.3plugins_to_lib_leftovers/resource_feeder/test/rss_feed_test.rb +0 -61
  195. data/vendor/converted2.3plugins_to_lib_leftovers/resource_feeder/test/test_helper.rb +0 -60
  196. data/vendor/converted2.3plugins_to_lib_leftovers/white_list/README +0 -35
  197. data/vendor/converted2.3plugins_to_lib_leftovers/white_list/Rakefile +0 -22
  198. data/vendor/converted2.3plugins_to_lib_leftovers/white_list/test/white_list_test.rb +0 -120
@@ -3,16 +3,17 @@ require 'digest/md5'
3
3
  # Methods added to this helper will be available to all templates in the application.
4
4
  module BaseHelper
5
5
  include ActsAsTaggableOn::TagsHelper
6
+ include Ckeditor::ApplicationHelper
6
7
 
7
8
  def commentable_url(comment)
8
9
  if comment.recipient && comment.commentable
9
10
  if comment.commentable_type != "User"
10
- polymorphic_url([comment.recipient, comment.commentable])+"#comment_#{comment.id}"
11
+ polymorphic_url([comment.recipient, comment.commentable])+"#comment-#{comment.id}"
11
12
  elsif comment
12
- user_url(comment.recipient)+"#comment_#{comment.id}"
13
+ user_url(comment.recipient)+"#comment-#{comment.id}"
13
14
  end
14
15
  elsif comment.commentable
15
- polymorphic_url(comment.commentable)+"#comment_#{comment.id}"
16
+ polymorphic_url(comment.commentable)+"#comment-#{comment.id}"
16
17
  end
17
18
  end
18
19
 
@@ -346,17 +347,6 @@ module BaseHelper
346
347
  user.gender ? (user.male? ? :his.l : :her.l) : :their.l
347
348
  end
348
349
 
349
- def tiny_mce_init_if_needed
350
- if !@uses_tiny_mce.blank?
351
- javascript_tag(tiny_mce_js)
352
- end
353
- end
354
-
355
- def tiny_mce_js
356
- selector = @tiny_mce_configuration['selector']
357
- "jQuery(function(){jQuery('#{selector}').RichTextEditor(#{@tiny_mce_configuration.to_json})});".html_safe
358
- end
359
-
360
350
  def flash_class(level)
361
351
  case level
362
352
  when :notice then "alert-info"
@@ -1,58 +1,28 @@
1
- #require_dependency ActsAsTaggableOn::Engine.config.root.join('app', 'models', 'acts_as_taggable_on', 'tag.rb').to_s
1
+ # require_dependency ActsAsTaggableOn::Engine.config.root.join('lib', 'acts_as_taggable_on', 'tag.rb').to_s
2
2
 
3
3
  class ActsAsTaggableOn::Tag < ActiveRecord::Base
4
4
 
5
5
  class << self
6
6
  def popular(limit = 20, type = nil)
7
- tags = ActsAsTaggableOn::Tag.counts(:at_least => 0).limit(limit).order('count DESC')
8
- tags = tags.where("taggings.taggable_type = ?", type.capitalize) if type
9
- tags
7
+ if type == nil
8
+ ActsAsTaggableOn::Tag.most_used(limit)
9
+ else
10
+ klass = Object.const_get type
11
+ klass.tag_counts.most_used(limit)
12
+ end
10
13
  end
11
14
 
12
15
  def default_per_page
13
16
  25
14
17
  end
15
18
 
16
- # Calculate the tag counts for all tags.
17
- #
18
- # - +:start_at+ - restrict the tags to those created after a certain time
19
- # - +:end_at+ - restrict the tags to those created before a certain time
20
- # - +:at_least+ - exclude tags with a frequency less than the given value
21
- # - +:at_most+ - exclude tags with a frequency greater than the given value
22
- #
23
- # Deprecated:
24
- #
25
- # - +:conditions+
26
- # - +:limit+
27
- # - +:order+
28
- #
29
- def counts(options = {})
30
- options.assert_valid_keys :start_at, :end_at, :at_least, :at_most, :conditions, :limit, :order, :joins
31
-
32
- tags = select("#{quoted_table_name}.id", "#{quoted_table_name}.name", "COUNT(#{quoted_table_name}.id) AS count")
33
- tags = tags.joins(:taggings)
34
- tags = tags.having(["COUNT(#{ActsAsTaggableOn::Tagging.quoted_table_name}.id) >= ?", options[:at_least]]) if options[:at_least]
35
- tags = tags.having(["COUNT(#{ActsAsTaggableOn::Tagging.quoted_table_name}.id) <= ?", options[:at_most]]) if options[:at_most]
36
- tags = tags.where("#{ActsAsTaggableOn::Tagging.quoted_table_name}.created_at >= ?", options[:start_at]) if options[:start_at]
37
- tags = tags.where("#{ActsAsTaggableOn::Tagging.quoted_table_name}.created_at <= ?", options[:end_at]) if options[:end_at]
38
- tags = tags.where(options[:conditions]) if options[:conditions]
39
- tags = tags.limit(options[:limit]) if options[:limit]
40
- tags = tags.order(options[:order]) if options[:order]
41
-
42
- if joins = options.delete(:joins)
43
- tags = tags.joins(joins)
44
- end
45
-
46
- tags.group("#{quoted_table_name}.id, #{quoted_table_name}.name")
47
- end
48
-
49
-
50
19
  end
51
20
 
52
21
  def to_param
53
22
  URI.escape(URI.escape(self.name), /[\/.?#]/)
54
23
  end
55
24
 
25
+
56
26
  def related_tags(limit = 10)
57
27
  taggables = self.taggings.limit(10).to_a.collect{|t| t.taggable }.compact
58
28
 
@@ -60,11 +30,9 @@ class ActsAsTaggableOn::Tag < ActiveRecord::Base
60
30
  return [] if tagging_ids.blank?
61
31
 
62
32
  ActsAsTaggableOn::Tag.where("tags.id != '#{self.id}'")
63
- .select("tags.id, tags.name, COUNT(tags.id) as count")
64
33
  .joins(:taggings)
65
34
  .where({:taggings => {:id => tagging_ids }})
66
- .group("tags.id, tags.name")
67
- .order("count DESC")
35
+ .order("taggings_count DESC")
68
36
  .limit(limit)
69
37
  end
70
38
 
@@ -21,7 +21,7 @@ class Clipping < ActiveRecord::Base
21
21
 
22
22
  def self.find_related_to(clipping, options = {})
23
23
  options.reverse_merge!({:limit => 8,
24
- :order => 'created_at DESC',
24
+ :order => 'clippings.created_at DESC',
25
25
  :conditions => [ 'clippings.id != ?', clipping.id ]
26
26
  })
27
27
 
@@ -14,9 +14,9 @@ class Forum < ActiveRecord::Base
14
14
  belongs_to :owner, :polymorphic => true
15
15
 
16
16
  format_attribute :description
17
-
17
+
18
18
  def to_param
19
19
  id.to_s << "-" << (name ? name.parameterize : '' )
20
20
  end
21
-
21
+
22
22
  end
@@ -60,7 +60,7 @@ class Photo < ActiveRecord::Base
60
60
 
61
61
  def self.find_related_to(photo, options = {})
62
62
  options.reverse_merge!({:limit => 8,
63
- :order => 'created_at DESC',
63
+ :order => 'photos.created_at DESC',
64
64
  :conditions => ['photos.id != ?', photo.id]
65
65
  })
66
66
  limit(options[:limit]).order(options[:order]).where(options[:conditions]).tagged_with(photo.tags.collect{|t| t.name }, :any => true)
@@ -51,7 +51,7 @@ class Post < ActiveRecord::Base
51
51
 
52
52
  def find_related_to(post, options = {})
53
53
  options.reverse_merge!({:limit => 8,
54
- :order => 'published_at DESC',
54
+ :order => 'posts.published_at DESC',
55
55
  :conditions => [ 'posts.id != ? AND published_as = ?', post.id, 'live' ]
56
56
  })
57
57
 
@@ -1,20 +1,20 @@
1
1
  class SbPost < ActiveRecord::Base
2
- acts_as_activity :user, :if => Proc.new{|record| record.user } #don't record an activity if there's no user
2
+ acts_as_activity :user, :if => Proc.new{|record| record.user } #don't record an activity if there's no user
3
3
  include Rakismet::Model
4
4
  rakismet_attrs :author => :username, :comment_type => 'comment', :content => :body, :user_ip => :author_ip
5
-
5
+
6
6
  belongs_to :forum, :counter_cache => true
7
7
  belongs_to :user, :counter_cache => true
8
8
  belongs_to :topic, :counter_cache => true
9
9
 
10
10
  format_attribute :body
11
11
  before_create { |r| r.forum_id = r.topic.forum_id }
12
- after_create { |r|
12
+ after_create { |r|
13
13
  Topic.where('id = ?', r.topic_id)
14
14
  .update_all(['replied_at = ?, replied_by = ?, last_post_id = ?', r.created_at, r.user_id, r.id])
15
15
 
16
16
  }
17
- after_destroy { |r|
17
+ after_destroy { |r|
18
18
  t = Topic.find(r.topic_id)
19
19
  Topic.where('id = ?', t.id).update_all(['replied_at = ?, replied_by = ?, last_post_id = ?', t.sb_posts.recent.last.created_at, t.sb_posts.recent.last.user_id, t.sb_posts.recent.last.id]) if t.sb_posts.recent.last
20
20
  }
@@ -27,40 +27,44 @@ class SbPost < ActiveRecord::Base
27
27
  validates_presence_of :body, :topic
28
28
 
29
29
  after_create :monitor_topic
30
- after_create :notify_monitoring_users
31
-
30
+ after_create :notify_monitoring_users
31
+
32
32
  scope :with_query_options, lambda {
33
33
  select('sb_posts.*, topics.title as topic_title, forums.name as forum_name')
34
34
  .joins('inner join topics on sb_posts.topic_id = topics.id inner join forums on topics.forum_id = forums.id')
35
35
  .order('sb_posts.created_at desc')
36
36
  }
37
37
  scope :recent, -> { order('sb_posts.created_at ASC') }
38
- validate :check_spam
39
-
38
+ validate :check_spam
39
+
40
40
  def monitor_topic
41
- return unless user
41
+ return unless user
42
42
  monitorship = Monitorship.where(:user_id => self.user.id, :topic_id => self.topic.id).first_or_initialize
43
43
  if monitorship.new_record?
44
44
  monitorship.update_attribute :active, true
45
45
  end
46
46
  end
47
-
47
+
48
48
  def notify_monitoring_users
49
49
  topic.notify_of_new_post(self)
50
50
  end
51
-
51
+
52
52
  def editable_by?(user)
53
53
  user && (user.id == user_id || user.admin? || user.moderator_of?(topic.forum_id))
54
54
  end
55
-
55
+
56
56
  def username
57
57
  user ? user.login : (author_name.blank? ? :anonymous.l : author_name)
58
58
  end
59
-
59
+
60
60
  def check_spam
61
61
  if configatron.has_key?(:akismet_key) && self.spam?
62
62
  self.errors.add(:base, :comment_spam_error.l)
63
63
  end
64
- end
65
-
64
+ end
65
+
66
+ def dom_id
67
+ ['sb_posts', id].join('-')
68
+ end
69
+
66
70
  end
@@ -1,6 +1,6 @@
1
1
  class Topic < ActiveRecord::Base
2
2
  acts_as_activity :user
3
-
3
+
4
4
  acts_as_taggable
5
5
  belongs_to :forum, :counter_cache => true
6
6
  belongs_to :user
@@ -10,14 +10,14 @@ class Topic < ActiveRecord::Base
10
10
  has_many :sb_posts, :dependent => :destroy, :inverse_of => :topic
11
11
 
12
12
  belongs_to :replied_by_user, :foreign_key => "replied_by", :class_name => "User"
13
-
13
+
14
14
  validates_presence_of :forum, :user, :title
15
15
  before_create :set_default_replied_at_and_sticky
16
16
  after_save :set_post_topic_id
17
17
  after_create :create_monitorship_for_owner
18
-
18
+
19
19
  accepts_nested_attributes_for :sb_posts
20
-
20
+
21
21
  scope :recently_replied, -> {order('replied_at DESC')}
22
22
 
23
23
  def notify_of_new_post(post)
@@ -33,11 +33,11 @@ class Topic < ActiveRecord::Base
33
33
  def voices
34
34
  sb_posts.map { |p| p.user_id }.uniq.size
35
35
  end
36
-
36
+
37
37
  def body
38
38
  sb_posts.first
39
39
  end
40
-
40
+
41
41
  def hit!
42
42
  self.class.increment_counter :hits, id
43
43
  end
@@ -47,7 +47,7 @@ class Topic < ActiveRecord::Base
47
47
  def views() hits end
48
48
 
49
49
  def paged?() sb_posts_count > 25 end
50
-
50
+
51
51
  def last_page
52
52
  (sb_posts_count.to_f / 25.0).ceil.to_i
53
53
  end
@@ -55,7 +55,7 @@ class Topic < ActiveRecord::Base
55
55
  def editable_by?(user)
56
56
  user && (user.id == user_id || user.admin? || user.moderator_of?(forum_id))
57
57
  end
58
-
58
+
59
59
  protected
60
60
  def set_default_replied_at_and_sticky
61
61
  self.replied_at = Time.now.utc
@@ -65,9 +65,9 @@ class Topic < ActiveRecord::Base
65
65
  def set_post_topic_id
66
66
  SbPost.where('topic_id = ?', id).update_all(['forum_id = ?', forum_id])
67
67
  end
68
-
68
+
69
69
  def create_monitorship_for_owner
70
70
  monitorship = Monitorship.find_or_initialize_by(:user_id => user.id, :topic_id => self.id)
71
- monitorship.update_attribute :active, true
71
+ monitorship.update_attribute :active, true
72
72
  end
73
73
  end
@@ -447,7 +447,7 @@ class User < ActiveRecord::Base
447
447
  self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
448
448
  end
449
449
 
450
- # before filters
450
+ # before actions
451
451
  def whitelist_attributes
452
452
  self.login = self.login.strip
453
453
  self.description = white_list(self.description )
@@ -0,0 +1,11 @@
1
+ class ActiveAdmin::PagePolicy < ApplicationPolicy
2
+
3
+ def dashboard?
4
+ true
5
+ end
6
+
7
+ def index?
8
+ true
9
+ end
10
+
11
+ end
@@ -0,0 +1,59 @@
1
+ class ApplicationPolicy
2
+ attr_reader :user, :record
3
+
4
+ def initialize(user, record)
5
+ @user = user
6
+ @record = record
7
+ end
8
+
9
+ def show?
10
+ true
11
+ end
12
+
13
+ def index?
14
+ true
15
+ end
16
+
17
+ def new?
18
+ create?
19
+ end
20
+
21
+ def create?
22
+ true
23
+ end
24
+
25
+ def edit?
26
+ update?
27
+ end
28
+
29
+ def update?
30
+ user.admin? || record.respond_to(:user) && record.user.eql?(user)
31
+ end
32
+
33
+ def destroy?
34
+ update?
35
+ end
36
+
37
+ def destroy_all?
38
+ user.admin?
39
+ end
40
+
41
+ def scope
42
+ Pundit.policy_scope!(user, record.class)
43
+ end
44
+
45
+ class Scope
46
+ attr_reader :user, :scope
47
+
48
+ def initialize(user, scope)
49
+ @user = user
50
+ @scope = scope
51
+ end
52
+
53
+ def resolve
54
+ scope
55
+ end
56
+ end
57
+
58
+ end
59
+
@@ -0,0 +1,13 @@
1
+ class PostPolicy < ApplicationPolicy
2
+
3
+ class Scope < Scope
4
+ def resolve
5
+ if user.admin?
6
+ scope.unscoped
7
+ else
8
+ scope.unscoped.where(:user_id => user.id)
9
+ end
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,15 @@
1
+ class SbPostPolicy < ApplicationPolicy
2
+
3
+ def edit?
4
+ update?
5
+ end
6
+
7
+ def destroy?
8
+ update?
9
+ end
10
+
11
+ def update?
12
+ record.editable_by?(user)
13
+ end
14
+
15
+ end
@@ -0,0 +1,23 @@
1
+ class TopicPolicy < ApplicationPolicy
2
+
3
+ def new?
4
+ create?
5
+ end
6
+
7
+ def create?
8
+ true
9
+ end
10
+
11
+ def edit?
12
+ update?
13
+ end
14
+
15
+ def destroy?
16
+ update?
17
+ end
18
+
19
+ def update?
20
+ record.editable_by?(user)
21
+ end
22
+
23
+ end