--- loncom/enrollment/localenroll.pm 2021/03/31 02:19:58 1.60 +++ loncom/enrollment/localenroll.pm 2021/06/15 20:52:27 1.61 @@ -1,6 +1,6 @@ # functions to glue school database system into Lon-CAPA for # automated enrollment -# $Id: localenroll.pm,v 1.60 2021/03/31 02:19:58 raeburn Exp $ +# $Id: localenroll.pm,v 1.61 2021/06/15 20:52:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -655,6 +655,101 @@ sub check_instclasses { 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