d2l_sdk 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/d2l_sdk.rb +16 -14
- data/lib/d2l_sdk/auth.rb +1 -1
- data/lib/d2l_sdk/config_variables.rb +81 -5
- data/lib/d2l_sdk/course.rb +184 -136
- data/lib/d2l_sdk/course_content.rb +148 -23
- data/lib/d2l_sdk/course_template.rb +78 -69
- data/lib/d2l_sdk/demographics.rb +62 -22
- data/lib/d2l_sdk/enroll.rb +159 -84
- data/lib/d2l_sdk/grades.rb +352 -0
- data/lib/d2l_sdk/group.rb +1 -0
- data/lib/d2l_sdk/news.rb +97 -0
- data/lib/d2l_sdk/org_unit.rb +205 -167
- data/lib/d2l_sdk/requests.rb +3 -14
- data/lib/d2l_sdk/section.rb +77 -52
- data/lib/d2l_sdk/semester.rb +3 -0
- data/lib/d2l_sdk/setup_versions.rb +14 -0
- data/lib/d2l_sdk/user.rb +334 -68
- data/lib/d2l_sdk/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88964b8ade0908b80eda0463f78cc82a18ca4c6a
|
4
|
+
data.tar.gz: 855c097579e67071038f779cee78e7b82daafddb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7c1ccbd845a45c2f51680e603309f5b9a72f0572b32213c6a2350012fa29331f9fed7708ea494b73df3bd356472489522b7275d06f26d863afd4006e5c0ef0d
|
7
|
+
data.tar.gz: d8476be7c9e325f11421bb91ff2cb11f1fe4622c11f026c93f5b94ece96020cf08694f30fc12f9ef2368c10ec6b3bf216a0ca8838f751d57fe9b9cebe1cc1ffd
|
data/lib/d2l_sdk.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
require_relative 'd2l_sdk/
|
2
|
-
require_relative 'd2l_sdk/
|
3
|
-
require_relative 'd2l_sdk/
|
4
|
-
require_relative 'd2l_sdk/
|
5
|
-
require_relative 'd2l_sdk/
|
6
|
-
require_relative 'd2l_sdk/
|
7
|
-
require_relative 'd2l_sdk/
|
8
|
-
require_relative 'd2l_sdk/
|
9
|
-
require_relative 'd2l_sdk/
|
10
|
-
require_relative 'd2l_sdk/
|
11
|
-
require_relative 'd2l_sdk/
|
12
|
-
require_relative 'd2l_sdk/
|
13
|
-
require_relative 'd2l_sdk/
|
14
|
-
|
1
|
+
require_relative 'd2l_sdk/setup_versions' # Checked
|
2
|
+
require_relative 'd2l_sdk/course_template' # Checked
|
3
|
+
require_relative 'd2l_sdk/course' # Checked
|
4
|
+
require_relative 'd2l_sdk/datahub' # Checked
|
5
|
+
require_relative 'd2l_sdk/enroll' # Checked
|
6
|
+
require_relative 'd2l_sdk/group' # Checked
|
7
|
+
require_relative 'd2l_sdk/org_unit' # Checked
|
8
|
+
require_relative 'd2l_sdk/section' # Checked
|
9
|
+
require_relative 'd2l_sdk/semester' # Checked
|
10
|
+
require_relative 'd2l_sdk/user' # Checked
|
11
|
+
require_relative 'd2l_sdk/config_variables' # Checked
|
12
|
+
require_relative 'd2l_sdk/demographics' # Checked
|
13
|
+
require_relative 'd2l_sdk/logging' # Checked
|
14
|
+
require_relative 'd2l_sdk/course_content' # Checked
|
15
|
+
require_relative 'd2l_sdk/grades' # Checked -- added 3/21
|
16
|
+
require_relative 'd2l_sdk/news' # Checked -- added 3/21
|
15
17
|
|
16
18
|
puts "d2l_sdk loaded"
|
data/lib/d2l_sdk/auth.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems' # useful
|
|
2
2
|
require 'awesome_print' # useful for debugging
|
3
3
|
require 'base64' # NEEDED
|
4
4
|
require 'json' # NEEDED
|
5
|
-
require '
|
5
|
+
require 'rest-client' # NEEDED
|
6
6
|
require 'openssl' # NEEDED
|
7
7
|
require 'open-uri' # NEEDED
|
8
8
|
require 'colorize' # useful
|
@@ -1,26 +1,37 @@
|
|
1
1
|
require_relative 'auth'
|
2
2
|
|
3
|
+
|
4
|
+
@debug = false
|
5
|
+
|
3
6
|
########################
|
4
|
-
#
|
7
|
+
# DEFINITIONS:##########
|
5
8
|
########################
|
6
|
-
|
9
|
+
# NOTE: These provide access to the definition meta-data
|
10
|
+
# surrounding configuration variables.
|
7
11
|
|
8
|
-
#Retrieve the definitions for all the configuration variables the
|
12
|
+
# Retrieve the definitions for all the configuration variables the
|
13
|
+
# user has access to view.
|
9
14
|
def get_all_config_var_definitions(search='', bookmark='')
|
10
15
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/definitions/"
|
11
16
|
path += "?search=#{search}" if search != ''
|
12
17
|
path += "?bookmark=#{bookmark}" if bookmark != ''
|
13
18
|
_get(path)
|
14
|
-
#returns paged result set of Definition JSON data blocks
|
19
|
+
# returns paged result set of Definition JSON data blocks
|
15
20
|
end
|
16
21
|
|
17
|
-
#Retrieve the definitions for a configuration variable.
|
22
|
+
# Retrieve the definitions for a configuration variable.
|
18
23
|
def get_config_var_definitions(variable_id)
|
19
24
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/(#{variable_id}/definition"
|
20
25
|
_get(path)
|
21
26
|
# returns Definition JSON data block
|
22
27
|
end
|
23
28
|
|
29
|
+
########################
|
30
|
+
# VALUES:###############
|
31
|
+
########################
|
32
|
+
# NOTE: These provide access to the values assigned to configuration
|
33
|
+
# variables in the running back-end service.
|
34
|
+
|
24
35
|
#Retrieve the value summary for a configuration variable.
|
25
36
|
def get_config_var_values(variable_id)
|
26
37
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values"
|
@@ -50,6 +61,7 @@ def get_config_var_org_unit_override_value(variable_id, org_unit_id)
|
|
50
61
|
# returns OrgUnitValue JSON block
|
51
62
|
end
|
52
63
|
|
64
|
+
# NOTE: UNSTABLE!!!
|
53
65
|
# Retrieve the effective value for a configuration variable within an org unit.
|
54
66
|
def get_config_var_org_unit_effective_value(variable_id, org_unit_id)
|
55
67
|
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/effectiveValues/orgUnits/#{org_unit_id}"
|
@@ -75,7 +87,71 @@ def get_config_var_system_value(variable_id)
|
|
75
87
|
_get(path)
|
76
88
|
end
|
77
89
|
|
90
|
+
# REVIEW: Set a new org value for a configuration variable.
|
91
|
+
def set_config_var_org_value(variable_id, org_value)
|
92
|
+
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/org"
|
93
|
+
if org_value.is_a? String || org_value.nil?
|
94
|
+
payload = {"OrgValue" => org_value}
|
95
|
+
_put(path, payload)
|
96
|
+
else
|
97
|
+
raise ArgumentError, "Argument 'org_value' is not a String or nil"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# REVIEW: Set a new org unit override value for a configuration variable.
|
102
|
+
def set_config_var_override_value(variable_id, org_unit_id, org_unit_value)
|
103
|
+
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/orgUnits/#{org_unit_id}"
|
104
|
+
if org_unit_value.is_a? String || org_unit_value.nil?
|
105
|
+
payload = {"OrgUnitValue" => org_unit_value}
|
106
|
+
_put(path, payload)
|
107
|
+
else
|
108
|
+
raise ArgumentError, "Argument 'org_unit_value' is not a String or nil"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# REVIEW: Set a new role override value for a configuration variable.
|
113
|
+
def set_config_var_role_value(variable_id, role_id, role_value)
|
114
|
+
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/roles/#{role_id}"
|
115
|
+
if role_value.is_a? String || role_value.nil?
|
116
|
+
payload = {"RoleValue" => role_value}
|
117
|
+
_put(path, payload)
|
118
|
+
else
|
119
|
+
raise ArgumentError, "Argument 'role_value' is not a String or nil"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# REVIEW: Set a new system value for a configuration variable.
|
124
|
+
def set_config_var_system_value(variable_id, system_value)
|
125
|
+
path = "/d2l/api/lp/#{$lp_ver}/configVariables/#{variable_id}/values/system"
|
126
|
+
if system_value.is_a?(String) || system_value.nil?
|
127
|
+
payload = {"SystemValue" => system_value}
|
128
|
+
_put(path, payload)
|
129
|
+
else
|
130
|
+
raise ArgumentError, "Argument 'system_value' is not a String or nil"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
########################
|
135
|
+
# RESOLVER:#############
|
136
|
+
########################
|
137
|
+
# NOTE: These provide a way to manage a configuration variable’s
|
138
|
+
# resolution strategy.
|
139
|
+
|
140
|
+
# NOTE: UNSTABLE!!!
|
141
|
+
# TODO: UNSTABLE!!! --Restore the default resolution strategy for an org unit configuration variable.
|
142
|
+
def restore_default_org_unit_config_var_resolution(variable_id)
|
143
|
+
# DELETE /d2l/api/lp/(version)/configVariables/(variableId)/resolver
|
144
|
+
end
|
145
|
+
|
146
|
+
# NOTE: UNSTABLE!!!
|
147
|
+
# REVIEW: Retrieve the resolution strategy for an org unit configuration variable.
|
78
148
|
def get_config_var_resolver(variable_id)
|
79
149
|
path = "/d2l/api/lp/#{lp_ver}/configVariables/#{variable_id}/resolver"
|
80
150
|
_get(path)
|
81
151
|
end
|
152
|
+
|
153
|
+
# NOTE: UNSTABLE!!!
|
154
|
+
# TODO: Update the resolution strategy for an org unit configuration variable.
|
155
|
+
def update_org_unit_config_var_resolution(resolver_value)
|
156
|
+
# PUT /d2l/api/lp/(version)/configVariables/(variableId)/resolver
|
157
|
+
end
|
data/lib/d2l_sdk/course.rb
CHANGED
@@ -1,9 +1,48 @@
|
|
1
1
|
require_relative 'requests'
|
2
2
|
require 'json-schema'
|
3
|
+
|
3
4
|
########################
|
4
|
-
#
|
5
|
+
# ACTIONS:##############
|
5
6
|
########################
|
6
7
|
|
8
|
+
# Deletes a course based, referencing it via its org_unit_id
|
9
|
+
# This reference is created through a formatted path appended with the id.
|
10
|
+
# Then, a delete http method is executed using this path, deleting the course.
|
11
|
+
def delete_course_by_id(org_unit_id)
|
12
|
+
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}" # setup user path
|
13
|
+
#ap path
|
14
|
+
_delete(path)
|
15
|
+
puts '[+] Course data deleted successfully'.green
|
16
|
+
end
|
17
|
+
|
18
|
+
# retrieve the list of parent org unit type constraints for course offerings
|
19
|
+
def get_parent_outypes_courses_schema_constraints
|
20
|
+
path = "/d2l/api/lp/#{$lp_ver}/courses/schema"
|
21
|
+
_get(path)
|
22
|
+
# returns a JSON array of SchemaElement blocks
|
23
|
+
end
|
24
|
+
|
25
|
+
# Performs a get request to retrieve a particular course using the org_unit_id
|
26
|
+
# of this particular course. If the course does not exist, as specified by the
|
27
|
+
# org_unit_id, the response is typically a 404 error.
|
28
|
+
#
|
29
|
+
# returns: JSON object of the course
|
30
|
+
def get_course_by_id(org_unit_id)
|
31
|
+
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}"
|
32
|
+
_get(path)
|
33
|
+
# returns: JSON object of the course
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def get_course_image(org_unit_id, width = 0, height = 0)
|
38
|
+
path = "/d2l/api/lp/#{lp_ver}/courses/#{org_unit_id}/image"
|
39
|
+
if width > 0 && height > 0
|
40
|
+
path += "?width=#{width}"
|
41
|
+
path += "&height=#{height}"
|
42
|
+
end
|
43
|
+
_get(path)
|
44
|
+
end
|
45
|
+
|
7
46
|
# Checks whether the created course data conforms to the valence api for the
|
8
47
|
# course data JSON object. If it does conform, then nothing happens and it
|
9
48
|
# simply returns true. If it does not conform, then the JSON validator raises
|
@@ -59,93 +98,7 @@ def create_course_data(course_data)
|
|
59
98
|
# requires: CreateCourseOffering JSON block
|
60
99
|
path = "/d2l/api/lp/#{$lp_ver}/courses/"
|
61
100
|
_post(path, payload)
|
62
|
-
puts '[+] Course creation completed successfully'.green
|
63
|
-
end
|
64
|
-
|
65
|
-
# In order to retrieve an entire department's class list, this method uses a
|
66
|
-
# predefined org_unit identifier. This identifier is then appended to a path
|
67
|
-
# and all classes withiin the department are returned as JSON objects in an arr.
|
68
|
-
#
|
69
|
-
# returns: JSON array of classes.
|
70
|
-
def get_org_department_classes(org_unit_id)
|
71
|
-
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/#{org_unit_id}"
|
72
|
-
_get(path)
|
73
|
-
# returns: JSON array of classes.
|
74
|
-
end
|
75
|
-
|
76
|
-
# Performs a get request to retrieve a particular course using the org_unit_id
|
77
|
-
# of this particular course. If the course does not exist, as specified by the
|
78
|
-
# org_unit_id, the response is typically a 404 error.
|
79
|
-
#
|
80
|
-
# returns: JSON object of the course
|
81
|
-
def get_course_by_id(org_unit_id)
|
82
|
-
path = "/d2l/api/lp/#{$lp_ver}/courses/#{org_unit_id}"
|
83
|
-
_get(path)
|
84
|
-
# returns: JSON object of the course
|
85
|
-
end
|
86
|
-
|
87
|
-
def get_all_courses
|
88
|
-
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/6606/descendants/?ouTypeId=3"
|
89
|
-
_get(path)
|
90
|
-
end
|
91
|
-
|
92
|
-
# much slower means of getting courses if less than 100 courses
|
93
|
-
def get_courses_by_code(org_unit_code)
|
94
|
-
all_courses = get_all_courses
|
95
|
-
courses = []
|
96
|
-
all_courses.each do |course|
|
97
|
-
courses.push(course) if course["Code"].downcase.include? "#{org_unit_code}".downcase
|
98
|
-
end
|
99
|
-
courses
|
100
|
-
end
|
101
|
-
# Retrieves all courses that have a particular string (org_unit_name) within
|
102
|
-
# their names. This is done by first defining that none are found yet and then
|
103
|
-
# searching through all course for ones that do have a particular string within
|
104
|
-
# their name, the matches are pushed into the previously empty array of matches.
|
105
|
-
# This array is subsequently returned; if none were found, a message is returned
|
106
|
-
#
|
107
|
-
# returns: JSON array of matching course data objects
|
108
|
-
def get_courses_by_name(org_unit_name)
|
109
|
-
get_courses_by_property_by_string('Name', org_unit_name)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Retrieves all matching courses that are found using a property and a search
|
113
|
-
# string. First, it is considered that the class is not found. Then, all courses
|
114
|
-
# are retrieved and stored as a JSON array in the varaible +results+. After this
|
115
|
-
# each of the +results+ is iterated, downcased, and checked for their matching
|
116
|
-
# of the particular search string. If there is a match, they are pushed to
|
117
|
-
# an array called +courses_results+. This is returned at the end of this op.
|
118
|
-
#
|
119
|
-
# returns: array of JSON course objects (that match the search string/property)
|
120
|
-
def get_courses_by_property_by_string(property, search_string)
|
121
|
-
puts "[+] Searching for courses using search string: #{search_string}".yellow +
|
122
|
-
+ " -- And property: #{property}"
|
123
|
-
courses_results = []
|
124
|
-
results = get_all_courses
|
125
|
-
results.each do |x|
|
126
|
-
if x[property].downcase.include? search_string.downcase
|
127
|
-
courses_results.push(x)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
courses_results
|
131
|
-
# returns array of all matching courses in JSON format.
|
132
|
-
end
|
133
|
-
|
134
|
-
# Retrieves all courses that have the specified prop match a regular expression.
|
135
|
-
# This is done by iterating through all courses and returning an array of all
|
136
|
-
# that match a regular expression.
|
137
|
-
#
|
138
|
-
# returns: array of JSON course objects (with property that matches regex)
|
139
|
-
def get_courses_by_property_by_regex(property, regex)
|
140
|
-
puts "[+] Searching for courses using regex: #{regex}".yellow +
|
141
|
-
+ " -- And property: #{property}"
|
142
|
-
courses_results = []
|
143
|
-
results = get_all_courses
|
144
|
-
results.each do |x|
|
145
|
-
courses_results.push(x) if (x[property] =~ regex) != nil
|
146
|
-
end
|
147
|
-
courses_results
|
148
|
-
# returns array of all matching courses in JSON format.
|
101
|
+
#puts '[+] Course creation completed successfully'.green
|
149
102
|
end
|
150
103
|
|
151
104
|
# Checks whether the updated course data conforms to the valence api for the
|
@@ -192,16 +145,30 @@ def update_course_data(course_id, new_data)
|
|
192
145
|
# Provide feedback that the update was successful
|
193
146
|
end
|
194
147
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
148
|
+
# TODO: Update the course image for a course offering.
|
149
|
+
def update_course_image(org_unit_id, image_file)
|
150
|
+
# PUT /d2l/api/lp/(version)/courses/(orgUnitId)/image
|
151
|
+
end
|
152
|
+
|
153
|
+
########################
|
154
|
+
# COURSE TEMPLATES:#####
|
155
|
+
########################
|
156
|
+
# NOTE: Course template related functions are now in 'course_template.rb'
|
157
|
+
|
158
|
+
########################
|
159
|
+
# COPYING COURSES:######
|
160
|
+
########################
|
161
|
+
|
162
|
+
def get_copy_job_request_status(org_unit_id, job_token)
|
163
|
+
path = "/d2l/api/le/#{le_ver}/import/#{org_unit_id}/copy/#{job_token}"
|
164
|
+
_get(path)
|
165
|
+
# returns GetCopyJobResponse JSON block
|
166
|
+
# GetImportJobResponse:
|
167
|
+
# {"JobToken" => <string:COPYJOBSTATUS_T>,
|
168
|
+
# "TargetOrgUnitID" => <number:D2LID>,
|
169
|
+
# "Status" => <string:IMPORTJOBTSTATUS_T>}
|
170
|
+
# States of getImport: UPLOADING, PROCESSING, PROCESSED, IMPORTING,
|
171
|
+
# IMPORTFAILED, COMPLETED
|
205
172
|
end
|
206
173
|
|
207
174
|
def check_create_copy_job_request_validity(create_copy_job_request)
|
@@ -223,6 +190,19 @@ def check_create_copy_job_request_validity(create_copy_job_request)
|
|
223
190
|
JSON::Validator.validate!(schema, create_copy_job_request, validate_schema: true)
|
224
191
|
end
|
225
192
|
|
193
|
+
# simple schema check to assure the course component is an actual course component
|
194
|
+
# returns: boolean
|
195
|
+
def is_course_component(key)
|
196
|
+
valid_components = %w(AttendanceRegisters Glossary News Checklists
|
197
|
+
Grades QuestionLibrary Competencies GradesSettings
|
198
|
+
Quizzes Content Groups ReleaseConditions CourseFiles
|
199
|
+
Homepages Rubrics Discussions IntelligentAgents
|
200
|
+
Schedule DisplaySettings Links SelfAssessments
|
201
|
+
Dropbox LtiLink Surveys Faq LtiTP ToolNames Forms
|
202
|
+
Navbars Widgets)
|
203
|
+
valid_components.include?(key)
|
204
|
+
# returns whether the key is actually a course component
|
205
|
+
end
|
226
206
|
|
227
207
|
def create_new_copy_job_request(org_unit_id, create_copy_job_request)
|
228
208
|
payload =
|
@@ -247,27 +227,26 @@ def create_new_copy_job_request(org_unit_id, create_copy_job_request)
|
|
247
227
|
# Returns CreateCopyJobResponse JSON block
|
248
228
|
end
|
249
229
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
230
|
+
# NOTE: UNSTABLE!!!!
|
231
|
+
# TODO: --UNSTABLE-- Retrieve the list of logs for course copy jobs.
|
232
|
+
# Query Params:
|
233
|
+
# --OPTIONAL--
|
234
|
+
# -bookmark : string
|
235
|
+
# -page_size : number
|
236
|
+
# -source_org_unit_id : number
|
237
|
+
# -destination_org_unit_id : number
|
238
|
+
# -start_date : UTCDateTime
|
239
|
+
# -end_date : UTCDateTime
|
240
|
+
# RETURNS: An object list page containing the resulting CopyCourseLogMessage data blocks
|
241
|
+
def get_copy_jobs_logs(bookmark = '', page_size = 0, source_org_unit_id = 0,
|
242
|
+
destination_org_unit_id = 0, start_date = '', end_date = '')
|
243
|
+
# GET /d2l/api/le/(version)/ccb/logs
|
260
244
|
end
|
261
|
-
#########
|
262
|
-
=begin
|
263
|
-
def create_course_import_request(org_unit_id, callback_url = '')
|
264
|
-
path = "/d2l/le/#{le_ver}/import/#{org_unit_id}/imports/"
|
265
|
-
path += "?callbackUrl=#{callback_url}" if callback_url != ''
|
266
|
-
#_post(path, payload)
|
267
|
-
#_upload(path, json, file, 'POST', 'file', filename)
|
268
245
|
|
269
|
-
|
270
|
-
|
246
|
+
########################
|
247
|
+
# IMPORTING COURSES:####
|
248
|
+
########################
|
249
|
+
|
271
250
|
def get_course_import_job_request_status(org_unit_id, job_token)
|
272
251
|
path = "/d2l/api/le/#{le_ver}/import/#{org_unit_id}/imports/#{job_token}"
|
273
252
|
_get(path)
|
@@ -284,28 +263,97 @@ def get_course_import_job_request_logs(org_unit_id, job_token, bookmark = '')
|
|
284
263
|
# returns PAGED RESULT of ImportCourseLog JSON blocks following bookmark param
|
285
264
|
end
|
286
265
|
|
287
|
-
#
|
288
|
-
#
|
289
|
-
|
290
|
-
|
291
|
-
path
|
292
|
-
#
|
293
|
-
|
294
|
-
puts '[+] Course data deleted successfully'.green
|
266
|
+
# TODO: Create a new course import job request.
|
267
|
+
# INPUT: simple file upload process
|
268
|
+
def create_course_import_request(org_unit_id, callback_url = '')
|
269
|
+
#path = "/d2l/le/#{le_ver}/import/#{org_unit_id}/imports/"
|
270
|
+
#path += "?callbackUrl=#{callback_url}" if callback_url != ''
|
271
|
+
#_post(path, payload)
|
272
|
+
#_upload(path, json, file, 'POST', 'file', filename)
|
295
273
|
end
|
296
274
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
275
|
+
################################################################################
|
276
|
+
################################################################################
|
277
|
+
|
278
|
+
|
279
|
+
###########################
|
280
|
+
# ADDITIONAL FUNCTIONS:####
|
281
|
+
###########################
|
282
|
+
|
283
|
+
|
284
|
+
# In order to retrieve an entire department's class list, this method uses a
|
285
|
+
# predefined org_unit identifier. This identifier is then appended to a path
|
286
|
+
# and all classes withiin the department are returned as JSON objects in an arr.
|
287
|
+
#
|
288
|
+
# returns: JSON array of classes.
|
289
|
+
def get_org_department_classes(org_unit_id)
|
290
|
+
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/#{org_unit_id}"
|
291
|
+
_get(path)
|
292
|
+
# returns: JSON array of classes.
|
302
293
|
end
|
303
294
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
path
|
308
|
-
path
|
295
|
+
|
296
|
+
|
297
|
+
def get_all_courses
|
298
|
+
path = "/d2l/api/lp/#{$lp_ver}/orgstructure/6606/descendants/?ouTypeId=3"
|
299
|
+
_get(path)
|
300
|
+
end
|
301
|
+
|
302
|
+
# much slower means of getting courses if less than 100 courses
|
303
|
+
def get_courses_by_code(org_unit_code)
|
304
|
+
all_courses = get_all_courses
|
305
|
+
courses = []
|
306
|
+
all_courses.each do |course|
|
307
|
+
courses.push(course) if course["Code"].downcase.include? "#{org_unit_code}".downcase
|
309
308
|
end
|
310
|
-
|
309
|
+
courses
|
310
|
+
end
|
311
|
+
# Retrieves all courses that have a particular string (org_unit_name) within
|
312
|
+
# their names. This is done by first defining that none are found yet and then
|
313
|
+
# searching through all course for ones that do have a particular string within
|
314
|
+
# their name, the matches are pushed into the previously empty array of matches.
|
315
|
+
# This array is subsequently returned; if none were found, a message is returned
|
316
|
+
#
|
317
|
+
# returns: JSON array of matching course data objects
|
318
|
+
def get_courses_by_name(org_unit_name)
|
319
|
+
get_courses_by_property_by_string('Name', org_unit_name)
|
320
|
+
end
|
321
|
+
|
322
|
+
# Retrieves all matching courses that are found using a property and a search
|
323
|
+
# string. First, it is considered that the class is not found. Then, all courses
|
324
|
+
# are retrieved and stored as a JSON array in the varaible +results+. After this
|
325
|
+
# each of the +results+ is iterated, downcased, and checked for their matching
|
326
|
+
# of the particular search string. If there is a match, they are pushed to
|
327
|
+
# an array called +courses_results+. This is returned at the end of this op.
|
328
|
+
#
|
329
|
+
# returns: array of JSON course objects (that match the search string/property)
|
330
|
+
def get_courses_by_property_by_string(property, search_string)
|
331
|
+
puts "[+] Searching for courses using search string: #{search_string}".yellow +
|
332
|
+
+ " -- And property: #{property}"
|
333
|
+
courses_results = []
|
334
|
+
results = get_all_courses
|
335
|
+
results.each do |x|
|
336
|
+
if x[property].downcase.include? search_string.downcase
|
337
|
+
courses_results.push(x)
|
338
|
+
end
|
339
|
+
end
|
340
|
+
courses_results
|
341
|
+
# returns array of all matching courses in JSON format.
|
342
|
+
end
|
343
|
+
|
344
|
+
# Retrieves all courses that have the specified prop match a regular expression.
|
345
|
+
# This is done by iterating through all courses and returning an array of all
|
346
|
+
# that match a regular expression.
|
347
|
+
#
|
348
|
+
# returns: array of JSON course objects (with property that matches regex)
|
349
|
+
def get_courses_by_property_by_regex(property, regex)
|
350
|
+
puts "[+] Searching for courses using regex: #{regex}".yellow +
|
351
|
+
+ " -- And property: #{property}"
|
352
|
+
courses_results = []
|
353
|
+
results = get_all_courses
|
354
|
+
results.each do |x|
|
355
|
+
courses_results.push(x) if (x[property] =~ regex) != nil
|
356
|
+
end
|
357
|
+
courses_results
|
358
|
+
# returns array of all matching courses in JSON format.
|
311
359
|
end
|