166 lines
4.3 KiB
Ruby
166 lines
4.3 KiB
Ruby
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
|
# licensed under the Affero General Public License version 3 or later. See
|
|
# the COPYRIGHT file.
|
|
|
|
class Profile < ActiveRecord::Base
|
|
self.include_root_in_json = false
|
|
|
|
include Diaspora::Federated::Base
|
|
include Diaspora::Taggable
|
|
|
|
attr_accessor :tag_string
|
|
acts_as_taggable_on :tags
|
|
extract_tags_from :tag_string
|
|
validates :tag_list, :length => { :maximum => 5 }
|
|
|
|
before_save :strip_names
|
|
after_validation :strip_names
|
|
|
|
validates :first_name, :length => { :maximum => 32 }
|
|
validates :last_name, :length => { :maximum => 32 }
|
|
validates :location, :length => { :maximum =>255 }
|
|
|
|
validates_format_of :first_name, :with => /\A[^;]+\z/, :allow_blank => true
|
|
validates_format_of :last_name, :with => /\A[^;]+\z/, :allow_blank => true
|
|
validate :max_tags
|
|
validate :valid_birthday
|
|
|
|
belongs_to :person
|
|
before_validation do
|
|
self.tag_string = self.tag_string.split[0..4].join(' ')
|
|
self.build_tags
|
|
end
|
|
|
|
before_save do
|
|
self.build_tags
|
|
self.construct_full_name
|
|
end
|
|
|
|
def subscribers
|
|
Person.joins(:contacts).where(contacts: {user_id: person.owner_id})
|
|
end
|
|
|
|
def diaspora_handle
|
|
#get the parent diaspora handle, unless we want to access a profile without a person
|
|
(self.person) ? self.person.diaspora_handle : self[:diaspora_handle]
|
|
end
|
|
|
|
def image_url(size=:thumb_large)
|
|
result = if size == :thumb_medium && self[:image_url_medium]
|
|
self[:image_url_medium]
|
|
elsif size == :thumb_small && self[:image_url_small]
|
|
self[:image_url_small]
|
|
else
|
|
self[:image_url]
|
|
end
|
|
|
|
if result
|
|
if AppConfig.privacy.camo.proxy_remote_pod_images?
|
|
Diaspora::Camo.image_url(result)
|
|
else
|
|
result
|
|
end
|
|
else
|
|
ActionController::Base.helpers.image_path("user/default.png")
|
|
end
|
|
end
|
|
|
|
def from_omniauth_hash(omniauth_user_hash)
|
|
mappings = {"description" => "bio",
|
|
'image' => 'image_url',
|
|
'name' => 'first_name',
|
|
'location' => 'location',
|
|
}
|
|
|
|
update_hash = Hash[ omniauth_user_hash.map {|k, v| [mappings[k], v] } ]
|
|
|
|
self.attributes.merge(update_hash){|key, old, new| old.blank? ? new : old}
|
|
end
|
|
|
|
def image_url=(url)
|
|
super(build_image_url(url))
|
|
end
|
|
|
|
def image_url_small=(url)
|
|
super(build_image_url(url))
|
|
end
|
|
|
|
def image_url_medium=(url)
|
|
super(build_image_url(url))
|
|
end
|
|
|
|
def date= params
|
|
if %w(month day).all? {|key| params[key].present? }
|
|
params["year"] = "1004" if params["year"].blank?
|
|
if Date.valid_civil?(params["year"].to_i, params["month"].to_i, params["day"].to_i)
|
|
self.birthday = Date.new(params["year"].to_i, params["month"].to_i, params["day"].to_i)
|
|
else
|
|
@invalid_birthday_date = true
|
|
end
|
|
elsif %w(year month day).all? {|key| params[key].blank? }
|
|
self.birthday = nil
|
|
end
|
|
end
|
|
|
|
def formatted_birthday
|
|
birthday.to_s(:long).gsub(/, 100[0|4]/, "") if birthday.present?
|
|
end
|
|
|
|
def bio_message
|
|
@bio_message ||= Diaspora::MessageRenderer.new(bio)
|
|
end
|
|
|
|
def location_message
|
|
@location_message ||= Diaspora::MessageRenderer.new(location)
|
|
end
|
|
|
|
def tag_string
|
|
@tag_string ||= tags.pluck(:name).map {|tag| "##{tag}" }.join(" ")
|
|
end
|
|
|
|
# Constructs a full name by joining #first_name and #last_name
|
|
# @return [String] A full name
|
|
def construct_full_name
|
|
self.full_name = [self.first_name, self.last_name].join(' ').downcase.strip
|
|
self.full_name
|
|
end
|
|
|
|
def tombstone!
|
|
self.taggings.delete_all
|
|
clearable_fields.each do |field|
|
|
self[field] = nil
|
|
end
|
|
self[:searchable] = false
|
|
self.save
|
|
end
|
|
|
|
protected
|
|
def strip_names
|
|
self.first_name.strip! if self.first_name
|
|
self.last_name.strip! if self.last_name
|
|
end
|
|
|
|
def max_tags
|
|
if self.tag_string.count('#') > 5
|
|
errors[:base] << 'Profile cannot have more than five tags'
|
|
end
|
|
end
|
|
|
|
def valid_birthday
|
|
if @invalid_birthday_date
|
|
errors.add(:birthday)
|
|
@invalid_birthday_date = nil
|
|
end
|
|
end
|
|
|
|
private
|
|
def clearable_fields
|
|
self.attributes.keys - ["id", "created_at", "updated_at", "person_id"]
|
|
end
|
|
|
|
def build_image_url(url)
|
|
return nil if url.blank? || url.match(/user\/default/)
|
|
return url if url.match(/^https?:\/\//)
|
|
"#{AppConfig.pod_uri.to_s.chomp('/')}#{url}"
|
|
end
|
|
end
|