version 1.54, 2016/04/02 04:31:26
|
version 1.63, 2022/01/14 16:27:20
|
Line 39 described at http://www.lon-capa.org.
|
Line 39 described at http://www.lon-capa.org.
|
|
|
=head1 NOTABLE SUBROUTINES |
=head1 NOTABLE SUBROUTINES |
|
|
=over |
|
|
|
=cut |
=cut |
|
|
package localenroll; |
package localenroll; |
Line 48 package localenroll;
|
Line 46 package localenroll;
|
use strict; |
use strict; |
|
|
=pod |
=pod |
|
|
|
=over |
|
|
=item run() |
=item run() |
set this to return 1 if you want the auto enrollment to run |
set this to return 1 if you want the auto enrollment to run |
Line 144 sub run() {
|
Line 144 sub run() {
|
Manager, or via the 'Upload a class list','Enroll a single student' or |
Manager, or via the 'Upload a class list','Enroll a single student' or |
'Modify student data' utilities in the Enrollment Manager, by checking the |
'Modify student data' utilities in the Enrollment Manager, by checking the |
'make these dates the default for future enrollment' checkbox. If no default |
'make these dates the default for future enrollment' checkbox. If no default |
dates have been set, then the tudent role will be active immediately, and will |
dates have been set, then the student role will be active immediately, and will |
remain active until the role is explicitly expired using ENRL -> Drop students. |
remain active until the role is explicitly expired using ENRL -> Drop students. |
If dates are to included in the XML file, they should be in the format |
If dates are to included in the XML file, they should be in the format |
YYYY:MM:DD:HH:MM:SS (: separators required). |
YYYY:MM:DD:HH:MM:SS (: separators required). |
Line 207 sub fetch_enrollment {
|
Line 207 sub fetch_enrollment {
|
("001","601","602") would be returned |
("001","601","602") would be returned |
|
|
If the array returned contains at least one element, then |
If the array returned contains at least one element, then |
the interface offerred to the course coordinator, lists |
the interface offered to the course coordinator, lists |
official sections and provides a checkbox to use to |
official sections and provides a checkbox to use to |
select enrollment in the LON-CAPA course from each official section. |
select enrollment in the LON-CAPA course from each official section. |
|
|
Line 258 sub get_sections {
|
Line 258 sub get_sections {
|
username:domain |
username:domain |
(c) the LON-CAPA domain that contains the course |
(c) the LON-CAPA domain that contains the course |
|
|
new_course also takes a fourth (optional) argument - |
new_course also takes optional fourth and fifth arguments - |
(d) the course co-owners, as a comma-separated list of username:domain for |
(d) the course co-owners, as a comma-separated list of username:domain for |
any co-owners. |
any co-owners. |
|
(e) database handle (might be set when new_course() is called by check_section |
|
routine within localenroll.pm). |
|
|
=cut |
=cut |
|
|
Line 340 sub validate_instcode {
|
Line 342 sub validate_instcode {
|
|
|
=pod |
=pod |
|
|
|
=item validate_crosslist_access() |
|
|
|
This is called for an official course to check whether a course |
|
with the institutional code can have access to enrollment data |
|
from a cross-listed institutional section code, given a co-owner. |
|
|
|
validate_crosslist_access() takes four arguments - |
|
(a) the course's LON-CAPA domain |
|
(b) the institional course code assigned to the course |
|
(c) the institutional course section code for the crosslisting |
|
(d) the co-owner to check for affiliation with the crosslisting |
|
(username:domain). |
|
|
|
A combination of (a), (b), (c) and (d) with access to enrollment |
|
data, as per institutional policies, is confirmed by returning 'valid'. |
|
|
|
=cut |
|
|
|
sub validate_crosslist_access { |
|
my ($dom,$instcode,$inst_xlist,$coowner) = @_; |
|
my $outcome = ''; |
|
return $outcome; |
|
} |
|
|
|
=pod |
|
|
=item validate_crsreq() |
=item validate_crsreq() |
|
|
This is used to check whether a course request should be processed |
This is used to check whether a course request should be processed |
Line 542 sub crsreq_updates {
|
Line 570 sub crsreq_updates {
|
|
|
=pod |
=pod |
|
|
|
=item export_grades() |
|
|
|
This routine can be customized to push grade information to some other gradebook, |
|
LCMS, or administrative system external to LON-CAPA. |
|
|
|
export_grades() takes five arguments - |
|
(a) the LON-CAPA course ID |
|
(b) the LON-CAPA course domain |
|
(c) a hash reference containing the following: |
|
scope => scope of the grades (e.g., course, map or resource). |
|
instcode => institutional course code (if an official course) |
|
crstype => course type -- Course, Community or Placement |
|
context => calling context, e.g., "completion" when a student completes a placement test. |
|
(d) a perl data structure (hash of a hash) containing the grade data. |
|
in the outer hash, the keys are student's username:domain |
|
in the inner hash, keys are: |
|
id => student/employee ID |
|
lastname => student's last name |
|
firstname => student's first name |
|
email => student's "permannent" e-mail address |
|
section => student's LON-CAPA course section |
|
total => total points earned |
|
bytitle => reference to a hash (keys are question titles, values are points |
|
bysymb => reference to a hash (keys are symbs, i.e., unique resource identifiers). |
|
(e) reference to a hash which will contain information to return. |
|
keys will be the student's username:domain. Value of 1 to show grades pushed |
|
successfully. |
|
|
|
=cut |
|
|
|
sub export_grades { |
|
my ($cnum,$cdom,$hashref,$dataref,$outgoing) = @_; |
|
my %info; |
|
if (ref($hashref) eq 'HASH') { |
|
%info = %{$hashref}; |
|
} |
|
if ((ref($dataref) eq 'HASH') && (ref($outgoing) eq 'HASH')) { |
|
foreach my $key (keys(%{$dataref})) { |
|
$outgoing->{$key} = 1; |
|
} |
|
return 'ok'; |
|
} else { |
|
return 'error'; |
|
} |
|
} |
|
|
|
=pod |
|
|
|
=item check_instclasses() |
|
|
|
This is used to supply information about which instituional course sections |
|
and cross-listings are available to supply enrollment data, given the current |
|
list of owner and co-owners. The data are used to populate the column titled: |
|
"Auto-enrollment of registered students" when showing full detailed for a course |
|
in the course catalog. |
|
|
|
This subroutine takes four arguments - |
|
|
|
(a) $owners - comma-separated list of username:domain for course owner |
|
and co-owners. |
|
(b) $dom - domain of course. |
|
(c) $classes - reference to hash of institutional course sections and |
|
crosslistings for which access to enrollment data is being checked. |
|
(d) $validated - reference to hash which will be populated with all |
|
keys from incoming $classes hashref, for which one or more of the |
|
owner/co-owners has rights to access enrollment data. For each |
|
key included in $validated hashref, corresponding value will be set to 1. |
|
|
|
The subroutine returns 'ok' if there is no processing error. |
|
|
|
=cut |
|
|
|
|
|
sub check_instclasses { |
|
my ($owners,$dom,$classes,$validated) = @_; |
|
if ((ref($classes) eq 'HASH') && (ref($validated) eq 'HASH')) { |
|
foreach my $class (keys(%{$classes})){ |
|
if (&check_section($class,$owners,$dom) eq 'ok') { |
|
$validated->{$class} = 1; |
|
} |
|
} |
|
} |
|
return 'ok'; |
|
} |
|
|
|
=pod |
|
|
|
=item instsec_reformat() |
|
|
|
Inputs: $dom, $action, $instsecref |
|
|
|
$dom is the course's domain |
|
$action is either: clutter or declutter |
|
$instsecref is a reference to a hash, in which each key is |
|
course num:course code, and each value is either an array of |
|
institutional sections, or (in the case of crosslisted courses) |
|
an array of institutional course sections. |
|
|
|
Returns: ok |
|
|
|
Side effects: will modify the items in the array as determined by |
|
code implemented for the domain. Modification will differ depending |
|
on whether the action is clutter or declutter. |
|
|
|
The idea is that "clutter" will modify the name of the section such |
|
that a concatenation of institutional code then (modified) section |
|
will result in a string that other customized routines in localenroll.pm |
|
can separate without ambiguity into instituional code then (real) |
|
institutional section using a regular expression. |
|
|
|
Conversely, "declutter" will modify the name of an already modified |
|
item such that display of the concatenated string (e.g., for a |
|
crosslisting in the course catalog) does not include the "added" |
|
characters used to eliminate ambiguity. |
|
|
|
Examples (MSU): |
|
|
|
Starting in Fall 2021 at MSU, institution section numbers are no |
|
longer guaranteed to be three digit numbers (including leading zeroes). |
|
|
|
So, for example the course code: fs21phy183b might have sections: |
|
001, 002, LEC1, LEC2, and be crosslisted with fs21phy233b (with |
|
sections: 730, LEC3, LEC4). |
|
|
|
The sections: LEC1, and LEC2 should be changed to _LEC1, and _LEC2 |
|
before creating the inner keys in the %affiliates hash of a hash, |
|
passed to fetch_enrollment() in Enrollment.pm. They will however |
|
be stored in the course's environment as LEC1 and LEC2. |
|
|
|
For the crosslistings, LEC3 and LEC4 should be changed to |
|
_LEC3 and _LEC4 before storing in the course's environment.db file. |
|
|
|
In both cases when it comes time to extract the various components |
|
of an institutional section code (i.e., the concatenated string) in |
|
fetch_enrollment(), for example, the regexp used at MSU would be: |
|
|
|
if ($class =~ m/^([suf]s)(\d{2})(\w{2,4})(\d{3,4}[A-Za-z]?)(\d{3}|_[A-Za-z0-9]{1,5})$/) { |
|
my ($sem,$yr,$subj,$crse,$sec) = ($1,$2,$3,$4,$5); |
|
|
|
The three digit sections would match the \d{3} and the other sections |
|
(LEC1, LEC2 etc.) would match the _[A-Za-z0-9]{1,5}. |
|
|
|
The customization in &instsec_reformat() would be: |
|
|
|
if ($action eq 'clutter') { |
|
unless ($item =~ /^\d{3}$/) { |
|
$item = '_'.$item; |
|
} |
|
} elsif ($action eq 'declutter') { |
|
if ($item =~ /^([suf]s\d{2}\w{2,4}\d{3,4}[A-Za-z]?)(\d{3}|_[A-Za-z0-9]{1,5})$/) { |
|
my ($instcode,$instsec) = ($1,$2); |
|
$instsec =~ s/^_//; |
|
$item = $instcode.$instsec; |
|
} elsif ($item =~ /^_[A-Za-z0-9]{1,5}$/) { |
|
$item =~ s/^_//; |
|
} |
|
} |
|
|
|
=cut |
|
|
|
sub instsec_reformat { |
|
my ($dom,$action,$instsecref) = @_; |
|
if ((ref($instsecref) eq 'HASH') && |
|
(($action eq 'clutter') || ($action eq 'declutter'))) { |
|
foreach my $key (keys(%{$instsecref})) { |
|
if (ref($instsecref->{$key}) eq 'ARRAY') { |
|
foreach my $sec (@{$instsecref->{$key}}) { |
|
if ($action eq 'clutter') { |
|
# modify the section, as needed. |
|
next; |
|
} elsif ($action eq 'declutter') { |
|
# modify the section, as needed. |
|
next; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return 'ok'; |
|
} |
|
|
|
=pod |
|
|
=item create_password() |
=item create_password() |
|
|
This is called when the authentication method set for the automated |
This is called when the authentication method set for the automated |
Line 861 sub instcode_defaults {
|
Line 1072 sub instcode_defaults {
|
(d) $lc_users - reference to hash containing LON-CAPA usernames in |
(d) $lc_users - reference to hash containing LON-CAPA usernames in |
in domain $dom, as keys. Needed if institutional |
in domain $dom, as keys. Needed if institutional |
data source only allows query by username. |
data source only allows query by username. |
|
(e) $counts - reference to hash (optional), for use when called |
|
from Autoupdate.pl which can contain counts for |
|
user-specified items retrieved in allusers_info() |
|
or in custom subroutines which it calls. Key in |
|
hashref, and count value will be printed to |
|
autoupdate.log by Autoupdate.pl. |
|
|
returns 1 parameter - 'ok' if no processing error, or other value |
returns 1 parameter - 'ok' if no processing error, or other value |
if an error occurred. |
if an error occurred. |
side effects - populates the $instusers and $instids refs to hashes. |
side effects - populates the $instusers and $instids refs to hashes. |
Line 871 sub instcode_defaults {
|
Line 1089 sub instcode_defaults {
|
=cut |
=cut |
|
|
sub allusers_info { |
sub allusers_info { |
my ($dom,$instusers,$instids,$lc_users) = @_; |
my ($dom,$instusers,$instids,$lc_users,$counts) = @_; |
my $outcome = 'ok'; |
my $outcome = 'ok'; |
return $outcome; |
return $outcome; |
} |
} |
Line 907 sub allusers_info {
|
Line 1125 sub allusers_info {
|
institutional types to check. |
institutional types to check. |
(g) $srchby - optional if $uname or $id defined, otherwise required. |
(g) $srchby - optional if $uname or $id defined, otherwise required. |
Allowed values include: 1. lastfirst, 2. last, 3. uname |
Allowed values include: 1. lastfirst, 2. last, 3. uname |
corresponding to searches by 1. lastname,firstname; |
4. email, corresponding to searches by 1. lastname,firstname; |
2. lastname; 3. username |
2. lastname; 3. username; 4. e-mail address |
(h) $srchterm - optional if $uname or $id defined, otherwise required |
(h) $srchterm - optional if $uname or $id defined, otherwise required |
String to search for. |
String to search for. |
(i) $srchtype - optional. Allowed values: contains, begins (defaults |
(i) $srchtype - optional. Allowed values: contains, begins (defaults |