diaspora/app/models/profile.rb
cmrd Senya 45619cb153
Account migration model and message support
This commit introduces support for AccountMigration federation message
receive. It covers the cases when the new home pod for a user is remote
respective to the recepient pod of the message. It also allows to initiate
migration locally by a podmin from the rails console. This will give the
pods a possibility to understand the account migration event on the
federation level and thus future version which will implement migration
will be backward compatible with the pods starting from this commit.
2017-08-15 01:32:34 +03:00

167 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 < ApplicationRecord
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 public?
public_details?
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 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!
@tag_string = nil
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