149 lines
4.3 KiB
Ruby
149 lines
4.3 KiB
Ruby
|
|
class ChallengeClaimsController < ApplicationController
|
||
|
|
|
||
|
|
before_action :users_only
|
||
|
|
before_action :load_collection, except: [:index]
|
||
|
|
before_action :collection_owners_only, except: [:index, :show, :create, :destroy]
|
||
|
|
before_action :load_claim_from_id, only: [:show, :destroy]
|
||
|
|
|
||
|
|
before_action :load_challenge, except: [:index]
|
||
|
|
|
||
|
|
before_action :allowed_to_destroy, only: [:destroy]
|
||
|
|
|
||
|
|
|
||
|
|
# PERMISSIONS AND STATUS CHECKING
|
||
|
|
|
||
|
|
def load_challenge
|
||
|
|
if @collection
|
||
|
|
@challenge = @collection.challenge
|
||
|
|
elsif @challenge_claim
|
||
|
|
@challenge = @challenge_claim.collection.challenge
|
||
|
|
end
|
||
|
|
no_challenge and return unless @challenge
|
||
|
|
end
|
||
|
|
|
||
|
|
def no_challenge
|
||
|
|
flash[:error] = ts("What challenge did you want to work with?")
|
||
|
|
redirect_to collection_path(@collection) rescue redirect_to '/'
|
||
|
|
false
|
||
|
|
end
|
||
|
|
|
||
|
|
def load_claim_from_id
|
||
|
|
@challenge_claim = ChallengeClaim.find(params[:id])
|
||
|
|
no_claim and return unless @challenge_claim
|
||
|
|
end
|
||
|
|
|
||
|
|
def no_claim
|
||
|
|
flash[:error] = ts("What claim did you want to work on?")
|
||
|
|
if @collection
|
||
|
|
redirect_to collection_path(@collection) rescue redirect_to '/'
|
||
|
|
else
|
||
|
|
redirect_to user_path(@user) rescue redirect_to '/'
|
||
|
|
end
|
||
|
|
false
|
||
|
|
end
|
||
|
|
|
||
|
|
def load_user
|
||
|
|
@user = User.find_by(login: params[:user_id]) if params[:user_id]
|
||
|
|
no_user and return unless @user
|
||
|
|
end
|
||
|
|
|
||
|
|
def no_user
|
||
|
|
flash[:error] = ts("What user were you trying to work with?")
|
||
|
|
redirect_to "/" and return
|
||
|
|
false
|
||
|
|
end
|
||
|
|
|
||
|
|
def owner_only
|
||
|
|
unless @user == @challenge_claim.claiming_user
|
||
|
|
flash[:error] = ts("You aren't the claimer of that prompt.")
|
||
|
|
redirect_to "/" and return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def allowed_to_destroy
|
||
|
|
@challenge_claim.user_allowed_to_destroy?(current_user) || not_allowed(@collection)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
# ACTIONS
|
||
|
|
|
||
|
|
def index
|
||
|
|
if !(@collection = Collection.find_by(name: params[:collection_id])).nil? && @collection.closed? && !@collection.user_is_maintainer?(current_user)
|
||
|
|
flash[:notice] = ts("This challenge is currently closed to new posts.")
|
||
|
|
end
|
||
|
|
if params[:collection_id]
|
||
|
|
return unless load_collection
|
||
|
|
|
||
|
|
@challenge = @collection.challenge
|
||
|
|
not_allowed(@collection) unless user_scoped? || @challenge.user_allowed_to_see_assignments?(current_user)
|
||
|
|
|
||
|
|
@claims = ChallengeClaim.unposted_in_collection(@collection)
|
||
|
|
@claims = @claims.where(claiming_user_id: current_user.id) if user_scoped?
|
||
|
|
|
||
|
|
# sorting
|
||
|
|
set_sort_order
|
||
|
|
|
||
|
|
if params[:sort] == "claimer"
|
||
|
|
@claims = @claims.order_by_offering_pseud(@sort_direction)
|
||
|
|
else
|
||
|
|
@claims = @claims.order(@sort_order)
|
||
|
|
end
|
||
|
|
elsif params[:user_id] && (@user = User.find_by(login: params[:user_id]))
|
||
|
|
if current_user == @user
|
||
|
|
@claims = @user.request_claims.order_by_date.unposted
|
||
|
|
if params[:posted]
|
||
|
|
@claims = @user.request_claims.order_by_date.posted
|
||
|
|
end
|
||
|
|
if params[:collection_id] && (@collection = Collection.find_by(name: params[:collection_id]))
|
||
|
|
@claims = @claims.in_collection(@collection)
|
||
|
|
end
|
||
|
|
else
|
||
|
|
flash[:error] = ts("You aren't allowed to see that user's claims.")
|
||
|
|
redirect_to '/' and return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
@claims = @claims.paginate page: params[:page], per_page: ArchiveConfig.ITEMS_PER_PAGE
|
||
|
|
end
|
||
|
|
|
||
|
|
def show
|
||
|
|
# this is here just as a failsafe, this path should not be used
|
||
|
|
redirect_to collection_prompt_path(@collection, @challenge_claim.request_prompt)
|
||
|
|
end
|
||
|
|
|
||
|
|
def create
|
||
|
|
# create a new claim
|
||
|
|
prompt = @collection.prompts.find(params[:prompt_id])
|
||
|
|
claim = prompt.request_claims.build(claiming_user: current_user)
|
||
|
|
if claim.save
|
||
|
|
flash[:notice] = "New claim made."
|
||
|
|
else
|
||
|
|
flash[:error] = "We couldn't save the new claim."
|
||
|
|
end
|
||
|
|
redirect_to collection_claims_path(@collection, for_user: true)
|
||
|
|
end
|
||
|
|
|
||
|
|
def destroy
|
||
|
|
redirect_path = collection_claims_path(@collection)
|
||
|
|
flash[:notice] = ts("The claim was deleted.")
|
||
|
|
|
||
|
|
if @challenge_claim.claiming_user == current_user
|
||
|
|
redirect_path = collection_claims_path(@collection, for_user: true)
|
||
|
|
flash[:notice] = ts("Your claim was deleted.")
|
||
|
|
end
|
||
|
|
|
||
|
|
begin
|
||
|
|
@challenge_claim.destroy
|
||
|
|
rescue
|
||
|
|
flash.delete(:notice)
|
||
|
|
flash[:error] = ts("We couldn't delete that right now, sorry! Please try again later.")
|
||
|
|
end
|
||
|
|
redirect_to redirect_path
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def user_scoped?
|
||
|
|
params[:for_user].to_s.casecmp?("true")
|
||
|
|
end
|
||
|
|
end
|