d2l_sdk 0.1.10 → 0.1.11
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +28 -0
- data/.fasterer.yml +28 -0
- data/.rubocop.yml +67 -0
- data/.vscode/settings.json +9 -0
- data/Gemfile +3 -2
- data/README.md +341 -63
- data/d2l_sdk.gemspec +1 -0
- data/lib/d2l_sdk/auth.rb +1 -1
- data/lib/d2l_sdk/calendar.rb +11 -12
- data/lib/d2l_sdk/config.rb +29 -29
- data/lib/d2l_sdk/config_variables.rb +27 -39
- data/lib/d2l_sdk/course.rb +53 -47
- data/lib/d2l_sdk/course_content.rb +60 -54
- data/lib/d2l_sdk/course_template.rb +19 -14
- data/lib/d2l_sdk/datahub.rb +28 -28
- data/lib/d2l_sdk/demographics.rb +23 -8
- data/lib/d2l_sdk/discussions.rb +361 -56
- data/lib/d2l_sdk/dropbox.rb +208 -16
- data/lib/d2l_sdk/enroll.rb +9 -9
- data/lib/d2l_sdk/grades.rb +7 -7
- data/lib/d2l_sdk/group.rb +42 -42
- data/lib/d2l_sdk/logging.rb +2 -2
- data/lib/d2l_sdk/lti.rb +243 -11
- data/lib/d2l_sdk/news.rb +2 -2
- data/lib/d2l_sdk/org_unit.rb +20 -18
- data/lib/d2l_sdk/requests.rb +105 -69
- data/lib/d2l_sdk/section.rb +13 -12
- data/lib/d2l_sdk/semester.rb +6 -5
- data/lib/d2l_sdk/setup_versions.rb +7 -7
- data/lib/d2l_sdk/user.rb +48 -58
- data/lib/d2l_sdk/version.rb +1 -1
- metadata +6 -5
- data/change_lastname.rb +0 -65
- data/lol.txt +0 -1
- data/test.rb +0 -19
data/d2l_sdk.gemspec
CHANGED
data/lib/d2l_sdk/auth.rb
CHANGED
@@ -85,7 +85,7 @@ end
|
|
85
85
|
def _get_string(path, http_method)
|
86
86
|
timestamp = Time.now.to_i
|
87
87
|
signature = format_signature(path, http_method, timestamp)
|
88
|
-
|
88
|
+
if !path.include? "/auth/api/token"
|
89
89
|
build_authenticated_uri_query_string(signature, timestamp)
|
90
90
|
else
|
91
91
|
# build authenticated query string not using typical schema
|
data/lib/d2l_sdk/calendar.rb
CHANGED
@@ -30,9 +30,9 @@ end
|
|
30
30
|
# REVIEW: Retrieve the calling user’s calendar events, within a
|
31
31
|
# number of org units (see query parameter)
|
32
32
|
# RETURNS: An ObjectListPage JSON block containing a list of EventDataInfo JSON data blocks.
|
33
|
-
def get_current_user_calendar_events_by_org_units(
|
34
|
-
|
35
|
-
|
33
|
+
def get_current_user_calendar_events_by_org_units(org_unit_ids_csv, start_date_time,
|
34
|
+
end_date_time, association = nil,
|
35
|
+
event_type = nil)
|
36
36
|
path = "/d2l/api/le/#{$le_ver}/calendar/events/myEvents/"
|
37
37
|
path += "?orgUnitIdsCSV=#{org_unit_ids_csv}"
|
38
38
|
path += "&startDateTime=#{start_date_time}"
|
@@ -44,8 +44,8 @@ end
|
|
44
44
|
|
45
45
|
# REVIEW: Retrieve the calling user’s events for a particular org unit.
|
46
46
|
# RETURNS: An ObjectListPage JSON block containing a list of EventDataInfo JSON data blocks.
|
47
|
-
def get_current_user_events_by_org_unit(
|
48
|
-
|
47
|
+
def get_current_user_events_by_org_unit(start_date_time, end_date_time,
|
48
|
+
association = nil, event_type = nil)
|
49
49
|
path = "/d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/events/myEvents/"
|
50
50
|
path += "&startDateTime=#{start_date_time}"
|
51
51
|
path += "&endDateTime=#{end_date_time}"
|
@@ -56,8 +56,8 @@ end
|
|
56
56
|
|
57
57
|
# REVIEW: Retrieve a count of calling user’s calendar events, within a number of org units
|
58
58
|
# RETURNS: An ObjectListPage JSON block containing a list of EventCountInfo JSON data blocks.
|
59
|
-
def get_calendar_event_count(
|
60
|
-
|
59
|
+
def get_calendar_event_count(org_unit_ids_csv, start_date_time, end_date_time,
|
60
|
+
association = nil, event_type = nil)
|
61
61
|
path = "/d2l/api/le/#{$le_ver}/calendar/events/myEvents/itemCounts/"
|
62
62
|
path += "?orgUnitIdsCSV=#{org_unit_ids_csv}"
|
63
63
|
path += "&startDateTime=#{start_date_time}"
|
@@ -70,8 +70,8 @@ end
|
|
70
70
|
# REVIEW: Retrieve a count of calling user’s calendar events, within the
|
71
71
|
# provided org unit context.
|
72
72
|
# RETURNS: An EventCountInfo JSON data block.
|
73
|
-
def get_org_unit_calendar_event_count(
|
74
|
-
|
73
|
+
def get_org_unit_calendar_event_count(start_date_time, end_date_time,
|
74
|
+
association = nil, event_type = nil)
|
75
75
|
path = "/d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/events/myEvents/itemCounts/"
|
76
76
|
path += "?startDateTime=#{start_date_time}"
|
77
77
|
path += "&endDateTime=#{end_date_time}"
|
@@ -177,7 +177,7 @@ end
|
|
177
177
|
def create_event(org_unit_id, event_data)
|
178
178
|
# POST /d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/event/
|
179
179
|
path = "/d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/event/"
|
180
|
-
payload = { #Calendar.EventDataInfo
|
180
|
+
payload = { # Calendar.EventDataInfo
|
181
181
|
"Title" => "",
|
182
182
|
"Description" => "",
|
183
183
|
"StartDateTime" => nil, # UTCDateTime || nil
|
@@ -214,7 +214,6 @@ def create_event(org_unit_id, event_data)
|
|
214
214
|
}.merge!(event_data)
|
215
215
|
check_calendar_event_data_validity(payload) # NOTE: Test later
|
216
216
|
_post(path, payload)
|
217
|
-
|
218
217
|
end
|
219
218
|
|
220
219
|
# REVIEW: Create Schema checker; Check that this payload conforms to it.
|
@@ -224,7 +223,7 @@ end
|
|
224
223
|
def update_event(org_unit_id, event_id, event_data)
|
225
224
|
# PUT /d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/event/#{event_id}
|
226
225
|
path = "/d2l/api/le/#{$le_ver}/#{org_unit_id}/calendar/event/#{event_id}"
|
227
|
-
payload = { #Calendar.EventDataInfo
|
226
|
+
payload = { # Calendar.EventDataInfo
|
228
227
|
"Title" => "",
|
229
228
|
"Description" => "",
|
230
229
|
"StartDateTime" => nil, # UTCDateTime || nil
|
data/lib/d2l_sdk/config.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#Is this the production environment?
|
1
|
+
# Is this the production environment?
|
2
2
|
require 'json'
|
3
3
|
@production = true
|
4
4
|
@debug = true
|
@@ -8,49 +8,49 @@ config_file_name = 'd2l_config.json'
|
|
8
8
|
if File.exist?(config_file_name)
|
9
9
|
config_file = File.read(config_file_name)
|
10
10
|
config = JSON.parse(config_file)
|
11
|
-
puts
|
12
|
-
puts "[-] hostname: #{config[
|
13
|
-
$hostname = config[
|
14
|
-
puts "[-] user_id: #{config[
|
15
|
-
$user_id = config[
|
16
|
-
puts "[-] user_key: #{config[
|
17
|
-
$user_key = config[
|
18
|
-
puts "[-] app_id: #{config[
|
19
|
-
$app_id = config[
|
20
|
-
puts "[-] app_key: #{config[
|
21
|
-
$app_key = config[
|
11
|
+
puts '[+] Configuration Variables:' if @debug
|
12
|
+
puts "[-] hostname: #{config['hostname']}" if @debug
|
13
|
+
$hostname = config['hostname']
|
14
|
+
puts "[-] user_id: #{config['user_id']}" if @debug
|
15
|
+
$user_id = config['user_id']
|
16
|
+
puts "[-] user_key: #{config['user_key']}" if @debug
|
17
|
+
$user_key = config['user_key']
|
18
|
+
puts "[-] app_id: #{config['app_id']}" if @debug
|
19
|
+
$app_id = config['app_id']
|
20
|
+
puts "[-] app_key: #{config['app_key']}" if @debug
|
21
|
+
$app_key = config['app_key']
|
22
22
|
# else if a configuration file doesnt exist, create one and load the config vars!
|
23
23
|
else
|
24
24
|
puts "[!] No file by the name 'd2l_config.json' found!"
|
25
25
|
puts "[-] Initializing 'd2l_config.json' in current directory..\n"\
|
26
26
|
" Please enter the following information..."
|
27
27
|
# host of D2L server
|
28
|
-
print
|
29
|
-
$hostname = gets.chomp.gsub(/'|\"|https:\/\/|http:\/\/|/,'').strip
|
28
|
+
print 'hostname: '
|
29
|
+
$hostname = gets.chomp.gsub(/'|\"|https:\/\/|http:\/\/|/, '').strip
|
30
30
|
# api-user id
|
31
|
-
print
|
32
|
-
$user_id = gets.chomp.gsub(/'|\"/,'').strip
|
31
|
+
print 'user_id: '
|
32
|
+
$user_id = gets.chomp.gsub(/'|\"/, '').strip
|
33
33
|
# api-user key
|
34
|
-
print
|
35
|
-
$user_key = gets.chomp.gsub(/'|\"/,'').strip
|
34
|
+
print 'user_key: '
|
35
|
+
$user_key = gets.chomp.gsub(/'|\"/, '').strip
|
36
36
|
# app id (received from apitesttool)
|
37
|
-
print
|
38
|
-
$app_id = gets.chomp.gsub(/'|\"/,'').strip
|
37
|
+
print 'app_id: '
|
38
|
+
$app_id = gets.chomp.gsub(/'|\"/, '').strip
|
39
39
|
# app key (same as app id retrieval)
|
40
|
-
print
|
41
|
-
$app_key = gets.chomp.gsub(/'|\"/,'').strip
|
40
|
+
print 'app_key: '
|
41
|
+
$app_key = gets.chomp.gsub(/'|\"/, '').strip
|
42
42
|
|
43
43
|
config_hash = {
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
'hostname' => $hostname,
|
45
|
+
'user_id' => $user_id,
|
46
|
+
'user_key' => $user_key,
|
47
|
+
'app_id' => $app_id,
|
48
|
+
'app_key' => $app_key
|
49
49
|
}
|
50
50
|
json = JSON.pretty_generate(config_hash)
|
51
51
|
puts json if @debug
|
52
|
-
#puts JSON.parse(json)["hostname"] if @debug
|
53
|
-
config = File.new(
|
52
|
+
# puts JSON.parse(json)["hostname"] if @debug
|
53
|
+
config = File.new('d2l_config.json', 'w')
|
54
54
|
config.puts(json)
|
55
55
|
config.close
|
56
56
|
end
|
@@ -11,7 +11,7 @@ require_relative 'auth'
|
|
11
11
|
|
12
12
|
# Retrieve the definitions for all the configuration variables the
|
13
13
|
# user has access to view.
|
14
|
-
def get_all_config_var_definitions(search='', bookmark='')
|
14
|
+
def get_all_config_var_definitions(search = '', bookmark = '')
|
15
15
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/definitions/"
|
16
16
|
path += "?search=#{search}" if search != ''
|
17
17
|
path += "?bookmark=#{bookmark}" if bookmark != ''
|
@@ -32,14 +32,14 @@ end
|
|
32
32
|
# NOTE: These provide access to the values assigned to configuration
|
33
33
|
# variables in the running back-end service.
|
34
34
|
|
35
|
-
#Retrieve the value summary for a configuration variable.
|
35
|
+
# Retrieve the value summary for a configuration variable.
|
36
36
|
def get_config_var_values(variable_id)
|
37
37
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values"
|
38
38
|
_get(path)
|
39
39
|
# returns Values JSON data block
|
40
40
|
end
|
41
41
|
|
42
|
-
#Retrieve the current org value for a configuration variable.
|
42
|
+
# Retrieve the current org value for a configuration variable.
|
43
43
|
def get_config_var_current_org_value(variable_id)
|
44
44
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/org"
|
45
45
|
_get(path)
|
@@ -47,7 +47,7 @@ def get_config_var_current_org_value(variable_id)
|
|
47
47
|
end
|
48
48
|
|
49
49
|
# Retrieve all the org unit override values for a configuration variable.
|
50
|
-
def get_all_config_var_org_unit_override_values(variable_id, bookmark='')
|
50
|
+
def get_all_config_var_org_unit_override_values(variable_id, bookmark = '')
|
51
51
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/orgUnits/"
|
52
52
|
path += "?bookmark=#{bookmark}" if bookmark != ''
|
53
53
|
_get(path)
|
@@ -70,7 +70,7 @@ def get_config_var_org_unit_effective_value(variable_id, org_unit_id)
|
|
70
70
|
end
|
71
71
|
|
72
72
|
# Retrieve all the role override values for a configuration variable.
|
73
|
-
def get_all_config_var_org_unit_role_override_values(variable_id, bookmark='')
|
73
|
+
def get_all_config_var_org_unit_role_override_values(variable_id, bookmark = '')
|
74
74
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/roles/"
|
75
75
|
path += "?bookmark=#{bookmark}" if bookmark != ''
|
76
76
|
_get(path)
|
@@ -90,45 +90,33 @@ end
|
|
90
90
|
# REVIEW: Set a new org value for a configuration variable.
|
91
91
|
def set_config_var_org_value(variable_id, org_value)
|
92
92
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/org"
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
else
|
97
|
-
raise ArgumentError, "Argument 'org_value' is not a String or nil"
|
98
|
-
end
|
93
|
+
raise(ArgumentError, "Argument 'org_value' is not a String or nil") unless org_value.is_a?(String) || org_value.nil?
|
94
|
+
payload = { 'OrgValue' => org_value }
|
95
|
+
_put(path, payload)
|
99
96
|
end
|
100
97
|
|
101
98
|
# REVIEW: Set a new org unit override value for a configuration variable.
|
102
99
|
def set_config_var_override_value(variable_id, org_unit_id, org_unit_value)
|
103
100
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/orgUnits/#{org_unit_id}"
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
else
|
108
|
-
raise ArgumentError, "Argument 'org_unit_value' is not a String or nil"
|
109
|
-
end
|
101
|
+
raise(ArgumentError, "Argument 'org_unit_value' is not a String or nil") unless org_unit_value.is_a?(String) || org_unit_value.nil?
|
102
|
+
payload = { 'OrgUnitValue' => org_unit_value }
|
103
|
+
_put(path, payload)
|
110
104
|
end
|
111
105
|
|
112
106
|
# REVIEW: Set a new role override value for a configuration variable.
|
113
107
|
def set_config_var_role_value(variable_id, role_id, role_value)
|
114
108
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/roles/#{role_id}"
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
else
|
119
|
-
raise ArgumentError, "Argument 'role_value' is not a String or nil"
|
120
|
-
end
|
109
|
+
raise(ArgumentError, "Argument 'role_value' is not a String or nil") unless role_value.is_a? String || role_value.nil?
|
110
|
+
payload = { 'RoleValue' => role_value }
|
111
|
+
_put(path, payload)
|
121
112
|
end
|
122
113
|
|
123
114
|
# REVIEW: Set a new system value for a configuration variable.
|
124
115
|
def set_config_var_system_value(variable_id, system_value)
|
125
116
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/system"
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
else
|
130
|
-
raise ArgumentError, "Argument 'system_value' is not a String or nil"
|
131
|
-
end
|
117
|
+
raise(ArgumentError, "Argument 'system_value' is not a String or nil") unless system_value.is_a?(String) || system_value.nil?
|
118
|
+
payload = { 'SystemValue' => system_value }
|
119
|
+
_put(path, payload)
|
132
120
|
end
|
133
121
|
|
134
122
|
########################
|
@@ -139,9 +127,9 @@ end
|
|
139
127
|
|
140
128
|
# NOTE: UNSTABLE!!!
|
141
129
|
# TODO: UNSTABLE!!! --Restore the default resolution strategy for an org unit configuration variable.
|
142
|
-
def restore_default_org_unit_config_var_resolution(variable_id)
|
130
|
+
def restore_default_org_unit_config_var_resolution(variable_id); end
|
143
131
|
# DELETE /d2l/api/lp/(version)/configVariables/(variableId)/resolver
|
144
|
-
|
132
|
+
|
145
133
|
|
146
134
|
# NOTE: UNSTABLE!!!
|
147
135
|
# REVIEW: Retrieve the resolution strategy for an org unit configuration variable.
|
@@ -152,9 +140,9 @@ end
|
|
152
140
|
|
153
141
|
# NOTE: UNSTABLE!!!
|
154
142
|
# TODO: UNSTABLE!!! --Update the resolution strategy for an org unit configuration variable.
|
155
|
-
def update_org_unit_config_var_resolution(resolver_value)
|
143
|
+
def update_org_unit_config_var_resolution(resolver_value); end
|
156
144
|
# PUT /d2l/api/lp/(version)/configVariables/(variableId)/resolver
|
157
|
-
|
145
|
+
|
158
146
|
|
159
147
|
################################################################################
|
160
148
|
############################### TOOLS ###################################
|
@@ -193,7 +181,7 @@ def check_and_create_update_status_payload(update_status)
|
|
193
181
|
if update_status != true && update_status != false
|
194
182
|
raise ArgumentError, 'update_status is not a boolean'
|
195
183
|
end
|
196
|
-
payload = {
|
184
|
+
payload = { 'Status' => update_status } # Tools.UpdateStatus JSON data block
|
197
185
|
payload
|
198
186
|
end
|
199
187
|
|
@@ -262,11 +250,11 @@ def update_org_unit_level_tool_info(org_unit_id, tool_id, org_unit_information)
|
|
262
250
|
path = "/d2l/api/lp/#{$lp_ver}/tools/orgUnits/#{org_unit_id}/#{tool_id}"
|
263
251
|
payload =
|
264
252
|
{
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
253
|
+
'ToolId' => '', # <string:D2LID>
|
254
|
+
'DisplayName' => '', # <string> ## added with LP v1.6 API
|
255
|
+
'OrgUnitId' => 0, # D2LID:number
|
256
|
+
'Status' => false, # boolean
|
257
|
+
'CustomNavbarName' => '' # <string>
|
270
258
|
}.merge!(org_unit_information)
|
271
259
|
check_org_unit_information_validity(payload) # NOTE: Check this later.
|
272
260
|
_put(path, payload)
|
data/lib/d2l_sdk/course.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'requests'
|
2
2
|
require 'json-schema'
|
3
|
+
require 'mime/types'
|
3
4
|
|
4
5
|
########################
|
5
6
|
# ACTIONS:##############
|
@@ -10,7 +11,7 @@ require 'json-schema'
|
|
10
11
|
# Then, a delete http method is executed using this path, deleting the course.
|
11
12
|
def delete_course_by_id(org_unit_id)
|
12
13
|
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}" # setup user path
|
13
|
-
#ap path
|
14
|
+
# ap path
|
14
15
|
_delete(path)
|
15
16
|
puts '[+] Course data deleted successfully'.green
|
16
17
|
end
|
@@ -33,9 +34,8 @@ def get_course_by_id(org_unit_id)
|
|
33
34
|
# returns: JSON object of the course
|
34
35
|
end
|
35
36
|
|
36
|
-
|
37
37
|
def get_course_image(org_unit_id, width = 0, height = 0)
|
38
|
-
path = "/d2l/api/lp/#{lp_ver}/courses/#{org_unit_id}/image"
|
38
|
+
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}/image"
|
39
39
|
if width > 0 && height > 0
|
40
40
|
path += "?width=#{width}"
|
41
41
|
path += "&height=#{height}"
|
@@ -68,7 +68,6 @@ def check_course_data_validity(course_data)
|
|
68
68
|
JSON::Validator.validate!(schema, course_data, validate_schema: true)
|
69
69
|
end
|
70
70
|
|
71
|
-
|
72
71
|
# Creates the course based upon a merged result of the argument course_data
|
73
72
|
# and a preformatted payload. This is then passed as a new payload in the
|
74
73
|
# +_post+ method in order to create the defined course.
|
@@ -82,23 +81,24 @@ def create_course_data(course_data)
|
|
82
81
|
# Define a valid, empty payload and merge! with the user_data. Print it.
|
83
82
|
# can be an issue if more than one course template associated with
|
84
83
|
# a course and the last course template parent to a course cannot be deleted
|
85
|
-
payload = {
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
84
|
+
payload = {
|
85
|
+
'Name' => '', # String
|
86
|
+
'Code' => 'off_SEMESTERCODE_STARNUM', # String
|
87
|
+
'Path' => '', # String
|
88
|
+
'CourseTemplateId' => 99_989, # number: D2L_ID
|
89
|
+
'SemesterId' => nil, # number: D2L_ID | nil
|
90
|
+
'StartDate' => nil, # String: UTCDateTime | nil
|
91
|
+
'EndDate' => nil, # String: UTCDateTime | nil
|
92
|
+
'LocaleId' => nil, # number: D2L_ID | nil
|
93
|
+
'ForceLocale' => false, # bool
|
94
|
+
'ShowAddressBook' => false # bool
|
95
|
+
}.merge!(course_data)
|
96
96
|
check_course_data_validity(payload)
|
97
97
|
# ap payload
|
98
98
|
# requires: CreateCourseOffering JSON block
|
99
99
|
path = "/d2l/api/lp/#{$lp_ver}/courses/"
|
100
100
|
_post(path, payload)
|
101
|
-
#puts '[+] Course creation completed successfully'.green
|
101
|
+
# puts '[+] Course creation completed successfully'.green
|
102
102
|
end
|
103
103
|
|
104
104
|
# Checks whether the updated course data conforms to the valence api for the
|
@@ -112,9 +112,9 @@ def check_updated_course_data_validity(course_data)
|
|
112
112
|
'properties' => {
|
113
113
|
'Name' => { 'type' => 'string' },
|
114
114
|
'Code' => { 'type' => 'string' },
|
115
|
-
'StartDate' => { 'type' =>
|
116
|
-
'EndDate' => { 'type' =>
|
117
|
-
'IsActive' => { 'type' =>
|
115
|
+
'StartDate' => { 'type' => %w(string null) },
|
116
|
+
'EndDate' => { 'type' => %w(string null) },
|
117
|
+
'IsActive' => { 'type' => 'boolean' }
|
118
118
|
}
|
119
119
|
}
|
120
120
|
JSON::Validator.validate!(schema, course_data, validate_schema: true)
|
@@ -127,12 +127,13 @@ end
|
|
127
127
|
# Utilize the second argument and perform a PUT action to replace the old data
|
128
128
|
def update_course_data(course_id, new_data)
|
129
129
|
# Define a valid, empty payload and merge! with the new data.
|
130
|
-
payload = {
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
130
|
+
payload = {
|
131
|
+
'Name' => '', # String
|
132
|
+
'Code' => 'off_SEMESTERCODE_STARNUM', # String
|
133
|
+
'StartDate' => nil, # String: UTCDateTime | nil
|
134
|
+
'EndDate' => nil, # String: UTCDateTime | nil
|
135
|
+
'IsActive' => false # bool
|
136
|
+
}.merge!(new_data)
|
136
137
|
check_updated_course_data_validity(payload)
|
137
138
|
# ap payload
|
138
139
|
# Define a path referencing the courses path
|
@@ -145,8 +146,13 @@ def update_course_data(course_id, new_data)
|
|
145
146
|
# Provide feedback that the update was successful
|
146
147
|
end
|
147
148
|
|
148
|
-
#
|
149
|
-
def update_course_image(org_unit_id,
|
149
|
+
# REVIEW: Update the course image for a course offering.
|
150
|
+
def update_course_image(org_unit_id, image_file_path)
|
151
|
+
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}/image"
|
152
|
+
# (SCHEMA) Make sure file isnt > 2MB
|
153
|
+
raise ArgumentError, "File referrenced by 'image_file_path' must be less than 1000KB." if File.size(image_file_path) > 2_000_000
|
154
|
+
raise ArgumentError, "File referrenced by 'image_file_path' is not a valid image." if MIME::Types.type_for(image_file_path).first.media_type.downcase.casecmp("image").zero?
|
155
|
+
_image_upload(path, image_file_path, "PUT")
|
150
156
|
# PUT /d2l/api/lp/(version)/courses/(orgUnitId)/image
|
151
157
|
end
|
152
158
|
|
@@ -178,13 +184,13 @@ def check_create_copy_job_request_validity(create_copy_job_request)
|
|
178
184
|
'properties' => {
|
179
185
|
'SourceOrgUnitId' => { 'type' => 'integer' },
|
180
186
|
'Components' => {
|
181
|
-
'type' =>
|
187
|
+
'type' => %w(array null),
|
182
188
|
'items' =>
|
183
189
|
{
|
184
|
-
'type' =>
|
190
|
+
'type' => 'string'
|
185
191
|
}
|
186
192
|
},
|
187
|
-
'CallbackUrl' => { 'type' =>
|
193
|
+
'CallbackUrl' => { 'type' => %w(string null) }
|
188
194
|
}
|
189
195
|
}
|
190
196
|
JSON::Validator.validate!(schema, create_copy_job_request, validate_schema: true)
|
@@ -192,7 +198,7 @@ end
|
|
192
198
|
|
193
199
|
# simple schema check to assure the course component is an actual course component
|
194
200
|
# returns: boolean
|
195
|
-
def
|
201
|
+
def course_component?(key)
|
196
202
|
valid_components = %w(AttendanceRegisters Glossary News Checklists
|
197
203
|
Grades QuestionLibrary Competencies GradesSettings
|
198
204
|
Quizzes Content Groups ReleaseConditions CourseFiles
|
@@ -216,19 +222,17 @@ def create_new_copy_job_request(org_unit_id, create_copy_job_request)
|
|
216
222
|
# Check each one of the components to see if they are valid Component types
|
217
223
|
payload["Components"].each do |component|
|
218
224
|
# If one of the components is not valid, cancel the CopyJobRequest operation
|
219
|
-
if(
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
end
|
225
|
+
next if course_component?(key)
|
226
|
+
puts "'#{component}' specified is not a valid Copy Job Request component"
|
227
|
+
puts "Please retry with a valid course component such as 'Dropbox' or 'Grades'"
|
228
|
+
break
|
224
229
|
end
|
225
230
|
path = "/d2l/api/le/#{$le_ver}/import/#{org_unit_id}/copy/"
|
226
231
|
_post(path, payload)
|
227
232
|
# Returns CreateCopyJobResponse JSON block
|
228
233
|
end
|
229
234
|
|
230
|
-
#
|
231
|
-
# TODO: --UNSTABLE-- Retrieve the list of logs for course copy jobs.
|
235
|
+
# TODO: UNSTABLE!!!! Retrieve the list of logs for course copy jobs.
|
232
236
|
# Query Params:
|
233
237
|
# --OPTIONAL--
|
234
238
|
# -bookmark : string
|
@@ -263,13 +267,14 @@ def get_course_import_job_request_logs(org_unit_id, job_token, bookmark = '')
|
|
263
267
|
# returns PAGED RESULT of ImportCourseLog JSON blocks following bookmark param
|
264
268
|
end
|
265
269
|
|
266
|
-
#
|
267
|
-
# INPUT: simple file upload process
|
268
|
-
def create_course_import_request(org_unit_id, callback_url = '')
|
269
|
-
|
270
|
-
|
271
|
-
#
|
272
|
-
|
270
|
+
# REVIEW: Create a new course import job request.
|
271
|
+
# INPUT: simple file upload process -- using "course package" as the uploaded file
|
272
|
+
def create_course_import_request(org_unit_id, file_path, callback_url = '')
|
273
|
+
path = "/d2l/le/#{le_ver}/import/#{org_unit_id}/imports/"
|
274
|
+
path += "?callbackUrl=#{callback_url}" if callback_url != ''
|
275
|
+
# TODO: (SCHEMA) Find out WTH a 'course package' entails as far as standards.
|
276
|
+
_course_package_upload(path, file_path, "POST")
|
277
|
+
# RETURNS: Parsed CreateImportJobResponse JSON block.
|
273
278
|
end
|
274
279
|
|
275
280
|
################################################################################
|
@@ -304,10 +309,11 @@ def get_courses_by_code(org_unit_code)
|
|
304
309
|
all_courses = get_all_courses
|
305
310
|
courses = []
|
306
311
|
all_courses.each do |course|
|
307
|
-
courses.push(course) if course["Code"].downcase.include?
|
312
|
+
courses.push(course) if course["Code"].downcase.include? org_unit_code.to_s.downcase
|
308
313
|
end
|
309
314
|
courses
|
310
315
|
end
|
316
|
+
|
311
317
|
# Retrieves all courses that have a particular string (org_unit_name) within
|
312
318
|
# their names. This is done by first defining that none are found yet and then
|
313
319
|
# searching through all course for ones that do have a particular string within
|
@@ -352,7 +358,7 @@ def get_courses_by_property_by_regex(property, regex)
|
|
352
358
|
courses_results = []
|
353
359
|
results = get_all_courses
|
354
360
|
results.each do |x|
|
355
|
-
courses_results.push(x)
|
361
|
+
courses_results.push(x) unless (x[property] =~ regex).nil?
|
356
362
|
end
|
357
363
|
courses_results
|
358
364
|
# returns array of all matching courses in JSON format.
|