sakai-info 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +12 -0
- data/LICENSE +8 -0
- data/README.md +148 -0
- data/ROADMAP.md +37 -0
- data/bin/sakai-info +79 -0
- data/lib/sakai-info.rb +62 -0
- data/lib/sakai-info/announcement.rb +170 -0
- data/lib/sakai-info/assignment.rb +281 -0
- data/lib/sakai-info/authz.rb +378 -0
- data/lib/sakai-info/cli.rb +35 -0
- data/lib/sakai-info/cli/help.rb +103 -0
- data/lib/sakai-info/configuration.rb +288 -0
- data/lib/sakai-info/content.rb +300 -0
- data/lib/sakai-info/db.rb +19 -0
- data/lib/sakai-info/gradebook.rb +176 -0
- data/lib/sakai-info/group.rb +119 -0
- data/lib/sakai-info/instance.rb +122 -0
- data/lib/sakai-info/message.rb +122 -0
- data/lib/sakai-info/sakai_object.rb +58 -0
- data/lib/sakai-info/sakai_xml_entity.rb +126 -0
- data/lib/sakai-info/samigo.rb +219 -0
- data/lib/sakai-info/site.rb +752 -0
- data/lib/sakai-info/user.rb +220 -0
- data/lib/sakai-info/version.rb +3 -0
- metadata +90 -0
@@ -0,0 +1,281 @@
|
|
1
|
+
# sakai-info/assignment.rb
|
2
|
+
# SakaiInfo::Assignment library
|
3
|
+
#
|
4
|
+
# Created 2012-02-17 daveadams@gmail.com
|
5
|
+
# Last updated 2012-02-17 daveadams@gmail.com
|
6
|
+
#
|
7
|
+
# https://github.com/daveadams/sakai-info
|
8
|
+
#
|
9
|
+
# This software is public domain.
|
10
|
+
#
|
11
|
+
|
12
|
+
module SakaiInfo
|
13
|
+
class Assignment < SakaiXMLEntity
|
14
|
+
attr_reader :site
|
15
|
+
|
16
|
+
@@cache = {}
|
17
|
+
def self.find(id)
|
18
|
+
if @@cache[id].nil?
|
19
|
+
site = nil
|
20
|
+
xml = ""
|
21
|
+
DB.connect.exec("select context, xml from assignment_assignment " +
|
22
|
+
"where assignment_id = :id", id) do |row|
|
23
|
+
site = Site.find(row[0])
|
24
|
+
REXML::Document.new(row[1].read).write(xml, 2)
|
25
|
+
end
|
26
|
+
if site.nil?
|
27
|
+
raise ObjectNotFoundException.new(Assignment, id)
|
28
|
+
end
|
29
|
+
@@cache[id] = Assignment.new(id, site, xml)
|
30
|
+
end
|
31
|
+
@@cache[id]
|
32
|
+
end
|
33
|
+
|
34
|
+
# raw data constructor
|
35
|
+
def initialize(id, site, xml)
|
36
|
+
@id = id
|
37
|
+
@site = site
|
38
|
+
@xml = xml
|
39
|
+
parse_xml
|
40
|
+
end
|
41
|
+
|
42
|
+
# set lookup
|
43
|
+
def self.find_by_site_id(site_id)
|
44
|
+
assignments = []
|
45
|
+
DB.connect.exec("select assignment_id, context, xml from assignment_assignment " +
|
46
|
+
"where context = :site_id", site_id) do |row|
|
47
|
+
id = row[0]
|
48
|
+
site = Site.find(row[1])
|
49
|
+
xml = ""
|
50
|
+
REXML::Document.new(row[2].read).write(xml, 2)
|
51
|
+
assignments << Assignment.new(id, site, xml)
|
52
|
+
end
|
53
|
+
return assignments
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.count_by_site_id(site_id)
|
57
|
+
assignment_count = 0
|
58
|
+
DB.connect.exec("select count(*) from assignment_assignment " +
|
59
|
+
"where context = :site_id", site_id) do |row|
|
60
|
+
assignment_count = row[0].to_i
|
61
|
+
end
|
62
|
+
return assignment_count
|
63
|
+
end
|
64
|
+
|
65
|
+
# getters
|
66
|
+
def title
|
67
|
+
@attributes["title"]
|
68
|
+
end
|
69
|
+
|
70
|
+
def submissions
|
71
|
+
@submissions ||= AssignmentSubmission.find_by_assignment_id(@id)
|
72
|
+
end
|
73
|
+
|
74
|
+
def submission_count
|
75
|
+
@submission_count ||= AssignmentSubmission.count_by_assignment_id(@id)
|
76
|
+
end
|
77
|
+
|
78
|
+
# yaml/json serialization
|
79
|
+
def default_serialization
|
80
|
+
{
|
81
|
+
"id" => self.id,
|
82
|
+
"title" => self.title,
|
83
|
+
"site" => self.site.serialize(:summary),
|
84
|
+
"created_by" => self.created_by.eid,
|
85
|
+
"created_at" => self.created_at,
|
86
|
+
"submissions" => self.submission_count
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
def summary_serialization
|
91
|
+
{
|
92
|
+
"id" => self.id,
|
93
|
+
"title" => self.title,
|
94
|
+
"created_by" => self.created_by.eid,
|
95
|
+
"submissions" => self.submission_count
|
96
|
+
}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class AssignmentSubmission < SakaiXMLEntity
|
101
|
+
attr_reader :assignment, :submitter
|
102
|
+
|
103
|
+
def initialize(id, assignment, xml, submitter, submitted, graded)
|
104
|
+
@id = id
|
105
|
+
@assignment = assignment
|
106
|
+
@xml = xml
|
107
|
+
@submitter = submitter
|
108
|
+
@submitted = submitted
|
109
|
+
@graded = graded
|
110
|
+
parse_xml
|
111
|
+
end
|
112
|
+
|
113
|
+
@@cache = {}
|
114
|
+
def self.find(id)
|
115
|
+
if @@cache[id].nil?
|
116
|
+
assignment = submitter = submitted_at = submitted = graded = nil
|
117
|
+
xml = ""
|
118
|
+
DB.connect.exec("select context, xml, submitter_id, " +
|
119
|
+
"submitted, graded from assignment_submission " +
|
120
|
+
"where submission_id = :id", id) do |row|
|
121
|
+
assignment = Assignment.find(row[0])
|
122
|
+
xml = ""
|
123
|
+
REXML::Document.new(row[1].read).write(xml, 2)
|
124
|
+
submitter = User.find(row[2])
|
125
|
+
submitted = (row[3] == "true")
|
126
|
+
graded = (row[4] == "true")
|
127
|
+
end
|
128
|
+
if assignment.nil?
|
129
|
+
raise ObjectNotFoundException.new(AssignmentSubmission, id)
|
130
|
+
end
|
131
|
+
@@cache[id] = AssignmentSubmission.new(id, assignment, xml, submitter, submitted, graded)
|
132
|
+
end
|
133
|
+
@@cache[id]
|
134
|
+
end
|
135
|
+
|
136
|
+
def submitted?
|
137
|
+
( created_by.eid == @submitter.eid && @submitted ) || false
|
138
|
+
end
|
139
|
+
|
140
|
+
def graded?
|
141
|
+
@graded || false
|
142
|
+
end
|
143
|
+
|
144
|
+
def submitted_at
|
145
|
+
@submitted_at ||= format_entity_date(@attributes["datesubmitted"])
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.find_by_assignment_id(assignment_id)
|
149
|
+
submissions = []
|
150
|
+
DB.connect.exec("select submission_id, context, xml, submitter_id, " +
|
151
|
+
"submitted, graded from assignment_submission " +
|
152
|
+
"where context = :assignment_id", assignment_id) do |row|
|
153
|
+
id = row[0]
|
154
|
+
assignment = Assignment.find(row[1])
|
155
|
+
xml = ""
|
156
|
+
REXML::Document.new(row[2].read).write(xml, 2)
|
157
|
+
submitter = User.find(row[3])
|
158
|
+
submitted = (row[4] == "true")
|
159
|
+
graded = (row[5] == "true")
|
160
|
+
submissions << AssignmentSubmission.new(id, assignment, xml, submitter, submitted, graded)
|
161
|
+
end
|
162
|
+
return submissions
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.count_by_assignment_id(assignment_id)
|
166
|
+
submission_count = 0
|
167
|
+
DB.connect.exec("select count(*) from assignment_submission " +
|
168
|
+
"where context = :assignment_id", assignment_id) do |row|
|
169
|
+
submission_count = row[0].to_i
|
170
|
+
end
|
171
|
+
return submission_count
|
172
|
+
end
|
173
|
+
|
174
|
+
def self.find_by_user_id(user_id)
|
175
|
+
submissions = []
|
176
|
+
DB.connect.exec("select submission_id, context, xml, submitter_id, " +
|
177
|
+
"submitted, graded from assignment_submission " +
|
178
|
+
"where submitter_id = :user_id", user_id) do |row|
|
179
|
+
id = row[0]
|
180
|
+
assignment = Assignment.find(row[1])
|
181
|
+
xml = ""
|
182
|
+
REXML::Document.new(row[2].read).write(xml, 2)
|
183
|
+
submitter = User.find(row[3])
|
184
|
+
submitted = (row[4] == "true")
|
185
|
+
graded = (row[5] == "true")
|
186
|
+
submissions << AssignmentSubmission.new(id, assignment, xml, submitter, submitted, graded)
|
187
|
+
end
|
188
|
+
return submissions
|
189
|
+
end
|
190
|
+
|
191
|
+
def self.count_by_user_id(user_id)
|
192
|
+
submission_count = 0
|
193
|
+
DB.connect.exec("select count(*) from assignment_submission " +
|
194
|
+
"where submitter_id = :user_id", user_id) do |row|
|
195
|
+
submission_count = row[0].to_i
|
196
|
+
end
|
197
|
+
return submission_count
|
198
|
+
end
|
199
|
+
|
200
|
+
# yaml/json serialization
|
201
|
+
def default_serialization
|
202
|
+
{
|
203
|
+
"id" => self.id,
|
204
|
+
"assignment" => self.assignment.serialize(:summary),
|
205
|
+
"submitter" => self.submitter.serialize(:summary),
|
206
|
+
"submitted" => self.submitted?,
|
207
|
+
"submitted_at" => self.submitted_at,
|
208
|
+
"graded" => self.graded?,
|
209
|
+
"created_by" => self.created_by.eid,
|
210
|
+
"created_at" => self.created_at,
|
211
|
+
"modified_by" => self.modified_by.eid,
|
212
|
+
"modified_at" => self.modified_at
|
213
|
+
}
|
214
|
+
end
|
215
|
+
|
216
|
+
def summary_serialization
|
217
|
+
{
|
218
|
+
"id" => self.id,
|
219
|
+
"assignment_id" => self.assignment.id,
|
220
|
+
"submitter" => self.submitter.eid,
|
221
|
+
"submitted" => self.submitted?
|
222
|
+
}
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
class AssignmentContent < SakaiXMLEntity
|
227
|
+
attr_reader :owner
|
228
|
+
|
229
|
+
def initialize(id, owner, xml)
|
230
|
+
@id = id
|
231
|
+
@owner = owner
|
232
|
+
@xml = xml
|
233
|
+
parse_xml
|
234
|
+
end
|
235
|
+
|
236
|
+
@@cache = {}
|
237
|
+
def self.find(id)
|
238
|
+
if @@cache[id].nil?
|
239
|
+
context = nil
|
240
|
+
xml = ""
|
241
|
+
DB.connect.exec("select context, xml from assignment_content " +
|
242
|
+
"where content_id = :id", id) do |row|
|
243
|
+
context = row[0]
|
244
|
+
REXML::Document.new(row[1].read).write(xml, 2)
|
245
|
+
end
|
246
|
+
if context.nil?
|
247
|
+
raise ObjectNotFoundException.new(AssignmentContent, id)
|
248
|
+
end
|
249
|
+
@@cache[id] = AssignmentContent.new(id, context, xml)
|
250
|
+
end
|
251
|
+
@@cache[id]
|
252
|
+
end
|
253
|
+
|
254
|
+
def self.find_by_user_id(user_id)
|
255
|
+
contents = []
|
256
|
+
DB.connect.exec("select content_id, context, xml from assignment_content " +
|
257
|
+
"where context = :user_id", user_id) do |row|
|
258
|
+
id = row[0]
|
259
|
+
context = row[1]
|
260
|
+
xml = ""
|
261
|
+
REXML::Document.new(row[2].read).write(xml, 2)
|
262
|
+
contents << AssignmentContent.new(id, context, xml)
|
263
|
+
end
|
264
|
+
return contents
|
265
|
+
end
|
266
|
+
|
267
|
+
def self.count_by_user_id(user_id)
|
268
|
+
content_count = 0
|
269
|
+
DB.connect.exec("select count(*) from assignment_content " +
|
270
|
+
"where context = :user_id", user_id) do |row|
|
271
|
+
content_count = row[0].to_i
|
272
|
+
end
|
273
|
+
content_count
|
274
|
+
end
|
275
|
+
|
276
|
+
# getters
|
277
|
+
def title
|
278
|
+
@attributes["title"]
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
@@ -0,0 +1,378 @@
|
|
1
|
+
# sakai-info/authz.rb
|
2
|
+
# SakaiInfo::Authz library
|
3
|
+
#
|
4
|
+
# Created 2012-02-17 daveadams@gmail.com
|
5
|
+
# Last updated 2012-02-17 daveadams@gmail.com
|
6
|
+
#
|
7
|
+
# https://github.com/daveadams/sakai-info
|
8
|
+
#
|
9
|
+
# This software is public domain.
|
10
|
+
#
|
11
|
+
|
12
|
+
module SakaiInfo
|
13
|
+
class AuthzRole < SakaiObject
|
14
|
+
attr_reader :name
|
15
|
+
|
16
|
+
def initialize(id, name)
|
17
|
+
@id = id
|
18
|
+
@name = name
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
name
|
23
|
+
end
|
24
|
+
|
25
|
+
@@cache = {}
|
26
|
+
def self.find_by_id(id)
|
27
|
+
id = id.to_s
|
28
|
+
if @@cache[id].nil?
|
29
|
+
name = nil
|
30
|
+
DB.connect.exec("select role_name from sakai_realm_role " +
|
31
|
+
"where role_key = :id", id.to_i) do |row|
|
32
|
+
name = row[0]
|
33
|
+
end
|
34
|
+
if name.nil?
|
35
|
+
raise ObjectNotFoundException.new(AuthzRole, id)
|
36
|
+
end
|
37
|
+
@@cache[id] = AuthzRole.new(id, name)
|
38
|
+
@@cache[name] = @@cache[id]
|
39
|
+
end
|
40
|
+
@@cache[id]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.find_by_name(name)
|
44
|
+
if name.nil?
|
45
|
+
raise ObjectNotFoundException.new(AuthzRole, "")
|
46
|
+
end
|
47
|
+
if @@cache[name].nil?
|
48
|
+
id = nil
|
49
|
+
DB.connect.exec("select role_key from sakai_realm_role " +
|
50
|
+
"where role_name = :name", name) do |row|
|
51
|
+
id = row[0].to_i.to_s
|
52
|
+
end
|
53
|
+
if id.nil?
|
54
|
+
raise ObjectNotFoundException.new(AuthzRole, name)
|
55
|
+
end
|
56
|
+
@@cache[name] = AuthzRole.new(id, name)
|
57
|
+
@@cache[id] = @@cache[name]
|
58
|
+
end
|
59
|
+
@@cache[name]
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.find(id_or_name)
|
63
|
+
id_or_name = id_or_name.to_s
|
64
|
+
role = nil
|
65
|
+
begin
|
66
|
+
role = AuthzRole.find_by_name(id_or_name)
|
67
|
+
rescue ObjectNotFoundException
|
68
|
+
# just in case
|
69
|
+
role = AuthzRole.find_by_id(id_or_name)
|
70
|
+
end
|
71
|
+
if role.nil?
|
72
|
+
raise ObjectNotFoundException.new(AuthzRole, id_or_name)
|
73
|
+
end
|
74
|
+
role
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.find_by_realm_id_and_function_id(realm_id, function_id)
|
78
|
+
roles = []
|
79
|
+
DB.connect.exec("select role_key, role_name from " +
|
80
|
+
"sakai_realm_role where role_key in " +
|
81
|
+
"(select role_key from sakai_realm_rl_fn " +
|
82
|
+
"where realm_key=:realm_id and function_key=:function_id) " +
|
83
|
+
"order by role_name", realm_id, function_id) do |row|
|
84
|
+
role_id = row[0].to_i.to_s
|
85
|
+
role_name = row[1]
|
86
|
+
roles << AuthzRole.new(role_id, role_name)
|
87
|
+
end
|
88
|
+
roles
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class AuthzFunction < SakaiObject
|
93
|
+
attr_reader :name
|
94
|
+
|
95
|
+
def initialize(id, name)
|
96
|
+
@id = id
|
97
|
+
@name = name
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_s
|
101
|
+
name
|
102
|
+
end
|
103
|
+
|
104
|
+
@@cache = {}
|
105
|
+
def self.find_by_id(id)
|
106
|
+
id = id.to_s
|
107
|
+
if @@cache[id].nil?
|
108
|
+
name = nil
|
109
|
+
DB.connect.exec("select function_name from sakai_realm_function " +
|
110
|
+
"where function_key = :id", id.to_i) do |row|
|
111
|
+
name = row[0]
|
112
|
+
end
|
113
|
+
if name.nil?
|
114
|
+
raise ObjectNotFoundException.new(AuthzFunction, id)
|
115
|
+
end
|
116
|
+
@@cache[id] = AuthzFunction.new(id, name)
|
117
|
+
@@cache[name] = @@cache[id]
|
118
|
+
end
|
119
|
+
@@cache[id]
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.find_by_name(name)
|
123
|
+
if @@cache[name].nil?
|
124
|
+
id = nil
|
125
|
+
DB.connect.exec("select function_key from sakai_realm_function " +
|
126
|
+
"where function_name = :name", name) do |row|
|
127
|
+
id = row[0].to_i.to_s
|
128
|
+
end
|
129
|
+
if id.nil?
|
130
|
+
raise ObjectNotFoundException.new(AuthzFunction, name)
|
131
|
+
end
|
132
|
+
@@cache[name] = AuthzFunction.new(id, name)
|
133
|
+
@@cache[id] = @@cache[name]
|
134
|
+
end
|
135
|
+
@@cache[name]
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.find(id_or_name)
|
139
|
+
id_or_name = id_or_name.to_s
|
140
|
+
function = nil
|
141
|
+
begin
|
142
|
+
function = AuthzFunction.find_by_name(id_or_name)
|
143
|
+
rescue ObjectNotFoundException
|
144
|
+
# just in case
|
145
|
+
function = AuthzFunction.find_by_id(id_or_name)
|
146
|
+
end
|
147
|
+
if function.nil?
|
148
|
+
raise ObjectNotFoundException.new(AuthzFunction, id_or_name)
|
149
|
+
end
|
150
|
+
function
|
151
|
+
end
|
152
|
+
|
153
|
+
def self.count_by_realm_id_and_role_id(realm_id, role_id)
|
154
|
+
count = 0
|
155
|
+
DB.connect.exec("select count(*) from sakai_realm_rl_fn " +
|
156
|
+
"where realm_key=:realm_id and role_key=:role_id",
|
157
|
+
realm_id, role_id) do |row|
|
158
|
+
count = row[0].to_i
|
159
|
+
end
|
160
|
+
count
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.find_by_realm_id_and_role_id(realm_id, role_id)
|
164
|
+
functions = []
|
165
|
+
DB.connect.exec("select function_key, function_name from " +
|
166
|
+
"sakai_realm_function where function_key in " +
|
167
|
+
"(select function_key from sakai_realm_rl_fn " +
|
168
|
+
"where realm_key=:realm_id and role_key=:role_id) " +
|
169
|
+
"order by function_name", realm_id, role_id) do |row|
|
170
|
+
function_id = row[0].to_i.to_s
|
171
|
+
function_name = row[1]
|
172
|
+
functions << AuthzFunction.new(function_id, function_name)
|
173
|
+
end
|
174
|
+
functions
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class AuthzRealm < SakaiObject
|
179
|
+
attr_reader :name, :providers, :maintain_role
|
180
|
+
|
181
|
+
def initialize(id, name, providers, maintain_role)
|
182
|
+
@id = id
|
183
|
+
@name = name
|
184
|
+
if providers.nil?
|
185
|
+
@providers = nil
|
186
|
+
else
|
187
|
+
@providers = providers.split("+")
|
188
|
+
end
|
189
|
+
@maintain_role = maintain_role
|
190
|
+
end
|
191
|
+
|
192
|
+
def realm_roles
|
193
|
+
@realm_roles ||= AuthzRealmRole.find_by_realm_id(@id)
|
194
|
+
end
|
195
|
+
|
196
|
+
def to_s
|
197
|
+
name
|
198
|
+
end
|
199
|
+
|
200
|
+
def user_count
|
201
|
+
@user_count ||= AuthzRealmMembership.count_by_realm_id(@id)
|
202
|
+
end
|
203
|
+
|
204
|
+
def membership
|
205
|
+
@membership ||= AuthzRealmMembership.find_by_realm_id(@id)
|
206
|
+
end
|
207
|
+
|
208
|
+
@@cache = {}
|
209
|
+
def self.find_by_id(id)
|
210
|
+
id = id.to_s
|
211
|
+
if @@cache[id].nil?
|
212
|
+
name = providers = maintain_role = nil
|
213
|
+
DB.connect.exec("select realm_id, provider_id, maintain_role " +
|
214
|
+
"from sakai_realm " +
|
215
|
+
"where realm_key = :id", id.to_i) do |row|
|
216
|
+
name = row[0]
|
217
|
+
providers = row[1]
|
218
|
+
if row[2].nil? or row[2] == ""
|
219
|
+
maintain_role = nil
|
220
|
+
else
|
221
|
+
maintain_role = AuthzRole.find_by_id(row[2].to_i)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
if name.nil?
|
225
|
+
raise ObjectNotFoundException.new(AuthzRealm, id)
|
226
|
+
end
|
227
|
+
@@cache[id] = AuthzRealm.new(id, name, providers, maintain_role)
|
228
|
+
@@cache[name] = @@cache[id]
|
229
|
+
end
|
230
|
+
@@cache[id]
|
231
|
+
end
|
232
|
+
|
233
|
+
def self.find_by_name(name)
|
234
|
+
if @@cache[name].nil?
|
235
|
+
id = providers = maintain_role = nil
|
236
|
+
DB.connect.exec("select realm_key, provider_id, maintain_role " +
|
237
|
+
"from sakai_realm " +
|
238
|
+
"where realm_id = :name", name) do |row|
|
239
|
+
id = row[0].to_i.to_s
|
240
|
+
providers = row[1]
|
241
|
+
if row[2].nil? or row[2] == ""
|
242
|
+
maintain_role = nil
|
243
|
+
else
|
244
|
+
maintain_role = AuthzRole.find_by_id(row[2].to_i)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
if id.nil?
|
248
|
+
raise ObjectNotFoundException.new(AuthzRealm, name)
|
249
|
+
end
|
250
|
+
@@cache[name] = AuthzRealm.new(id, name, providers, maintain_role)
|
251
|
+
@@cache[id] = @@cache[name]
|
252
|
+
end
|
253
|
+
@@cache[name]
|
254
|
+
end
|
255
|
+
|
256
|
+
def self.find(id_or_name)
|
257
|
+
id_or_name = id_or_name.to_s
|
258
|
+
realm = nil
|
259
|
+
begin
|
260
|
+
realm = AuthzRealm.find_by_name(id_or_name)
|
261
|
+
rescue ObjectNotFoundException
|
262
|
+
# just in case
|
263
|
+
realm = AuthzRealm.find_by_id(id_or_name)
|
264
|
+
end
|
265
|
+
if realm.nil?
|
266
|
+
raise ObjectNotFoundException.new(AuthzRealm, id_or_name)
|
267
|
+
end
|
268
|
+
realm
|
269
|
+
end
|
270
|
+
|
271
|
+
def self.find_by_site_id(site_id)
|
272
|
+
AuthzRealm.find_by_name("/site/#{site_id}")
|
273
|
+
end
|
274
|
+
|
275
|
+
def self.find_by_site_id_and_group_id(site_id, group_id)
|
276
|
+
AuthzRealm.find_by_name("/site/#{site_id}/group/#{group_id}")
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
class AuthzRealmRole < SakaiObject
|
281
|
+
attr_reader :realm, :role
|
282
|
+
|
283
|
+
def initialize(realm, role)
|
284
|
+
@realm = realm
|
285
|
+
@role = role
|
286
|
+
end
|
287
|
+
|
288
|
+
def function_count
|
289
|
+
@function_count ||= AuthzFunction.count_by_realm_id_and_role_id(@realm.id, @role.id)
|
290
|
+
end
|
291
|
+
|
292
|
+
def functions
|
293
|
+
@functions ||= AuthzFunction.find_by_realm_id_and_role_id(@realm.id, @role.id)
|
294
|
+
end
|
295
|
+
|
296
|
+
def user_count
|
297
|
+
@user_count ||= User.count_by_realm_id_and_role_id(@realm.id, @role.id)
|
298
|
+
end
|
299
|
+
|
300
|
+
def users
|
301
|
+
@users ||= User.find_by_realm_id_and_role_id(@realm.id, @role.id)
|
302
|
+
end
|
303
|
+
|
304
|
+
def self.find_by_realm_id(realm_id)
|
305
|
+
realm_roles = []
|
306
|
+
realm = AuthzRealm.find_by_id(realm_id)
|
307
|
+
DB.connect.exec("select distinct role_key from " +
|
308
|
+
"sakai_realm_rl_fn where " +
|
309
|
+
"realm_key = :realm_id", realm_id) do |row|
|
310
|
+
begin
|
311
|
+
role = AuthzRole.find_by_id(row[0].to_i)
|
312
|
+
realm_roles << AuthzRealmRole.new(realm, role)
|
313
|
+
rescue AuthzRoleNotFoundException
|
314
|
+
end
|
315
|
+
end
|
316
|
+
realm_roles
|
317
|
+
end
|
318
|
+
|
319
|
+
def default_serialization
|
320
|
+
{
|
321
|
+
"realm_name" => self.realm.name,
|
322
|
+
"role_name" => self.role.name,
|
323
|
+
"user_count" => self.user_count,
|
324
|
+
"function_count" => self.function_count
|
325
|
+
}
|
326
|
+
end
|
327
|
+
|
328
|
+
def summary_serialization
|
329
|
+
{
|
330
|
+
"role_name" => self.role.name,
|
331
|
+
"user_count" => self.user_count,
|
332
|
+
"function_count" => self.function_count
|
333
|
+
}
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
class AuthzRealmMembership < SakaiObject
|
338
|
+
attr_reader :realm, :user, :role
|
339
|
+
|
340
|
+
def initialize(realm_id, user_id, role)
|
341
|
+
@realm = AuthzRealm.find(realm_id)
|
342
|
+
@user = User.find(user_id)
|
343
|
+
@role = AuthzRole.find(role)
|
344
|
+
end
|
345
|
+
|
346
|
+
def self.find_by_realm_id(realm_id)
|
347
|
+
results = []
|
348
|
+
DB.connect.exec("select srrg.user_id, srr.role_name " +
|
349
|
+
"from sakai_realm_rl_gr srrg, sakai_realm_role srr " +
|
350
|
+
"where srrg.role_key = srr.role_key " +
|
351
|
+
"and srrg.realm_key = :realm_id", realm_id) do |row|
|
352
|
+
results << AuthzRealmMembership.new(realm_id, row[0], row[1])
|
353
|
+
end
|
354
|
+
results
|
355
|
+
end
|
356
|
+
|
357
|
+
def self.count_by_realm_id(realm_id)
|
358
|
+
count = 0
|
359
|
+
DB.connect.exec("select count(*) from sakai_realm_rl_gr " +
|
360
|
+
"where realm_key = :realm_id", realm_id) do |row|
|
361
|
+
count = row[0].to_i
|
362
|
+
end
|
363
|
+
count
|
364
|
+
end
|
365
|
+
|
366
|
+
def self.find_by_user_id(user_id)
|
367
|
+
results = []
|
368
|
+
DB.connect.exec("select sr.realm_id, srr.role_name " +
|
369
|
+
"from sakai_realm_rl_gr srrg, sakai_realm_role srr, sakai_realm sr " +
|
370
|
+
"where srrg.role_key = srr.role_key " +
|
371
|
+
"and srrg.realm_key = sr.realm_key " +
|
372
|
+
"and srrg.user_id = :user_id", user_id) do |row|
|
373
|
+
results << AuthzRealmMembership.new(row[0], user_id, row[1])
|
374
|
+
end
|
375
|
+
results
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|