sakai-info 0.3.4 → 0.3.5
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 +8 -0
- data/README.md +2 -2
- data/ROADMAP.md +12 -15
- data/lib/sakai-info.rb +2 -1
- data/lib/sakai-info/cli.rb +4 -1
- data/lib/sakai-info/cli/help.rb +43 -1
- data/lib/sakai-info/forum.rb +263 -0
- data/lib/sakai-info/generic_message.rb +67 -0
- data/lib/sakai-info/site.rb +2 -2
- data/lib/sakai-info/version.rb +1 -1
- metadata +6 -4
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# sakai-info Change History #
|
2
2
|
|
3
|
+
## 0.3.5 ##
|
4
|
+
|
5
|
+
*Released 2012-04-02*
|
6
|
+
|
7
|
+
* Basic Forum, ForumThread, and ForumPost support in CLI
|
8
|
+
* Refactored Forum support in library
|
9
|
+
* Fixed join_role serialization for Site
|
10
|
+
|
3
11
|
## 0.3.4 ##
|
4
12
|
|
5
13
|
*Released 2012-03-09*
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# sakai-info #
|
2
2
|
|
3
|
-
last updated: 2012-
|
3
|
+
last updated: 2012-04-02
|
4
4
|
author: David Adams (daveadams@gmail.com)
|
5
5
|
github url: https://github.com/daveadams/sakai-info
|
6
6
|
|
@@ -24,7 +24,7 @@ Use `rake` to test and build the gem:
|
|
24
24
|
$ rake gem:build
|
25
25
|
|
26
26
|
The resulting gem will be saved to the working directory as
|
27
|
-
`sakai-info-0.3.
|
27
|
+
`sakai-info-0.3.5.gem`.
|
28
28
|
|
29
29
|
Cleanup built gems using:
|
30
30
|
|
data/ROADMAP.md
CHANGED
@@ -1,38 +1,35 @@
|
|
1
1
|
# sakai-info Roadmap #
|
2
2
|
|
3
|
-
*Last updated 2012-
|
3
|
+
*Last updated 2012-04-02*
|
4
4
|
|
5
|
-
### 0.
|
5
|
+
### 0.4.0 ###
|
6
6
|
|
7
|
-
* CLI access to
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
* CLI access to gradebook
|
7
|
+
* CLI access to content
|
8
|
+
* Content binary entity parsing
|
9
|
+
* Command line tool name change to "sin"
|
12
10
|
|
13
|
-
### 0.
|
11
|
+
### 0.4.1 ###
|
14
12
|
|
15
13
|
* CLI access to announcements
|
16
14
|
|
17
|
-
### 0.
|
15
|
+
### 0.4.2 ###
|
18
16
|
|
19
|
-
* CLI access to
|
17
|
+
* CLI access to gradebook
|
20
18
|
|
21
|
-
### 0.3
|
19
|
+
### 0.4.3 ###
|
22
20
|
|
23
21
|
* CLI access to authz (realms, roles, functions)
|
24
22
|
|
25
|
-
### 0.
|
23
|
+
### 0.5.0 ###
|
26
24
|
|
27
25
|
* Sqlite test infrastructure for a few basic objects
|
28
|
-
* Command line tool name change to "sin"
|
29
26
|
|
30
|
-
### 0.
|
27
|
+
### 0.6.0 ###
|
31
28
|
|
32
29
|
* Test fixtures and basic unit tests for all represented objects
|
33
30
|
* RDoc coverage for every class
|
34
31
|
|
35
|
-
### 0.
|
32
|
+
### 0.7.0 ###
|
36
33
|
|
37
34
|
* Basic OSP support
|
38
35
|
|
data/lib/sakai-info.rb
CHANGED
@@ -88,7 +88,8 @@ require 'sakai-info/authz'
|
|
88
88
|
require 'sakai-info/content'
|
89
89
|
require 'sakai-info/gradebook'
|
90
90
|
require 'sakai-info/group'
|
91
|
-
require 'sakai-info/message'
|
92
91
|
require 'sakai-info/quiz'
|
93
92
|
require 'sakai-info/question_pool'
|
93
|
+
require 'sakai-info/generic_message'
|
94
|
+
require 'sakai-info/forum'
|
94
95
|
|
data/lib/sakai-info/cli.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# - sakai-info command line tool support
|
3
3
|
#
|
4
4
|
# Created 2012-02-19 daveadams@gmail.com
|
5
|
-
# Last updated 2012-
|
5
|
+
# Last updated 2012-04-02 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -32,6 +32,9 @@ module SakaiInfo
|
|
32
32
|
"question-pool" => QuestionPool,
|
33
33
|
"assignment" => Assignment,
|
34
34
|
"assignment-submission" => AssignmentSubmission,
|
35
|
+
"forum" => Forum,
|
36
|
+
"forum-thread" => ForumThread,
|
37
|
+
"forum-post" => ForumPost,
|
35
38
|
}
|
36
39
|
end
|
37
40
|
end
|
data/lib/sakai-info/cli/help.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# - sakai-info command line help
|
3
3
|
#
|
4
4
|
# Created 2012-02-19 daveadams@gmail.com
|
5
|
-
# Last updated 2012-
|
5
|
+
# Last updated 2012-04-02 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -41,6 +41,10 @@ sakai-info #{VERSION}
|
|
41
41
|
assignment-submission
|
42
42
|
Assignment submission information
|
43
43
|
|
44
|
+
forum Forum information
|
45
|
+
forum-thread Forum Thread information
|
46
|
+
forum-post Forum Post information
|
47
|
+
|
44
48
|
Misc commands:
|
45
49
|
test Tests configured database connections
|
46
50
|
help Prints general help
|
@@ -292,6 +296,44 @@ sakai-info assignment-submission
|
|
292
296
|
--mod Print creation/modification info
|
293
297
|
--all Print all possible details
|
294
298
|
EOF
|
299
|
+
|
300
|
+
"forum" => <<EOF,
|
301
|
+
sakai-info forum
|
302
|
+
|
303
|
+
Usage: sakai-info forum <id> [<options>]
|
304
|
+
|
305
|
+
Prints information about the forum ID specified. Additional options may be
|
306
|
+
passed to include additional information:
|
307
|
+
|
308
|
+
--threads Print summary of all threads
|
309
|
+
--mod Print creation/modification info
|
310
|
+
--all Print all possible details
|
311
|
+
EOF
|
312
|
+
|
313
|
+
"forum-thread" => <<EOF,
|
314
|
+
sakai-info forum-thread
|
315
|
+
|
316
|
+
Usage: sakai-info forum-thread <id> [<options>]
|
317
|
+
|
318
|
+
Prints information about the forum thread ID specified. Additional options
|
319
|
+
may be passed to include additional information:
|
320
|
+
|
321
|
+
--posts Print summary of all posts
|
322
|
+
--mod Print creation/modification info
|
323
|
+
--all Print all possible details
|
324
|
+
EOF
|
325
|
+
|
326
|
+
"forum-post" => <<EOF,
|
327
|
+
sakai-info forum-post
|
328
|
+
|
329
|
+
Usage: sakai-info forum-post <id> [<options>]
|
330
|
+
|
331
|
+
Prints information about the forum post ID specified. Additional options
|
332
|
+
may be passed to include additional information:
|
333
|
+
|
334
|
+
--mod Print creation/modification info
|
335
|
+
--all Print all possible details
|
336
|
+
EOF
|
295
337
|
}
|
296
338
|
|
297
339
|
def self.help(topic = :default, io = STDOUT)
|
@@ -0,0 +1,263 @@
|
|
1
|
+
# sakai-info/forum.rb
|
2
|
+
# SakaiInfo::Forum library
|
3
|
+
#
|
4
|
+
# Created 2012-04-01 daveadams@gmail.com
|
5
|
+
# Last updated 2012-04-01 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 Forum < SakaiObject
|
14
|
+
attr_reader :id, :title, :dbrow
|
15
|
+
|
16
|
+
include ModProps
|
17
|
+
created_by_key :created_by
|
18
|
+
created_at_key :created
|
19
|
+
modified_by_key :modified_by
|
20
|
+
modified_at_key :modified
|
21
|
+
|
22
|
+
@@cache = {}
|
23
|
+
def self.find(id)
|
24
|
+
if @@cache[id.to_s].nil?
|
25
|
+
row = DB.connect[:mfr_open_forum_t].where(:id => id).first
|
26
|
+
if row.nil?
|
27
|
+
raise ObjectNotFoundException.new(Forum, id)
|
28
|
+
end
|
29
|
+
@@cache[id.to_s] = Forum.new(row)
|
30
|
+
end
|
31
|
+
@@cache[id.to_s]
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(dbrow)
|
35
|
+
@dbrow = dbrow
|
36
|
+
|
37
|
+
@id = dbrow[:id].to_i
|
38
|
+
@title = dbrow[:title]
|
39
|
+
@area_id = dbrow[:surrogatekey]
|
40
|
+
|
41
|
+
@site_id_is_nil = false
|
42
|
+
end
|
43
|
+
|
44
|
+
def site_id
|
45
|
+
return nil if @site_id_is_nil
|
46
|
+
|
47
|
+
if @site_id.nil?
|
48
|
+
result = DB.connect[:mfr_area_t].
|
49
|
+
select(:context_id).where(:id => @area_id).first
|
50
|
+
if result.nil?
|
51
|
+
@site_id_is_nil = true
|
52
|
+
return nil
|
53
|
+
else
|
54
|
+
@site_id = result[:context_id]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
@site_id
|
58
|
+
end
|
59
|
+
|
60
|
+
def site
|
61
|
+
if self.site_id.nil?
|
62
|
+
return nil
|
63
|
+
end
|
64
|
+
|
65
|
+
@site ||= Site.find(self.site_id)
|
66
|
+
end
|
67
|
+
|
68
|
+
def thread_count
|
69
|
+
@thread_count ||= ForumThread.count_by_forum_id(self.id)
|
70
|
+
end
|
71
|
+
|
72
|
+
def threads
|
73
|
+
@threads ||= ForumThread.find_by_forum_id(self.id)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.query_by_site_id(site_id)
|
77
|
+
db = DB.connect
|
78
|
+
db[:mfr_open_forum_t].
|
79
|
+
where(:surrogatekey =>
|
80
|
+
db[:mfr_area_t].select(:id).where(:context_id => site_id)).
|
81
|
+
where(:forum_dtype => "DF")
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.count_by_site_id(site_id)
|
85
|
+
Forum.query_by_site_id(site_id).count
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.find_by_site_id(site_id)
|
89
|
+
Forum.query_by_site_id(site_id).all.
|
90
|
+
collect { |row| @@cache[row[:id].to_i.to_s] = Forum.new(row) }
|
91
|
+
end
|
92
|
+
|
93
|
+
def default_serialization
|
94
|
+
{
|
95
|
+
"id" => self.id,
|
96
|
+
"title" => self.title,
|
97
|
+
"site" => self.site.serialize(:summary),
|
98
|
+
"thread_count" => self.thread_count,
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def threads_serialization
|
103
|
+
{
|
104
|
+
"threads" => self.threads.collect { |t| t.serialize(:summary) }
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def summary_serialization
|
109
|
+
{
|
110
|
+
"id" => self.id,
|
111
|
+
"title" => self.title
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.all_serializations
|
116
|
+
[ :default, :threads ]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class ForumThread < GenericThread
|
121
|
+
attr_reader :id, :title, :dbrow
|
122
|
+
|
123
|
+
include ModProps
|
124
|
+
created_by_key :created_by
|
125
|
+
created_at_key :created
|
126
|
+
modified_by_key :modified_by
|
127
|
+
modified_at_key :modified
|
128
|
+
|
129
|
+
@@cache = {}
|
130
|
+
def self.find(id)
|
131
|
+
if @@cache[id.to_s].nil?
|
132
|
+
row = DB.connect[:mfr_topic_t].where(:id => id, :topic_dtype => "DT").first
|
133
|
+
if row.nil?
|
134
|
+
raise ObjectNotFoundException.new(ForumThread, id)
|
135
|
+
end
|
136
|
+
@@cache[id.to_s] = ForumThread.new(row)
|
137
|
+
end
|
138
|
+
@@cache[id.to_s]
|
139
|
+
end
|
140
|
+
|
141
|
+
def initialize(dbrow)
|
142
|
+
@dbrow = dbrow
|
143
|
+
|
144
|
+
@id = dbrow[:id].to_i
|
145
|
+
@title = dbrow[:title]
|
146
|
+
end
|
147
|
+
|
148
|
+
def post_count
|
149
|
+
@post_count ||= ForumPost.count_by_thread_id(self.id)
|
150
|
+
end
|
151
|
+
|
152
|
+
def posts
|
153
|
+
@posts ||= ForumPost.find_by_thread_id(self.id)
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.query_by_forum_id(forum_id)
|
157
|
+
DB.connect[:mfr_topic_t].where(:of_surrogatekey => forum_id)
|
158
|
+
end
|
159
|
+
|
160
|
+
def self.count_by_forum_id(forum_id)
|
161
|
+
ForumThread.query_by_forum_id(forum_id).count
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.find_by_forum_id(forum_id)
|
165
|
+
ForumThread.query_by_forum_id(forum_id).all.collect { |r| ForumThread.new(r) }
|
166
|
+
end
|
167
|
+
|
168
|
+
def default_serialization
|
169
|
+
{
|
170
|
+
"id" => self.id,
|
171
|
+
"title" => self.title,
|
172
|
+
"post_count" => self.post_count,
|
173
|
+
}
|
174
|
+
end
|
175
|
+
|
176
|
+
def posts_serialization
|
177
|
+
if self.post_count > 0
|
178
|
+
{
|
179
|
+
"posts" => self.posts.collect { |p| p.serialize(:summary) }
|
180
|
+
}
|
181
|
+
else
|
182
|
+
{ }
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def summary_serialization
|
187
|
+
{
|
188
|
+
"id" => self.id,
|
189
|
+
"title" => self.title,
|
190
|
+
}
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.all_serializations
|
194
|
+
[ :default, :posts ]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class ForumPost < GenericMessage
|
199
|
+
attr_reader :id, :title, :dbrow
|
200
|
+
|
201
|
+
include ModProps
|
202
|
+
created_by_key :created_by
|
203
|
+
created_at_key :created
|
204
|
+
modified_by_key :modified_by
|
205
|
+
modified_at_key :modified
|
206
|
+
|
207
|
+
@@cache = {}
|
208
|
+
def self.find(id)
|
209
|
+
if @@cache[id.to_s].nil?
|
210
|
+
row = DB.connect[:mfr_message_t].where(:id => id, :message_dtype => "ME").first
|
211
|
+
if row.nil?
|
212
|
+
raise ObjectNotFoundException.new(ForumPost, id)
|
213
|
+
end
|
214
|
+
@@cache[id.to_s] = ForumPost.new(row)
|
215
|
+
end
|
216
|
+
@@cache[id.to_s]
|
217
|
+
end
|
218
|
+
|
219
|
+
def initialize(dbrow)
|
220
|
+
@dbrow = dbrow
|
221
|
+
|
222
|
+
@id = dbrow[:id].to_i
|
223
|
+
@title = dbrow[:title]
|
224
|
+
end
|
225
|
+
|
226
|
+
def author
|
227
|
+
@author ||= User.find(@dbrow[:author])
|
228
|
+
end
|
229
|
+
|
230
|
+
def thread
|
231
|
+
@thread ||= ForumThread.find(@dbrow[:surrogatekey])
|
232
|
+
end
|
233
|
+
|
234
|
+
def self.query_by_thread_id(thread_id)
|
235
|
+
DB.connect[:mfr_message_t].where(:surrogatekey => thread_id)
|
236
|
+
end
|
237
|
+
|
238
|
+
def self.count_by_thread_id(thread_id)
|
239
|
+
ForumPost.query_by_thread_id(thread_id).count
|
240
|
+
end
|
241
|
+
|
242
|
+
def self.find_by_thread_id(thread_id)
|
243
|
+
ForumPost.query_by_thread_id(thread_id).all.collect { |r| ForumPost.new(r) }
|
244
|
+
end
|
245
|
+
|
246
|
+
def default_serialization
|
247
|
+
{
|
248
|
+
"id" => self.id,
|
249
|
+
"title" => self.title,
|
250
|
+
"author" => self.author.serialize(:summary),
|
251
|
+
"thread" => self.thread.serialize(:summary),
|
252
|
+
}
|
253
|
+
end
|
254
|
+
|
255
|
+
def summary_serialization
|
256
|
+
{
|
257
|
+
"id" => self.id,
|
258
|
+
"title" => self.title,
|
259
|
+
}
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# sakai-info/generic_message.rb
|
2
|
+
# SakaiInfo::GenericMessage library
|
3
|
+
#
|
4
|
+
# Created 2012-04-01 daveadams@gmail.com
|
5
|
+
# Last updated 2012-04-01 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 UnknownMessageTypeException < SakaiException; end
|
14
|
+
class GenericMessage < SakaiObject
|
15
|
+
def self.types
|
16
|
+
{
|
17
|
+
"ME" => "Forum Post",
|
18
|
+
"PM" => "Private Message"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.valid_message_type?(mt)
|
23
|
+
GenericMessage.types.keys.include?(mt)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.count_by_date_and_message_type(count_date, message_type)
|
27
|
+
date_str = nil
|
28
|
+
if count_date.is_a? Time
|
29
|
+
date_str = count_date.strftime("%Y-%m-%d")
|
30
|
+
elsif count_date.is_a? String
|
31
|
+
if count_date =~ /^\d\d\d\d-\d\d-\d\d$/
|
32
|
+
date_str = count_date
|
33
|
+
else
|
34
|
+
raise InvalidDateException
|
35
|
+
end
|
36
|
+
else
|
37
|
+
raise InvalidDateException
|
38
|
+
end
|
39
|
+
|
40
|
+
if not valid_message_type? message_type
|
41
|
+
raise UnknownMessageTypeException
|
42
|
+
end
|
43
|
+
|
44
|
+
DB.connect.fetch("select count(*) as count from mfr_message_t " +
|
45
|
+
"where message_dtype = ? and " +
|
46
|
+
"to_char(created,'YYYY-MM-DD') = ? ",
|
47
|
+
message_type, date_str).first[:count].to_i
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class GenericThread < SakaiObject
|
52
|
+
def self.types
|
53
|
+
{
|
54
|
+
"TO" => "Generic Thread",
|
55
|
+
"PT" => "Private Thread",
|
56
|
+
"OT" => "Open Thread",
|
57
|
+
"DT" => "Discussion Thread"
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.valid_message_type?(mt)
|
62
|
+
GenericThread.types.keys.include?(mt)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
data/lib/sakai-info/site.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# SakaiInfo::Site library
|
3
3
|
#
|
4
4
|
# Created 2012-02-17 daveadams@gmail.com
|
5
|
-
# Last updated 2012-
|
5
|
+
# Last updated 2012-04-01 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -244,7 +244,7 @@ module SakaiInfo
|
|
244
244
|
"site_properties" => self.properties,
|
245
245
|
"providers" => self.realm.providers,
|
246
246
|
"is_joinable" => self.joinable?,
|
247
|
-
"join_role" => (self.joinable? ? self.join_role : nil),
|
247
|
+
"join_role" => (self.joinable? ? self.join_role.name : nil),
|
248
248
|
"user_count" => self.user_count,
|
249
249
|
"group_count" => self.group_count,
|
250
250
|
"page_count" => self.page_count,
|
data/lib/sakai-info/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sakai-info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 5
|
10
|
+
version: 0.3.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Adams
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-04-02 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- lib/sakai-info/authz.rb
|
65
65
|
- lib/sakai-info/gradebook.rb
|
66
66
|
- lib/sakai-info/mod_props.rb
|
67
|
+
- lib/sakai-info/forum.rb
|
67
68
|
- lib/sakai-info/sakai_object.rb
|
68
69
|
- lib/sakai-info/quiz.rb
|
69
70
|
- lib/sakai-info/user.rb
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- lib/sakai-info/database.rb
|
73
74
|
- lib/sakai-info/cli.rb
|
74
75
|
- lib/sakai-info/question_pool.rb
|
76
|
+
- lib/sakai-info/generic_message.rb
|
75
77
|
- lib/sakai-info/message.rb
|
76
78
|
- lib/sakai-info/content.rb
|
77
79
|
- lib/sakai-info/page.rb
|