mirror of
https://github.com/wahyd4/ocelots.git
synced 2026-08-10 13:36:16 +10:00
126 lines
3.1 KiB
Ruby
126 lines
3.1 KiB
Ruby
require 'omnipotence'
|
|
require 'uuid_generator'
|
|
|
|
class Person < ActiveRecord::Base
|
|
include Omnipotence
|
|
extend UuidGenerator
|
|
include Gravtastic ,UuidGenerator
|
|
gravtastic :secure => false,
|
|
:size => 300
|
|
|
|
attr_accessible :email, :persona_id, :account, :auth_token
|
|
attr_accessible :full_name, :chinese_name, :pinyin_name, :preferred_name
|
|
attr_accessible :photo, :phone
|
|
attr_accessible :url, :twitter, :facebook, :weibo, :appnet, :github ,:flickr
|
|
attr_accessible :lat, :lng
|
|
attr_accessible :show_avatar
|
|
|
|
|
|
validates_uniqueness_of :account
|
|
validates_uniqueness_of :auth_token
|
|
|
|
validates_presence_of :full_name ,:message => 'cannot be blank.'
|
|
validates_presence_of :account, :message => 'cannot be blank'
|
|
|
|
has_many :facts
|
|
has_many :memberships
|
|
has_many :teams, through: :memberships
|
|
|
|
validates_attachment_content_type :photo, :content_type=>['image/jpeg', 'image/png', 'image/gif']
|
|
|
|
has_attached_file :photo, {
|
|
styles: { square: "300x300#" }
|
|
}.merge(Rails.application.config.paperclip_storage_options)
|
|
|
|
def self.create_for_email email
|
|
Person.create email: email,
|
|
persona_id: Digest::MD5.hexdigest(email),
|
|
full_name: email.split("@")[0],
|
|
account: uuid,
|
|
auth_token: uuid
|
|
end
|
|
|
|
def api_attributes
|
|
att = attributes.except(*%w{id auth_token photo_file_name photo_content_type photo_file_size})
|
|
att[:photo_url] = photo.url if photo.exists?
|
|
att
|
|
end
|
|
|
|
def minimal_api_attributes
|
|
attributes.slice *%w{email full_name}
|
|
end
|
|
|
|
def approved_teams
|
|
memberships.approved.includes('team').map &:team
|
|
end
|
|
|
|
def pending_teams
|
|
memberships.pendings.map &:team
|
|
end
|
|
|
|
def allowed_to_view? person
|
|
return false unless person
|
|
omnipotent? or person == self or !(teams & person.approved_teams).empty?
|
|
end
|
|
|
|
def allowed_to_view_team? team
|
|
return false unless team
|
|
|
|
blessed?(team) or team.creator == self or teams.include?(team)
|
|
end
|
|
|
|
def viewable_teams
|
|
Team.find(:all).select{|team| allowed_to_view_team?(team)} - approved_teams - pending_teams
|
|
end
|
|
|
|
def blessed?(team)
|
|
return true if omnipotent?
|
|
team.blessed?(email_domain)
|
|
end
|
|
|
|
def email_domain
|
|
email.split('@').last
|
|
end
|
|
|
|
def leave (team)
|
|
Membership.where(team_id: team.id,person_id: id).first.leave
|
|
end
|
|
|
|
def join(team)
|
|
if Membership.where(team_id: team.id,person_id: id).empty?
|
|
teams << team
|
|
else
|
|
Membership.where(team_id: team.id,person_id: id).first.approve
|
|
end
|
|
end
|
|
|
|
def invite(emails, team)
|
|
mails = Mail::AddressList.new emails.delete("\n")
|
|
mails.addresses.each do |addr|
|
|
unless addr.domain
|
|
raise "You have illegal email addresses ,please correct it."
|
|
end
|
|
invitee = Person.to_person(addr.address.to_s)
|
|
Membership.create_pending_membership(self, invitee, team)
|
|
end
|
|
end
|
|
|
|
def organisation
|
|
Organisation.where('domains like ?',email_domain).first
|
|
end
|
|
|
|
def refresh_auth_token
|
|
update_attributes auth_token: uuid
|
|
auth_token
|
|
end
|
|
|
|
def display_name
|
|
full_name || '^@^'
|
|
end
|
|
|
|
def self.to_person(email)
|
|
person = Person.find_by_email email
|
|
person = Person.create_for_email email unless person
|
|
person
|
|
end
|
|
end |