81 lines
2.9 KiB
Ruby
81 lines
2.9 KiB
Ruby
class GiftExchange < ApplicationRecord
|
|
PROMPT_TYPES = %w[requests offers].freeze
|
|
include ChallengeCore
|
|
|
|
override_datetime_setters
|
|
|
|
belongs_to :collection
|
|
has_one :collection, as: :challenge
|
|
|
|
# limits the kind of prompts users can submit
|
|
belongs_to :request_restriction, class_name: "PromptRestriction", dependent: :destroy
|
|
accepts_nested_attributes_for :request_restriction
|
|
|
|
belongs_to :offer_restriction, class_name: "PromptRestriction", dependent: :destroy
|
|
accepts_nested_attributes_for :offer_restriction
|
|
|
|
belongs_to :potential_match_settings, dependent: :destroy
|
|
accepts_nested_attributes_for :potential_match_settings
|
|
|
|
validates :signup_instructions_general, :signup_instructions_requests, :signup_instructions_offers, length: {
|
|
allow_blank: true,
|
|
maximum: ArchiveConfig.INFO_MAX, too_long: ts("must be less than %{max} letters long.", max: ArchiveConfig.INFO_MAX)
|
|
}
|
|
|
|
PROMPT_TYPES.each do |type|
|
|
%w[required allowed].each do |setting|
|
|
prompt_limit_field = "#{type}_num_#{setting}"
|
|
validates prompt_limit_field, numericality: {
|
|
only_integer: true,
|
|
less_than_or_equal_to: ArchiveConfig.PROMPTS_MAX,
|
|
greater_than_or_equal_to: 1
|
|
}
|
|
end
|
|
end
|
|
|
|
before_validation :update_allowed_values
|
|
def update_allowed_values
|
|
%w[request offer].each do |prompt_type|
|
|
required = send("#{prompt_type}s_num_required")
|
|
allowed = send("#{prompt_type}s_num_allowed")
|
|
send("#{prompt_type}s_num_allowed=", required) if required > allowed
|
|
end
|
|
end
|
|
|
|
# make sure that challenge sign-up / close / open dates aren't contradictory
|
|
validate :validate_signup_dates
|
|
|
|
# When Challenges are deleted, there are two references left behind that need to be reset to nil
|
|
before_destroy :clear_challenge_references
|
|
|
|
after_save :copy_tag_set_from_offer_to_request
|
|
def copy_tag_set_from_offer_to_request
|
|
return unless self.offer_restriction
|
|
|
|
self.request_restriction.set_owned_tag_sets(self.offer_restriction.owned_tag_sets)
|
|
|
|
# copy the tag-set-based restriction settings
|
|
self.request_restriction.character_restrict_to_fandom = self.offer_restriction.character_restrict_to_fandom
|
|
self.request_restriction.relationship_restrict_to_fandom = self.offer_restriction.relationship_restrict_to_fandom
|
|
self.request_restriction.character_restrict_to_tag_set = self.offer_restriction.character_restrict_to_tag_set
|
|
self.request_restriction.relationship_restrict_to_tag_set = self.offer_restriction.relationship_restrict_to_tag_set
|
|
self.request_restriction.save
|
|
end
|
|
|
|
# override core
|
|
def allow_name_change?
|
|
false
|
|
end
|
|
|
|
def topmost_tag_type
|
|
self.request_restriction.topmost_tag_type
|
|
end
|
|
|
|
def user_allowed_to_see_requests_summary?(user)
|
|
self.collection.user_is_maintainer?(user) || self.requests_summary_visible?
|
|
end
|
|
|
|
def user_allowed_to_see_prompt?(user, prompt)
|
|
self.collection.user_is_maintainer?(user) || prompt.pseud.user == user
|
|
end
|
|
end
|