gluttonberg-core 2.5.5 → 2.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/app/assets/javascripts/gb_application.js +34 -0
  2. data/app/assets/stylesheets/gb_admin-override.sass +17 -1
  3. data/app/controllers/gluttonberg/admin/asset_library/assets_controller.rb +4 -2
  4. data/app/controllers/gluttonberg/admin/content/articles_controller.rb +22 -22
  5. data/app/controllers/gluttonberg/admin/content/comments_controller.rb +80 -23
  6. data/app/controllers/gluttonberg/admin/main_controller.rb +1 -1
  7. data/app/controllers/gluttonberg/public/comments_controller.rb +9 -8
  8. data/app/helpers/gluttonberg/admin.rb +3 -3
  9. data/app/helpers/gluttonberg/asset_library.rb +14 -11
  10. data/app/models/gluttonberg/asset.rb +8 -6
  11. data/app/models/gluttonberg/comment.rb +57 -3
  12. data/app/models/gluttonberg/comment_subscription.rb +2 -0
  13. data/app/models/gluttonberg/setting.rb +11 -5
  14. data/app/views/gluttonberg/admin/asset_library/assets/_browser_root.html.haml +20 -3
  15. data/app/views/gluttonberg/admin/asset_library/assets/search.json.haml +1 -1
  16. data/app/views/gluttonberg/admin/content/comments/index.html.haml +36 -10
  17. data/app/views/gluttonberg/admin/content/main/_sidebar.html.haml +6 -3
  18. data/app/views/gluttonberg/admin/main/index.html.haml +4 -4
  19. data/app/views/gluttonberg/admin/settings/generic_settings/index.html.haml +11 -7
  20. data/config/routes.rb +10 -0
  21. data/db/migrate/20130201025800_spam_flag_for_comments.rb +6 -0
  22. data/lib/engine.rb +3 -2
  23. data/lib/generators/gluttonberg/installer/installer_generator.rb +33 -32
  24. data/lib/gluttonberg/content/block.rb +2 -0
  25. data/lib/gluttonberg/content/clean_html.rb +16 -14
  26. data/lib/gluttonberg/content/despamilator/conf/unusual_characters.txt +6674 -0
  27. data/lib/gluttonberg/content/despamilator/filter/emails.rb +49 -0
  28. data/lib/gluttonberg/content/despamilator/filter/gtubs_test_filter.rb +25 -0
  29. data/lib/gluttonberg/content/despamilator/filter/html_tags.rb +134 -0
  30. data/lib/gluttonberg/content/despamilator/filter/ip_address_url.rb +27 -0
  31. data/lib/gluttonberg/content/despamilator/filter/long_words.rb +29 -0
  32. data/lib/gluttonberg/content/despamilator/filter/mixed_case.rb +25 -0
  33. data/lib/gluttonberg/content/despamilator/filter/naughty_words.rb +80 -0
  34. data/lib/gluttonberg/content/despamilator/filter/no_vowels.rb +28 -0
  35. data/lib/gluttonberg/content/despamilator/filter/numbers_and_words.rb +55 -0
  36. data/lib/gluttonberg/content/despamilator/filter/obfuscated_urls.rb +45 -0
  37. data/lib/gluttonberg/content/despamilator/filter/prices.rb +23 -0
  38. data/lib/gluttonberg/content/despamilator/filter/script_tag.rb +25 -0
  39. data/lib/gluttonberg/content/despamilator/filter/shouting.rb +38 -0
  40. data/lib/gluttonberg/content/despamilator/filter/spammy_tlds.rb +26 -0
  41. data/lib/gluttonberg/content/despamilator/filter/square_brackets.rb +27 -0
  42. data/lib/gluttonberg/content/despamilator/filter/trailing_number.rb +25 -0
  43. data/lib/gluttonberg/content/despamilator/filter/unusual_characters.rb +51 -0
  44. data/lib/gluttonberg/content/despamilator/filter/urls.rb +45 -0
  45. data/lib/gluttonberg/content/despamilator/filter/very_long_domain_name.rb +31 -0
  46. data/lib/gluttonberg/content/despamilator/filter/weird_punctuation.rb +48 -0
  47. data/lib/gluttonberg/content/despamilator/filter.rb +57 -0
  48. data/lib/gluttonberg/content/despamilator/subject/text.rb +36 -0
  49. data/lib/gluttonberg/content/despamilator/subject.rb +34 -0
  50. data/lib/gluttonberg/content/despamilator/version.rb +7 -0
  51. data/lib/gluttonberg/content/despamilator.rb +79 -0
  52. data/lib/gluttonberg/content.rb +12 -11
  53. data/lib/gluttonberg/library/attachment_mixin.rb +52 -269
  54. data/lib/gluttonberg/library/config/image_sizes.rb +61 -0
  55. data/lib/gluttonberg/library/config.rb +10 -0
  56. data/lib/gluttonberg/library/processor/audio.rb +42 -0
  57. data/lib/gluttonberg/library/processor/image.rb +134 -0
  58. data/lib/gluttonberg/library/processor.rb +11 -0
  59. data/lib/gluttonberg/library/storage/filesystem.rb +76 -0
  60. data/lib/gluttonberg/library/storage/s3.rb +196 -0
  61. data/lib/gluttonberg/library/storage.rb +11 -0
  62. data/lib/gluttonberg/library.rb +87 -86
  63. data/lib/gluttonberg/record_history.rb +14 -15
  64. data/lib/gluttonberg/tasks/asset.rake +25 -3
  65. data/lib/gluttonberg/version.rb +1 -1
  66. metadata +53 -2
@@ -296,6 +296,20 @@ var AssetBrowser = {
296
296
  e.preventDefault();
297
297
  });
298
298
 
299
+ // same height for all elements within same row
300
+ $.each(AssetBrowser.browser.find(".tab-pane") , function(index , element){
301
+ AssetBrowser.sameHeightForAllElementsOfSameRow($(element));
302
+ });
303
+
304
+ try{
305
+ $().collapse({parent: "#accordion_for_collections"});
306
+ }catch(e){
307
+ console.log(e);
308
+ }
309
+
310
+
311
+
312
+
299
313
  $("#assetsDialog").css({
300
314
  height: ($(window).height()*0.9) + "px",
301
315
  width: ($(window).width()*0.7) + "px",
@@ -322,6 +336,26 @@ var AssetBrowser = {
322
336
 
323
337
  })
324
338
  },
339
+ sameHeightForAllElementsOfSameRow: function(parent_element){
340
+
341
+ var all_spans = parent_element.find(".thumbnails .span3");
342
+ var row_num = 1;
343
+ var ASSET_MAX_COLUMNS = 5;
344
+ var row_max_height = 0;
345
+ $.each(all_spans , function(index , element){
346
+ if($(element).height() > row_max_height){
347
+ row_max_height = $(element).height();
348
+ }
349
+ $(element).attr('data-row' , row_num);
350
+ if( (index+1) % ASSET_MAX_COLUMNS == 0 ){
351
+ if(row_max_height > 0){
352
+ parent_element.find("[data-row="+row_num+"]").height(row_max_height);
353
+ }
354
+ row_num++;
355
+ row_max_height = 0;
356
+ }
357
+ });
358
+ },
325
359
  resizeDisplay: function() {
326
360
  // var newHeight = AssetBrowser.browser.innerHeight() - AssetBrowser.offsetHeight;
327
361
  // AssetBrowser.display.height(newHeight);
@@ -491,6 +491,15 @@ legend.collapsed
491
491
  -moz-border-radius: 3px 0 0 3px
492
492
  border-radius: 3px 0 0 3px
493
493
 
494
+ span.gap
495
+ float: left
496
+ padding: 0 30px
497
+ line-height: 34px
498
+ text-decoration: none
499
+ border: 1px solid #ddd
500
+ border-left-width: 0
501
+ font-weight: bold
502
+
494
503
 
495
504
  table
496
505
  thead
@@ -570,4 +579,11 @@ table
570
579
  :float left
571
580
 
572
581
  form .span5 input.span2, form .span5 textarea.span2, form .span5 .uneditable-input.span2
573
- width: 130px
582
+ width: 130px
583
+
584
+ .editable
585
+ :display block
586
+ :padding-left 20px
587
+ :background url('/assets/gb_icon_blog.png') no-repeat
588
+ &:hover
589
+ :cursor pointer
@@ -75,7 +75,6 @@ module Gluttonberg
75
75
  end
76
76
  end # category#all
77
77
  page = params[:page].blank? ? 1 : params[:page].to_i
78
- puts "----#{Gluttonberg::Setting.get_setting("number_of_per_page_items")} #{page}"
79
78
  @assets = @assets.paginate( :per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items") , :page => page ).order(get_order)
80
79
  end
81
80
 
@@ -84,7 +83,10 @@ module Gluttonberg
84
83
  end
85
84
 
86
85
  def destroy_assets_in_bulk
87
- @assets = Asset.delete_all(:id => params[:asset_ids].split(","))
86
+ @assets = Asset.where(:id => params[:asset_ids].split(",")).all
87
+ @assets.each do |asset|
88
+ asset.destroy
89
+ end
88
90
  redirect_to "/admin/browse/all/page/1"
89
91
  end
90
92
 
@@ -2,32 +2,32 @@
2
2
 
3
3
  module Gluttonberg
4
4
  module Admin
5
- module Content
5
+ module Content
6
6
  class ArticlesController < Gluttonberg::Admin::BaseController
7
-
7
+
8
8
  before_filter :find_blog , :except => [:create]
9
9
  before_filter :find_article, :only => [:show, :edit, :update, :delete, :destroy , :duplicate]
10
- before_filter :authorize_user , :except => [:destroy , :delete]
11
- before_filter :authorize_user_for_destroy , :only => [:destroy , :delete]
10
+ before_filter :authorize_user , :except => [:destroy , :delete]
11
+ before_filter :authorize_user_for_destroy , :only => [:destroy , :delete]
12
12
  record_history :@article , :title
13
-
13
+
14
14
  def index
15
15
  conditions = {:blog_id => @blog.id}
16
16
  conditions[:user_id] = current_user.id unless current_user.super_admin?
17
- @articles = Article.where( conditions).paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page])
17
+ @articles = Article.where( conditions).order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page])
18
18
  end
19
-
20
-
19
+
20
+
21
21
  def show
22
22
  @comment = Comment.new
23
23
  end
24
-
24
+
25
25
  def new
26
26
  @article = Article.new
27
27
  @article_localization = ArticleLocalization.new(:article => @article , :locale_id => Locale.first_default.id)
28
28
  @authors = User.all
29
29
  end
30
-
30
+
31
31
  def create
32
32
  params[:gluttonberg_article_localization][:article][:name] = params[:gluttonberg_article_localization][:title]
33
33
  article_attributes = params["gluttonberg_article_localization"].delete(:article)
@@ -42,7 +42,7 @@ module Gluttonberg
42
42
  render :edit
43
43
  end
44
44
  end
45
-
45
+
46
46
  def edit
47
47
  @authors = User.all
48
48
  unless params[:version].blank?
@@ -50,7 +50,7 @@ module Gluttonberg
50
50
  @article.revert_to(@version)
51
51
  end
52
52
  end
53
-
53
+
54
54
  def update
55
55
  article_attributes = params["gluttonberg_article_localization"].delete(:article)
56
56
  if @article_localization.update_attributes(params[:gluttonberg_article_localization])
@@ -59,7 +59,7 @@ module Gluttonberg
59
59
  article.assign_attributes(article_attributes)
60
60
  article.previous_slug = article.current_slug if article.slug_changed?
61
61
  article.save
62
-
62
+
63
63
  localization_detail = ""
64
64
  if Gluttonberg.localized?
65
65
  localization_detail = " (#{@article_localization.locale.slug}) "
@@ -69,22 +69,22 @@ module Gluttonberg
69
69
  end
70
70
 
71
71
  flash[:notice] = "The article was successfully updated."
72
- redirect_to admin_blog_articles_path(@blog)
72
+ redirect_to edit_admin_blog_article_path(@article.blog, @article)
73
73
  else
74
74
  flash[:error] = "Sorry, The article could not be updated."
75
75
  render :edit
76
76
  end
77
77
  end
78
-
78
+
79
79
  def delete
80
80
  display_delete_confirmation(
81
81
  :title => "Delete Article '#{@article.title}'?",
82
82
  :url => admin_blog_article_path(@blog, @article),
83
- :return_url => admin_blog_articles_path(@blog),
83
+ :return_url => admin_blog_articles_path(@blog),
84
84
  :warning => ""
85
85
  )
86
86
  end
87
-
87
+
88
88
  def destroy
89
89
  title = @article.current_localization.title
90
90
  if @article.destroy
@@ -107,13 +107,13 @@ module Gluttonberg
107
107
  redirect_to admin_blog_articles_path(@blog)
108
108
  end
109
109
  end
110
-
110
+
111
111
  protected
112
-
112
+
113
113
  def find_blog
114
114
  @blog = Blog.find(params[:blog_id])
115
115
  end
116
-
116
+
117
117
  def find_article
118
118
  if params[:localization_id].blank?
119
119
  conditions = { :article_id => params[:id] , :locale_id => Locale.first_default.id}
@@ -124,7 +124,7 @@ module Gluttonberg
124
124
  end
125
125
  @article = Article.find(:first , :conditions => {:id => params[:id]})
126
126
  end
127
-
127
+
128
128
  def authorize_user
129
129
  authorize! :manage, Gluttonberg::Article
130
130
  end
@@ -132,7 +132,7 @@ module Gluttonberg
132
132
  def authorize_user_for_destroy
133
133
  authorize! :destroy, Gluttonberg::Article
134
134
  end
135
-
135
+
136
136
  end
137
137
  end
138
138
  end
@@ -2,68 +2,125 @@
2
2
 
3
3
  module Gluttonberg
4
4
  module Admin
5
- module Content
5
+ module Content
6
6
  class CommentsController < Gluttonberg::Admin::BaseController
7
7
  include ActionView::Helpers::TextHelper
8
-
9
- before_filter :find_blog
10
- before_filter :find_article , :except => [:index]
8
+
9
+ before_filter :find_blog , :except => [:all , :approved, :rejected , :pending , :spam , :moderation , :delete , :destroy , :spam_detection_for_all_pending , :block_comment_author]
10
+ before_filter :find_article , :except => [:index, :all , :approved , :rejected , :pending , :spam , :moderation , :delete , :destroy , :spam_detection_for_all_pending , :block_comment_author]
11
11
  before_filter :authorize_user , :except => [:moderation]
12
-
13
-
12
+
13
+
14
14
  def index
15
15
  find_article([:comments])
16
- @comments = @article.comments.paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page])
16
+ @comments = @article.comments.order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page] , :order => "created_at DESC")
17
17
  end
18
-
18
+
19
19
  def delete
20
- @comment = Comment.find(params[:id], :conditions => {:commentable_type => "Gluttonberg::Article", :commentable_id => @article.id})
20
+ @comment = Comment.find(params[:id])
21
21
  display_delete_confirmation(
22
22
  :title => "Delete Comment ?",
23
- :url => admin_blog_article_comment_path(@blog, @article, @comment),
24
- :return_url => admin_blog_article_comments_path(@blog, @article),
23
+ :url => admin_comment_destroy_path(@comment),
24
+ :return_url => :back,
25
25
  :warning => ""
26
26
  )
27
27
  end
28
-
29
- def moderation
28
+
29
+ def moderation
30
30
  authorize_user_for_moderation
31
- @comment = Comment.find(params[:id], :conditions => {:commentable_type => "Gluttonberg::Article", :commentable_id => @article.id})
31
+ @comment = Comment.find(params[:id])
32
32
  @comment.moderate(params[:moderation])
33
33
  Gluttonberg::Feed.log(current_user,@comment, truncate(@comment.body, :length => 100) , params[:moderation])
34
- redirect_to admin_blog_article_comments_path(@blog, @article)
34
+ redirect_to :back
35
35
  end
36
-
36
+
37
37
  def destroy
38
38
  @comment = Comment.find(params[:id])
39
39
  if @comment.delete
40
40
  flash[:notice] = "The comment was successfully deleted."
41
41
  Gluttonberg::Feed.log(current_user,@comment, truncate(@comment.body, :length => 100) , "deleted")
42
- redirect_to admin_blog_article_comments_path(@blog, @article)
42
+ redirect_to admin_pending_comments_path()
43
43
  else
44
44
  flash[:error] = "There was an error deleting the comment."
45
- redirect_to admin_blog_article_comments_path(@blog, @article)
45
+ redirect_to admin_pending_comments_path()
46
+ end
47
+ end
48
+
49
+
50
+ def pending
51
+ @comments = Comment.all_pending.order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page] , :order => "created_at DESC")
52
+ render :template => "/gluttonberg/admin/content/comments/index"
53
+ end
54
+
55
+ def approved
56
+ @comments = Comment.all_approved.order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page] , :order => "created_at DESC")
57
+ render :template => "/gluttonberg/admin/content/comments/index"
58
+ end
59
+
60
+ def rejected
61
+ @comments = Comment.all_rejected.order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page] , :order => "created_at DESC")
62
+ render :template => "/gluttonberg/admin/content/comments/index"
63
+ end
64
+
65
+ def spam
66
+ @comments = Comment.all_spam.order("created_at DESC").paginate(:per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items"), :page => params[:page] , :order => "created_at DESC")
67
+ render :template => "/gluttonberg/admin/content/comments/index"
68
+ end
69
+
70
+ def spam_detection_for_all_pending
71
+ Comment.spam_detection_for_all
72
+ redirect_to admin_pending_comments_path
73
+ end
74
+
75
+ def block_comment_author
76
+ @comment = Comment.find(params[:id])
77
+
78
+ author_string = ""
79
+ unless @comment.author_name.blank? || @comment.author_name == "NULL" || @comment.author_name.length < 3
80
+ author_string += @comment.author_name
81
+ end
82
+ unless @comment.author_email.blank? || @comment.author_email == "NULL" || @comment.author_email.length < 3
83
+ author_string += ", " unless author_string.blank?
84
+ author_string += @comment.author_email
85
+ end
86
+ unless @comment.author_website.blank? || @comment.author_website == "NULL" || @comment.author_website.length < 3
87
+ author_string += ", " unless author_string.blank?
88
+ author_string += @comment.author_website
46
89
  end
90
+ unless author_string.blank?
91
+ author_string
92
+ gb_blacklist_settings = Gluttonberg::Setting.get_setting("comment_blacklist")
93
+ if gb_blacklist_settings.blank?
94
+ gb_blacklist_settings = author_string
95
+ else
96
+ gb_blacklist_settings = gb_blacklist_settings + ", " + author_string
97
+ end
98
+ Gluttonberg::Setting.update_settings("comment_blacklist" => gb_blacklist_settings)
99
+ Comment.spam_detection_for_all
100
+ end
101
+ redirect_to admin_pending_comments_path
47
102
  end
48
-
103
+
104
+
105
+
49
106
  protected
50
-
107
+
51
108
  def find_blog
52
109
  @blog = Blog.find(params[:blog_id])
53
110
  raise ActiveRecord::RecordNotFound unless @blog
54
111
  end
55
-
112
+
56
113
  def find_article(include_model=[])
57
114
  conditions = { :id => params[:article_id] }
58
115
  conditions[:user_id] = current_user.id unless current_user.super_admin?
59
116
  @article = Article.find(:first , :conditions => conditions , :include => include_model )
60
117
  raise ActiveRecord::RecordNotFound unless @article
61
118
  end
62
-
119
+
63
120
  def authorize_user
64
121
  authorize! :manage, Gluttonberg::Comment
65
122
  end
66
-
123
+
67
124
  def authorize_user_for_moderation
68
125
  authorize! :moderate, Gluttonberg::Comment
69
126
  end
@@ -16,7 +16,7 @@ module Gluttonberg
16
16
  end
17
17
 
18
18
  if Comment.table_exists?
19
- @comments = Comment.find(:all , :conditions => {:commentable_type => "Gluttonberg::Article" , :moderation_required => true } , :order => "created_at DESC" , :limit => 3)
19
+ @comments = Comment.all_pending.where({:commentable_type => "Gluttonberg::Article" , :moderation_required => true }).order("created_at DESC").limit(5)
20
20
  @article = Article.new
21
21
  @article_localization = ArticleLocalization.new(:article => @article , :locale_id => Locale.first_default.id)
22
22
  @blogs = Gluttonberg::Blog.all
@@ -1,11 +1,12 @@
1
1
  module Gluttonberg
2
2
  module Public
3
3
  class CommentsController < Gluttonberg::Public::BaseController
4
-
4
+
5
5
  def create
6
6
  @blog = Gluttonberg::Blog.first(:conditions => {:slug => params[:blog_id]})
7
7
  @article = Gluttonberg::Article.first(:conditions => {:slug => params[:article_id], :blog_id => @blog.id})
8
- @comment = @article.comments.new(params[:comment].merge(:blog_slug => params[:blog_id]))
8
+ @comment = @article.comments.new(params[:comment])
9
+ @comment.blog_slug = params[:blog_id]
9
10
  @comment.author_id = current_member.id if current_member
10
11
  if @comment.save
11
12
  if Setting.get_setting("comment_notification") == "Yes" || @blog.moderation_required == true
@@ -13,16 +14,16 @@ module Gluttonberg
13
14
  Notifier.comment_notification_for_admin(user , @article , @comment).deliver
14
15
  end
15
16
  end
16
-
17
+
17
18
  @subscription = CommentSubscription.find(:first , :conditions => {:article_id => @article.id , :author_email => @comment.writer_email })
18
19
  if @comment.subscribe_to_comments == "1" && @subscription.blank?
19
20
  @subscription = CommentSubscription.create( {:article_id => @article.id , :author_email => @comment.writer_email , :author_name => @comment.writer_name } )
20
21
  elsif (@comment.subscribe_to_comments.blank? || @comment.subscribe_to_comments == "0") && !@subscription.blank?
21
22
  #unsubscribe
22
- @subscription.destroy
23
+ @subscription.destroy
23
24
  end
24
25
  else
25
-
26
+
26
27
  end
27
28
  if Gluttonberg.localized?
28
29
  redirect_to blog_article_path(current_localization_slug , @blog.slug, @article.slug)
@@ -30,8 +31,8 @@ module Gluttonberg
30
31
  redirect_to blog_article_path(:blog_id => @blog.slug, :id => @article.slug)
31
32
  end
32
33
  end
33
-
34
- private
34
+
35
+ private
35
36
  def current_localization_slug
36
37
  if @locale
37
38
  @locale.slug
@@ -40,6 +41,6 @@ module Gluttonberg
40
41
  end
41
42
  end
42
43
  end
43
-
44
+
44
45
  end
45
46
  end
@@ -136,7 +136,7 @@ module Gluttonberg
136
136
  def nav_link(*args)
137
137
  class_names = "button"
138
138
  class_names = "#{class_names} #{args[2][:class]}" if args.length >= 3
139
- content_tag(:li, link_to(args[0] , args[1] , :title => args[0]), :class => class_names)
139
+ content_tag(:li, active_link_to(args[0] , args[1] , :title => args[0]), :class => class_names)
140
140
  end
141
141
 
142
142
  # Writes out the back control for the sub nav.
@@ -279,7 +279,7 @@ module Gluttonberg
279
279
 
280
280
 
281
281
  def honeypot_field_tag
282
- html = label_tag(Rails.configuration.honeypot_field_name , 'Please leave this field empty:' )
282
+ html = label_tag(Rails.configuration.honeypot_field_name , Rails.configuration.honeypot_field_name.humanize )
283
283
  html << text_field_tag( Rails.configuration.honeypot_field_name )
284
284
  content_tag :div , html , :class => Rails.configuration.honeypot_field_name , :style => "display:none"
285
285
  end
@@ -350,7 +350,7 @@ module Gluttonberg
350
350
  height : '20px',
351
351
  cancel : 'Cancel',
352
352
  submit : 'OK',
353
- indicator : '#{image_tag('/assets/spinner.gif')}'
353
+ indicator : '#{image_tag('/assets/gb_spinner.gif')}'
354
354
  };
355
355
  $.extend(args, #{args.to_json});
356
356
  $(".editable[data-id='#{object.id}'][data-name='#{name}']").editable("#{update_url}", args);
@@ -1,20 +1,23 @@
1
1
  module Gluttonberg
2
2
  module AssetLibrary
3
3
 
4
- # nice and clean public url of assets
5
- def asset_url(asset , opts = {})
6
- url = ""
7
- if Rails.env=="development"
4
+ # nice and clean public url of assets
5
+ def asset_url(asset , opts = {})
6
+ url = ""
7
+ if Rails.configuration.asset_storage == :s3
8
+ url = asset.url
9
+ else
10
+ if Rails.env=="development"
8
11
  url = "http://#{request.host}:#{request.port}/user_asset/#{asset.asset_hash[0..3]}/#{asset.id}"
9
- else
12
+ else
10
13
  url = "http://#{request.host}/user_asset/#{asset.asset_hash[0..3]}/#{asset.id}"
11
- end
14
+ end
12
15
 
13
- if opts[:thumb_name]
16
+ if opts[:thumb_name]
14
17
  url << "/#{opts[:thumb_name]}"
15
- end
16
-
17
- url
18
+ end
19
+ end
20
+ url
18
21
  end
19
22
 
20
23
 
@@ -134,7 +137,7 @@ module Gluttonberg
134
137
  end
135
138
 
136
139
  def asset_panel(assets, name_or_id , type )
137
- render :partial => "gluttonberg/admin/shared/asset_panel.html" , :locals => {:assets => assets , :name_or_id => name_or_id , :type => type}
140
+ render :partial => "/gluttonberg/admin/shared/asset_panel" , :locals => {:assets => assets , :name_or_id => name_or_id , :type => type} , :formats => [:html]
138
141
  end
139
142
 
140
143
 
@@ -4,7 +4,7 @@ module Gluttonberg
4
4
  has_many :set_elements, :as => :element
5
5
  has_many :asset_thumbnails
6
6
 
7
- after_save :update_file
7
+ #after_save :update_file
8
8
  before_validation :set_category_and_type
9
9
 
10
10
  acts_as_taggable_on :locations , :characters , :themes, :photographers
@@ -27,6 +27,8 @@ module Gluttonberg
27
27
  attr_accessible :description, :synopsis, :copyrights, :year_of_production, :duration
28
28
  attr_accessible :artist_name, :link, :width, :height, :alt , :processed, :copied_to_s3
29
29
 
30
+ attr_accessor :type
31
+
30
32
  # constants for formatted file size
31
33
  GIGA_SIZE = 1073741824.0
32
34
  MEGA_SIZE = 1048576.0
@@ -78,9 +80,9 @@ module Gluttonberg
78
80
  self.asset_type = AssetType.for_file(mime_type, file_name)
79
81
  cat = self.category.to_s.downcase
80
82
  if cat == "image"
81
- self[:type] = "Photo"
83
+ self.type = "Photo"
82
84
  elsif cat == "video"
83
- self[:type] = "Video"
85
+ self.type = "Video"
84
86
  end
85
87
  end
86
88
 
@@ -165,9 +167,9 @@ module Gluttonberg
165
167
  private
166
168
 
167
169
  # make a new asset folder if not exist. then make backup of asset. generate thumbnails
168
- def update_file
169
- update_file_on_disk
170
- end
170
+ # def update_file
171
+ # update_file_on_disk
172
+ # end
171
173
 
172
174
 
173
175
  end
@@ -9,11 +9,15 @@ module Gluttonberg
9
9
  belongs_to :author, :class_name => "Gluttonberg::Member"
10
10
 
11
11
  before_save :init_moderation
12
+ before_validation :spam_detection
12
13
  after_save :send_notifications_if_needed
13
14
 
14
- scope :all_approved, :conditions => { :approved => true }
15
- scope :all_pending, :conditions => { :moderation_required => true }
16
- scope :all_rejected, :conditions => { :approved => false , :moderation_required => false }
15
+ validates_presence_of :body
16
+
17
+ scope :all_approved, :conditions => ["approved = ? AND ( spam = ? OR spam IS NULL)",true , false]
18
+ scope :all_pending, :conditions => ["moderation_required = ? AND ( spam = ? OR spam IS NULL)",true , false]
19
+ scope :all_rejected, :conditions => ["moderation_required = ? AND approved = ? AND ( spam = ? OR spam IS NULL)",false , false , false]
20
+ scope :all_spam, :conditions => { :spam => true }
17
21
 
18
22
  attr_accessor :subscribe_to_comments , :blog_slug
19
23
  attr_accessible :body , :author_name , :author_email , :author_website , :commentable_id , :commentable_type , :author_id
@@ -26,6 +30,7 @@ module Gluttonberg
26
30
  if params == "approve"
27
31
  self.moderation_required = false
28
32
  self.approved = true
33
+ self.spam = false
29
34
  self.save
30
35
  elsif params == "disapprove"
31
36
  self.moderation_required = false
@@ -36,6 +41,27 @@ module Gluttonberg
36
41
  end
37
42
  end
38
43
 
44
+ def self.all_comments_count
45
+ self.count
46
+ end
47
+
48
+ def self.approved_comments_count
49
+ self.all_approved.count
50
+ end
51
+
52
+ def self.rejected_comments_count
53
+ self.all_rejected.count
54
+ end
55
+
56
+ def self.pending_comments_count
57
+ self.all_pending.count
58
+ end
59
+
60
+ def self.spam_comments_count
61
+ self.all_spam.count
62
+ end
63
+
64
+
39
65
  def user_id
40
66
  self.author_id
41
67
  end
@@ -66,6 +92,13 @@ module Gluttonberg
66
92
  write_attribute(:approved, val)
67
93
  end
68
94
 
95
+ def self.spam_detection_for_all
96
+ self.all_pending.each do |c|
97
+ c.send("spam_detection")
98
+ c.save(:validate => false)
99
+ end
100
+ end
101
+
69
102
  protected
70
103
  def init_moderation
71
104
  if self.commentable.respond_to?(:moderation_required)
@@ -84,5 +117,26 @@ module Gluttonberg
84
117
  end
85
118
  end
86
119
 
120
+ def spam_detection
121
+ unless self.body.blank?
122
+ dspam = Gluttonberg::Content::Despamilator.new(self.body)
123
+ self.spam = (dspam.score >= 1.0)
124
+ self.spam_score = dspam.score
125
+ unless self.spam
126
+ naughty_word_parser = Gluttonberg::Content::DespamilatorFilter::NaughtyWords.new
127
+ if !self.author_email.blank? && naughty_word_parser.local_parse(self.author_email) >= 1.0
128
+ self.spam = true
129
+ elsif !self.author_name.blank? && naughty_word_parser.local_parse(self.author_name) >= 1.0
130
+ self.spam = true
131
+ elsif !self.author_website.blank? && naughty_word_parser.local_parse(self.author_website) >= 1.0
132
+ self.spam = true
133
+ end
134
+ end
135
+ else
136
+ self.spam = true
137
+ self.spam_score = 1.0
138
+ end
139
+ end
140
+
87
141
  end
88
142
  end
@@ -5,6 +5,8 @@ module Gluttonberg
5
5
  before_save :generate_reference_hash
6
6
  belongs_to :article
7
7
 
8
+ attr_accessible :article_id , :author_email , :author_name
9
+
8
10
  def self.notify_subscribers_of(article , comment)
9
11
  subscribers = self.find(:all , :conditions => {:article_id => article.id})
10
12
  subscribers.each do |subscriber|