app/models/user.rb
# frozen_string_literal: true
class User < ApplicationRecord
include PgSearchCommon
has_attached_file :avatar,
styles: { medium: '300x300>', thumb: '100x100>', head: '32x32#'},
default_url: 'standard_:style.png'
before_validation :clear_avatar
validates_attachment_size :avatar, less_than: 1.megabyte
validates_attachment_content_type :avatar,
content_type: %r(\Aimage/.*\Z)
# call on authlogic
acts_as_authentic do |c|
# replace SHA512 by bcrypt
c.transition_from_crypto_providers = Authlogic::CryptoProviders::Sha512
c.crypto_provider = Authlogic::CryptoProviders::BCrypt
end
#after_create :make_standard_phenotypes
# dependent so stuff gets destroyed on delete
has_many :user_phenotypes, dependent: :destroy
has_many :phenotypes, through: :user_phenotypes
has_many :user_picture_phenotypes, dependent: :destroy
has_many :picture_phenotypes, through: :user_picture_phenotypes
has_many :genotypes, dependent: :destroy
has_many :user_snps, through: :genotypes
has_many :snps, through: :user_snps
has_many :homepages, dependent: :destroy
has_many :messages, dependent: :destroy
has_many :user_achievements, dependent: :destroy
has_many :achievements, through: :user_achievements
has_many :snp_comments # these shouldn't be deleted, but orphaned
has_many :phenotype_comments, dependent: :destroy
has_many :picture_phenotype_comments, dependent: :destroy
has_one :open_humans_profile, dependent: :destroy
# needed to edit several user_phenotypes at once, add and delete, and not empty
accepts_nested_attributes_for :homepages, allow_destroy: true
accepts_nested_attributes_for :user_phenotypes, allow_destroy: true
pg_search_common_scope against: [:description, :name]
def deliver_password_reset_instructions!
reset_perishable_token!
UserMailer.password_reset_instructions(self).deliver_later
end
def phenotype_length
# tiny workaround for user-index
phenotypes.length
end
def user_has_sequence_string
# used in the user-index-page instead of ugly true/false
if has_sequence
'Yes'
else
'No'
end
end
def check_if_phenotype_exists(charact)
# checks so we don't create duplicate phenotypes
if Phenotype.find_by_characteristic(charact) != nil
true
else
false
end
end
def check_and_make_standard_phenotypes(charact)
# checks whether phenotype exists, creates one if doesn't,
# creates fitting user_phenotype in both cases
if check_if_phenotype_exists(charact) == true
@phen_id = Phenotype.find_by_characteristic(charact).id
UserPhenotype.create(phenotype_id: @phen_id, variation: '', user_id: id)
else
@phen_id = Phenotype.create(characteristic: charact).id
UserPhenotype.create(phenotype_id: @phen_id, variation: '', user_id: id)
end
end
def make_standard_phenotypes
check_and_make_standard_phenotypes('Hair color')
check_and_make_standard_phenotypes('Eye color')
check_and_make_standard_phenotypes('Skin color')
check_and_make_standard_phenotypes('Blood type')
end
def delete_avatar=(value)
@delete_avatar = !value.to_i.zero?
end
def delete_avatar
!!@delete_avatar
end
alias_method :delete_avatar?, :delete_avatar
def clear_avatar
self.avatar = nil if delete_avatar?
end
def display_help_header?
# minor help method called in layouts/application header
!help_one || !help_two || !help_three
end
def phenotype_count
user_phenotypes.count
end
end