diaspora/app/models/profile.rb
Jonne Haß 2a4db54db9 New configuration system
* Throw away old system
* Add new system
* Add new example files
* Replace all calls
* add the most important docs
* Add Specs
* rename disable_ssl_requirement to require_ssl
* cloudfiles isn't used/called in our code
* since community_spotlight.list is only used as enable flag replace it with such one and remove all legacy and irelevant codepaths around it
* die if session secret is unset and on heroku
* First basic infrastructure for version information
2012-09-26 20:19:37 +02:00

192 lines
5 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 }
xml_attr :diaspora_handle
xml_attr :first_name
xml_attr :last_name
xml_attr :image_url
xml_attr :image_url_small
xml_attr :image_url_medium
xml_attr :birthday
xml_attr :gender
xml_attr :bio
xml_attr :location
xml_attr :searchable
xml_attr :nsfw
xml_attr :tag_string
before_save :strip_names
after_validation :strip_names
validates :first_name, :length => { :maximum => 32 }
validates :last_name, :length => { :maximum => 32 }
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
attr_accessible :first_name, :last_name, :image_url, :image_url_medium,
:image_url_small, :birthday, :gender, :bio, :location, :searchable, :date, :tag_string, :nsfw
belongs_to :person
before_validation do
self.tag_string = self.tag_string.split[0..4].join(' ')
end
before_save do
self.build_tags
self.construct_full_name
end
def subscribers(user)
Person.joins(:contacts).where(:contacts => {:user_id => user.id})
end
def receive(user, person)
Rails.logger.info("event=receive payload_type=profile sender=#{person} to=#{user}")
person.profile.update_attributes self.attributes.merge(:tag_string => self.tag_string)
person.profile
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
result || '/assets/user/default.png'
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
return image_url if url == ''
if url.nil? || url.match(/^https?:\/\//)
super(url)
else
super(absolutify_local_url(url))
end
end
def image_url_small= url
return image_url if url == ''
if url.nil? || url.match(/^https?:\/\//)
super(url)
else
super(absolutify_local_url(url))
end
end
def image_url_medium= url
return image_url if url == ''
if url.nil? || url.match(/^https?:\/\//)
super(url)
else
super(absolutify_local_url(url))
end
end
def date= params
if ['month', 'day'].all? { |key| params[key].present? }
params['year'] = '1000' 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 [ 'year', 'month', 'day'].all? { |key| params[key].blank? }
self.birthday = nil
end
end
def formatted_birthday
birthday.to_s(:long).gsub(', 1000', '') if birthday.present?
end
def tag_string
if @tag_string
@tag_string
else
rows = connection.select_rows( self.tags.scoped.to_sql )
rows.inject(""){|string, row| string << "##{row[1]} " }
end
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 - Profile.protected_attributes.to_a - ["created_at", "updated_at", "person_id"]
end
def absolutify_local_url url
pod_url = AppConfig.environment.url.get
pod_url.chop! if pod_url[-1,1] == '/'
"#{pod_url}#{url}"
end
end