lib/lentil/admin/images.rb in lentil-0.5.2 vs lib/lentil/admin/images.rb in lentil-0.6.0
- old
+ new
@@ -1,13 +1,44 @@
if defined?(ActiveAdmin)
ActiveAdmin.register Lentil::Image do
actions :index, :show
- config.batch_actions = false
+ config.batch_actions = true
config.per_page = 10
- filter :state, :as => :select, :collection => proc { Lentil::Image::States }
+ batch_action :destroy, false
+
+ batch_action :approve_all do |ids|
+ images = Lentil::Image.where(id: ids)
+ total_images = images.size
+ image_counter = 0
+ errors = []
+
+ images.each do |image|
+ second_moderation = true
+ unless image.moderator_id.nil?
+ second_moderation = false
+ end
+
+ begin
+ image.update_attributes!(:state => 1, :moderator => current_admin_user, :moderated_at => DateTime.now,
+ :second_moderation => second_moderation)
+ rescue Exception => e
+ errors << "image_id #{image.id}: #{e.message}"
+ next
+ end
+
+ image_counter += 1
+ end
+
+ if errors.length > 0
+ redirect_to collection_path, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} approved (out of #{total_images})", alert: errors.join('<br>').html_safe
+ else
+ redirect_to collection_path, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} approved (out of #{total_images})"
+ end
+ end
+
filter :suppressed
filter :media_type, :as => :select
filter :user_user_name, :as => :string, :label => "Username"
filter :user_full_name, :as => :string, :label => "Full Name"
filter :staff_like, :as => :select
@@ -20,20 +51,44 @@
filter :file_harvested_date
filter :tags_name, :as => :string
filter :url, :label => "Service URL"
filter :id
+ scope :all
+ scope :new, :default => true do |images|
+ images.where(:state => Lentil::Image::States[:pending])
+ end
+ scope :approved do |images|
+ images.where(:state => Lentil::Image::States[:approved])
+ end
+ scope :rejected do |images|
+ images.where(:state => Lentil::Image::States[:rejected])
+ end
+ scope :skipped do |images|
+ images.where(:state => Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL")
+ end
+ # scope :flagged do |images|
+ # # images.where(:state => Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL")
+ # images.includes(:user, :tags, :taggings, :flags).joins(:flags).where(:second_moderation => false).uniq.all
+ # end
+
action_item :only => :show do
link_to('Update Image', update_image_admin_lentil_image_path(lentil_image))
end
action_item { link_to "Moderate New", moderate_admin_lentil_images_path }
action_item { link_to "Moderate Skipped", moderate_skipped_admin_lentil_images_path }
action_item { link_to "Moderate Flagged", moderate_flagged_admin_lentil_images_path }
+ action_item { link_to "Moderate Approved", moderate_approved_admin_lentil_images_path }
+ action_item { link_to "Moderate Rejected", moderate_rejected_admin_lentil_images_path }
action_item { link_to "Flagging History", flagging_history_admin_lentil_images_path }
action_item { link_to "Add Instagram Image", manual_input_admin_lentil_images_path }
index do
+ harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
+ if current_scope.name == 'New'
+ selectable_column
+ end
column "Image" do |image|
unless image.media_type == "video"
link_to(image_tag(image.image_url, :class => "moderation_thumbnail"), admin_lentil_image_path(image))
else
link_to(video_tag(image.video_url, controls: true, size: "250x250"), admin_lentil_image_path(image))
@@ -48,10 +103,13 @@
names.join("\n")
end
column "All Tags" do |image|
image.tags.map{|tag| tag.name}.join(' | ')
end
+ column "Harvesting Tags" do |image|
+ image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ')
+ end
column "Likes", :like_votes_count
column :staff_like
column "Battles", :battles_count, :sortable => false
column :win_pct, :sortable => :win_pct do |image|
if image.win_pct
@@ -66,10 +124,11 @@
image.state_name
end
end
show :title => :id do |image|
+ harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
attributes_table do
row :id
row :description
row :user
row :moderator do |image|
@@ -88,106 +147,159 @@
image.tags.map{|tag| tag.name}.join(' | ')
else
"Image has not been tagged."
end
end
+ row "Harvesting Tags" do |image|
+ unless image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.empty?
+ image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ')
+ else
+ "Image has no harvesting tags."
+ end
+ end
row :staff_like
row :do_not_request_donation
row :donor_agreement_submitted_date
row :file_harvested_date
row :suppressed
row :state do
image.state_name
end
row :image do
- unless image.media_type == "video"
- link_to(image_tag(image.image_url), admin_lentil_image_path(image))
- else
- video_tag(image.video_url, controls: true, size: "640x640")
- end
+ unless image.media_type == "video"
+ link_to(image_tag(image.image_url), admin_lentil_image_path(image))
+ else
+ video_tag(image.video_url, controls: true, size: "640x640")
+ end
end
end
active_admin_comments
end
controller do
+ def scoped_collection
+ super.includes :user, :taggings, :tags
+ end
+
+ # TODO: This method may need optimization
def update_images(images, images_params, second_moderation)
+ total_images = images.size
+ image_counter = 0
+ errors = []
+
images.each do |image|
image_params = images_params[image.id.to_s]
- incoming_tag_ids = image_params['tag_ids'].reject(&:empty?)
- existing_tag_ids = []
- service_tag_ids = []
+ if image_params.key?(:tag_ids)
+ incoming_tag_ids = image_params['tag_ids'].reject(&:empty?)
+ existing_tag_ids = []
+ service_tag_ids = []
- image.taggings.each do |tagging|
- existing_tag_ids << tagging[:tag_id]
- if tagging[:staff_tag] == false
- service_tag_ids << tagging[:tag_id]
+ image.taggings.each do |tagging|
+ existing_tag_ids << tagging[:tag_id]
+ if tagging[:staff_tag] == false
+ service_tag_ids << tagging[:tag_id]
+ end
end
- end
- new_tag_ids = incoming_tag_ids - existing_tag_ids
- tag_ids_to_keep = incoming_tag_ids - new_tag_ids + service_tag_ids
+ new_tag_ids = incoming_tag_ids - existing_tag_ids
+ tag_ids_to_keep = incoming_tag_ids - new_tag_ids + service_tag_ids
- new_taggings = []
- new_tag_ids.each do |id|
- new_taggings << image.taggings.build(:tag_id => id, :staff_tag => true)
+ new_taggings = []
+ new_tag_ids.each do |id|
+ new_taggings << image.taggings.build(:tag_id => id, :staff_tag => true)
+ end
+
+ taggings_to_keep = image.taggings.select{ |tagging| tag_ids_to_keep.include? tagging.tag_id}
+ taggings = new_taggings + taggings_to_keep
+
+ # Save Updated Image with new tags
+ begin
+ image.update_attributes!(:state => image_params['state'], :taggings => taggings, :staff_like => image_params['staff_like'],
+ :moderator => current_admin_user, :moderated_at => DateTime.now, :second_moderation => second_moderation,
+ :do_not_request_donation => image_params['do_not_request_donation'], :suppressed => image_params['suppressed'])
+ rescue Exception => e
+ errors << "image_id #{image.id}: #{e.message}"
+ next
+ end
+ else
+ # Save Updated Image with same tags
+ begin
+ image.update_attributes!(:state => image_params['state'], :staff_like => image_params['staff_like'],
+ :moderator => current_admin_user, :moderated_at => DateTime.now, :second_moderation => second_moderation,
+ :do_not_request_donation => image_params['do_not_request_donation'], :suppressed => image_params['suppressed'])
+ rescue Exception => e
+ errors << "image_id #{image.id}: #{e.message}"
+ next
+ end
end
- taggings_to_keep = image.taggings.where(:tag_id => tag_ids_to_keep)
- taggings = new_taggings + taggings_to_keep
+ image_counter += 1
+ end
- image.update_attributes!(:state => image_params['state'], :taggings => taggings, :staff_like => image_params['staff_like'],
- :moderator => current_admin_user, :moderated_at => DateTime.now, :second_moderation => second_moderation,
- :do_not_request_donation => image_params['do_not_request_donation'], :suppressed => image_params['suppressed'])
+ if errors.length > 0
+ redirect_to :back, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} moderated (out of #{total_images})", alert: errors.join('<br>').html_safe
+ else
+ redirect_to :back, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} moderated (out of #{total_images})"
end
end
end
member_action :update_image do
+ @tags = Lentil::Tag.all
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
id = params['id']
@second_moderation = false
@images = Lentil::Image.where(id: id)
render "admin/lentil_images/moderate"
end
collection_action :moderate do
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
@second_moderation = false
- @images = Lentil::Image.where(state: Lentil::Image::States[:pending], moderator_id: nil).paginate(:page => params[:page], :per_page => 10)
+ @images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:pending], moderator_id: nil).paginate(:page => params[:page], :per_page => 10)
end
+ collection_action :moderate_approved do
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
+ @second_moderation = false
+ @images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:approved]).paginate(:page => params[:page], :per_page => 10)
+ render "/admin/lentil_images/moderate"
+ end
+
+ collection_action :moderate_rejected do
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
+ @second_moderation = false
+ @images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:rejected]).paginate(:page => params[:page], :per_page => 10)
+ render "/admin/lentil_images/moderate"
+ end
+
collection_action :moderate_skipped do
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
@second_moderation = false
- @images = Lentil::Image.where(state: Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL").paginate(:page => params[:page], :per_page => 10)
+ @images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL").paginate(:page => params[:page], :per_page => 10)
render "/admin/lentil_images/moderate"
end
collection_action :moderate_flagged do
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
@second_moderation = true
- @images = Lentil::Image.joins(:flags).group("lentil_images.id").having("count(lentil_flags.id) > 0").where(:second_moderation => false).paginate(:page => params[:page], :per_page => 10)
+ temp_images = Lentil::Image.includes(:user, :tags, :taggings, :flags).joins(:flags).where(:second_moderation => false).uniq.all
+ @images = Kaminari.paginate_array(temp_images).page(params[:page]).per(10)
render "/admin/lentil_images/moderate"
end
collection_action :do_moderation, :method => :post do
- images = Lentil::Image.find(params[:image].keys)
+ images = Lentil::Image.find(params[:image].keys, :include => [:user, :taggings, :tags])
images_params = params[:image]
second_moderation = params[:moderation]['second_moderation']
-
- begin
- update_images(images, images_params, second_moderation)
- rescue => e
- message = "Error moderating images: " + e.to_s
- redirect_to :back, :flash => {:error => message}
- else
- number_of_images = params['image'].size
- plural = 'image'.pluralize(number_of_images)
- message = number_of_images.to_s + " " + plural + " moderated."
- redirect_to :back, notice: message
- end
+ update_images(images, images_params, second_moderation)
end
collection_action :flagging_history do
- @images = Lentil::Image.joins(:flags).group("lentil_images.id").having("count(lentil_flags.id) > 0").paginate(:page => params[:page], :per_page => 10)
+ @harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
+ temp_images = Lentil::Image.includes(:user, :tags, :flags, :moderator).joins(:flags).uniq.all
+ @images = Kaminari.paginate_array(temp_images).page(params[:page]).per(10)
end
collection_action :manual_input do
@tags = Lentil::Tag.all
end