person.rb
3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# A person is the profile of an user holding all relationships with the rest of the system
class Person < Profile
acts_as_accessor
has_many :friendships, :dependent => :destroy
has_many :friends, :class_name => 'Person', :through => :friendships
has_many :requested_tasks, :class_name => 'Task', :foreign_key => :requestor_id, :dependent => :destroy
after_destroy do |person|
Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy }
end
def suggested_friend_groups
(friend_groups + [ _('friends'), _('work'), _('school'), _('family') ]).map {|i| i if !i.empty?}.compact.uniq
end
def friend_groups
friendships.map { |item| item.group }.uniq
end
def add_friend(friend, group = nil)
self.friendships.build(:friend => friend, :group => group).save!
end
def already_request_friendship?(person)
person.tasks.find_by_requestor_id(self.id, :conditions => { :type => 'AddFriend' })
end
def remove_friend(friend)
friends.delete(friend)
end
N_('Contact information'); N_('Birth date'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code')
settings_items :photo, :contact_information, :birth_date, :sex, :city, :state, :country, :zip_code
def self.conditions_for_profiles(conditions, person)
new_conditions = sanitize_sql(['role_assignments.accessor_id = ?', person])
new_conditions << ' AND ' + sanitize_sql(conditions) unless conditions.blank?
new_conditions
end
def memberships(conditions = {})
Profile.find(
:all,
:conditions => self.class.conditions_for_profiles(conditions, self),
:joins => "LEFT JOIN role_assignments ON profiles.id = role_assignments.resource_id AND role_assignments.resource_type = \'#{Profile.base_class.name}\'",
:select => 'profiles.*').uniq
end
def enterprise_memberships
memberships(:type => Enterprise.name)
end
alias :enterprises :enterprise_memberships
def community_memberships
memberships(:type => Community.name)
end
alias :communities :community_memberships
validates_presence_of :user_id
validates_uniqueness_of :user_id
def email
self.user.nil? ? nil : self.user.email
end
def email= (email)
self.user.email = email if ! self.user.nil?
end
after_update do |person|
person.user.save!
end
def is_admin?
role_assignments.map{|ra|ra.role.permissions}.any? do |ps|
ps.any? do |p|
ActiveRecord::Base::PERMISSIONS['Environment'].keys.include?(p)
end
end
end
def default_set_of_blocks
[
[MainBlock],
[ProfileInfoBlock, RecentDocumentsBlock, TagsBlock],
[FriendsBlock, EnterprisesBlock, CommunitiesBlock]
]
end
def name
if !self[:name].blank?
self[:name]
else
self.user ? self.user.login : nil
end
end
has_and_belongs_to_many :favorite_enterprises, :class_name => 'Enterprise', :join_table => 'favorite_enteprises_people'
def email_addresses
# TODO for now, only one e-mail address
['%s@%s' % [self.identifier, self.environment.default_hostname(true) ] ]
end
def display_info_to?(user)
if friends.include?(user)
true
else
super
end
end
def template
environment.person_template
end
def self.with_pending_tasks
Person.find(:all).select{ |person| !person.tasks.pending.empty? or person.has_organization_pending_tasks? }
end
def has_organization_pending_tasks?
self.memberships.any?{ |group| group.tasks.pending.any?{ |task| self.has_permission?(task.permission, group) } }
end
def organizations_with_pending_tasks
self.memberships.select do |organization|
organization.tasks.pending.any?{|task| self.has_permission?(task.permission, organization)}
end
end
def pending_tasks_for_organization(organization)
organization.tasks.pending.select{|task| self.has_permission?(task.permission, organization)}
end
end