File:  [LON-CAPA] / loncom / enrollment / Autoenroll.pl
Revision 1.9: download - view: text, annotated - select for diffs
Tue Jun 8 22:09:44 2004 UTC (19 years, 11 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
Changes to support autoenroll calls from a remote server.

lond on the homeserver for the course(s) handles requests from the remote
server for institutional data (e.g., classlists, valid institutional courseIDs,
institutional section numbers for a course code, validation of course owners), by
calling the appropriate functions in the homeserver's localenroll.pm

All replies are made directly with the exception of fetch_enrollment_query, which
is shipped over to lonsql, in case retrieval of institutional classlists is a
protracted process.

lonsql on the homeserver for the course(s) calls localenroll::fetch_enrollment()
and writes XML files of enrollment data to /home/httpd/perl/tmp

Transfer of classlist data occurs later following an autoretrieve call from the
remote server. It is planned to generalize this function and add encryption to the transfer back to the client.

Autoenroll.pl called by cron on a library server, now only carries out updates for
courses in its domain, for which the library server is the course's homeserver. If a domain has multiple library servers Autoenroll.pl will need to be run on each library server.

#!/usr/bin/perl
#
#Automated Enrollment script
# $Id: Autoenroll.pl,v 1.9 2004/06/08 22:09:44 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#

    use strict;
    use lib '/home/httpd/lib/perl';
    use localenroll;
    use LONCAPA::Configuration;
    use LONCAPA::Enrollment;
    use Apache::lonnet;
    use Apache::loncoursedata;
    use Apache::lonmsg;
    use HTML::Entities;

#only run if configured to
    if (! &localenroll::run()) { exit; }

# Determine the library server's domain and hostID
    my $perlvarref = LONCAPA::Configuration::read_conf('loncapa.conf');
    my $dom = $$perlvarref{'lonDefDomain'};
    my $logfile = $$perlvarref{'lonDaemons'}.'/logs/autoenroll.log';
    $ENV{'user.domain'} = $dom;
    my $hostid = $$perlvarref{'lonHostID'};

# Determine the present time;
    my $timenow = time();

# Determine the courses
    my %courses = &Apache::lonnet::courseiddump($dom,'.',1,$hostid); 
    my %affiliates = ();
    my %enrollvar = ();
    my %reply = ();
    my %LC_code = ();
    foreach my $key (sort keys %courses) {
        my $crs;
        if ($key =~ m/^($dom)_(\w+)$/) {
            $crs = $2;
        }

# Get course settings
        my %settings = &Apache::lonnet::dump('environment',$dom,$crs);
        %{$enrollvar{$crs}} = ();
        @{$affiliates{$crs}} = ();
        %{$LC_code{$crs}} = ();
        foreach my $item (keys %settings) {
            if ($item =~ m/^internal\.(.+)$/) {
                $enrollvar{$crs}{$1} = $settings{$item};
            } elsif ($item eq 'description') {
                $enrollvar{$crs}{$item} = &HTML::Entities::decode($settings{$item});  
            }
        }
        if (($enrollvar{$crs}{autostart} <= $timenow) && ( ($enrollvar{$crs}{autoend} > $timenow) || ($enrollvar{$crs}{autoend} == 0) ) ) {
            if ( ($enrollvar{$crs}{autoadds} == 1) || ($enrollvar{$crs}{autodrops} == 1) ) {
# Add to list of classes for retrieval
                $enrollvar{$crs}{sectionnums} =~ s/ //g;
                $enrollvar{$crs}{crosslistings} =~ s/ //g;
                my @sections = ();
                my @crosslistings = ();
                if ($enrollvar{$crs}{sectionnums} =~ m/,/) {
                    @sections = split/,/,$enrollvar{$crs}{sectionnums};
                } else {
                    $sections[0] = $enrollvar{$crs}{sectionnums};
                }
                if ($enrollvar{$crs}{crosslistings} =~ m/,/) {
                    @crosslistings = split/,/,$enrollvar{$crs}{crosslistings}
                } else {
                    @crosslistings = $enrollvar{$crs}{crosslistings};
                }
                foreach my $sec (@sections) {
                    if ($sec =~ m/^(\w+):(\w*)$/ ) {
                        my $course_id = $enrollvar{$crs}{coursecode}.$1;
                        my $gp = $2;
                        if (!grep/^$course_id$/,@{$affiliates{$crs}}) {
                            push @{$affiliates{$crs}}, $course_id;
                            $LC_code{$crs}{$course_id} = $gp; 
                        }
                    }
                }
                foreach my $xlist (@crosslistings) {
                    if ($xlist =~ m/^(\w+):(\w*)$/) {
                        my $course_id = $1;
                        my $gp = $2;
                        if (!grep/^$course_id$/,@{$affiliates{$crs}}) {
                            push @{$affiliates{$crs}}, $course_id;
                            $LC_code{$crs}{$course_id} = $gp;
                        }
                    }
                }
            }
        }
    }
    my $outcome = &Apache::lonnet::fetch_enrollment_query($hostid,$dom,\%affiliates,\%reply);

# Now go through classes and perform required enrollment changes.
    open (my $fh,">>$logfile");
    print $fh "********************\n".localtime(time)." Enrollment messages start --\n";
    foreach my $crs (sort keys %enrollvar) {
        my $logmsg = '';
        my $newusermsg = '';
        if ($reply{$crs} > 0) {
            if ( ($enrollvar{$crs}{autostart} < $timenow) && ( ($enrollvar{$crs}{autoend} > $timenow) || ($enrollvar{$crs}{autoend} == 0) ) ) {
                if (($enrollvar{$crs}{autoadds} == 1) || ($enrollvar{$crs}{autodrops} == 1)) {
                    my ($changecount,$response) = &LONCAPA::Enrollment::update_LC($dom,$crs,$enrollvar{$crs}{autoadds},$enrollvar{$crs}{autodrops},$enrollvar{$crs}{startdate},$enrollvar{$crs}{enddate},$enrollvar{$crs}{authtype},$enrollvar{$crs}{autharg},\@{$affiliates{$crs}},\%{$LC_code{$crs}},\$logmsg,\$newusermsg,'automated');
                    print $fh "Messages start for $crs\n";
                    print $fh "$logmsg\n";
                    print $fh "Messages end for $crs\n";
                    if ($changecount > 0) {
                        unless ($enrollvar{$crs}{notifylist}  eq '') {
# Send message about enrollment changes to notifylist.
# Set $ENV{'user.name'}, $ENV{'user.home'} for use by logging in lonmsg
                            unless ( ($enrollvar{$crs}{'courseowner'} eq '') || (!defined($enrollvar{$crs}{'courseowner'}) )  ) {
                                $ENV{'user.name'} = $enrollvar{$crs}{'courseowner'};
                                $ENV{'user.home'} = &Apache::lonnet::homeserver($ENV{'user.name'},$dom);

                                my $subject = "Student enrollment changes in $enrollvar{$crs}{coursecode}";
                                my $message = "The following $changecount change(s) occurred in $enrollvar{$crs}{description} - $enrollvar{$crs}{coursecode} as a result of the automated classlist update:\n\n".$response;
                                unless ($newusermsg eq '') 
                                {
                                   $message .= "\n".$newusermsg;
                                }
                                my @to_notify = ();
                                if ($enrollvar{$crs}{notifylist} =~ m/,/) {
                                    @to_notify = split/,/,$enrollvar{$crs}{notifylist};
                                } else {
                                    $to_notify[0] = $enrollvar{$crs}{notifylist};
                                }
                                foreach my $cc (@to_notify) {
                                    my ($ccname,$ccdom) = split/@/,$cc;
                                    my $status =  &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message);
                                }
                                if ( ($enrollvar{$crs}{notifylist} eq '') && ($newusermsg ne '') ) {
                                     my $subject = "New user accounts in  $enrollvar{$crs}{'coursecode'}";
                                     my $status =  &Apache::lonmsg::user_normal_msg($ENV{'user.name'},$dom,$subject,$newusermsg);
                                }
                                delete($ENV{'user.name'});
                                delete($ENV{'user.home'});
                            }
                        }
                    }
                }
            }
        } else {
            if ( ($enrollvar{$crs}{autoadds} == 1) || ($enrollvar{$crs}{autodrops} == 1) ) {
                if ( ($enrollvar{$crs}{autostart} < $timenow) && ( ($enrollvar{$crs}{autoend} > $timenow) || ($enrollvar{$crs}{autoend} == 0) ) ) {
                    print $fh "No institutional classlist data could be retrieved for $crs\n";
                } else {
                    print $fh "Not within time window for auto-enrollment in $crs\n";
                }
            } else {
                print $fh "Auto-enrollment not currently enabled for $crs\n";
            }
        }
    }
    print $fh "-- ".localtime(time)." Enrollment messages end\n*******************\n\n";
    close($fh);
    delete($ENV{'user.domain'});

# Check for photos

1;

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