Catalogo sport in YAML, board implicito, engine per volley/basket/timed/racket/timer/generic, regia e app Android allineate. Co-authored-by: Cursor <cursoragent@cursor.com>
97 lines
2.1 KiB
Ruby
97 lines
2.1 KiB
Ruby
class Team < ApplicationRecord
|
|
include Brandable
|
|
|
|
belongs_to :club
|
|
has_many :user_teams, dependent: :destroy
|
|
has_many :users, through: :user_teams
|
|
has_many :matches, dependent: :destroy
|
|
has_many :recordings, dependent: :destroy
|
|
has_many :team_invitations, dependent: :destroy
|
|
has_many :roster_members, class_name: "TeamRosterMember", dependent: :destroy
|
|
|
|
has_one_attached :photo_file
|
|
|
|
validates :name, presence: true
|
|
validates :sport_key, presence: true
|
|
validate :sport_key_known
|
|
validate :photo_file_type, if: -> { photo_file.attached? }
|
|
|
|
before_validation :normalize_sport_key
|
|
|
|
def subscription
|
|
club.subscription
|
|
end
|
|
|
|
def entitlements
|
|
Teams::Entitlements.new(self)
|
|
end
|
|
|
|
# Canale YouTube OAuth è unico per tutta la società (Premium Full).
|
|
def youtube_credential
|
|
club&.youtube_credential
|
|
end
|
|
|
|
def owner
|
|
club&.owner
|
|
end
|
|
|
|
def team_photo_url
|
|
if photo_file.attached?
|
|
Rails.application.routes.url_helpers.rails_blob_path(photo_file, only_path: true)
|
|
end
|
|
end
|
|
|
|
def roster_by_category
|
|
TeamRosterMember::DISPLAY_ORDER.index_with do |cat|
|
|
roster_members.by_category(cat).to_a
|
|
end
|
|
end
|
|
|
|
def sport_label
|
|
Sports::Catalog.find_optional(sport_key)&.dig(:label) || sport_key.to_s.humanize
|
|
end
|
|
|
|
def effective_board_type
|
|
Sports::Catalog.board_for(sport_key)
|
|
end
|
|
|
|
def sport
|
|
sport_key
|
|
end
|
|
|
|
def sport=(value)
|
|
self.sport_key = Sports::Catalog.normalize_key(value)
|
|
end
|
|
|
|
private
|
|
|
|
def normalize_sport_key
|
|
self.sport_key = Sports::Catalog.normalize_key(sport_key) if sport_key.present?
|
|
end
|
|
|
|
def sport_key_known
|
|
return if sport_key.blank?
|
|
return if Sports::Catalog.find_optional(sport_key)
|
|
|
|
errors.add(:sport_key, "non valido")
|
|
end
|
|
|
|
def photo_file_type
|
|
return if photo_file.content_type.in?(%w[image/png image/jpeg image/webp])
|
|
|
|
errors.add(:photo_file, "deve essere PNG, JPEG o WebP")
|
|
end
|
|
|
|
def branding_parent
|
|
club
|
|
end
|
|
|
|
def default_primary_color
|
|
club&.primary_color.presence || super
|
|
end
|
|
|
|
def default_secondary_color
|
|
club&.secondary_color.presence || super
|
|
end
|
|
end
|