mirror of
https://github.com/ENSL/ensl.org.git
synced 2024-12-27 04:51:14 +00:00
133 lines
3.9 KiB
Ruby
133 lines
3.9 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: contesters
|
|
#
|
|
# id :integer not null, primary key
|
|
# active :boolean default(TRUE), not null
|
|
# draw :integer default(0), not null
|
|
# extra :integer not null
|
|
# loss :integer default(0), not null
|
|
# score :integer default(0), not null
|
|
# trend :integer not null
|
|
# win :integer default(0), not null
|
|
# created_at :datetime
|
|
# updated_at :datetime
|
|
# contest_id :integer
|
|
# team_id :integer
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_contesters_on_contest_id (contest_id)
|
|
# index_contesters_on_team_id (team_id)
|
|
#
|
|
|
|
class Contester < ActiveRecord::Base
|
|
include Extra
|
|
|
|
TREND_FLAT = 0
|
|
TREND_UP = 1
|
|
TREND_DOWN = 2
|
|
|
|
#attr_protected :id, :updated_at, :created_at, :trend
|
|
attr_accessor :user
|
|
|
|
belongs_to :team, :optional => true
|
|
belongs_to :contest, :optional => true
|
|
|
|
scope :active, -> { includes(:team).where(active: true) }
|
|
# ranked is used for ladder. lower score the higher the rank
|
|
scope :ranked, -> { order("score ASC, win DESC, loss ASC").select("contesters.*") }
|
|
scope :ordered, -> { select("contesters.*, (score + extra) AS total_score").order("total_score DESC, score DESC, win DESC, loss ASC") }
|
|
scope :chronological, -> { order("created_at DESC") }
|
|
scope :of_contest, -> (contest) { where("contesters.contest_id", contest.id) }
|
|
|
|
has_many :challenges_sent, :class_name => "Challenge", :foreign_key => "contester1_id"
|
|
has_many :challenges_received, :class_name => "Challenge", :foreign_key => "contester2_id"
|
|
has_many :matches, -> { where("(contester1_id = contesters.id OR contester2_id = contesters.id)") }, :through => :contest
|
|
|
|
validates_presence_of :team, :contest
|
|
validates_inclusion_of [:score, :win, :loss, :draw, :extra], :in => 0..9999, :allow_nil => true
|
|
validates_uniqueness_of :team_id, :scope => :contest_id, :message => "You can't join same contest twice."
|
|
|
|
#validate_on_create:validate_member_participation
|
|
validate :validate_contest, :on => :create
|
|
#validate_on_create:validate_playernumber
|
|
|
|
before_create :init_variables
|
|
|
|
|
|
def to_s
|
|
team.to_s
|
|
end
|
|
|
|
def total
|
|
score + extra.to_i
|
|
end
|
|
|
|
def statuses
|
|
{false => "Inactive", true => "Active"}
|
|
end
|
|
|
|
def lineup
|
|
contest.status == Contest::STATUS_CLOSED ? team.teamers.distinct : team.teamers.active
|
|
end
|
|
|
|
def get_matches
|
|
contest.matches.where("contester1_id = ? OR contester2_id = ?", id, id)
|
|
end
|
|
|
|
def init_variables
|
|
self.active = true
|
|
self.trend = Contester::TREND_FLAT
|
|
self.extra = 0
|
|
end
|
|
|
|
def validate_member_participation
|
|
# TODO joku erhe
|
|
# for member in team.teamers.present do
|
|
# for team in member.user.active_teams do
|
|
# if team.contesters.active.exists?(:contest_id => contest_id)
|
|
# errors.add_to_base "Member #{member.user} is already participating with team #{team.name}"
|
|
# end
|
|
# end
|
|
# end
|
|
end
|
|
|
|
def validate_contest
|
|
if contest.end.past?
|
|
self.errors.add :base, "Cannot join contest! It is already over!"
|
|
elsif contest.status != Contest::STATUS_OPEN
|
|
self.errors.add :base, "Cannot join contest! Signups are closed!"
|
|
end
|
|
end
|
|
|
|
def validate_playernumber
|
|
if team.teamers.active.unique_by_team.count < 6
|
|
errors.add :team, I18n.t(:contests_join_need6)
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
update_attribute :active, false
|
|
end
|
|
|
|
def can_create? cuser, params = {}
|
|
return false unless cuser
|
|
return false if cuser.banned?(Ban::TYPE_LEAGUE)
|
|
return true if cuser.admin?
|
|
return true if team.is_leader? cuser and Verification.contain params, [:team_id, :contest_id]
|
|
return false
|
|
end
|
|
|
|
def can_update? cuser
|
|
cuser and cuser.admin?
|
|
end
|
|
|
|
def can_destroy? cuser
|
|
cuser and team.is_leader? cuser or cuser.admin?
|
|
end
|
|
|
|
def self.params params, cuser
|
|
params.require(:contester).permit(:team_id, :score, :win, :loss, :draw, :contest_id, :active, :extra, :user)
|
|
end
|
|
end
|