# frozen_string_literal: true # License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later # Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE class Profile < ApplicationRecord include Image::AttachmentExtensions # :registered, # bool # :mini_bio, # :first_name, # str # :last_name, # str # :name, # :phone, # str # :address, # str # :email, # str # :city, # str # :state_code, # str (eg. CA) # :zip_code, # str # :privacy_settings, # text [str]: XXX deprecated # :picture, # str: either their social network pic or a stored pic on S3 # :anonymous, # bool: negates all privacy_settings # :city_state, # :user_id validates :email, format: { with: Email::Regex }, allow_blank: true attr_accessor :email, :city_state serialize :privacy_settings, Array has_one_attached :picture has_one_attached_with_sizes(:picture, {normal: 150, medium:100, tiny: 50}) belongs_to :user has_many :activities # Activities this profile has created has_many :supporters has_many :donations has_many :campaigns has_many :events has_many :recurring_donations has_many :comments, as: :host, dependent: :destroy has_many :nonprofits, through: :supporters has_many :activities, dependent: :destroy # has_one :card, as: :holder # accepts_nested_attributes_for :card scope :non_anon, -> { where(anonymous: [nil, false]) } before_validation(on: :create) do set_defaults self end def set_defaults self.name ||= user.name if user self.email ||= user.email if user picture.attach(io: File.open(Houdini.defaults.image.profile), filename: "profile-image.png") unless self.picture.attached? if self.name.blank? && first_name.present? && last_name.present? self.name ||= first_name + ' ' + last_name end end # Queries def recent_donations(npo_id) donations.valid.order('created_at').where(nonprofit_id: npo_id).take(10) end # Attrs def total_given_to(nonprofit) donations.valid.where(nonprofit_id: nonprofit.id).pluck(:amount).sum end def monthly_giving(nonprofit_id) donations.where(nonprofit_id: nonprofit_id).map(&:amount).sum end def monthly_total_giving donations.map(&:amount).sum end def full_name "#{first_name} #{last_name}" end def supporter_name self.name.blank? ? 'A Supporter' : self.name end def get_profile_picture(size = :normal) # Can be, in order of precedence: your uploaded photo, facebook picture, or # default image if user.picture return user.get_picture(size) else return picture_url(size) end # Either does not want photo shown or has none uploaded. Houdini.defaults.image.profile end def url Rails.application.routes.url_helpers.profile_path(self) end # Cache setters def set_caches! self.total_raised = donations.pluck(:amount).sum self.total_recurring = recurring_donations.active.pluck(:amount).sum save! end end