lusi_api 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +58 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +235 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/lusi_api.rb +5 -0
- data/lib/lusi_api/calendar.rb +234 -0
- data/lib/lusi_api/core/api.rb +190 -0
- data/lib/lusi_api/core/code.rb +101 -0
- data/lib/lusi_api/core/exceptions.rb +47 -0
- data/lib/lusi_api/core/lookup.rb +612 -0
- data/lib/lusi_api/core/util.rb +102 -0
- data/lib/lusi_api/core/xml.rb +168 -0
- data/lib/lusi_api/country.rb +111 -0
- data/lib/lusi_api/course.rb +1300 -0
- data/lib/lusi_api/enrolment.rb +247 -0
- data/lib/lusi_api/organisation.rb +291 -0
- data/lib/lusi_api/person/staff.rb +115 -0
- data/lib/lusi_api/person/student.rb +551 -0
- data/lib/lusi_api/service_account.rb +121 -0
- data/lib/lusi_api/service_method.rb +52 -0
- data/lib/lusi_api/version.rb +5 -0
- data/lib/lusi_api/vle.rb +329 -0
- data/lusi_api.gemspec +36 -0
- metadata +182 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
|
4
|
+
module LUSI
|
5
|
+
module API
|
6
|
+
module Core
|
7
|
+
module Util
|
8
|
+
|
9
|
+
|
10
|
+
# Converts a LUSI year identity code into a numeric or LUSI::API::Calendar::Year instance representing the year
|
11
|
+
# If a lookup service is supplied, the identity code is resolved by a LUSI API call.
|
12
|
+
# Otherwise, the year is calculated as: year = year_identity.to_i + 1900
|
13
|
+
# @param year_identity [String] the year identity code
|
14
|
+
# @param lookup [LUSI::API::Lookup::LookupService] the LUSI lookup service
|
15
|
+
# @param as_instance [Boolean] if true, return a LUSI::API::Calendar::Year instance instead of a year
|
16
|
+
# @param offset [Integer] an offset (in years) to apply to the year
|
17
|
+
# @return [Integer] the year represented by the year identity code
|
18
|
+
def lusi_year(year_identity = nil, lookup = nil, as_instance: false, offset: 0)
|
19
|
+
|
20
|
+
# Convert the year identity to an integer
|
21
|
+
case
|
22
|
+
when year_identity.is_a?(LUSI::API::Calendar::Week)
|
23
|
+
year_identity = year_identity.year.identity.to_i
|
24
|
+
when year_identity.is_a?(LUSI::API::Calendar::Year)
|
25
|
+
year_identity = year_identity.identity.to_i
|
26
|
+
when year_identity.is_a?(String) && year_identity.length == 6
|
27
|
+
# Assume a 6-character string is an identity code
|
28
|
+
year_identity = year_identity.to_i
|
29
|
+
else
|
30
|
+
# Assume anything else is a year and convert it to an identity
|
31
|
+
year_identity = lusi_year_identity(year.to_i)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Apply the offset
|
35
|
+
year_identity += offset.to_i
|
36
|
+
|
37
|
+
year_identity = "%06d" % year_identity
|
38
|
+
if lookup
|
39
|
+
year = lookup.lookup(:year, year_identity)
|
40
|
+
if as_instance
|
41
|
+
year
|
42
|
+
else
|
43
|
+
year ? year.full_year.to_i : nil
|
44
|
+
end
|
45
|
+
else
|
46
|
+
# Year identities are (year - 1900) zero-padded to six digits
|
47
|
+
year = year_identity.to_i + 1900
|
48
|
+
if as_instance
|
49
|
+
yy = year % 100
|
50
|
+
description = "%02s/%02s" % [yy, (yy + 1) % 100]
|
51
|
+
LUSI::API::Calendar::Year.new(nil, lookup, code: year_identity, description: description,
|
52
|
+
full_year: year.to_s)
|
53
|
+
else
|
54
|
+
year
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
# Converts a year into a LUSI year identity code
|
61
|
+
# @param year [Date, DateTime, Numeric, String, LUSI::API::Calendar::Week, LUSI::API::Calendar::Year] the year
|
62
|
+
# @param offset [Integer] an offset (in years) to apply to the year
|
63
|
+
# @return [String] the year identity code
|
64
|
+
def lusi_year_identity(year = nil, offset: 0)
|
65
|
+
|
66
|
+
offset = offset.to_i
|
67
|
+
|
68
|
+
# Get the year as an integer
|
69
|
+
# If the year is provided as an identity, it's converted to a numeric year
|
70
|
+
year_identity = nil
|
71
|
+
case
|
72
|
+
when year.is_a?(LUSI::API::Calendar::Week)
|
73
|
+
year_identity = year.year.identity
|
74
|
+
when year.is_a?(LUSI::API::Calendar::Year)
|
75
|
+
year_identity = year.identity
|
76
|
+
when year.is_a?(Date) || year.is_a?(DateTime) || year.is_a?(Time)
|
77
|
+
year = year.year
|
78
|
+
when year.is_a?(String)
|
79
|
+
if year.length == 6
|
80
|
+
year_identity = year
|
81
|
+
else
|
82
|
+
year = year.to_i
|
83
|
+
end
|
84
|
+
when year.is_a?(Numeric)
|
85
|
+
year = year.to_i
|
86
|
+
else
|
87
|
+
year = Time.now.year
|
88
|
+
end
|
89
|
+
year = year_identity.to_i + 1900 if year_identity
|
90
|
+
|
91
|
+
# Return the year identity for the year with offset applied
|
92
|
+
"%06d" % (year + offset - 1900)
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
# Creates a LUSI Year instance from a year
|
97
|
+
#
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
|
5
|
+
module LUSI
|
6
|
+
module API
|
7
|
+
module Core
|
8
|
+
module XML
|
9
|
+
|
10
|
+
NAMESPACE = 'Uol.Cis.Lusi.WebService'
|
11
|
+
|
12
|
+
def self.lookup(xml = nil, lookup = nil, service = nil, path = nil, default = nil, &block)
|
13
|
+
return default if xml.nil? || lookup.nil? || service.nil?
|
14
|
+
key = xml_content_at(xml, path)
|
15
|
+
result = lookup.lookup(service, key, default)
|
16
|
+
yield(result) if block_given?
|
17
|
+
result
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.xml(xml = nil, path = nil, default = nil, filter: nil, &block)
|
21
|
+
_xml(xml, path, default, single: false, content: false, filter: filter, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.xml_at(xml = nil, path = nil, default = nil, &block)
|
25
|
+
_xml(xml, path, default, single: true, content: false, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.xml_boolean(xml = nil, path = nil, default = nil, &block)
|
29
|
+
content = xml_content(xml, path, default)
|
30
|
+
content.map { |str| xml_boolean_parse(str, default) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.xml_boolean_at(xml = nil, path = nil, default = nil, &block)
|
34
|
+
xml_boolean_parse(xml_content_at(xml, path, default), default)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.xml_boolean_parse(boolstr = nil, default = nil, true_values = nil, false_values = nil, &block)
|
38
|
+
boolstr = boolstr.to_s.downcase
|
39
|
+
false_values ||= ['false', 'n', 'no']
|
40
|
+
true_values ||= ['true', 'y', 'yes']
|
41
|
+
if true_values.include?(boolstr)
|
42
|
+
true
|
43
|
+
elsif false_values.include?(boolstr)
|
44
|
+
false
|
45
|
+
else
|
46
|
+
default
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.xml_content(xml = nil, path = nil, default = nil, &block)
|
51
|
+
_xml(xml, path, default, single: false, content: true, &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.xml_content_at(xml = nil, path = nil, default = nil, &block)
|
55
|
+
_xml(xml, path, default, single: true, content: true, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.xml_datetime(xml = nil, path = nil, default = nil, format = nil, &block)
|
59
|
+
content = xml_content(xml, path, default)
|
60
|
+
content.map { |str| xml_datetime_parse(str, default, format) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.xml_datetime_at(xml = nil, path = nil, default = nil, format = nil, &block)
|
64
|
+
xml_datetime_parse(xml_content_at(xml, path, default), default, format)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.xml_datetime_parse(datestr = nil, default = nil, format = nil, &block)
|
68
|
+
return default if datestr.nil?
|
69
|
+
format ||= '%Y-%m-%dT%H:%M:%S'
|
70
|
+
begin
|
71
|
+
DateTime.strptime(datestr, format)
|
72
|
+
rescue Exception
|
73
|
+
default
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.xml_float(xml = nil, path = nil, default = nil, &block)
|
78
|
+
content = xml_content(xml, path, default)
|
79
|
+
content.map { |str| xml_float_parse(str, default) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.xml_float_at(xml = nil, path = nil, default = nil, &block)
|
83
|
+
xml_float_parse(xml_content_at(xml, path, default), default)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.xml_float_parse(floatstr, default = nil)
|
87
|
+
begin
|
88
|
+
floatstr.to_f
|
89
|
+
rescue
|
90
|
+
default
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.xml_int(xml = nil, path = nil, default = nil, &block)
|
95
|
+
content = xml_content(xml, path, default)
|
96
|
+
content.map { |str| xml_int_parse(str, default) }
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.xml_int_at(xml = nil, path = nil, default = nil, &block)
|
100
|
+
xml_int_parse(xml_content_at(xml, path, default), default)
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.xml_int_parse(intstr, default = nil)
|
104
|
+
begin
|
105
|
+
intstr.to_i
|
106
|
+
rescue
|
107
|
+
default
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
|
113
|
+
def self._xml(xml = nil, path = nil, default = nil, single: false, content: true, filter: nil, &block)
|
114
|
+
|
115
|
+
# Return the default value if no XML is given
|
116
|
+
return default if xml.nil?
|
117
|
+
|
118
|
+
# Return the XML value itself if it's not an accepted XML instance
|
119
|
+
return xml unless xml.is_a?(Nokogiri::XML::Node) or xml.is_a?(Nokogiri::XML::NodeSet)
|
120
|
+
|
121
|
+
if single
|
122
|
+
# Return the first matching node
|
123
|
+
result = xml.at_xpath(path)
|
124
|
+
if result.nil?
|
125
|
+
default
|
126
|
+
else
|
127
|
+
content ? result.content.to_s : result
|
128
|
+
end
|
129
|
+
else
|
130
|
+
# If a code block is provided, return an array of results of applying the block to each node, or an empty
|
131
|
+
# array if no matches exist.
|
132
|
+
# Otherwise return the matching nodeset, or nil of no matches exist
|
133
|
+
nodeset = xml.xpath(path)
|
134
|
+
if block
|
135
|
+
if nodeset.nil? then
|
136
|
+
# Return an empty array for an empty nodeset
|
137
|
+
[]
|
138
|
+
elsif filter.nil?
|
139
|
+
# Apply the block to every node
|
140
|
+
if content
|
141
|
+
nodeset.to_a.map { |node| block.call(node.content.to_s) }
|
142
|
+
else
|
143
|
+
nodeset.to_a.map(&block)
|
144
|
+
end
|
145
|
+
else
|
146
|
+
# Apply the block only to nodes for which the filter returns true
|
147
|
+
result = []
|
148
|
+
if content
|
149
|
+
nodeset.each { |node| result.push(node.content.to_s) if filter.call(node) }
|
150
|
+
else
|
151
|
+
nodeset.each { |node| result.push(block.call(node)) if filter.call(node) }
|
152
|
+
end
|
153
|
+
result
|
154
|
+
end
|
155
|
+
else
|
156
|
+
if content
|
157
|
+
nodeset.to_a.map { |node| node.content.to_s }
|
158
|
+
else
|
159
|
+
nodeset
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'lusi_api/core/code'
|
2
|
+
require 'lusi_api/core/xml'
|
3
|
+
|
4
|
+
|
5
|
+
module LUSI
|
6
|
+
module API
|
7
|
+
module Country
|
8
|
+
|
9
|
+
# Represents a country in the LUSI API
|
10
|
+
class Country < LUSI::API::Core::Code
|
11
|
+
|
12
|
+
# @!attribute [rw] iso_alpha2_code
|
13
|
+
# @return [String, nil] the ISO alpha-2 code for the country
|
14
|
+
attr_accessor :iso_alpha2_code
|
15
|
+
|
16
|
+
# Initialises a new Country instance
|
17
|
+
# @param (see LUSI::API::Core::Code#initialize)
|
18
|
+
# @param iso_alpha2_code [String, nil] the default ISO alpha-2 code for the country
|
19
|
+
# @return [void]
|
20
|
+
def initialize(xml = nil, lookup = nil, iso_alpha2_code: nil, **kwargs)
|
21
|
+
super(xml, lookup, **kwargs)
|
22
|
+
@iso_alpha2_code = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ISOAlpha2Code', iso_alpha2_code)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns a string representation of the Country instance
|
26
|
+
# @return [String] the string representation of the Country instance
|
27
|
+
def to_s
|
28
|
+
@description
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# Represents the country component of an address in the LUSI API
|
35
|
+
class AddressCountry < Country
|
36
|
+
|
37
|
+
# @!attribute [rw] region
|
38
|
+
# @return [String. nil] the text description of the region of the address
|
39
|
+
attr_accessor :region
|
40
|
+
|
41
|
+
# Returns AddressCountry instances matching the supplied parameters
|
42
|
+
# @param (see LUSI::API::Country::Country#get_instance)
|
43
|
+
# @param iso_alpha2_code [String, nil] the ISO alpha-2 code to search for
|
44
|
+
# @param region [String, nil] the region to search for
|
45
|
+
# @return [Array<AddressCountry>, nil] the matching AddressCountry instances
|
46
|
+
# @yield [obj] Passes the AddressCountry instance to the block
|
47
|
+
# @yieldparam obj [LUSI::API::Country::AddressCountry] the AddressCountry instance
|
48
|
+
def self.get_instance(api = nil, lookup = nil, iso_alpha2_code: nil, region: nil, **kwargs)
|
49
|
+
super(api, lookup, 'LUSIReference', 'Lookup.asmx', 'GetAddressCountries', 'xmlns:AddressCountry',
|
50
|
+
iso_alpha2_code: iso_alpha2_code, region: region, **kwargs)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Initialises a new AddressCountry instance
|
54
|
+
# @param (see Country#initialize)
|
55
|
+
# @param region [String, nil] the default region
|
56
|
+
# @return [void]
|
57
|
+
def initialize(xml = nil, lookup = nil, region: nil, **kwargs)
|
58
|
+
super(xml, lookup, **kwargs)
|
59
|
+
@region = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Region', region)
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
# Returns a parameter hash for the LUSI API call
|
65
|
+
# @params (see #get_instance)
|
66
|
+
# @return [Hash<String, any] the parameter hash for the LUSI API call
|
67
|
+
def self.get_instance_params(**kwargs)
|
68
|
+
params = super(**kwargs)
|
69
|
+
params[:ISOAlpha2Code] = kwargs[:iso_alpha2_code] || ''
|
70
|
+
params[:Region] = kwargs[:region] || ''
|
71
|
+
params
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# Represents a nationality in the LUSI API
|
78
|
+
# @see Country
|
79
|
+
class Nationality < Country
|
80
|
+
|
81
|
+
# Returns Nationality instances matching the specified parameters
|
82
|
+
# @param api [LUSI::API::Core::API] the LUSI API instance
|
83
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
84
|
+
# @param identity [String, nil] the identity to search for
|
85
|
+
# @param description [String, nil] the description to search for
|
86
|
+
# @param iso_alpha2_code [String, nil] the ISO alpha-2 code to search for
|
87
|
+
# @return [Array<Nationality>, nil] the matching Nationality instances
|
88
|
+
# @yield [obj] Passes the Nationality instance to the block
|
89
|
+
# @yieldparam obj [LUSI::API::Country::Nationality] the Nationality instance
|
90
|
+
def self.get_instance(api = nil, lookup = nil, iso_alpha2_code: nil, **kwargs)
|
91
|
+
super(api, lookup, 'LUSIReference', 'Lookup.asmx', 'GetNationalities', 'xmlns:Nationality',
|
92
|
+
iso_alpha2_code: iso_alpha2_code, **kwargs)
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
# Returns a parameter hash for the LUSI API call
|
98
|
+
# @param (see #get_instance)
|
99
|
+
# @param iso_alpha2_code [String, nil] the ISO alpha-2 code to search for
|
100
|
+
# @return [Hash<String, any>] the parameter hash for the LUSI API call
|
101
|
+
def self.get_instance_params(iso_alpha2_code: nil, **kwargs)
|
102
|
+
params = super(**kwargs)
|
103
|
+
params[:ISOAlpha2Code] = kwargs[:iso_alpha2_code] || ''
|
104
|
+
params
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,1300 @@
|
|
1
|
+
require 'lusi_api/core/code'
|
2
|
+
require 'lusi_api/core/xml'
|
3
|
+
require 'lusi_api/enrolment'
|
4
|
+
require 'lusi_api/organisation'
|
5
|
+
require 'lusi_api/person/staff'
|
6
|
+
|
7
|
+
|
8
|
+
module LUSI
|
9
|
+
module API
|
10
|
+
module Course
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
# Represents the identity of a module or scheme of study
|
15
|
+
class Identity
|
16
|
+
|
17
|
+
# @!attribute [rw] asp
|
18
|
+
# @return [String, nil] the academically-significant period (ASP)
|
19
|
+
attr_accessor :asp
|
20
|
+
|
21
|
+
# @!attribute [rw] course
|
22
|
+
# @return [String, nil] the identity code of the module or scheme of study
|
23
|
+
attr_accessor :course
|
24
|
+
|
25
|
+
# @!attribute [rw] year
|
26
|
+
# @return [String, nil] the identity code of the academic year
|
27
|
+
attr_accessor :year
|
28
|
+
|
29
|
+
# Initialises a new Identity instance
|
30
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the identity
|
31
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
32
|
+
# @param asp [String, nil] the default academically-significant period (ASP)
|
33
|
+
# @param course [String, nil] the default identity of the module or schemem of study
|
34
|
+
# @param year [String, nil] the default academic year identity code
|
35
|
+
# @return [void]
|
36
|
+
def initialize(xml = nil, lookup = nil, asp: nil, course: nil, year: nil)
|
37
|
+
@asp = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ASP', asp)
|
38
|
+
@course = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Course', course)
|
39
|
+
@year = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Year', year)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns a string suitable for use as a hash lookup key
|
43
|
+
# @return [String] the lookup key
|
44
|
+
def lookup_key
|
45
|
+
"#{course}-#{year}"
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns a string representation of the Identity instance
|
49
|
+
# @return [String] the string representation of the Identity instance
|
50
|
+
def to_s
|
51
|
+
"lusi-#{lookup_key}"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# Represents a module or scheme of study enrolment identity in the LUSI API
|
58
|
+
class EnrolmentIdentity < Identity
|
59
|
+
|
60
|
+
# @!attribute [rw] cohort
|
61
|
+
# @return [Integer, nil] the identity code of the cohort for this course instance
|
62
|
+
attr_accessor :cohort
|
63
|
+
|
64
|
+
# Initialises a new EnrolmentIdentity instance
|
65
|
+
# @param (see LUSI::API::Course::Identity)
|
66
|
+
# @param cohort [Integer, nil] the default cohort identity code
|
67
|
+
# @return [void]
|
68
|
+
def initialize(xml = nil, lookup = nil, cohort: nil, **kwargs)
|
69
|
+
super(xml, lookup, **kwargs)
|
70
|
+
@cohort = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Cohort', cohort)
|
71
|
+
end
|
72
|
+
|
73
|
+
# (see LUSI::API::Course::Identity#lookup_key)
|
74
|
+
def lookup_key
|
75
|
+
"#{super}-#{cohort}"
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
# The abstract base class of Module and SchemeOfStudy
|
82
|
+
# @abstract Subclass and define:
|
83
|
+
# identity_class = the class representing identity
|
84
|
+
# lusi_ws_endpoint = the LUSI API endpoint
|
85
|
+
# lusi_ws_method = the LUSI API method to retrieve instance data
|
86
|
+
# lusi_ws_path = the LUSI API URL path
|
87
|
+
# lusi_ws_xml_root = the root element name of the LUSI API XML response
|
88
|
+
class ModuleBase
|
89
|
+
|
90
|
+
extend LUSI::API::Core::Endpoint
|
91
|
+
|
92
|
+
# @!attribute [rw] category_level
|
93
|
+
# @return [String, nil] the category (e.g. 'UG', 'PG')
|
94
|
+
attr_accessor :category_level
|
95
|
+
|
96
|
+
# @!attribute [rw] cohorts
|
97
|
+
# @return [Array<LUSI::API::Course::Cohort>, nil] the list of associated cohorts
|
98
|
+
attr_accessor :cohorts
|
99
|
+
|
100
|
+
# @!attribute [rw] course_departments
|
101
|
+
# @return [Array<LUSI::API::Course::CourseDepartment>, nil] the list of associated course departments
|
102
|
+
attr_accessor :course_departments
|
103
|
+
|
104
|
+
# @!attribute [rw] course_documents
|
105
|
+
# @return [Array<LUSI::API::Course::CourseDocument>, nil] the list of associated course documents
|
106
|
+
attr_accessor :course_documents
|
107
|
+
|
108
|
+
# @!attribute [rw] credit
|
109
|
+
# @return [String, nil] the credit point value
|
110
|
+
attr_accessor :credit
|
111
|
+
|
112
|
+
# @!attribute [rw] delivery_mode
|
113
|
+
# @return [LUSI::API::Core::Code, nil] the mode of delivery
|
114
|
+
attr_accessor :delivery_mode
|
115
|
+
|
116
|
+
# @!attribute [rw] display_long_title
|
117
|
+
# @return [String, nil] the long course title
|
118
|
+
attr_accessor :display_long_title
|
119
|
+
|
120
|
+
# @!attribute [rw] display_short_title
|
121
|
+
# @return [String, nil] the short course title
|
122
|
+
attr_accessor :display_short_title
|
123
|
+
|
124
|
+
# @!attribute [rw] enrolled_students
|
125
|
+
# @return [Integer, nil] the number of enrolled students
|
126
|
+
attr_accessor :enrolled_students
|
127
|
+
|
128
|
+
# @!attribute [rw] external_course_identity
|
129
|
+
# @return [String, nil] the external course identity
|
130
|
+
attr_accessor :external_course_identity
|
131
|
+
|
132
|
+
# @!attribute [rw] identity
|
133
|
+
# @return [LUSI::API::Course::Identity, nil] the course identity
|
134
|
+
attr_accessor :identity
|
135
|
+
|
136
|
+
# @!attribute [r] identity_class
|
137
|
+
# @return [Class, nil] the class representing module/scheme of study identity
|
138
|
+
attr_reader :identity_class
|
139
|
+
|
140
|
+
# @!attribute [rw] learning_hours
|
141
|
+
# @return [Integer, nil] the total number of learning hours
|
142
|
+
attr_accessor :learning_hours
|
143
|
+
|
144
|
+
# @!attribute [rw] mnemonic
|
145
|
+
# @return [String, nil] the mnemonic for the course
|
146
|
+
attr_accessor :mnemonic
|
147
|
+
|
148
|
+
# @!attribute [rw] status
|
149
|
+
# @return [String, nil] the status ('Live', 'Dormant', 'Draft' etc.)
|
150
|
+
attr_accessor :status
|
151
|
+
|
152
|
+
# @!attribute [rw] syllabus_rules
|
153
|
+
# @return [Array<LUSI::API::Course::SyllabusRule>, nil] the list of associated syllabus rules
|
154
|
+
attr_accessor :syllabus_rules
|
155
|
+
|
156
|
+
# @!attribute [rw] teaching_institution
|
157
|
+
# @return [LUSI::API::Organisation::Unit, nil] the teaching institution
|
158
|
+
attr_accessor :teaching_institution
|
159
|
+
|
160
|
+
# @!attribute [rw] title
|
161
|
+
# @return [String, nil] the title
|
162
|
+
attr_accessor :title
|
163
|
+
|
164
|
+
# @!attribute [rw] year
|
165
|
+
# @return [String, nil] the academic year
|
166
|
+
attr_accessor :year
|
167
|
+
|
168
|
+
# Returns an array of enrolment lookup table indices to search for this module/scheme of study
|
169
|
+
def enrolment_lookup_indices
|
170
|
+
[]
|
171
|
+
end
|
172
|
+
|
173
|
+
# Returns an array of enrolment lookup table keys for this module/scheme of study
|
174
|
+
# @return [Array<String>] the enrolment lookup table keys
|
175
|
+
def enrolment_lookup_keys
|
176
|
+
self.cohorts.map { |cohort| "#{self.identity.lookup_key}-#{cohort.identity}" }
|
177
|
+
end
|
178
|
+
|
179
|
+
# Returns an array of instances matching the specified search criteria
|
180
|
+
# @param api [LUSI::API::Core::API] the LUSI API instance to use for searching
|
181
|
+
# @param (see #get_instance_params)
|
182
|
+
# @return [<Array<LUSI::API::Course::Module, LUSI::API::Course::SchemeOfStudy>] the list of matching instances
|
183
|
+
# @yield [obj] Passes the instance to the block
|
184
|
+
# @yieldparam obj [LUSI::API::Course::Module, LUSI::API::Course::SchemeOfStudy] the instance
|
185
|
+
def self.get_instance(api, lookup = nil, **kwargs)
|
186
|
+
# active_vle_spaces_only: nil)
|
187
|
+
params = get_instance_params(**kwargs)
|
188
|
+
xml = api.call(self.lusi_ws_path, self.lusi_ws_endpoint, self.lusi_ws_method, **params)
|
189
|
+
LUSI::API::Core::XML.xml(xml, "xmlns:#{self.lusi_ws_xml_root}") do |m|
|
190
|
+
obj = self.new(m, lookup)
|
191
|
+
yield(obj) if block_given?
|
192
|
+
obj
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
# Initialises a new ModuleBase instance
|
197
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the module or scheme of study
|
198
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
199
|
+
# @param category_level [String, nil] the default category
|
200
|
+
# @param cohort [LUSI::API::Course::Cohort, nil] the default cohort
|
201
|
+
# @param course_departments [Array<LUSI::API::Course::CourseDepartment>, nil] the default course departments
|
202
|
+
# @param course_documents [Array<LUSI::API::Course::CourseDocument>, nil] the default course documents
|
203
|
+
# @param credit [String, nil] the default credit point value
|
204
|
+
# @param delivery_mode [LUSI::API::Core::Code, nil] the default delivery mode
|
205
|
+
# @param display_long_title [String, nil] the default long title
|
206
|
+
# @param display_short_title [String, nil] the default short title
|
207
|
+
# @param enrolled_students [Integer, nil] the default number of enrolled students
|
208
|
+
# @param external_course_identity [String, nil] the default external course identity code
|
209
|
+
# @param identity [String, nil] the default identity code
|
210
|
+
# @param learning_hours [Integer, nil] the default number of learning hours
|
211
|
+
# @param mnemonic [String, nil] the default mnemonic
|
212
|
+
# @param subjects [Array<LUSI::API::Course::Subject>, nil] the default subjects
|
213
|
+
# @param status [String, nil] the default status
|
214
|
+
# @param syllabus_rules [Array<SyllabusRule>, nil] the default syllabus rules
|
215
|
+
# @param teaching_institution [LUSI::API::Organisation::Unit, nil] the default teaching institution
|
216
|
+
# @param title [String, nil] the default title
|
217
|
+
# @param year [String, nil] the default year
|
218
|
+
# @return [void]
|
219
|
+
def initialize(xml = nil, lookup = nil, category_level: nil, cohort: nil, course_departments: nil,
|
220
|
+
course_documents: nil, credit: nil, delivery_mode: nil, display_long_title: nil,
|
221
|
+
display_short_title: nil, enrolled_students: nil, external_course_identity: nil, identity: nil,
|
222
|
+
learning_hours: nil, mnemonic: nil, subjects: nil, status: nil, syllabus_rules: nil,
|
223
|
+
teaching_institution: nil, title: nil, year: nil)
|
224
|
+
@category_level = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:CategoryLevel', category_level)
|
225
|
+
@cohorts = LUSI::API::Core::XML.xml(xml, 'xmlns:Cohorts/xmlns:Cohort', cohort) { |c| Cohort.new(c, lookup) }
|
226
|
+
@course_departments = LUSI::API::Core::XML.xml(xml, 'xmlns:CourseDepartments/xmlns:CourseDepartment',
|
227
|
+
course_departments) { |d| CourseDepartment.new(d, lookup) }
|
228
|
+
@course_documents = LUSI::API::Core::XML.xml(xml, 'xmlns:CourseDocuments/xmlns:CourseDocument',
|
229
|
+
course_documents) { |c| CourseDocument.new(c, lookup) }
|
230
|
+
@credit = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Credit', credit)
|
231
|
+
@delivery_mode = LUSI::API::Core::Code.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:DeliveryMode',
|
232
|
+
delivery_mode), lookup)
|
233
|
+
@display_long_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayLongTitle', display_long_title)
|
234
|
+
@display_short_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayShortTitle',
|
235
|
+
display_short_title)
|
236
|
+
@external_course_identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ExternalCourseIdentity',
|
237
|
+
external_course_identity)
|
238
|
+
@identity = Identity.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Identity', identity), lookup)
|
239
|
+
@learning_hours = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:LearningHours', learning_hours)
|
240
|
+
@mnemonic = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Mnemonic', mnemonic)
|
241
|
+
@status = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Status', status)
|
242
|
+
@subjects = LUSI::API::Core::XML.xml(xml, 'xmlns:Subjects/xmlns:Subject', subjects) { |s| Subject.new(s, lookup) }
|
243
|
+
@syllabus_rules = LUSI::API::Core::XML.xml(xml, 'xmlns:SyllabusRules/xmlns:SyllabusRule',
|
244
|
+
syllabus_rules) { |s| SyllabusRule.new(s, lookup) }
|
245
|
+
@teaching_institution = LUSI::API::Core::XML.lookup(xml, lookup, :institution,
|
246
|
+
'xmlns:TeachingInstitution/xmlns:Identity',
|
247
|
+
teaching_institution)
|
248
|
+
@title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
249
|
+
@year = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Year', year)
|
250
|
+
end
|
251
|
+
|
252
|
+
|
253
|
+
# Returns a hash of parameters for the LUSI API call. Subclasses may extend or override this method.
|
254
|
+
# @param asp_identity [String, nil] return instances matching this academic significant period (ASP)
|
255
|
+
# @param cohort_identity (String, nil) return instances matching this cohort identity
|
256
|
+
# @param course_identity [String, nil] return instances matching this course identity
|
257
|
+
# @param department_identity (String, nil) return instances matching this department identity
|
258
|
+
# @param external_course_identity [String, nil] return instances matching this external course identity
|
259
|
+
# @param include_course_documentation [Boolean, nil] include course documentation if true, otherwise omit it
|
260
|
+
# @param include_syllabus_rules [Boolean, nil] include syllabus rules if true, otherwise omit them
|
261
|
+
# @param live_only [Boolean, nil] return only live (active) instances if true, otherwise return all instances
|
262
|
+
# @param teaching_institution_id (String, nil) return instances matching this teaching institution
|
263
|
+
# @param year_identity (String, nil) return instances matching this year identity
|
264
|
+
# @return [Hash<String, String>] the parameter hash for the LUSI API call
|
265
|
+
def self.get_instance_params(**kwargs)
|
266
|
+
result = {
|
267
|
+
ASPIdentity: kwargs.fetch(:asp_identity, ''),
|
268
|
+
CohortIdentity: kwargs.fetch(:cohort_identity, ''),
|
269
|
+
CourseIdentity: kwargs.fetch(:course_identity, ''),
|
270
|
+
DepartmentIdentity: kwargs.fetch(:department_identity, ''),
|
271
|
+
ExternalCourseIdentity: kwargs.fetch(:external_course_identity, ''),
|
272
|
+
IncludeCourseDocumentation: kwargs.fetch(:include_course_documentation, false) ? 'true' : 'false',
|
273
|
+
IncludeSyllabusRules: kwargs.fetch(:include_syllabus_rules, false) ? 'true' : 'false',
|
274
|
+
LiveOnly: kwargs.fetch(:live_only, true) ? 'true' : 'false',
|
275
|
+
TeachingInstitutionId: kwargs.fetch(:teaching_institution_id, ''),
|
276
|
+
YearIdentity: kwargs.fetch(:year_identity, '')
|
277
|
+
}
|
278
|
+
if self.lusi_ws_endpoint == 'General.asmx'
|
279
|
+
# The General.asmx endpoint methods GetModuleDetails and GetSchemesOfStudy require an extra parameter
|
280
|
+
result[:ActiveVLESpaceOnly] = kwargs.fetch(:active_vle_space_only, true) ? 'true' : 'false'
|
281
|
+
end
|
282
|
+
result
|
283
|
+
end
|
284
|
+
|
285
|
+
#
|
286
|
+
# Returns the major departments for the module/scheme of study
|
287
|
+
# @return [Array<LUSI::API::Course::CourseDepartment>] the major departments
|
288
|
+
def major_departments
|
289
|
+
self.course_departments.select { |course_department| course_department.is_major_department }
|
290
|
+
end
|
291
|
+
|
292
|
+
protected
|
293
|
+
|
294
|
+
# Returns the class representing module/scheme of study identity
|
295
|
+
# @return [Class] the identity class
|
296
|
+
def self.identity_class
|
297
|
+
Identity
|
298
|
+
end
|
299
|
+
|
300
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_endpoint)
|
301
|
+
def self.lusi_ws_endpoint
|
302
|
+
'CourseManager.asmx'
|
303
|
+
end
|
304
|
+
|
305
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_path)
|
306
|
+
def self.lusi_ws_path
|
307
|
+
'LUSIReference'
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
312
|
+
|
313
|
+
#
|
314
|
+
#
|
315
|
+
# # The base class of ModuleEnrolment and SchemeOfStudyEnrolment
|
316
|
+
# class ModuleEnrolmentBase
|
317
|
+
#
|
318
|
+
# # @!attribute [rw] module_identity
|
319
|
+
# # @return [LUSI::API::Course::EnrolmentIdentity, nil] the module identity
|
320
|
+
# attr_accessor :identity
|
321
|
+
#
|
322
|
+
# # @!attribute [rw] display_long_title
|
323
|
+
# # @return [String, nil] the long title of the module
|
324
|
+
# attr_accessor :display_long_title
|
325
|
+
#
|
326
|
+
# # @!attribute [rw] display_short_title
|
327
|
+
# # @return [String, nil] the short title of the module
|
328
|
+
# attr_accessor :display_short_title
|
329
|
+
#
|
330
|
+
# # @!attribute [rw] enrol_year
|
331
|
+
# # @return [String, nil] the year of enrolment
|
332
|
+
# attr_accessor :enrol_year
|
333
|
+
#
|
334
|
+
# # @!attribute [rw] mnemonic
|
335
|
+
# # @return [String, nil] the mnemonic of the module
|
336
|
+
# attr_accessor :mnemonic
|
337
|
+
#
|
338
|
+
# # @!attribute [rw] title
|
339
|
+
# # @return [String, nil] the title of the module
|
340
|
+
# attr_accessor :title
|
341
|
+
#
|
342
|
+
# # @!attribute [rw] cohort_end_date
|
343
|
+
# # @return [DateTime, nil] the end date of the cohort in local time
|
344
|
+
# attr_accessor :cohort_end_date
|
345
|
+
#
|
346
|
+
# # @!attribute [rw] cohort_end_date_utc
|
347
|
+
# # @return [DateTime, nil] the end date of the cohort in UTC
|
348
|
+
# attr_accessor :cohort_end_date_utc
|
349
|
+
#
|
350
|
+
# # @!attribute [rw] cohort_start_date
|
351
|
+
# # @return [DateTime, nil] the start date of the cohort in local time
|
352
|
+
# attr_accessor :cohort_start_date
|
353
|
+
#
|
354
|
+
# # @!attribute [rw] cohort_start_date_utc
|
355
|
+
# # @return [DateTime, nil] the start date of the cohort in UTC
|
356
|
+
# attr_accessor :cohort_start_date_utc
|
357
|
+
#
|
358
|
+
# # Initialises a new ModuleEnrolment instance
|
359
|
+
# # @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the module enrolment
|
360
|
+
# # @param lookup [LUSI::API::Core::LookupTable, nil] the lookup service for object resolution
|
361
|
+
# # @param student_identity [String, nil] the default student identity
|
362
|
+
# # @param identity [LUSI::API::Course::EnrolmentIdentity, nil] the default enrolment identity
|
363
|
+
# # @param display_long_title [String, nil] the default module long title
|
364
|
+
# # @param display_short_title [String, nil] the default module short title
|
365
|
+
# # @param enrol_year [String, nil] the default enrol year
|
366
|
+
# # @param mnemonic [String, nil] the default module mnemonic
|
367
|
+
# # @param title [String, nil] the default module title
|
368
|
+
# # @param cohort_end_date [DateTime, nil] the default local-time cohort end date
|
369
|
+
# # @param cohort_end_date_utc [DateTime, nil] the default UTC cohort end date
|
370
|
+
# # @param cohort_start_date [DateTime, nil] the default local-time codhort start date
|
371
|
+
# # @param cohort_start_date_utc [DateTime, nil] the default UTC cohort start date
|
372
|
+
# # @return [void]
|
373
|
+
# def initialize(xml = nil, lookup = nil, student_identity: nil, identity: nil, display_long_title: nil,
|
374
|
+
# display_short_title: nil, enrol_year: nil, mnemonic: nil, title: nil, department: nil,
|
375
|
+
# year_sos: nil, study_type: nil, talis_code: nil, cohort_end_date: nil, cohort_end_date_utc: nil,
|
376
|
+
# cohort_start_date: nil, cohort_start_date_utc: nil)
|
377
|
+
# @student_identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:StudentIdentity', student_identity)
|
378
|
+
# @identity = EnrolmentIdentity.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Identity', identity), lookup)
|
379
|
+
# @display_long_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayLongTitle', display_long_title)
|
380
|
+
# @display_short_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayShortTitle',
|
381
|
+
# display_short_title)
|
382
|
+
# @enrol_year = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:EnrolYear', enrol_year)
|
383
|
+
# @mnemonic = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Mnemonic', mnemonic)
|
384
|
+
# @title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
385
|
+
# @cohort_end_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:CohortEndDate', cohort_end_date)
|
386
|
+
# @cohort_end_date_utc = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:CohortEndDateUTC',
|
387
|
+
# cohort_end_date_utc)
|
388
|
+
# @cohort_start_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:CohortStartDate', cohort_start_date)
|
389
|
+
# @cohort_start_date_utc = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:CohortStartDateUTC',
|
390
|
+
# cohort_start_date_utc)
|
391
|
+
# end
|
392
|
+
#
|
393
|
+
# end
|
394
|
+
|
395
|
+
|
396
|
+
# Mixin for staff user details
|
397
|
+
module StaffEndpoint
|
398
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_path)
|
399
|
+
def lusi_ws_endpoint
|
400
|
+
'Staff.asmx'
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
|
405
|
+
# Mixin for student user details
|
406
|
+
module StudentEndpoint
|
407
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_path)
|
408
|
+
def lusi_ws_endpoint
|
409
|
+
'Student.asmx'
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
|
414
|
+
public
|
415
|
+
|
416
|
+
# Represents a module assessment proportion in the LUSI API
|
417
|
+
class AssessmentProportion
|
418
|
+
|
419
|
+
# @!attribute [rw] assessment_type
|
420
|
+
# @return [LUSI::API::Core::Code, nil] the assessment type
|
421
|
+
attr_accessor :assessment_type
|
422
|
+
|
423
|
+
# @!attribute [rw] percentage
|
424
|
+
# @return [Integer, nil] the percentage value
|
425
|
+
attr_accessor :percentage
|
426
|
+
|
427
|
+
# @!attribute [rw] assessment_status
|
428
|
+
# @return [LUSI::API::Core::Code, nil] the assessment status
|
429
|
+
attr_accessor :assessment_status
|
430
|
+
|
431
|
+
# Initialises a new AssessmentProportion instance
|
432
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the assessment proportion
|
433
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
434
|
+
# @param assessment_status [LUSI::API::Core::Code, nil] the default assessment status
|
435
|
+
# @param assessment_type [LUSI::API::Core::Code, nil] the default assessment_type
|
436
|
+
# @param percentage [Integer, nil] the default percentage value
|
437
|
+
# @return [void]
|
438
|
+
def initialize(xml = nil, lookup = nil, assessment_status: nil, assessment_type: nil, percentage: nil)
|
439
|
+
@assessment_status = LUSI::API::Core::Code.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:AssessmentStatus',
|
440
|
+
assessment_status), lookup)
|
441
|
+
@assessment_type = LUSI::API::Core::Code.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:AssessmentType',
|
442
|
+
assessment_type), lookup)
|
443
|
+
@percentage = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Percentage', percentage)
|
444
|
+
end
|
445
|
+
|
446
|
+
# Returns a string representation of the AssessmentProportion instance
|
447
|
+
# @return [String] the string representation of the AssessmentProportion instance
|
448
|
+
def to_s
|
449
|
+
"#{@assessment_type.description} #{percentage}%"
|
450
|
+
end
|
451
|
+
|
452
|
+
end
|
453
|
+
|
454
|
+
|
455
|
+
# Represents a cohort (student intake) in the LUSI API
|
456
|
+
class Cohort
|
457
|
+
|
458
|
+
# @!attribute [rw] display_long_title
|
459
|
+
# @return [String, nil] the long title of the cohort
|
460
|
+
attr_accessor :display_long_title
|
461
|
+
|
462
|
+
# @!attribute [rw] display_short_title
|
463
|
+
# @return [String, nil] the short title of the cohort
|
464
|
+
attr_accessor :display_short_title
|
465
|
+
|
466
|
+
# @!attribute [rw] end_date
|
467
|
+
# @return [DateTime, nil] the end date of study
|
468
|
+
attr_accessor :end_date
|
469
|
+
|
470
|
+
# @!attribute [rw] identity
|
471
|
+
# @return [Integer, nil] the identity code of the cohort
|
472
|
+
attr_accessor :identity
|
473
|
+
|
474
|
+
# @!attribute [rw] start_date
|
475
|
+
# @return [DateTime, nil] the start date of study
|
476
|
+
attr_accessor :start_date
|
477
|
+
|
478
|
+
# Initialises a new Cohort instance
|
479
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the cohort
|
480
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
481
|
+
# @param display_long_title [String, nil] the default long title
|
482
|
+
# @param display_short_title [String, nil] the default short title
|
483
|
+
# @param end_date [DateTime, nil] the default end-of-study date
|
484
|
+
# @param identity [Integer, nil] the default identity code
|
485
|
+
# @param start_date [DateTime, nil] the default start-of-study date
|
486
|
+
# @return [void]
|
487
|
+
def initialize(xml = nil, lookup = nil, display_long_title: nil, display_short_title: nil, end_date: nil,
|
488
|
+
identity: nil, start_date: nil)
|
489
|
+
@display_long_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayLongTitle', display_long_title)
|
490
|
+
@display_short_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayShortTitle', display_short_title)
|
491
|
+
@end_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:EndDate', end_date)
|
492
|
+
@identity = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Identity', identity)
|
493
|
+
@start_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:StartDate', start_date)
|
494
|
+
end
|
495
|
+
|
496
|
+
# Returns a string representation of the Cohort instance
|
497
|
+
# @return [String] the string representation of the Cohort instance
|
498
|
+
def to_s
|
499
|
+
end_date = @end_date ? @end_date.strftime('%d-%m-%Y') : ''
|
500
|
+
start_date = @start_date ? @start_date.strftime('%d-%m-%Y') : ''
|
501
|
+
"#{@display_long_title || @display_short_title} #{start_date}-#{end_date}"
|
502
|
+
end
|
503
|
+
|
504
|
+
end
|
505
|
+
|
506
|
+
|
507
|
+
# Represents a department participating in a course
|
508
|
+
class CourseDepartment
|
509
|
+
|
510
|
+
# @!attribute [rw] org_unit
|
511
|
+
# @return [LUSI::API::Organisation::Unit] the organisation unit representing the department
|
512
|
+
attr_accessor :org_unit
|
513
|
+
|
514
|
+
# @!attribute [rw] identity
|
515
|
+
# @return [String] the course department identity code
|
516
|
+
attr_accessor :identity
|
517
|
+
|
518
|
+
# @!attribute [rw] is_major_department
|
519
|
+
# @return [Boolean] true if the department is the major (administering) department, otherwise false
|
520
|
+
attr_accessor :is_major_department
|
521
|
+
|
522
|
+
# @!attribute [rw] title
|
523
|
+
# @return [String] the course department's title
|
524
|
+
attr_accessor :title
|
525
|
+
|
526
|
+
# Initialises a new CourseDepartment instance
|
527
|
+
# @param identity [String] the course department's identity code
|
528
|
+
# @param org_unit [LUSI::API::Organisation::Unit] the default organisation unit for the department
|
529
|
+
# @param is_major_department [Boolean, nil] the major (administering) department flag
|
530
|
+
# @param title [String] the course department's title
|
531
|
+
# @return [void]
|
532
|
+
def initialize(xml = nil, lookup = nil, identity: nil, is_major_department: nil, org_unit: nil, title: nil)
|
533
|
+
is_major_department = is_major_department ? true : false
|
534
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
535
|
+
@is_major_department = LUSI::API::Core::XML.xml_boolean_at(xml, 'xmlns:IsMajorDepartment', is_major_department)
|
536
|
+
@org_unit = LUSI::API::Core::XML.lookup(xml, lookup, :department, 'xmlns:Identity', org_unit)
|
537
|
+
@title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
538
|
+
end
|
539
|
+
|
540
|
+
end
|
541
|
+
|
542
|
+
|
543
|
+
# Represents a course document in the LUSI API
|
544
|
+
class CourseDocument
|
545
|
+
|
546
|
+
# @!attribute [rw] type
|
547
|
+
# @return [LUSI::API::Core::Code, nil] the course document type
|
548
|
+
attr_accessor :type
|
549
|
+
|
550
|
+
# @!attribute [rw] html_text
|
551
|
+
# @return [String, nil] the text document as pre-formatted HTML
|
552
|
+
attr_accessor :html_text
|
553
|
+
|
554
|
+
# Initialises a new CourseDocument instance
|
555
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the course document
|
556
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
557
|
+
# @param type [LUSI::API::Core::Code, nil] the default document type
|
558
|
+
# @param html_text [String, nil] the default document text
|
559
|
+
# @return [void]
|
560
|
+
def initialize(xml = nil, lookup = nil, type: nil, html_text: nil)
|
561
|
+
@type = LUSI::API::Core::Code.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Type', type), lookup)
|
562
|
+
@html_text = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:HTMLText', html_text)
|
563
|
+
end
|
564
|
+
|
565
|
+
# Returns a string representation of the CourseDocument instance
|
566
|
+
# @return [String] the string representation of the CourseDocument instance
|
567
|
+
def to_s
|
568
|
+
@type.description
|
569
|
+
end
|
570
|
+
|
571
|
+
end
|
572
|
+
|
573
|
+
|
574
|
+
# Represents the credit points for a scheme of study
|
575
|
+
class CreditPoints
|
576
|
+
|
577
|
+
# @!attribute [rw] total_part_1
|
578
|
+
# @return [Integer, nil] the total number of credit points required at Part 1
|
579
|
+
attr_accessor :total_part_1
|
580
|
+
|
581
|
+
# @!attribute [rw] part_2_year_2
|
582
|
+
# @return [Integer, nil] the number of Part 2 credit points required in year 2
|
583
|
+
attr_accessor :part_2_year_2
|
584
|
+
|
585
|
+
# @!attribute [rw] part_2_year_3
|
586
|
+
# @return [Integer, nil] the number of Part 2 credit points required in year 3
|
587
|
+
attr_accessor :part_2_year_3
|
588
|
+
|
589
|
+
# @!attribute [rw] part_2_year_4
|
590
|
+
# @return [Integer, nil] the number of Part 2 credit points required in year 4
|
591
|
+
attr_accessor :part_2_year_4
|
592
|
+
|
593
|
+
# @!attribute [rw] part_2_year_5
|
594
|
+
# @return [Integer, nil] the number of Part 2 credit points required in year 5
|
595
|
+
attr_accessor :part_2_year_5
|
596
|
+
|
597
|
+
# @!attribute [rw] total_part_2
|
598
|
+
# @return [Integer, nil] the total number of credit points required at Part 2
|
599
|
+
attr_accessor :total_part_2
|
600
|
+
|
601
|
+
# @!attribute [rw] total_overall
|
602
|
+
# @return [Integer, nil] the total number of credit points required for the scheme of study
|
603
|
+
attr_accessor :total_overall
|
604
|
+
|
605
|
+
# Initialises a new CreditPoints instance
|
606
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the credit points
|
607
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
608
|
+
# @param part_2_year_2 [Integer, nil] the default part 2 year 2 credit points
|
609
|
+
# @param part_2_year_3 [Integer, nil] the default part 2 year 3 credit points
|
610
|
+
# @param part_2_year_4 [Integer, nil] the default part 2 year 4 credit points
|
611
|
+
# @param part_2_year_5 [Integer, nil] the default part 2 year 5 credit points
|
612
|
+
# @param total_overall [Integer, nil] the default overall total credit points
|
613
|
+
# @param total_part_1 [Integer, nil] the default part 1 total credit points
|
614
|
+
# @param total_part_2 [Integer, nil] the default part 2 total
|
615
|
+
# @return [void]
|
616
|
+
def initialize(xml = nil, lookup = nil, part_2_year_2: 0, part_2_year_3: 0, part_2_year_4: 0, part_2_year_5: 0,
|
617
|
+
total_overall: 0, total_part_1: 0, total_part_2: 0)
|
618
|
+
@part_2_year_2 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Part2Year2', part_2_year_2)
|
619
|
+
@part_2_year_3 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Part2Year3', part_2_year_3)
|
620
|
+
@part_2_year_4 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Part2Year4', part_2_year_4)
|
621
|
+
@part_2_year_5 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:Part2Year5', part_2_year_5)
|
622
|
+
@total_overall = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:TotalOverall', total_overall)
|
623
|
+
@total_part_1 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:TotalPart1', total_part_1)
|
624
|
+
@total_part_2 = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:TotalPart2', total_part_2)
|
625
|
+
end
|
626
|
+
|
627
|
+
# Returns a string representation of the CreditPoints instance
|
628
|
+
# @return [String] the string representation of the CreditPoints instance
|
629
|
+
def to_s
|
630
|
+
"#{@total_overall}"
|
631
|
+
end
|
632
|
+
|
633
|
+
end
|
634
|
+
|
635
|
+
|
636
|
+
# Represents the length of a scheme of study
|
637
|
+
class Length
|
638
|
+
|
639
|
+
# @!attribute [rw] absolute_maximum
|
640
|
+
# @return [String, nil] the absolute maximum scheme length
|
641
|
+
attr_accessor :absolute_maximum
|
642
|
+
|
643
|
+
# @!attribute [rw] maximum
|
644
|
+
# @return [String, nil] the maximum scheme length
|
645
|
+
attr_accessor :maximum
|
646
|
+
|
647
|
+
# @!attribute [rw] minimum
|
648
|
+
# @return [String, nil] the minimum scheme length
|
649
|
+
attr_accessor :minimum
|
650
|
+
|
651
|
+
# Initialises a new Length instance
|
652
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the length
|
653
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
654
|
+
# @param absolute_maximum [String, nil] the default absolute maximum scheme length
|
655
|
+
# @param maximum [String, nil] the default maximum scheme length
|
656
|
+
# @param minimum [String, nil] the default minimum scheme length
|
657
|
+
# @return [void]
|
658
|
+
def initialize(xml = nil, lookup = nil, absolute_maximum: nil, maximum: nil, minimum: nil)
|
659
|
+
@absolute_maximum = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AbsoluteMaximum', absolute_maximum)
|
660
|
+
@maximum = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Maximum', maximum)
|
661
|
+
@minimum = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Minimum', minimum)
|
662
|
+
end
|
663
|
+
|
664
|
+
# Returns a string representation of the Length instance
|
665
|
+
# @return [String] the string representation of the SchemeLength instance
|
666
|
+
def to_s
|
667
|
+
"#{minimum} - #{maximum} (#{absolute_maximum})"
|
668
|
+
end
|
669
|
+
|
670
|
+
end
|
671
|
+
|
672
|
+
|
673
|
+
# Represents a module mark in the LUSI API
|
674
|
+
class Mark
|
675
|
+
|
676
|
+
# @!attribute [rw] overall_percentage
|
677
|
+
# @return [Float, nil] the overall percentage mark for the module
|
678
|
+
attr_accessor :overall_percentage
|
679
|
+
|
680
|
+
# @!attribute [rw] overall_aggregation
|
681
|
+
# @return [Float, nil] the overall aggregation score for the module
|
682
|
+
attr_accessor :overall_aggregation
|
683
|
+
|
684
|
+
# Initialises a new Mark instance
|
685
|
+
# @param xml [Nokogir::XML::Document, Nokogiri::XML::Node] the parsed XML root of the mark
|
686
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
687
|
+
# @param overall_aggregation [Float, int] the default overall aggregation
|
688
|
+
# @param overall_percentage [Float, int] the default overall percentage
|
689
|
+
# @return [void]
|
690
|
+
def initialize(xml = nil, lookup = nil, overall_percentage: nil, overall_aggregation: nil)
|
691
|
+
@overall_percentage = LUSI::API::Core::XML.xml_float_at(xml, 'xmlns:OverallPercentage', overall_percentage)
|
692
|
+
@overall_aggregation = LUSI::API::Core::XML.xml_float_at(xml, 'xmlns:OverallAggregation',
|
693
|
+
overall_aggregation)
|
694
|
+
end
|
695
|
+
|
696
|
+
# Returns a string representation of the Mark instance
|
697
|
+
# @return [String] the string representation of the Mark instance
|
698
|
+
def to_s
|
699
|
+
"#{@overall_aggregation} (#{@overall_percentage}%)"
|
700
|
+
end
|
701
|
+
|
702
|
+
end
|
703
|
+
|
704
|
+
|
705
|
+
# # Represents a module enrolment in the LUSI API
|
706
|
+
# class ModuleEnrolment < ModuleEnrolmentBase
|
707
|
+
#
|
708
|
+
# # @!attribute [rw] module_identity
|
709
|
+
# # @see (#identity)
|
710
|
+
# alias module_identity identity
|
711
|
+
#
|
712
|
+
# # @!attribute [rw] department
|
713
|
+
# # @return [LUSI::API::Organisation::Unit, nil] the major department
|
714
|
+
# attr_accessor :department
|
715
|
+
#
|
716
|
+
# # @!attribute [rw] year_sos
|
717
|
+
# # @return [Integer, nil] the year of study on the scene(1 = first year etc.)
|
718
|
+
# attr_accessor :year_sos
|
719
|
+
#
|
720
|
+
# # @!attribute [rw] study_type
|
721
|
+
# # @return [String, nil] the type of study (e.g. 'Major', 'Minor')
|
722
|
+
# attr_accessor :study_type
|
723
|
+
#
|
724
|
+
# # @!attribute [rw] talis_code
|
725
|
+
# # @return [String, nil] the Talis Aspire reading list code
|
726
|
+
# attr_accessor :talis_code
|
727
|
+
#
|
728
|
+
# # @!attribute [rw] mark
|
729
|
+
# # @return [LUSI::API::Course::Mark, nil] the mark for the module
|
730
|
+
# attr_accessor :mark
|
731
|
+
#
|
732
|
+
# # Initalises a new ModuleEnrolment instance
|
733
|
+
# # @param (see LUSI::API::Course::ModuleEnrolmentBase#initialize)
|
734
|
+
# # @param department [LUSI::API::Organisation::Unit] the default major department
|
735
|
+
# # @param year_sos [Integer, nil] the default year of scheme of study
|
736
|
+
# # @param study_type [String, nil] the default study type
|
737
|
+
# # @param talis_code [String, nil] the default Talis Aspire reading list code
|
738
|
+
# # @param mark [LUSI::API::Course::Mark, nil] the default mark for the module
|
739
|
+
# # @return [void]
|
740
|
+
# def initialize(xml = nil, lookup = nil, department: nil, year_sos: nil, study_type: nil, talis_code: nil,
|
741
|
+
# mark: nil, **kwargs)
|
742
|
+
# super(xml, lookup, **kwargs)
|
743
|
+
# @department = LUSI::API::Core::XML.lookup(xml, lookup, :department, 'xmlns:Department/xmlns:Identity',
|
744
|
+
# department)
|
745
|
+
# @year_sos = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:YearSos', year_sos)
|
746
|
+
# @study_type = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:StudyType', study_type)
|
747
|
+
# @talis_code = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:TalisCode', talis_code)
|
748
|
+
# @mark = Mark.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Mark', mark))
|
749
|
+
# end
|
750
|
+
#
|
751
|
+
# end
|
752
|
+
|
753
|
+
|
754
|
+
# The abstract base class for module/scheme of study enrolments
|
755
|
+
# @abstract Subclasses must implement lookup_index and alias :course_identity to the accessor for the
|
756
|
+
# subclass-specific identity.
|
757
|
+
class CourseEnrolment < LUSI::API::Enrolment::EnrolmentBase
|
758
|
+
|
759
|
+
# Returns the index name used for the module/scheme of study identity
|
760
|
+
# @return [Symbol] the module/scheme of study index name
|
761
|
+
def self.lookup_index
|
762
|
+
raise NotImplementedError
|
763
|
+
end
|
764
|
+
|
765
|
+
# @see (LUSI::API::Enrolment::EnrolmentBase#lookup_indices)
|
766
|
+
def lookup_indices
|
767
|
+
super.push(self.lookup_index)
|
768
|
+
end
|
769
|
+
|
770
|
+
# @see (LUSI::API::Enrolment::EnrolmentBase#lookup_key)
|
771
|
+
def lookup_key(index)
|
772
|
+
# self.course_identity should be defined by all subclasses
|
773
|
+
if index == self.lookup_index
|
774
|
+
self.course_identity.lookup_key
|
775
|
+
else
|
776
|
+
super(index)
|
777
|
+
end
|
778
|
+
end
|
779
|
+
|
780
|
+
end
|
781
|
+
|
782
|
+
|
783
|
+
# Represents a module enrolment in the LUSI API
|
784
|
+
class ModuleEnrolment < CourseEnrolment
|
785
|
+
|
786
|
+
# @!attribute [rw] module_identity
|
787
|
+
# @return [LUSI::API::Course::EnrolmentIdentity] the enrolment's module identity
|
788
|
+
attr_accessor :module_identity
|
789
|
+
alias :course_identity :module_identity
|
790
|
+
|
791
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_method)
|
792
|
+
def self.lusi_ws_method
|
793
|
+
'BulkGetModuleEnrolments'
|
794
|
+
end
|
795
|
+
|
796
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_xml_root)
|
797
|
+
def self.lusi_ws_xml_root
|
798
|
+
'BulkModuleEnrolment'
|
799
|
+
end
|
800
|
+
|
801
|
+
# @see (LUSI::API::Enrolment::EnrolmentBase#initialize)
|
802
|
+
# @param module_identity [LUSI::API::Course::EnrolmentIdentity] the enrolment's module identity
|
803
|
+
def initialize(xml = nil, lookup = nil, module_identity: nil, **kwargs)
|
804
|
+
super(xml, lookup, **kwargs)
|
805
|
+
@module_identity = EnrolmentIdentity.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:ModuleIdentity',
|
806
|
+
module_identity), lookup)
|
807
|
+
end
|
808
|
+
|
809
|
+
end
|
810
|
+
|
811
|
+
|
812
|
+
# Represents a module evaluation cohort in the LUSI API
|
813
|
+
class ModuleEvaluationCohort
|
814
|
+
|
815
|
+
# @!attribute [rw] cohort identity
|
816
|
+
# @return [String, nil] the identity code of the cohort
|
817
|
+
attr_accessor :cohort_identity
|
818
|
+
|
819
|
+
# @!attribute [rw] evaluation_date
|
820
|
+
# @return [DateTime, nil] the start date of module evaluation for the cohort
|
821
|
+
attr_accessor :evaluation_date
|
822
|
+
|
823
|
+
# @!attribute [rw] week_identity
|
824
|
+
# @return [String, nil] the starting week identity of module evaluation for the cohort
|
825
|
+
attr_accessor :week_identity
|
826
|
+
|
827
|
+
# Initialises a new ModuleEvaluationCohort instance
|
828
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the module evaluation cohort
|
829
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
830
|
+
# @param cohort_identity [String, nil] the default cohort identity code
|
831
|
+
# @param evaluation_date [DateTime, nil] the default evaluation start date
|
832
|
+
# @param week_identity [String, nil] the default evaluation start week identity
|
833
|
+
# @return [void]
|
834
|
+
def initialize(xml = nil, lookup = nil, cohort_identity: nil, evaluation_date: nil, week_identity: nil)
|
835
|
+
@cohort_identity = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:CohortIdentity', cohort_identity)
|
836
|
+
@evaluation_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:EvaluationDate', evaluation_date)
|
837
|
+
@week_identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:WeekIdentity', week_identity)
|
838
|
+
end
|
839
|
+
|
840
|
+
# Returns a string representation of the ModuleEvaluationCohort instance
|
841
|
+
# @return [String] the string representation of the ModuleEvaluationCohort instance
|
842
|
+
def to_s
|
843
|
+
"#{@cohort_identity}: #{@evaluation_date}"
|
844
|
+
end
|
845
|
+
|
846
|
+
end
|
847
|
+
|
848
|
+
|
849
|
+
# # Represents a scheme of study enrolment in the LUSI API
|
850
|
+
# class SchemeOfStudyEnrolment < ModuleEnrolmentBase
|
851
|
+
#
|
852
|
+
# # @!attribute [rw] qualification
|
853
|
+
# # @return [String, nil] the qualification (e.g. 'BSc Hons')
|
854
|
+
# attr_accessor :qualification
|
855
|
+
#
|
856
|
+
# # @!attribute [rw] mode_of_study
|
857
|
+
# # @return [String, nil] the mode of study (e.g. 'Full Time')
|
858
|
+
# attr_accessor :mode_of_study
|
859
|
+
#
|
860
|
+
# # @!attribute scheme_length
|
861
|
+
# # @return [String, nil] the length of the scheme of study
|
862
|
+
# attr_accessor :scheme_length
|
863
|
+
#
|
864
|
+
# # Initialises a new SchemeOfStudyEnrolment instance
|
865
|
+
# # @param (see LUSI::API::Course::ModuleEnrolmentBase#initialize)
|
866
|
+
# # @param qualification [String, nil] the default qualification
|
867
|
+
# # @param mode_of_study [String. nil] the default mode of study
|
868
|
+
# # @param scheme_length [String, nil] the default scheme length
|
869
|
+
# # @return [void]
|
870
|
+
# def initialize(xml = nil, lookup = nil, mode_of_study: nil, qualification: nil, scheme_length: nil, **kwargs)
|
871
|
+
# super(xml, lookup, **kwargs)
|
872
|
+
# @mode_of_study = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ModeOfStudy', mode_of_study)
|
873
|
+
# @qualification = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Qualification', qualification)
|
874
|
+
# @scheme_length = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:SchemeLength', scheme_length)
|
875
|
+
# end
|
876
|
+
#
|
877
|
+
# end
|
878
|
+
|
879
|
+
|
880
|
+
# Represents a module enrolment in the LUSI API
|
881
|
+
class SchemeOfStudyEnrolment < CourseEnrolment
|
882
|
+
|
883
|
+
# @!attribute [rw] scheme_identity
|
884
|
+
# @return [LUSI::API::Course::EnrolmentIdentity] the enrolment's scheme of study identity
|
885
|
+
attr_accessor :scheme_identity
|
886
|
+
alias :course_identity :scheme_identity
|
887
|
+
|
888
|
+
# @see (LUSI::API::Course::CourseEnrolment#lookup_index)
|
889
|
+
def self.lookup_index
|
890
|
+
raise NotImplementedError
|
891
|
+
end
|
892
|
+
|
893
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_method)
|
894
|
+
def self.lusi_ws_method
|
895
|
+
'BulkGetSchemeOfStudyEnrolments'
|
896
|
+
end
|
897
|
+
|
898
|
+
# @see (LUSI::API::Core::Endpoint#lusi_ws_xml_root)
|
899
|
+
def self.lusi_ws_xml_root
|
900
|
+
'BulkSchemeOfStudyEnrolment'
|
901
|
+
end
|
902
|
+
|
903
|
+
# @see (LUSI::API::Enrolment::EnrolmentBase#initialize)
|
904
|
+
# @param scheme_identity [LUSI::API::Course::EnrolmentIdentity] the enrolment's scheme of study identity
|
905
|
+
def initialize(xml = nil, lookup = nil, scheme_identity: nil, **kwargs)
|
906
|
+
super(xml, lookup, **kwargs)
|
907
|
+
@scheme_identity = EnrolmentIdentity.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:SchemeIdentity',
|
908
|
+
scheme_identity), lookup)
|
909
|
+
end
|
910
|
+
|
911
|
+
end
|
912
|
+
|
913
|
+
|
914
|
+
# Represents a staff module enrolment in the LUSI API
|
915
|
+
class StaffModuleEnrolment < ModuleEnrolment
|
916
|
+
|
917
|
+
extend StaffEndpoint
|
918
|
+
|
919
|
+
# @see (LUSI::API::Course::ModuleEnrolment#lookup_index)
|
920
|
+
def lookup_index
|
921
|
+
:module_staff
|
922
|
+
end
|
923
|
+
|
924
|
+
end
|
925
|
+
|
926
|
+
|
927
|
+
# Represents a staff scheme of study enrolment in the LUSI API
|
928
|
+
class StaffSchemeOfStudyEnrolment < SchemeOfStudyEnrolment
|
929
|
+
|
930
|
+
extend StaffEndpoint
|
931
|
+
|
932
|
+
# @see (LUSI::API::Course::ModuleEnrolment#lookup_index)
|
933
|
+
def lookup_index
|
934
|
+
:scheme_staff
|
935
|
+
end
|
936
|
+
|
937
|
+
end
|
938
|
+
|
939
|
+
|
940
|
+
# Represents a student module enrolment in the LUSI API
|
941
|
+
class StudentModuleEnrolment < ModuleEnrolment
|
942
|
+
|
943
|
+
extend StudentEndpoint
|
944
|
+
|
945
|
+
# @see (LUSI::API::Course::ModuleEnrolment#lookup_index)
|
946
|
+
def lookup_index
|
947
|
+
:module_student
|
948
|
+
end
|
949
|
+
|
950
|
+
end
|
951
|
+
|
952
|
+
|
953
|
+
# Represents a student scheme of study enrolment in the LUSI API
|
954
|
+
class StudentSchemeOfStudyEnrolment < SchemeOfStudyEnrolment
|
955
|
+
|
956
|
+
extend StudentEndpoint
|
957
|
+
|
958
|
+
# @see (LUSI::API::Course::ModuleEnrolment#lookup_index)
|
959
|
+
def lookup_index
|
960
|
+
:scheme_student
|
961
|
+
end
|
962
|
+
|
963
|
+
end
|
964
|
+
|
965
|
+
|
966
|
+
# Represents a subject in the LUSI API
|
967
|
+
class Subject
|
968
|
+
|
969
|
+
# @!attribute [rw] identity
|
970
|
+
# @return [String, nil] the identity code of the subject
|
971
|
+
attr_accessor :identity
|
972
|
+
|
973
|
+
# @!attribute [rw] mnemonic
|
974
|
+
# @return [String, nil] the mnemonic for the subject
|
975
|
+
attr_accessor :mnemonic
|
976
|
+
|
977
|
+
# @!attribute [rw] title
|
978
|
+
# @return [String, nil] the title of the subject
|
979
|
+
attr_accessor :title
|
980
|
+
|
981
|
+
# @!attribute [rw] group
|
982
|
+
# @return [String, nil] the group type of the subject
|
983
|
+
attr_accessor :group
|
984
|
+
|
985
|
+
# @!attribute [rw] department
|
986
|
+
# @return [LUSI::API::Organisation::Unit, nil] the department associated with the subject
|
987
|
+
attr_accessor :department
|
988
|
+
|
989
|
+
# Initialises a new Subject instance
|
990
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the subject
|
991
|
+
# @param lookup [LUSI::API::Core::LookupTable, nil] the lookup table for department resolution
|
992
|
+
# @param department [LUSI::API::Organisation::Unit, nil] the default department
|
993
|
+
# @param group [String, nil] the default group type
|
994
|
+
# @param identity [String, nil] the default identity code
|
995
|
+
# @param mnemonic [String, nil] the default mnemonic
|
996
|
+
# @param title [String, title] the default title
|
997
|
+
# @return [void]
|
998
|
+
def initialize(xml = nil, lookup = nil, department: nil, group: nil, identity: nil, mnemonic: nil, title: nil)
|
999
|
+
@department = LUSI::API::Core::XML.lookup(xml, lookup, :department, 'xmlns:Department/xmlns:Identity',
|
1000
|
+
department)
|
1001
|
+
@group = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Group', group)
|
1002
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
1003
|
+
@mnemonic = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Mnemonic', mnemonic)
|
1004
|
+
@title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
# Returns a string representation of the Subject instance
|
1008
|
+
# @return [String] the string representationn of the Subject instance
|
1009
|
+
def to_s
|
1010
|
+
@title
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
|
1016
|
+
# Represents a syllabus rule in the LUSI API
|
1017
|
+
class SyllabusRuleModule
|
1018
|
+
|
1019
|
+
# @!attribute [rw] identity
|
1020
|
+
# @return [LUSI::API::Course::Identity, nil] the identity code of the associatied module or scheme of study
|
1021
|
+
attr_accessor :identity
|
1022
|
+
|
1023
|
+
# @!attribute [rw] display_long_title
|
1024
|
+
# @return [String, nil] the long title of the rule
|
1025
|
+
attr_accessor :display_long_title
|
1026
|
+
|
1027
|
+
# @!attribute [rw] display_short_title
|
1028
|
+
# @return [String, nil] the short title of the rule
|
1029
|
+
attr_accessor :display_short_title
|
1030
|
+
|
1031
|
+
# Initialises a new SyllabusRuleModule instance
|
1032
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the syllabus rule module
|
1033
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
1034
|
+
# @param identity [String, nil] the default identity code
|
1035
|
+
# @param display_long_title [String, nil] the default long title
|
1036
|
+
# @param display_short_title [String, nil] the default short title
|
1037
|
+
# @return [void]
|
1038
|
+
def initialize(xml = nil, lookup = nil, display_long_title: nil, display_short_title: nil, identity: nil)
|
1039
|
+
@display_long_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayLongTitle', display_long_title)
|
1040
|
+
@display_short_title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:DisplayShortTitle', display_short_title)
|
1041
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
1042
|
+
end
|
1043
|
+
|
1044
|
+
# Returns a string representation to the SyllabusRuleModule instance
|
1045
|
+
# @return [String] the string representation to the SyllabusRuleModule instance
|
1046
|
+
def to_s
|
1047
|
+
@display_long_title
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
|
1053
|
+
# Represents a syllabus rule type in the LUSI API
|
1054
|
+
class SyllabusRuleType < LUSI::API::Core::Code
|
1055
|
+
|
1056
|
+
# @!attribute [rw] category
|
1057
|
+
# @return [String, nil] the rule type category (short description)
|
1058
|
+
attr_accessor :category
|
1059
|
+
|
1060
|
+
# Initialises a new SyllabusRuleType instance
|
1061
|
+
# @param (see LUSI::API::Core::Code)
|
1062
|
+
# @param category [String, nil] the default rule type category (short description)
|
1063
|
+
# @return [void]
|
1064
|
+
def initialize(xml = nil, lookup = nil, category: nil, **kwargs)
|
1065
|
+
super(xml, **kwargs)
|
1066
|
+
@category = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Category', category)
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
# Returns a string representation of the SyllabusRuleType instance
|
1070
|
+
# @return [String] the string representation of the SyllabusRuleType instance
|
1071
|
+
def to_s
|
1072
|
+
"[#{@category}]: #{@description}"
|
1073
|
+
end
|
1074
|
+
|
1075
|
+
end
|
1076
|
+
|
1077
|
+
|
1078
|
+
# Represents a syllabus rule in the LUSI API
|
1079
|
+
class SyllabusRule
|
1080
|
+
|
1081
|
+
# @!attribute [rw] level
|
1082
|
+
# @return [String, nil] the level this rule applies to ('Module', 'Part II Year 3' etc.)
|
1083
|
+
attr_accessor :level
|
1084
|
+
|
1085
|
+
# @!attribute [rw] type
|
1086
|
+
# @return [LUSI::API::Course::SyllabusRuleType] the rule type
|
1087
|
+
attr_accessor :type
|
1088
|
+
|
1089
|
+
# @!attribute [rw] syllabus_rule_modules
|
1090
|
+
# @return [Array<LUSI::API::Course::SyllabusRuleModule>, nil] the list of modules included with this rule
|
1091
|
+
attr_accessor :syllabus_rule_modules
|
1092
|
+
|
1093
|
+
# Initialises a new SyllabusRule instance
|
1094
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the syllabus rule
|
1095
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
1096
|
+
# @param level [String, nil] the default rule level
|
1097
|
+
# @param type [LUSI::API::Course::SyllabusRuleType, nil] the default rule type
|
1098
|
+
# @param syllabus_rule_modules [Array<LUSI::API::Course::SyllabusRuleModule>, nil] the default rule modules
|
1099
|
+
# @return [void]
|
1100
|
+
def initialize(xml = nil, lookup = nil, level: nil, syllabus_rule_modules: nil, type: nil)
|
1101
|
+
@level = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Level', level)
|
1102
|
+
@syllabus_rule_modules = LUSI::API::Core::XML.xml(xml, 'xmlns:SyllabusRuleModuless/xmlns:SyllabusRuleModule',
|
1103
|
+
syllabus_rule_modules) { |s| SyllabusRuleModule.new(s, lookup) }
|
1104
|
+
@type = SyllabusRuleType.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Type', type), lookup)
|
1105
|
+
end
|
1106
|
+
|
1107
|
+
# Returns a string representation of the SyllabusRule instance
|
1108
|
+
# @return [String] the string representation of the SyllabusRule instance
|
1109
|
+
def to_s
|
1110
|
+
"#{@level} #{@type}"
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
|
1116
|
+
# Represents a module in the LUSI API
|
1117
|
+
class Module < ModuleBase
|
1118
|
+
|
1119
|
+
# @!attribute [rw] assessment_proportions
|
1120
|
+
# @return [Array<LUSI::API::Course::AssessmentProportion>, nil] the assessment proportions for the module
|
1121
|
+
attr_accessor :assessment_proportions
|
1122
|
+
|
1123
|
+
# @!attribute [rw] course_convenors
|
1124
|
+
# @return [Array<LUSI::API::Person::StaffMember>] the course convenor(s)
|
1125
|
+
attr_accessor :course_convenors
|
1126
|
+
|
1127
|
+
# @!attribute [rw] lecture_capture_enabled
|
1128
|
+
# @return [Boolean, nil] true if automated lecture capture is available for the module, otherwise false
|
1129
|
+
attr_accessor :lecture_capture_enabled
|
1130
|
+
|
1131
|
+
# @!attribute [rw] module_evaluation_cohorts
|
1132
|
+
# @return [Array<LUSI::API::Course::ModuleEvaluationCohort>, nil] the evaluation cohorts for the module
|
1133
|
+
attr_accessor :module_evaluation_cohorts
|
1134
|
+
|
1135
|
+
# @!attribute [rw] partner_module_leaders
|
1136
|
+
# @return [Array<LUSI::API::Person::StaffMember>, nil] the staff members leading the module
|
1137
|
+
attr_accessor :partner_module_leaders
|
1138
|
+
|
1139
|
+
# @!attribute [rw] validating_institution
|
1140
|
+
# @return [LUSI::API::Organisation::Unit, nil] the validating institution for the module
|
1141
|
+
attr_accessor :validating_institution
|
1142
|
+
|
1143
|
+
# Initialises a new Module instance
|
1144
|
+
# @param (see LUSI::API::Course::ModuleBase#initialize)
|
1145
|
+
# @param assessment_proportions [Array<LUSI::API::Course::AssessmentProportion>, nil] the default assessment
|
1146
|
+
# proportions
|
1147
|
+
# @param course_convenors [Array<LUSI::API::Person::StaffMember>, nil] the default course convenors
|
1148
|
+
# @param lecture_capture_enabled [Boolean, nil] the default lecture-capture-enabled flag
|
1149
|
+
# @param module_evaluation_cohorts [Array<LUSI::API::Course::ModuleEvaluationCohort>, nil] the default
|
1150
|
+
# module evaluation cohorts
|
1151
|
+
# @param partner_module_leaders [Array<LUSI::API::Person::StaffMember>, nil] the default partner module leaders
|
1152
|
+
# @param validating_institution [LUSI::API::Organisation::Unit] the default validating institution
|
1153
|
+
def initialize(xml = nil, lookup = nil, assessment_proportions: nil, course_convenors: nil,
|
1154
|
+
lecture_capture_enabled: nil, module_evaluation_cohorts: nil, partner_module_leaders: nil,
|
1155
|
+
validating_institution: nil, **kwargs)
|
1156
|
+
super(xml, lookup, **kwargs)
|
1157
|
+
@assessment_proportions = LUSI::API::Core::XML.xml(xml,
|
1158
|
+
'xmlns:AssessmentProportions/xmlns:AssessmentProportion',
|
1159
|
+
assessment_proportions) { |a| AssessmentProportion.new(a, lookup) }
|
1160
|
+
@course_convenors = LUSI::API::Core::XML.xml(xml, 'xmlns:CourseConvenor/xmlns:StaffMember',
|
1161
|
+
course_convenors) { |s| LUSI::API::Person::StaffMember.new(s, lookup) }
|
1162
|
+
@lecture_caputure_enabled = LUSI::API::Core::XML.xml_boolean_at(xml, 'xmlns:LectureCaptureEnabled',
|
1163
|
+
lecture_capture_enabled)
|
1164
|
+
@module_evaluation_cohorts = LUSI::API::Core::XML.xml(xml, 'xmlns:ModuleEvaluationCohorts/xmlns:ModuleEvaluationCohort',
|
1165
|
+
module_evaluation_cohorts) { |m| ModuleEvaluationCohort.new(m, lookup) }
|
1166
|
+
@partner_module_leaders = LUSI::API::Core::XML.xml(xml, 'xmlns:PartnerModuleLeader/xmlns:StaffMember',
|
1167
|
+
partner_module_leaders) { |s| LUSI::API::Person::StaffMember.new(s, lookup) }
|
1168
|
+
@validating_institution = LUSI::API::Core::XML.lookup(xml, lookup, :institution,
|
1169
|
+
'xmlns:ValidatingInstitution/xmlns:Identity',
|
1170
|
+
validating_institution)
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
# @see (LUSI::API::Course::ModuleBase#enrolment_lookup_indices)
|
1174
|
+
def enrolment_lookup_indices
|
1175
|
+
[:module_staff, :module_student]
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
# Returns a hash of parameters for the LUSI API call
|
1179
|
+
# @param (see LUSI::API::Course::ModuleBase#get_instance_params)
|
1180
|
+
# @param awarding_institution_id [String, nil] the awarding institution identity code
|
1181
|
+
def self.get_instance_params(validating_institution_id: nil, **kwargs)
|
1182
|
+
params = super(**kwargs)
|
1183
|
+
params[:ValidatingInstitutionId] = kwargs.fetch(:validating_institution_id, '')
|
1184
|
+
params
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
# Returns the LUSI API endpoint
|
1188
|
+
# @return [String] the LUSI API endpoint
|
1189
|
+
def self.lusi_ws_endpoint
|
1190
|
+
'CourseManager.asmx'
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
# Returns the LUSI API method
|
1194
|
+
# @return [String] the LUSI API method
|
1195
|
+
def self.lusi_ws_method
|
1196
|
+
'GetModuleFullDetails'
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
# Returns the root element name of the LUSI API XML response
|
1200
|
+
# @return [String] the root element name of the LUSI API XML response
|
1201
|
+
def self.lusi_ws_xml_root
|
1202
|
+
'ModuleRecord'
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
end
|
1206
|
+
|
1207
|
+
|
1208
|
+
# Represents a scheme (or programme) of study in the LUSI API
|
1209
|
+
class SchemeOfStudy < ModuleBase
|
1210
|
+
|
1211
|
+
# @!attribute [rw] awarding_institution
|
1212
|
+
# @return [LUSI::API::Organisation::Unit, nil] the awarding institution for the scheme of study
|
1213
|
+
attr_accessor :awarding_institution
|
1214
|
+
|
1215
|
+
# @!attribute [rw] credit_points
|
1216
|
+
# @return [LUSI::API::Course::CreditPoints, nil] the required credit points for the scheme of study
|
1217
|
+
attr_accessor :credit_points
|
1218
|
+
|
1219
|
+
# @!attribute [rw] length
|
1220
|
+
# @return [LUSI::API::Course::Length, nil] the length of the scheme of study
|
1221
|
+
attr_accessor :length
|
1222
|
+
|
1223
|
+
# @!attribute [rw] mode_of_study
|
1224
|
+
# @return [LUSI::API::Core::Code, nil] the scheme's mode of study
|
1225
|
+
attr_accessor :mode_of_study
|
1226
|
+
|
1227
|
+
# @!attribute [rw] qualification
|
1228
|
+
# @return [String, nil] the qualification awarded by the scheme of study
|
1229
|
+
attr_accessor :qualification
|
1230
|
+
|
1231
|
+
# @!attribute [rw] ucas_course_code
|
1232
|
+
# @return [String, nil] the UCAS course code for the scheme of study
|
1233
|
+
attr_accessor :ucas_course_code
|
1234
|
+
|
1235
|
+
# Initialises a new SchemeOfStudy instance
|
1236
|
+
# @param (see LUSI::API::Course::ModuleBase#initialize)
|
1237
|
+
# @param awarding_institution [LUSI::API::Organisation::Unit, nil] the default awarding institution
|
1238
|
+
# @param credit_points [LUSI::API::Course::CreditPoints, nil] the default credit points
|
1239
|
+
# @param director_of_studies [Array<LUSI::API::Person::StaffMember>, nil] the default director-of-studies list
|
1240
|
+
# @param length [LUSI::API::Course::Length] the default scheme of study length
|
1241
|
+
# @param mode_of_study [LUSI::API::Core::Code] the default mode of study
|
1242
|
+
# @param qualification [String, nil] the default qualification
|
1243
|
+
# @param ucas_course_code [String, nil] the default UCAS course code
|
1244
|
+
# @return [void]
|
1245
|
+
def initialize(xml = nil, lookup = nil, awarding_institution: nil, credit_points: nil, director_of_studies: nil,
|
1246
|
+
length: nil, mode_of_study: nil, qualification: nil, ucas_course_code: nil, **kwargs)
|
1247
|
+
super(xml, lookup, **kwargs)
|
1248
|
+
@awarding_institution = LUSI::API::Core::XML.lookup(xml, lookup, :organisation,
|
1249
|
+
'xmlns:AwardingInstitution/xmlns:Identity',
|
1250
|
+
awarding_institution)
|
1251
|
+
@credit_points = CreditPoints.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:CreditPoints', credit_points), lookup)
|
1252
|
+
@director_of_studies = LUSI::API::Core::XML.xml(xml, 'xmlns:DirectorOfStudies/xmlns:StaffMember',
|
1253
|
+
director_of_studies) { |s| LUSI::API::Person::StaffMember.new(s, lookup) }
|
1254
|
+
@length = Length.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:Length', length), lookup)
|
1255
|
+
@mode_of_study = LUSI::API::Core::Code.new(LUSI::API::Core::XML::xml_at(xml, 'xmlns:ModeOfStudy',
|
1256
|
+
mode_of_study), lookup)
|
1257
|
+
@qualification = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Qualification', qualification)
|
1258
|
+
@ucas_course_code = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:UCASCourseCode', ucas_course_code)
|
1259
|
+
end
|
1260
|
+
|
1261
|
+
# @see (LUSI::API::Course::ModuleBase#enrolment_lookup_indices)
|
1262
|
+
def enrolment_lookup_indices
|
1263
|
+
[:scheme_staff, :scheme_student]
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
protected
|
1267
|
+
|
1268
|
+
# Returns a hash of parameters for the LUSI API call
|
1269
|
+
# @param (see LUSI::API::Course::ModuleBase#get_instance_params)
|
1270
|
+
# @param awarding_institution_id [String, nil] the awarding institution identity code
|
1271
|
+
def self.get_instance_params(awarding_institution_id: nil, **kwargs)
|
1272
|
+
params = super(**kwargs)
|
1273
|
+
params[:AwardingInstitutionId] = kwargs.fetch(:awarding_institution_id, '')
|
1274
|
+
params
|
1275
|
+
end
|
1276
|
+
|
1277
|
+
# Returns the LUSI API endpoint
|
1278
|
+
# @return [String] the LUSI API endpoint
|
1279
|
+
def self.lusi_ws_endpoint
|
1280
|
+
'General.asmx'
|
1281
|
+
end
|
1282
|
+
|
1283
|
+
# Returns the LUSI API method
|
1284
|
+
# @return [String] the LUSI API method
|
1285
|
+
def self.lusi_ws_method
|
1286
|
+
'GetSchemesOfStudy'
|
1287
|
+
end
|
1288
|
+
|
1289
|
+
# Returns the root element name of the LUSI API XML response
|
1290
|
+
# @return [String] the root element name of the LUSI API XML response
|
1291
|
+
def self.lusi_ws_xml_root
|
1292
|
+
'SchemeOfStudy'
|
1293
|
+
end
|
1294
|
+
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
|
1298
|
+
end
|
1299
|
+
end
|
1300
|
+
end
|