Created
December 5, 2016 19:42
-
-
Save ckk-scratch/229ce9c2f61feb0d210257273da77574 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CampaignsController < ApplicationController | |
authorize_resource except: [:public, :confirm_event, :cancel_talent] | |
load_resource except: [:public, :index] | |
before_filter :prepare_events, only: [:show, :show_events] | |
before_filter :check_campaign_open, only: [:confirm_event, :cancel_talent, :add_talent, :remove_talent, :add_events, :remove_events] | |
def index | |
@campaigns = Campaign.order(created_at: :desc) | |
end | |
def show | |
end | |
def update | |
if @campaign.update_attributes(campaign_params) | |
flash[:notice] = "This has been successfully updated!" | |
if campaign_params[:message].nil? | |
redirect_to edit_mail_message_campaign_path(@campaign) | |
else | |
redirect_to slug_campaign_path(slug: @campaign.slug) | |
end | |
else | |
flash[:notice] = "This could not be updated!" | |
end | |
end | |
def public | |
@campaign = Campaign.find_by_slug!(params[:slug]) | |
@events = Event.none | |
if @campaign.open? | |
@campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:invitation]) | |
if @campaigns_user | |
@events = @campaigns_user.eligible_events.order("start ASC") | |
@eligible = (@campaigns_user.event_id.nil? and @campaigns_user.cancelled? == false) | |
@campaigns_user.update_attribute(:last_viewed_at, Time.now) unless user_signed_in? | |
if flash[:success].blank? | |
if @campaigns_user.event | |
flash.now[:success] = "You are all set to perform at #{@campaigns_user.event.name} on #{@campaigns_user.event.start.strftime("%a. %-m/%-d")}. Please contact #{@campaign.manager_email} if you have any questions." | |
elsif @campaigns_user.cancelled? | |
flash.now[:warning] = "Your invitation has been cancelled. Please contact #{@campaign.manager_email} if you have any questions." | |
end | |
end | |
elsif user_signed_in? and current_user.admin_or_manager? | |
@can_edit = true | |
@events = @campaign.events.includes(:campaigns_user).where( :campaigns_users => {:event_id => nil} ).order("start ASC") | |
@eligible = true | |
end | |
end | |
flash.now[:disable_alert_timeout] = true | |
end | |
def show_events | |
respond_to do |format| | |
format.js | |
format.html {render 'show'} | |
end | |
end | |
def show_talent | |
respond_to do |format| | |
format.js | |
format.html {render 'show'} | |
end | |
end | |
def show_regions | |
respond_to do |format| | |
format.js | |
format.html {render 'show'} | |
end | |
end | |
def edit_mail_message | |
render 'show' | |
end | |
def confirm_event | |
campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:access_hash]) | |
if campaigns_user | |
if campaigns_user.event_id.nil? | |
event = @campaign.events.find(params[:event_id]) | |
if event.campaigns_user | |
flash[:error] = "Sorry that event is no longer available. Please choose another event from the list below." | |
else | |
campaigns_user.confirm!(event) | |
flash[:success] = "Congratulations! You are all set to perform at #{event.name} on #{event.start.strftime("%a. %-m/%-d")}. Your event has been removed from this list. You will receive a confirmation email shortly." | |
end | |
else | |
flash[:warning] = "Warning! You are already confirmed to at #{campaigns_user.event.name} on #{campaigns_user.event.start.strftime("%a. %-m/%-d")}. Please contact #{@campaign.manager.email} if you have any questions." | |
end | |
else | |
flash[:error] = "You are not authorized to access this feature." | |
end | |
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash]) | |
end | |
def cancel_talent | |
campaigns_user = @campaign.campaigns_users.find_by_access_hash(params[:access_hash]) | |
if campaigns_user | |
campaigns_user.cancel! | |
flash[:success] = "Thank you for your feedback! You have been removed from the invitation list." | |
else | |
flash[:error] = "Failed to cancel talent, Something went wrong." | |
end | |
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash]) | |
end | |
def search_talent | |
@status = params[:status].nil? ? "All Talent" : params[:status] | |
@campaign_date = @campaign.event_start | |
campaign_regions = @campaign.regions.order(:state, :name) | |
all_regions = Region.where(type: Region.name).order(:state,:name) | |
@regions = @campaign.regions.order(:state,:name) + (all_regions - campaign_regions) | |
@region_options = [] | |
@regions.each_with_index do |r, i| | |
if i < campaign_regions.count | |
@region_options << [ "* #{r.display_name} *", r.id] | |
else | |
@region_options << [r.display_name, r.id] | |
end | |
end | |
@region_id = params[:region_id] | |
unless @region_id.blank? | |
@region = Region.find(@region_id) | |
@campaigns_region = @campaign.campaigns_regions.find_by_region_id(@region_id) | |
end | |
case @status | |
when "All Talent" | |
relation = @region ? @region.talent : Talent.all | |
campaign_user_ids = @campaign.campaigns_users.pluck(:user_id) | |
relation = relation.where("users.id NOT IN (?)", campaign_user_ids) unless campaign_user_ids.empty? | |
talent_relation = relation.joins(:events_users).where("events_users.status = ?", EventsUser::STATUS_CONFIRMED).uniq | |
when "New" | |
talent_relation = @campaigns_region ? @campaigns_region.new_talent : @campaign.new_talent | |
when "Invited" | |
talent_relation = @campaigns_region ? @campaigns_region.invited_talent : @campaign.invited_talent | |
when "Confirmed" | |
talent_relation = @campaigns_region ? @campaigns_region.confirmed_talent : @campaign.confirmed_talent | |
when "Cancelled" | |
talent_relation = @campaigns_region ? @campaigns_region.cancelled_talent : @campaign.cancelled_talent | |
when "Campaign" | |
talent_relation = @campaigns_region ? @campaigns_region.talent : @campaign.talent | |
end | |
@q = talent_relation.search(params[:q]) | |
page = params[:page].nil? ? 1 : params[:page].to_i | |
@talent_records = @q.result.paginate(page: page) | |
respond_to do |format| | |
format.js | |
format.html {render 'show'} | |
end | |
end | |
def add_talent | |
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i} | |
count_was = @campaign.campaigns_users.count | |
talent_ids.each do |talent_id| | |
talent = Talent.find(talent_id) | |
@campaign.campaigns_users.where(user_id: talent_id).first_or_create(status: CampaignsUser::STATUS_NEW, email: talent.email) | |
end | |
new_count = @campaign.campaigns_users.count - count_was | |
flash[:success] = "Successfully added #{new_count} #{"talent user".pluralize(new_count)}." | |
page = params[:page].blank? ? 1 : params[:page].to_i | |
redirect_to search_talent_campaign_path(@campaign, region_id: params[:region_id], page: page) | |
end | |
def remove_talent | |
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i} | |
campaigns_users = @campaign.campaigns_users.where("user_id IN (?)", talent_ids) | |
if campaigns_users.any? | |
campaigns_users.each {|campaigns_user| campaigns_user.cancel! } | |
flash[:success] = "Successfully cancelled talent user(s)." | |
else | |
flash[:notice] = "All users filtered." | |
end | |
redirect_to search_talent_campaign_path(@campaign) | |
end | |
def invite_talent | |
if @campaign.open? | |
talent_ids = params[:talent_ids].split(",").map {|t| t.to_i} | |
campaigns_users = @campaign.campaigns_users.where("user_id IN (?)", talent_ids) | |
if campaigns_users.any? | |
campaigns_users.each {|campaigns_user| campaigns_user.invite!} | |
flash[:success] = "Sent invite email to #{campaigns_users.count} #{"DJ".pluralize(campaigns_users.count)} successfully." | |
else | |
flash[:error] = "Please select talent that has been added to the campaign." | |
end | |
else | |
flash[:error] = "This campaign is not currently open." | |
end | |
redirect_to search_talent_campaign_path(@campaign, status: "Invited") | |
end | |
def add_events | |
event_ids = params[:event_ids].split(",").map {|t| t.to_i} | |
count_was = @campaign.events.count | |
Event.where("id IN (?)", event_ids).update_all(campaign_id: @campaign.id) | |
@campaign.update_regions | |
new_count = @campaign.events.count - count_was | |
flash[:success] = "Successfully added #{new_count} #{"event".pluralize(new_count)}." | |
redirect_to show_events_campaign_path(@campaign) | |
end | |
def remove_events | |
event_ids = params[:event_ids].split(",").map {|t| t.to_i} | |
count_was = @campaign.events.count | |
Event.where("id IN (?)", event_ids).update_all(campaign_id: nil) | |
CampaignsUser.where("event_id IN (?)", event_ids).update_all(event_id: nil, status: CampaignsUser::STATUS_INVITED, confirmed_at: nil) | |
new_count = count_was - @campaign.events.count | |
flash[:success] = "Successfully removed #{new_count} #{"event".pluralize(new_count)}." | |
redirect_to show_events_campaign_path(@campaign) | |
end | |
def send_invite | |
campaigns_user = CampaignsUser.find(params[:campaigns_user_id]) | |
campaigns_user.send_invite_email | |
flash[:success] = "Sent Invite email to #{campaigns_user.user.artist_name}." | |
redirect_to search_talent_campaign_path(@campaign, status: "Campaign") | |
end | |
def send_test_invite | |
CampaignMailer.delay.test_invite(current_user.id, @campaign.id) | |
flash[:success] = "Sent test to #{current_user.email}." | |
redirect_to edit_mail_message_campaign_path(@campaign) | |
end | |
private | |
def prepare_events | |
@event_scope = params[:event_scope].nil? ? "campaign" : params[:event_scope] | |
relation = @event_scope == "company" ? @campaign.other_company_events : @campaign.events | |
@events = relation.includes(:campaigns_user).includes(:region).order("campaigns_users.confirmed_at DESC, events.start, locations.name").paginate(page: params[:page], per_page: 100) | |
end | |
def check_campaign_open | |
if @campaign.closed? | |
flash[:warning] = "This campaign is closed and can no longer be changed." | |
redirect_to slug_campaign_path(slug: @campaign.slug, invitation: params[:access_hash]) | |
end | |
end | |
def campaign_params | |
params.require(:campaign).permit(:message, :email_body, :email_subject) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment