/
person.rb
206 lines (179 loc) · 5.67 KB
/
person.rb
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
module Webui
class Person < Node
class ListError < Exception; end
default_find_parameter :login
handles_xml_element 'person'
class << self
def make_stub( opt )
logger.debug "make stub params: #{opt.inspect}"
realname = ""
realname = opt[:realname] if opt.has_key? :realname
email = ""
email = opt[:email] if opt.has_key? :email
state = ""
state = opt[:state] if opt.has_key? :state
globalrole = ""
globalrole = opt[:globalrole] if opt.has_key? :globalrole
reply = <<-EOF
<person>
<login>#{opt[:login]}</login>
<email>#{email}</email>
<realname>#{realname}</realname>
<state>#{state}</state>
<globalrole>#{globalrole}</globalrole>
</person>
EOF
return reply
end
end
def initialize(data)
super(data)
@login = self.to_hash["login"]
@groups = nil
@watched_projects = nil
end
def email
self.to_hash["email"]
end
def state
self.to_hash["state"]
end
def login
@login || self.to_hash["login"]
end
def globalrole
roles = Array.new
to_hash.elements("globalrole").each do |role|
roles << role
end
roles if roles.length > 0
end
def to_str
login
end
def to_s
login
end
def free_cache
Rails.cache.delete("person_#{login}")
Rails.cache.delete("person_#{login}_watchlist")
predicate = "person/@userid='#{login}'"
groups.each {|group| predicate += " or group/@groupid='#{group}'"}
Webui::Collection.free_cache(:id, :what => 'project', :predicate => predicate)
Webui::Collection.free_cache(:id, :what => 'package', :predicate => predicate)
end
def involved_projects
predicate = "(person/@userid='#{login}'"
groups.each {|group| predicate += " or group/@groupid='#{group}'"}
predicate += ") and @kind!='maintenance_incident'"
logger.debug "Searching for involved projects of #{login} with #{predicate}"
Webui::Collection.find(:what => 'project', :predicate => predicate)
end
def involved_packages
predicate = "person/@userid='#{login}'"
groups.each {|group| predicate += " or group/@groupid='#{group}'"}
Webui::Collection.find(:id, :what => 'package', :predicate => predicate)
end
def running_patchinfos
array = Array.new
col = Webui::Collection.find(:id, :what => 'package', :predicate => "[kind='patchinfo' and issue/[@state='OPEN' and owner/@login='#{CGI.escape(login)}']]")
col.each_package do |pi|
hash = { :package => { :project => pi.project, :name => pi.name } }
issues = Array.new
begin
# get users open issues for package
path = "/source/#{URI.escape(pi.project)}/#{URI.escape(pi.name)}?view=issues&states=OPEN&login=#{CGI.escape(login)}"
frontend = ActiveXML::api
answer = frontend.direct_http URI(path), :method => "GET"
doc = ActiveXML::Node.new(answer)
doc.each("/package/issue") do |s|
i = {}
i[:name]= s.find_first("name").text
i[:tracker]= s.find_first("tracker").text
i[:label]= s.find_first("label").text
i[:url]= s.find_first("url").text
summary=s.find_first("summary")
i[:summary] = summary.text if summary
state=s.find_first("state")
i[:state] = state.text if state
login=s.find_first("login")
i[:login] = login.text if login
updated_at=s.find_first("updated_at")
i[:updated_at] = updated_at.text if updated_at
issues << i
end
hash[:issues] = issues
array << hash
rescue ActiveXML::Transport::NotFoundError
# Ugly catch for projects that where deleted while this loop is running... bnc#755463)
end
end
return array
end
# Returns a tuple (i.e., array) of open requests and open reviews.
def requests_that_need_work
ApiDetails.read(:by_class_requests, user: login)
end
def groups
return @groups if @groups
@groups = []
PersonGroup.find(login).to_hash.elements('entry') do |e|
groups << e['name']
end
@groups
end
def packagesorter(a, b)
a.project == b.project ? a.name <=> b.name : a.project <=> b.project
end
def is_in_group?(group)
return groups.include?(group)
end
def is_admin?
to_hash.elements('globalrole').each do |g|
return true if g == 'Admin'
end
return false
end
def is_maintainer?(project, package = nil)
return has_role?('maintainer', project, package)
end
def has_role?(role, project, package = nil)
if package
package = Webui::Package.find(:project => project, :package => package) if package.class == String
if package && package.user_has_role?(self, role)
return true
end
end
project = WebuiProject.find(project) if project.class == String
if project
return project.user_has_role?(self, role)
else
return false
end
end
def self.list(prefix=nil, hash=nil)
prefix = URI.encode(prefix)
user_list = Rails.cache.fetch("user_list_#{prefix.to_s}", :expires_in => 10.minutes) do
transport ||= ActiveXML::api
path = "/person?prefix=#{prefix}"
begin
logger.debug 'Fetching user list from API'
response = transport.direct_http URI("#{path}"), :method => 'GET'
names = []
if hash
Webui::Collection.new(response).each do |user|
user = { 'name' => user.name }
names << user
end
else
Webui::Collection.new(response).each {|user| names << user.name}
end
names
rescue ActiveXML::Transport::Error => e
raise ListError, e.summary
end
end
return user_list
end
end
end