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,115 @@
|
|
1
|
+
require 'lusi_api/core/code'
|
2
|
+
require 'lusi_api/core/xml'
|
3
|
+
|
4
|
+
|
5
|
+
module LUSI
|
6
|
+
module API
|
7
|
+
module Person
|
8
|
+
|
9
|
+
|
10
|
+
# Represents a staff course role in the LUSI API
|
11
|
+
class StaffCourseRole < LUSI::API::Core::Code
|
12
|
+
|
13
|
+
# @!attribute [rw] vle_role_description
|
14
|
+
# @return [String, nil] the VLE role description
|
15
|
+
attr_accessor :vle_role_description
|
16
|
+
|
17
|
+
# Returns an instance of StaffCourseRole matching the specified parameters
|
18
|
+
# @param api [LUSI::API::Core::API, nil] the LUSI API instance
|
19
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
20
|
+
# @param (see LUSI::API::Core::Code#get_instance)
|
21
|
+
# @return [Array<LUSI::API::Person::StaffCourseRole>, nil]
|
22
|
+
def self.get_instance(api = nil, lookup = nil, **kwargs)
|
23
|
+
super(api, lookup, 'LUSIReference', 'Lookup.asmx', 'GetStaffCourseRoles', 'xmlns:StaffCourseRole',
|
24
|
+
result_class: StaffCourseRole, **kwargs)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Initialises a new StaffCourseRole instance
|
28
|
+
# @param (see LUSI::API::Core::Code#initialize)
|
29
|
+
# @param vle_role_description [String, nil] the default VLE role description
|
30
|
+
# @return [void]
|
31
|
+
def initialize(xml = nil, lookup = nil, vle_role_description: nil, **kwargs)
|
32
|
+
super(xml, lookup, **kwargs)
|
33
|
+
@vle_role_description = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:VLERoleDescription',
|
34
|
+
vle_role_description)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
# Represents a staff member in the LUSI API
|
41
|
+
class StaffMember
|
42
|
+
|
43
|
+
# @!attribute [rw] identity
|
44
|
+
# @return [String, nil] the identity code of the staff member
|
45
|
+
attr_accessor :identity
|
46
|
+
|
47
|
+
# @!attribute [rw] title
|
48
|
+
# @return [String, nil] the title (honourific) of the staff member
|
49
|
+
attr_accessor :title
|
50
|
+
|
51
|
+
# @!attribute [rw] surname
|
52
|
+
# @return [String, nil] the surname of the staff member
|
53
|
+
attr_accessor :surname
|
54
|
+
|
55
|
+
# @!attribute [rw] forename
|
56
|
+
# @return [String, nil] the forename of the staff member
|
57
|
+
attr_accessor :forename
|
58
|
+
|
59
|
+
# @!attribute [rw] preferred_name
|
60
|
+
# @return [String, nil] the preferred name of the staff member
|
61
|
+
attr_accessor :preferred_name
|
62
|
+
|
63
|
+
# @!attribute [rw] department
|
64
|
+
# @return [LUSI::API::Organisation::Unit, nil] the staff member's associated department
|
65
|
+
attr_accessor :department
|
66
|
+
|
67
|
+
# @!attribute [rw] faculty
|
68
|
+
# @return [LUSI::API::Organisation::Unit, nil] the staff member's associated faculty
|
69
|
+
attr_accessor :faculty
|
70
|
+
|
71
|
+
# @!attribute [rw] institution
|
72
|
+
# @return [LUSI::API::Organisation::Unit, nil] the staff member's associated institution
|
73
|
+
attr_accessor :institution
|
74
|
+
|
75
|
+
# Initialises a new StaffMember instance
|
76
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the staff member
|
77
|
+
# @param lookup [LUSI::API::Core::LookupTable, nil] the lookup service for organisation unit resolution
|
78
|
+
# @param department [LUSI::API::Organisation::Unit, nil] the default department
|
79
|
+
# @param faculty [LUSI::API::Organisation::Unit, nil] the default faculty
|
80
|
+
# @param forename [String, nil] the default forename
|
81
|
+
# @param identity [String, nil] the default identity code
|
82
|
+
# @param institution [LUSI::API::Organisation::Unit, nil] the default institution
|
83
|
+
# @param preferred_name [String, nil] the default preferred name
|
84
|
+
# @param surname [String, nil] the default surname
|
85
|
+
# @param title [String, nil] the default title (honourific)
|
86
|
+
# @return [void]
|
87
|
+
def initialize(xml = nil, lookup = nil, department: nil, faculty: nil, forename: nil, identity: nil,
|
88
|
+
institution: nil, preferred_name: nil, surname: nil, title: nil)
|
89
|
+
@department = LUSI::API::Core::XML.lookup(xml, lookup, :department, 'xmlns:Department/xmlns:Identity',
|
90
|
+
department)
|
91
|
+
@faculty = LUSI::API::Core::XML.lookup(xml, lookup, :faculty, 'xmlns:Faculty/xmlns:Identity', faculty)
|
92
|
+
@forename = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Forename', forename)
|
93
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
94
|
+
@institution = LUSI::API::Core::XML.lookup(xml, lookup, :institution, 'xmlns:Institution/xmlns:Identity',
|
95
|
+
institution)
|
96
|
+
@preferred_name = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:PreferredName', preferred_name)
|
97
|
+
@surname = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Surname', surname)
|
98
|
+
@title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns a string representation of the staff member (full name)
|
102
|
+
# @return [String] the string representation of the staff member (full name)
|
103
|
+
def to_s
|
104
|
+
str = "#{@title} #{@forename} #{@surname}"
|
105
|
+
str.strip!
|
106
|
+
str.squeeze!(' ')
|
107
|
+
str
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,551 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
require 'lusi_api/core/api'
|
4
|
+
require 'lusi_api/core/xml'
|
5
|
+
require 'lusi_api/country'
|
6
|
+
require 'lusi_api/course'
|
7
|
+
require 'lusi_api/organisation'
|
8
|
+
|
9
|
+
|
10
|
+
module LUSI
|
11
|
+
module API
|
12
|
+
module Person
|
13
|
+
|
14
|
+
|
15
|
+
# Represents a student's leaving details in the LUSI API
|
16
|
+
class LeaveDetails
|
17
|
+
|
18
|
+
# @!attribute [rw] last_attend_date
|
19
|
+
# @return [DateTime, nil] the date of last attendance
|
20
|
+
attr_accessor :last_attend_date
|
21
|
+
|
22
|
+
# @!attribute [rw] leave_date
|
23
|
+
# @return [DateTime, nil] the date of leaving
|
24
|
+
attr_accessor :leave_date
|
25
|
+
|
26
|
+
# @!attribute [rw] leave_reason
|
27
|
+
# @return [LUSI::API::Core::Code, nil] the reason for leaving
|
28
|
+
attr_accessor :leave_reason
|
29
|
+
|
30
|
+
# Initialises a new LeaveDetails instance
|
31
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the leave details
|
32
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
33
|
+
# @param last_attend_date [DateTime, nil] the default date of last attendance
|
34
|
+
# @param leave_date [DateTime, nil] the default leave date
|
35
|
+
# @param leave_reason [LUSI::API::Core::Code, nil] the reason for leaving
|
36
|
+
# @return [void]
|
37
|
+
def initialize(xml = nil, lookup = nil, last_attend_date: nil, leave_date: nil, leave_reason: nil)
|
38
|
+
@leave_reason = LUSI::API::Core::Code.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:LeaveReason'), lookup)
|
39
|
+
@leave_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:LeaveDate')
|
40
|
+
@last_attend_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:LastAttendDate')
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a string representation of the LeaveDetails instance
|
44
|
+
# @return [String] the string representation of the LeaveDetails instance
|
45
|
+
def to_s
|
46
|
+
@leave_reason.to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
# Represents a person's postal address
|
53
|
+
class PersonAddress
|
54
|
+
|
55
|
+
# @!attribute [rw] address_type
|
56
|
+
# @return [String, nil] the address type (e.g. 'Termtime Address')
|
57
|
+
attr_accessor :address_type
|
58
|
+
|
59
|
+
# @!attribute [rw] address_line_1
|
60
|
+
# @return [String, nil] the first address line
|
61
|
+
attr_accessor :address_line_1
|
62
|
+
|
63
|
+
# @!attribute [rw] address_line_2
|
64
|
+
# @return [String, nil] the second address line
|
65
|
+
attr_accessor :address_line_2
|
66
|
+
|
67
|
+
# @!attribute [rw] address_line_3
|
68
|
+
# @return [String, nil] the third address line
|
69
|
+
attr_accessor :address_line_3
|
70
|
+
|
71
|
+
# @!attribute [rw] address_line_4
|
72
|
+
# @return [String, nil] the fourth address line
|
73
|
+
attr_accessor :address_line_4
|
74
|
+
|
75
|
+
# @!attribute [rw] address_line_5
|
76
|
+
# @return [String, nil] the fifth address line
|
77
|
+
attr_accessor :address_line_5
|
78
|
+
|
79
|
+
# @!attribute [rw] post_code
|
80
|
+
# @return [String, nil] the postal or zip code
|
81
|
+
attr_accessor :post_code
|
82
|
+
|
83
|
+
# @!attribute [rw] country
|
84
|
+
# @return [LUSI::API::Person::AddressCountry, nil] the country
|
85
|
+
attr_accessor :country
|
86
|
+
|
87
|
+
# Initialises a PersonAddress instance
|
88
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the address
|
89
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
90
|
+
# @param address_type [String, nil] the default address type
|
91
|
+
# @param address_line_1 [String, nil] the default first address line
|
92
|
+
# @param address_line_2 [String, nil] the default second address line
|
93
|
+
# @param address_line_3 [String, nil] the default third address line
|
94
|
+
# @param address_line_4 [String, nil] the default fourth address line
|
95
|
+
# @param address_line_5 [String, nil] the default fifth address line
|
96
|
+
# @param post_code [String, nil] the default postal or zip code
|
97
|
+
# @param country [LUSI::API::Country::AddressCountry, nil] the default country
|
98
|
+
# @return [void]
|
99
|
+
def initialize(xml = nil, lookup = nil, address_type: nil, address_line_1: nil, address_line_2: nil,
|
100
|
+
address_line_3: nil, address_line_4: nil, address_line_5: nil, post_code: nil, country: nil)
|
101
|
+
@address_type = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressType', address_type)
|
102
|
+
@address_line_1 = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressLine1', address_line_1)
|
103
|
+
@address_line_2 = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressLine2', address_line_2)
|
104
|
+
@address_line_3 = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressLine3', address_line_3)
|
105
|
+
@address_line_4 = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressLine4', address_line_4)
|
106
|
+
@address_line_5 = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AddressLine5', address_line_5)
|
107
|
+
@post_code = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:PostCode', post_code)
|
108
|
+
@country = LUSI::API::Core::XML.lookup(xml, lookup, :address_country, 'xmlns:Country/xmlns:Identity', country)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns a string representation of the PersonAddress instance
|
112
|
+
# @return [String] the string representation of the PersonAddress instance
|
113
|
+
def to_s(sep = nil)
|
114
|
+
sep ||= ', '
|
115
|
+
fields = []
|
116
|
+
[@address_type, @address_line_1, @address_line_2, @address_line_3, @address_line_4, @address_line_5,
|
117
|
+
@post_code, @country].each do |field|
|
118
|
+
field_s = field.to_s
|
119
|
+
fields.push(field_s) unless field_s.nil? || field_s.empty?
|
120
|
+
end
|
121
|
+
fields.join(sep)
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
# Holds a person's combined contact details (postal addresses, email addresses, phone numbers)
|
128
|
+
class ContactDetail
|
129
|
+
|
130
|
+
# @!attribute [rw] addresses
|
131
|
+
# @return [Array<PersonAddress>, nil] postal addresses as an array of PersonAddress instances
|
132
|
+
attr_accessor :addresses
|
133
|
+
|
134
|
+
# @!attribute [rw] personal_email_address
|
135
|
+
# @return [Array<String>, nil] an array of personal email addresses
|
136
|
+
attr_accessor :personal_email_address
|
137
|
+
|
138
|
+
# @!attribute [rw] lancaster_email_address
|
139
|
+
# @return [Array<String>, nil] and array of institutional email addresses
|
140
|
+
attr_accessor :institutional_email_address
|
141
|
+
|
142
|
+
# !@attribute [rw] mobile_phone_number
|
143
|
+
# @return [String, nil] mobile phone number
|
144
|
+
attr_accessor :mobile_phone_number
|
145
|
+
|
146
|
+
# @see institutional_email_address an alias for institutional_email_address for consistency with the LUSI API
|
147
|
+
alias lancaster_email_address institutional_email_address
|
148
|
+
|
149
|
+
# Initialises a new ContactDetails instance
|
150
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the contact details record
|
151
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
152
|
+
# @param addresses [Array<PersonAddress>, nil] the default array of postal addresses
|
153
|
+
# @param institutional_email_address [String, nil] the default semi-colon-separated institutional email addresses
|
154
|
+
# @param mobile_phone_number [String, nil] the default mobile phone number
|
155
|
+
# @param personal_email_address [String, nil] the default semi-colon-separated personal email addresses
|
156
|
+
# @return [void]
|
157
|
+
def initialize(xml = nil, lookup = nil, addresses: nil, institutional_email_address: nil, mobile_phone_number: nil,
|
158
|
+
personal_email_address: nil)
|
159
|
+
@addresses = LUSI::API::Core::XML.xml(xml, 'xmlns:Addresses/xmlns:PersonAddress') { |a| PersonAddress.new(a, lookup) }
|
160
|
+
@institutional_email_address = email_list(xml, 'xmlns:LancasterEmailAddress', institutional_email_address)
|
161
|
+
@mobile_phone_number = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:MobilePhoneNumber', mobile_phone_number)
|
162
|
+
@personal_email_address = email_list(xml, 'xmlns:PersonalEmailAddress', personal_email_address)
|
163
|
+
end
|
164
|
+
|
165
|
+
protected
|
166
|
+
|
167
|
+
# Extracts a semi-colon-separated email address from XML and splits into an array of single email addresses.
|
168
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the email address
|
169
|
+
# @param path [String] the XPath of the required email address
|
170
|
+
# @param default [String, nil] the default email address string
|
171
|
+
# @return [Array<String>] the array of single email addresses
|
172
|
+
def email_list(xml, path, default = nil)
|
173
|
+
# Extract the email address string from XML
|
174
|
+
emails = LUSI::API::Core::XML.xml_content_at(xml, path, default).to_s
|
175
|
+
# Split the string on semi-colons and remove empty entries
|
176
|
+
emails.strip.split(/\s*;\s*/).reject { |email| email.nil? || email.empty? }
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
class UserContact
|
183
|
+
|
184
|
+
# @!attribute [rw] identity
|
185
|
+
# @return [String, nil] the identity code of the contact
|
186
|
+
attr_accessor :identity
|
187
|
+
|
188
|
+
# @!attribute [rw] contact_type
|
189
|
+
# @return [String, nil] the type of contact ('Staff' | 'Student')
|
190
|
+
attr_accessor :contact_type
|
191
|
+
|
192
|
+
# @!attribute [rw] contact_name
|
193
|
+
# @return [String, nil] the name of the contact
|
194
|
+
attr_accessor :contact_name
|
195
|
+
|
196
|
+
# @!attribute [rw] email_address
|
197
|
+
# @return [String, nil] the email address of the contact
|
198
|
+
attr_accessor :email_address
|
199
|
+
|
200
|
+
# Initialises a new UserContact instance
|
201
|
+
# @param identity [String, nil] the default identity code of the contact
|
202
|
+
# @param contact_type [String, nil] the default contact type ('Staff' | 'Student')
|
203
|
+
# @param contact_name [String, nil] the default contact name
|
204
|
+
# @param email_address [String, nil] the default email address
|
205
|
+
# @return [void]
|
206
|
+
def initialize(xml = nil, lookup = nil, identity: nil, contact_type: nil, contact_name: nil, email_address: nil)
|
207
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
208
|
+
@contact_type = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ContactType', contact_type)
|
209
|
+
@contact_name = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:ContactName', contact_name)
|
210
|
+
@email_address = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:EmailAddress', email_address)
|
211
|
+
end
|
212
|
+
|
213
|
+
# Returns a string representation of the instance
|
214
|
+
# @return [String] the string representation of the contact
|
215
|
+
def to_s
|
216
|
+
email = @email_address ? " <#{@email_address}>" : ''
|
217
|
+
"#{@contact_name}#{@email}"
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
# Represents a student's relationship with a member of staff
|
224
|
+
class Relationship
|
225
|
+
|
226
|
+
# @!attribute [rw] staff_relationship
|
227
|
+
# @return [LUSI::API::Core::Code, nil] the staff relationship type
|
228
|
+
attr_accessor :staff_relationship
|
229
|
+
|
230
|
+
# @!attribute [rw] user_contact
|
231
|
+
# @return [LUSI::API::Person::UserContact, nil] the related person's contact details
|
232
|
+
attr_accessor :user_contact
|
233
|
+
|
234
|
+
# Initialises a new Relationship instance
|
235
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the relationship
|
236
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
237
|
+
# @param staff_relationship [LUSI::API::Core::Code, nil] the default staff relationship code
|
238
|
+
# @param user_contact [LUSI::API::Person::UserContact, nil] the default related person's contact details
|
239
|
+
def initialize(xml = nil, lookup = nil, staff_relationship: nil, user_contact: nil)
|
240
|
+
@staff_relationship = LUSI::API::Core::Code.new(
|
241
|
+
LUSI::API::Core::XML.xml_at(xml, 'xmlns:StaffRelationship', staff_relationship), lookup)
|
242
|
+
@user_contact = UserContact.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:UserContact', user_contact), lookup)
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns a string representation of the relationship
|
246
|
+
def to_s
|
247
|
+
contact = @user_contact ? @user_contact.contact_name : ''
|
248
|
+
description = @staff_relationship ? "#{@staff_relationship.description}: " : ''
|
249
|
+
"#{description}#{contact}"
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
|
255
|
+
# Represents a student record in the LUSI API
|
256
|
+
class StudentRecord
|
257
|
+
|
258
|
+
# @!attribute [rw] identity
|
259
|
+
# @return [String, nil] the institutional identity code for the student registration
|
260
|
+
attr_accessor :identity
|
261
|
+
|
262
|
+
# @!attribute [rw] external_institution_identity
|
263
|
+
# @return [String, nil] the external institutional identity code for the student registration
|
264
|
+
attr_accessor :external_institution_identity
|
265
|
+
|
266
|
+
# @!attribute [rw] category
|
267
|
+
# @return [String, nil] the category (type) of registration
|
268
|
+
attr_accessor :category
|
269
|
+
|
270
|
+
|
271
|
+
# @!attribute [rw] college
|
272
|
+
# @return [String, nil] the associated college name
|
273
|
+
attr_accessor :college
|
274
|
+
|
275
|
+
# @!attribute [rw] department
|
276
|
+
# @return [LUSI::API::Organisation::Unit, nil] the organisation Unit representing the associated department
|
277
|
+
attr_accessor :department
|
278
|
+
|
279
|
+
# @!attribute [rw] attendance_status
|
280
|
+
# @return [String, nil] the current status of the registration
|
281
|
+
attr_accessor :attendance_status
|
282
|
+
|
283
|
+
# @!attribute [rw] research_student
|
284
|
+
# @return [Boolean, nil] true if the registration is for a research course, otherwise false
|
285
|
+
attr_accessor :research_student
|
286
|
+
|
287
|
+
# @!attribute [rw] scheme_of_study
|
288
|
+
# @return [LUSI::API::Course::SchemeOfStudy, nil] the student's scheme (or programme) of study
|
289
|
+
attr_accessor :scheme_of_study
|
290
|
+
|
291
|
+
# @!attribute [rw] programme_of_study
|
292
|
+
# @see (#scheme_of_study)
|
293
|
+
alias programme_of_study scheme_of_study
|
294
|
+
|
295
|
+
# @!attribute [rw] entry_date
|
296
|
+
# @return [DateTime, nil] the start date of the scheme of study
|
297
|
+
attr_accessor :entry_date
|
298
|
+
|
299
|
+
# @!attribute [rw] expected_completion_date
|
300
|
+
# @return [DateTime, nil] the expected date of completion
|
301
|
+
attr_accessor :expected_completion_date
|
302
|
+
|
303
|
+
# @!attribute [rw] year_of_study
|
304
|
+
# @return [Integer, nil] the current year of study (1 = first year, 2 = second year etc.)
|
305
|
+
attr_accessor :year_of_study
|
306
|
+
|
307
|
+
# @!attribute [rw] year_of_scheme_of_study
|
308
|
+
# @return [Integer, nil] the nominal year of the student's scheme of study
|
309
|
+
attr_accessor :year_of_scheme_of_study
|
310
|
+
|
311
|
+
# @!attribute [rw] modules
|
312
|
+
# @return [Array<LUSI::API::Course::ModuleEnrolment>, nil] an array of associated module enrolments
|
313
|
+
attr_accessor :modules
|
314
|
+
|
315
|
+
# @!attribute [rw] relationships
|
316
|
+
# @return [Array<LUSI::API::Person::Relationship>, nil] an array of relationships for the student
|
317
|
+
attr_accessor :relationships
|
318
|
+
|
319
|
+
# @!attribute [rw] full_name_on_certificate
|
320
|
+
# @return [String, nil] the full name to be used on the certificate
|
321
|
+
attr_accessor :full_name_on_certificate
|
322
|
+
|
323
|
+
# @!attribute [rw] leave_details
|
324
|
+
# @return [LUSI::API::Person::LeaveDetails, nil] the student's leaving details, nil if still a current student
|
325
|
+
attr_accessor :leave_details
|
326
|
+
|
327
|
+
# @!attribute [rw] user_account
|
328
|
+
# @return [Array<LUSI::API::Person::UserAccount>, nil] an array of the student's network accounts
|
329
|
+
attr_accessor :user_account
|
330
|
+
|
331
|
+
# Initialises a new StudentRecord instance
|
332
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the student record
|
333
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
334
|
+
# @param identity [String, nil] the default institutional registration identity code
|
335
|
+
# @param external_institution_identity [String, nil] the default external institution registration identity code
|
336
|
+
# @param category [String, nil] the default registration category (type)
|
337
|
+
# @param college [String, nil] the default associated college name
|
338
|
+
# @param department [LUSI::API::Organisation::Unit, nil] the default associated department
|
339
|
+
# @param attendance_status [String, nil] the default registration status
|
340
|
+
# @param research_student [Boolean, nil] the default value of the research student indicator flag
|
341
|
+
# @param scheme_of_study [LUSI::API::Course::SchemeOfStudyEnrolment, nil] the default scheme of study enrolment
|
342
|
+
# @param programme_of_study [LUSI::API::Course::SchemeOfStudyEnrolment, nil] synonym for scheme_of_study
|
343
|
+
# @param entry_date [DateTime, nil] the default start date of the scheme of study
|
344
|
+
# @param expected_completion_date [DateTime, nil] the default expected completion date
|
345
|
+
# @param year_of_study [Integer, nil] the default year of study
|
346
|
+
# @param year_of_scheme_of_study [Integer, nil] the default year of the scheme of study
|
347
|
+
# @param modules [Array<LUSI::API::Course::ModuleEnrolment>, nil] the default list of associated modules
|
348
|
+
# @param relationships [Array<LUSI::API::Person::Relationship>, nil] the default list of staff relationships
|
349
|
+
# @param full_name_on_certificate [String, nil] the default full certificate name
|
350
|
+
# @param leave_details [LUSI::API::Person::LeaveDetails] the default leaving details
|
351
|
+
# @param user_account [Array<LUSI::API::Person::UserAccount>, nil] the default list of user accounts
|
352
|
+
# @return [void]
|
353
|
+
def initialize(xml = nil, lookup = nil, identity: nil, external_institution_identity: nil, category: nil,
|
354
|
+
college: nil, department: nil, attendance_status: nil, research_student: nil,
|
355
|
+
programme_of_study: nil, scheme_of_study: nil, entry_date: nil, expected_completion_date: nil,
|
356
|
+
year_of_study: nil, year_of_scheme_of_study: nil, modules: nil, relationships: nil,
|
357
|
+
full_name_on_certificate: nil, leave_details: nil, user_account: nil)
|
358
|
+
scheme_of_study ||= programme_of_study
|
359
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
360
|
+
@external_institution_identity = LUSI::API::Core::XML.xml_content_at(xml,
|
361
|
+
'xmlns:ExternalInstitutionIdentity',
|
362
|
+
external_institution_identity)
|
363
|
+
@category = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Category', category)
|
364
|
+
@college = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:College', college)
|
365
|
+
@department = LUSI::API::Core::XML.lookup(xml, lookup, :department, 'xmlns:Department', department)
|
366
|
+
@attendance_status = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AttendanceStatus', attendance_status)
|
367
|
+
@research_student = LUSI::API::Core::XML.xml_boolean_at(xml, 'xmlns:ResearchStudent', research_student)
|
368
|
+
@scheme_of_study = LUSI::API::Course::SchemeOfStudyEnrolment.new(
|
369
|
+
LUSI::API::Core::XML.xml_at(xml, 'xmlns:ProgrammeOfStudy', scheme_of_study), lookup)
|
370
|
+
@entry_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:EntryDate', entry_date)
|
371
|
+
@expected_completion_date = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:ExpectedCompletionDate',
|
372
|
+
expected_completion_date)
|
373
|
+
@year_of_study = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:YearOfStudy', year_of_study)
|
374
|
+
@year_of_scheme_of_study = LUSI::API::Core::XML.xml_int_at(xml, 'xmlns:YearOfSchemeOfStudy',
|
375
|
+
year_of_scheme_of_study)
|
376
|
+
@modules = LUSI::API::Core::XML.xml(xml, 'xmlns:Modules/xmlns:Module') { |m| LUSI::API::Course::ModuleEnrolment.new(m, lookup) }
|
377
|
+
@relationships = LUSI::API::Core::XML.xml(xml, 'xmlns:Relationships/xmlns:Relationship',
|
378
|
+
relationships) { |r| Relationship.new(r, lookup) }
|
379
|
+
@full_name_on_certificate = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:FullNameOnCertificate',
|
380
|
+
full_name_on_certificate)
|
381
|
+
@leave_details = LeaveDetails.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:LeaveDetails', leave_details),
|
382
|
+
lookup)
|
383
|
+
@user_account = LUSI::API::Core::XML.xml(xml, 'xmlns:UserAccounts/xmlns:UserAccount',
|
384
|
+
user_account) { |a| UserAccount.new(a, lookup) }
|
385
|
+
end
|
386
|
+
|
387
|
+
# Returns a string representation of the StudentRecord instance
|
388
|
+
# @return [String] the string representation of the instance
|
389
|
+
def to_s
|
390
|
+
@identity
|
391
|
+
end
|
392
|
+
|
393
|
+
end
|
394
|
+
|
395
|
+
|
396
|
+
# Represents a user's network account in the LUSI API
|
397
|
+
class UserAccount
|
398
|
+
|
399
|
+
# @!attribute [rw] account_name
|
400
|
+
# @return [String, nil] the account username
|
401
|
+
attr_accessor :account_name
|
402
|
+
|
403
|
+
# @!attribute [rw] identity
|
404
|
+
# @return [String, nil] the student identity associated with the username
|
405
|
+
attr_accessor :identity
|
406
|
+
|
407
|
+
# Initialises a new UserAccount instance
|
408
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed root of the user account
|
409
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
410
|
+
# @param account_name [String, nil] the default account name
|
411
|
+
# @param identity [String, nil] the default student identity
|
412
|
+
# @return [void]
|
413
|
+
def initialize(xml = nil, lookup = nil, account_name: nil, identity: nil)
|
414
|
+
@account_name = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:AccountName', account_name)
|
415
|
+
@identity = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Identity', identity)
|
416
|
+
end
|
417
|
+
|
418
|
+
# Returns a string representation of the UserAccount instance
|
419
|
+
# @return [String] the string representation of the UserAccount instance
|
420
|
+
def to_s
|
421
|
+
@account_name
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
|
426
|
+
|
427
|
+
# Represents a person (student) in the LUSI API
|
428
|
+
class Student
|
429
|
+
|
430
|
+
# @!attribute [rw] title
|
431
|
+
# @return [String, nil] the person's title (honourific)
|
432
|
+
attr_accessor :title
|
433
|
+
|
434
|
+
# !@attribute [rw] surname
|
435
|
+
# @return [String, nil] the person's surname
|
436
|
+
attr_accessor :surname
|
437
|
+
|
438
|
+
# !@attribute [rw] forenames
|
439
|
+
# @return [String, nil] the person's full forenames (space-separated string)
|
440
|
+
attr_accessor :forenames
|
441
|
+
|
442
|
+
# @!attribute [rw] preferred_name
|
443
|
+
# @return [String, nil] the person's preferred name
|
444
|
+
attr_accessor :preferred_name
|
445
|
+
|
446
|
+
# @!attribute [rw] date_of_birth
|
447
|
+
# @return [DateTime, nil] the person's date of birth
|
448
|
+
attr_accessor :date_of_birth
|
449
|
+
|
450
|
+
# @!attribute [rw] gender
|
451
|
+
# @return [String, nil] the person's gender
|
452
|
+
attr_accessor :gender
|
453
|
+
|
454
|
+
# @!attribute [rw] fee_status
|
455
|
+
# @return [String, nil] the person's fee status
|
456
|
+
attr_accessor :fee_status
|
457
|
+
|
458
|
+
# @!attribute [rw] nationality
|
459
|
+
# @return [LUSI::API::Country::Nationality] the person's nationality
|
460
|
+
attr_accessor :nationality
|
461
|
+
|
462
|
+
# @!attribute [rw] contact_detail
|
463
|
+
# @return [LUSI::API::Person::ContactDetail, nil] the person's contact details
|
464
|
+
attr_accessor :contact_detail
|
465
|
+
|
466
|
+
# @!attribute [rw] student_records
|
467
|
+
# @return [Array<LUSI::API::Person::StudentRecord>, nil] the person's student record list
|
468
|
+
attr_accessor :student_records
|
469
|
+
|
470
|
+
# Returns an array of Student instances matching the search parameters
|
471
|
+
# @param api [LUSI::API::Core::API] the LUSI API instance to use for searching
|
472
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
473
|
+
# @param lancaster_student_id [String, nil] the Lancaster University student ID to search for
|
474
|
+
# @param external_student_id [String, nil] the external student ID to search for
|
475
|
+
# @param user_login [String, nil] the user login name to search for
|
476
|
+
# @param relationship_is_current_only [Boolean, nil] if true, search only current students;
|
477
|
+
# otherwise search current and historic students
|
478
|
+
# @param relationship_identity [String, nil] the relationship identity to search for
|
479
|
+
# @return [Array<Student>, nil] the list of matching Student instances
|
480
|
+
# @yield [obj] Pass the Student instance to the block
|
481
|
+
# @yieldparam obj [LUSI::API::Person::Student] the Student instance
|
482
|
+
def self.get_instance(api, lookup = nil, lancaster_student_id: nil, external_student_id: nil, user_login: nil,
|
483
|
+
relationship_is_current_only: nil, relationship_identity: nil)
|
484
|
+
params = get_instance_params(lancaster_student_id: lancaster_student_id,
|
485
|
+
external_student_id: external_student_id, user_login: user_login,
|
486
|
+
relationship_is_current_only: relationship_is_current_only,
|
487
|
+
relationship_identity: relationship_identity)
|
488
|
+
xml = api.call('UserDetails', 'StudentManager.asmx', 'GetFullDetails', **params)
|
489
|
+
LUSI::API::Core::XML.xml(xml, 'xmlns:Person') do |p|
|
490
|
+
obj = Student.new(p, lookup)
|
491
|
+
yield(obj) if block_given?
|
492
|
+
obj
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
# Initialises a new Person instance
|
497
|
+
# @param xml [Nokogiri::XML::Document, Nokogiri::XML::Node] the parsed XML root of the person
|
498
|
+
# @param lookup [LUSI::API::Core::Lookup::LookupService, nil] the lookup service for object resolution
|
499
|
+
# @param title [String, nil] the default title (honourific)
|
500
|
+
# @param surname [String, nil] the default surname
|
501
|
+
# @param forenames [String, nil] the default forenames (space-separated string)
|
502
|
+
# @param preferred_name [String, nil] the default preferred name
|
503
|
+
# @param date_of_birth [DateTime, nil] the default date of birth
|
504
|
+
# @param gender [String, nil] the default gender
|
505
|
+
# @param fee_status [String, nil] the default fee status
|
506
|
+
# @param nationality [LUSI::API::Country::Nationality, nil] the default nationality
|
507
|
+
# @param contact_detail [LUSI::API::Person::ContactDetail, nil] the default contact detail record
|
508
|
+
# @param student_records [Array<LUSI::API::Person::StudentRecord>, nil] the default student record list
|
509
|
+
# @return [void]
|
510
|
+
def initialize(xml = nil, lookup = nil, title: nil, surname: nil, forenames: nil, preferred_name: nil,
|
511
|
+
date_of_birth: nil, gender: nil, fee_status: nil, nationality: nil, contact_detail: nil,
|
512
|
+
student_records: nil)
|
513
|
+
@title = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Title', title)
|
514
|
+
@surname = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Surname', surname)
|
515
|
+
@forenames = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Forenames', forenames)
|
516
|
+
@preferred_name = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:PreferredName', preferred_name)
|
517
|
+
@date_of_birth = LUSI::API::Core::XML.xml_datetime_at(xml, 'xmlns:DateOfBirth', date_of_birth)
|
518
|
+
@gender = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:Gender', gender)
|
519
|
+
@fee_status = LUSI::API::Core::XML.xml_content_at(xml, 'xmlns:FeeStatus', fee_status)
|
520
|
+
@nationality = LUSI::API::Core::XML.lookup(xml, lookup, :nationality, 'xmlns:Nationality', nationality)
|
521
|
+
@contact_detail = ContactDetail.new(LUSI::API::Core::XML.xml_at(xml, 'xmlns:ContactDetail', contact_detail),
|
522
|
+
lookup)
|
523
|
+
@student_records = LUSI::API::Core::XML.xml(xml, 'xmlns:StudentRecords/xmlns:StudentRecord',
|
524
|
+
student_records) { |r| StudentRecord.new(r, lookup) }
|
525
|
+
end
|
526
|
+
|
527
|
+
# Returns a string representation of the person (full title and names)
|
528
|
+
# @return [String] the string representation of the person
|
529
|
+
def to_s
|
530
|
+
"#{@title} #{@sforenames} #{@surname}".squeeze!(' ').strip!
|
531
|
+
end
|
532
|
+
|
533
|
+
protected
|
534
|
+
|
535
|
+
def self.get_instance_params(**kwargs)
|
536
|
+
current_relationship_only = kwargs[:relationship_is_current_only]
|
537
|
+
current_relationship_only = current_relationship_only.nil? || current_relationship_only ? 'true' : 'false'
|
538
|
+
{
|
539
|
+
ExternalStudentId: kwargs[:external_student_id] || '',
|
540
|
+
LancasterStudentId: kwargs[:lancaster_student_id ]|| '',
|
541
|
+
RelationshipIsCurrentOnly: current_relationship_only,
|
542
|
+
RelationshipIdentity: kwargs[:relationship_identity] || '',
|
543
|
+
UserLogin: kwargs[:user_login] || ''
|
544
|
+
}
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
|
549
|
+
end
|
550
|
+
end
|
551
|
+
end
|