Diff for /loncom/enrollment/localenroll.pm between versions 1.57 and 1.62

version 1.57, 2017/10/13 20:37:40 version 1.62, 2021/06/20 20:35:05
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 589  sub export_grades { Line 617  sub export_grades {
 }  }
   
 =pod  =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()
   

Removed from v.1.57  
changed lines
  Added in v.1.62


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>