houdini/app/models/profile.rb

120 lines
2.8 KiB
Ruby
Raw Normal View History

# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
class Profile < ActiveRecord::Base
attr_accessible \
: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
mount_uploader :picture, ProfileUploader
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
self.set_defaults
self
end
def set_defaults
self.name ||= self.user.name if self.user
self.email ||= self.user.email if self.user
self.picture ||= self.user.picture if self.user
if self.name.blank? && self.first_name.present? && self.last_name.present?
self.name ||= self.first_name + ' ' + self.last_name
end
end
# Queries
def recent_donations(npo_id)
self.donations.valid.order("created_at").where(nonprofit_id: npo_id).take(10)
end
# Attrs
def total_given_to(nonprofit)
self.donations.valid.where(nonprofit_id: nonprofit.id).pluck(:amount).sum
end
def monthly_giving(nonprofit_id)
self.donations.where(nonprofit_id: nonprofit_id).map(&:amount).sum
end
def monthly_total_giving
self.donations.map(&:amount).sum
end
def full_name
"#{self.first_name} #{self.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 self.user.picture
return self.user.get_picture(size)
else
return self.picture_url(size)
end
# Either does not want photo shown or has none uploaded.
return Image::DefaultProfileUrl
end
def url
Rails.application.routes.url_helpers.profile_path(self)
end
def as_json(options = {})
h = super(options)
h[:pic_tiny] = self.get_profile_picture :tiny
h[:url] = self.url
h
end
# Cache setters
def set_caches!
self.total_raised = self.donations.pluck(:amount).sum
self.total_recurring = self.recurring_donations.active.pluck(:amount).sum
self.save!
end
end