if defined?(ActiveAdmin)
ActiveAdmin.register Lentil::Image do
actions :index, :show
config.batch_actions = true
config.per_page = 10
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('
').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
filter :do_not_request_donation, :as => :select
filter :win_pct
filter :popular_score, :label => "Score"
filter :description
filter :updated_at
filter :donor_agreement_submitted_date
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))
end
end
column :id
column :description
column "User", :user do |i|
names = []
names << i.user.user_name
names << i.user.full_name
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
number_to_percentage(image.win_pct, :precision => 0)
else
"No Battles Fought"
end
end
column "Score", :popular_score
column :suppressed
column :state do |image|
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|
unless image.moderator_id.nil?
image.moderator.email
else
"Image has not been moderated."
end
end
row :created_at
row :updated_at
row :like_votes_count
row :url
row "All Tags" do |image|
unless image.tags.empty?
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
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]
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]
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_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
image_counter += 1
end
if errors.length > 0
redirect_to :back, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} moderated (out of #{total_images})", alert: errors.join('
').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.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.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
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, :include => [:user, :taggings, :tags])
images_params = params[:image]
second_moderation = params[:moderation]['second_moderation']
update_images(images, images_params, second_moderation)
end
collection_action :flagging_history do
@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
collection_action :do_manual_input, :method => :post do
urls = params[:manual_input][:urls].lines.to_a.map(&:chomp).reject {|url| url.length < 1}
total_urls = urls.size
image_counter = 0
errors = []
urls.each do |raw_url|
url = URI.parse(raw_url) rescue next
unless url.kind_of?(URI::HTTP) || url.kind_of?(URI::HTTPS)
errors << "#{raw_url}: Unable to validate URL"
next
end
harvester = Lentil::InstagramHarvester.new
begin
image = harvester.save_image_from_url(url.to_s)
rescue Exception => e
errors << "#{raw_url}: #{e.message}"
next
end
image_counter += image.length
if image.length < 1
errors << "#{raw_url}: Unknown error (possible duplicate)"
end
end
redirect_to :back, notice: "#{image_counter} #{'URL'.pluralize(image_counter)} added (out of #{total_urls})", alert: errors.join('
').html_safe
end
end
end