[LON-CAPA-cvs] cvs: loncom /enrollment Enrollment.pm
raeburn
lon-capa-cvs@mail.lon-capa.org
Mon, 08 Dec 2003 15:51:40 -0000
This is a MIME encoded message
--raeburn1070898700
Content-Type: text/plain
raeburn Mon Dec 8 10:51:40 2003 EDT
Modified files:
/loncom/enrollment Enrollment.pm
Log:
Changes to support enrollment from crosslisted classes, and also use outside Apache, when called from
iAutoenroll.pl script owned by www, run by cron.
--raeburn1070898700
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20031208105140.txt"
Index: loncom/enrollment/Enrollment.pm
diff -u loncom/enrollment/Enrollment.pm:1.4 loncom/enrollment/Enrollment.pm:1.5
--- loncom/enrollment/Enrollment.pm:1.4 Fri Dec 5 14:07:19 2003
+++ loncom/enrollment/Enrollment.pm Mon Dec 8 10:51:40 2003
@@ -109,12 +109,12 @@
push @okusers, $uname;
}
elsif (@sections > 1) {
- $logmsg = "$uname appears in classlists for multiple sections of $crs -";
+ $$logmsg = "$uname appears in classlists for the more than one section of this course, i.e. in sections: ";
foreach (@sections) {
- $logmsg .= " $_,";
+ $$logmsg .= " $_,";
}
- chop($logmsg);
- $logmsg .= " No automated enrollment action taken for this student.\n";
+ chop($$logmsg);
+ $$logmsg .= " Because of this ambiguity, no enrollment action was taken for this student.".$linefeed;
}
} else {
@{$enrollinfo{$uname}} = @{$allenrolled{$uname}[0]};
@@ -134,212 +134,200 @@
@{$unameFromINid{$stuID}} = $uname;
}
}
+# Explicitly allow access to creation/modification of students if called as an automated process.
+ if ($context eq 'automated') {
+ $ENV{'allowed.cst'}='F';
+ }
+
# Compare IDs with existing LON-CAPA enrollment for this class
foreach my $uname (@okusers) {
- my %uidhash=&Apache::lonnet::idrget($dom,$uname);
- my @stuinfo = @{$enrollinfo{$uname}};
- if (grep/^$uname$/,@localstudents) {
+ unless ($uname eq '') {
+ my %uidhash=&Apache::lonnet::idrget($dom,$uname);
+ my @stuinfo = @{$enrollinfo{$uname}};
+ if (grep/^$uname$/,@localstudents) {
# Check for studentID changes
- if ( ($uidhash{$uname}) && ($uidhash{$uname} !~ /error\:/) ) {
- unless ( ($uidhash{$uname}) eq ($stuinfo[ $place{studentID} ]) ) {
- $logmsg .= "Change in ID for $uname in class: $crs. StudentID in LON-CAPA system is $uidhash{$uname}, StudentID in institutional data is $stuinfo[ $place{studentID} ]\n";
+ if ( ($uidhash{$uname}) && ($uidhash{$uname} !~ /error\:/) ) {
+ unless ( ($uidhash{$uname}) eq ($stuinfo[ $place{studentID} ]) ) {
+ $$logmsg .= "Change in ID for $uname in class: $crs. StudentID in LON-CAPA system is $uidhash{$uname}, StudentID in institutional data is $stuinfo[ $place{studentID} ]".$linefeed;
+ }
}
- }
# Check for section changes
- unless ($$currlist{$uname}[$sec] eq $stuinfo[ $place{groupID} ]) {
- $logmsg .= "Found a section difference for $uname - ".$$currlist{$uname}[$sec] ."versus ".$stuinfo[ $place{groupID} ]." in class $crs\n";
- if ( ($$currlist{$uname}[$type] eq "auto") && ($adds == 1) ) {
- my $modify_section_result = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto',$cid);
- if ($modify_section_result !~ /^ok/) {
- $logmsg .= "An error occured during the attempt to expire the $uname from the old section $$currlist{$uname}[$sec] - $modify_section_result\n";
+ unless ($$currlist{$uname}[$sec] eq $stuinfo[ $place{groupID} ]) {
+ if ( ($$currlist{$uname}[$type] eq "auto") && ($adds == 1) ) {
+ my $modify_section_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$$currlist{$uname}[$cend],$$currlist{$uname}[$cstart],'auto',$cid);
+ if ($modify_section_result =~ /^ok/) {
+ $$logmsg .= "Section for $uname switched from old section: ".$$currlist{$uname}[$sec] ."to new section: ".$stuinfo[ $place{groupID} ]." in class $crs".$linefeed;
+ } else {
+ $$logmsg .= "Error when attempting section change for $uname from old section ".$$currlist{$uname}[$sec]." to new section: ".$stuinfo[ $place{groupID} ]." -error: $modify_section_result".$linefeed;
+ }
}
-
-# Assign the role of student in the new section
- my $uurl='/'.$cid;
- $uurl=~s/\_/\//g;
- if ($stuinfo[ $place{groupID} ]) {
- $uurl.='/'.$stuinfo[ $place{groupID} ];
- }
- my $newend = $stuinfo[ $place{enddate} ];
- my $newstart = $stuinfo[ $place{startdate} ];
- if ($newend eq '') {
- $newend = $enddate;
- }
- if ($newstart eq '') {
- $newstart = $startdate;
- }
- #explicitly allow acces to creating students
- $ENV{'allowed.cst'}='F';
- &Apache::lonnet::assignrole($dom,$uname,$uurl,"st",$newend,$newstart);
- delete($ENV{'allowed.cst'});
}
- }
- }
- elsif ($uname ne '') {
+ } else {
# Check for changed usernames by checking studentIDs
- if ( ($stuinfo[ $place{studentID} ] ne '') && (grep/^$stuinfo[ $place{studentID} ]$/,@LCids) ) {
- if (grep/^$$currlist{$uname}[ $place{'studentID'} ]$/,@allINids) {
- foreach my $match ( @{ $unameFromLCid{ $stuinfo[ $place{studentID} ] } } ) {
- if (grep/^$match$/,@okusers) {
- $logmsg .= "A possible change in username has been detected for a student enrolled in $crs. The existing LON-CAPA classlist contains user: $uname and student ID: ".$$currlist{$uname}[ $place{studentID} ].". This username has been dropped from the institutional classlist, but the same student ID is used for user: $match who still appears in the institutional classlist. You may need to move the student data files for user: $uname to $match\n";
+ if ( ($stuinfo[ $place{studentID} ] ne '') && (grep/^$stuinfo[ $place{studentID} ]$/,@LCids) ) {
+ if (grep/^$$currlist{$uname}[ $place{'studentID'} ]$/,@allINids) {
+ foreach my $match ( @{ $unameFromLCid{ $stuinfo[ $place{studentID} ] } } ) {
+ if (grep/^$match$/,@okusers) {
+ $$logmsg .= "A possible change in username has been detected for a student enrolled in $crs. The existing LON-CAPA classlist contains user: $uname and student ID: ".$$currlist{$uname}[ $place{studentID} ].". This username has been dropped from the institutional classlist, but the same student ID is used for user: $match who still appears in the institutional classlist. You may need to move the student data files for user: $uname to $match".$linefeed;
+ }
}
}
- }
- } elsif ($adds == 1) {
+ } elsif ($adds == 1) {
# Add student to LON-CAPA classlist
- my $auth = $stuinfo[ $place{'authtype'} ];
- my $authparam = $stuinfo[ $place{'autharg'} ];
- my $first = $stuinfo[ $place{'firstname'} ];
- my $middle = $stuinfo[ $place{'middlename'} ];
- my $last = $stuinfo[ $place{'lastname'} ];
- my $gene = $stuinfo[ $place{'generation'} ];
- my $usec = $stuinfo[ $place{'groupID'} ];
- my $end = $stuinfo[ $place{'enddate'} ];
- my $start = $stuinfo[ $place{'startdate'} ];
- my $emailaddr = $stuinfo[ $place{'email'} ];
- my $pid = $stuinfo[ $place{'studentID'} ];
+ my $auth = $stuinfo[ $place{'authtype'} ];
+ my $authparam = $stuinfo[ $place{'autharg'} ];
+ my $first = $stuinfo[ $place{'firstname'} ];
+ my $middle = $stuinfo[ $place{'middlename'} ];
+ my $last = $stuinfo[ $place{'lastname'} ];
+ my $gene = $stuinfo[ $place{'generation'} ];
+ my $usec = $stuinfo[ $place{'groupID'} ];
+ my $end = $stuinfo[ $place{'enddate'} ];
+ my $start = $stuinfo[ $place{'startdate'} ];
+ my $emailaddr = $stuinfo[ $place{'email'} ];
+ my $pid = $stuinfo[ $place{'studentID'} ];
# remove non alphanumeric values from section
- $usec =~ s/\W//g;
+ $usec =~ s/\W//g;
- unless ($emailaddr =~/^[^\@]+\@[^\@]+$/) { $emailaddr =''; }
- my $emailenc = &HTML::Entities::encode($emailaddr);
+ unless ($emailaddr =~/^[^\@]+\@[^\@]+$/) { $emailaddr =''; }
+ my $emailenc = &HTML::Entities::encode($emailaddr);
# Use course defaults where entry is absent
- if ($auth eq '') {
- $auth = $authtype;
- }
- if ($authparam eq '') {
- $authparam = $autharg;
- }
- if ($auth =~ m/^krb/) {
- $auth .= ":".$authparam;
- }
- if ($end eq '') {
- $end = $enddate;
- }
- if ($start eq '') {
- $start = $startdate;
- }
+ if ( ($auth eq '') || (!defined($auth)) ) {
+ $auth = $authtype;
+ }
+ if ( ($authparam eq '') || (!defined($authparam)) ) {
+ $authparam = $autharg;
+ }
+ if ($auth =~ m/^krb/) {
+ $auth .= ":".$authparam;
+ }
+ if ( ($end eq '') || (!defined($end)) ) {
+ $end = $enddate;
+ }
+ if ( ($start eq '') || (!defined($start)) ) {
+ $start = $startdate;
+ }
# Clean up whitespace
- foreach (\$dom,\$uname,\$pid,\$first,\$middle,\$last,\$gene,\$usec) {
- $$_ =~ s/(\s+$|^\s+)//g;
- }
+ foreach (\$dom,\$uname,\$pid,\$first,\$middle,\$last,\$gene,\$usec) {
+ $$_ =~ s/(\s+$|^\s+)//g;
+ }
# Check for existing account in this LON-CAPA domain for this username
- my $uhome=&Apache::lonnet::homeserver($uname,$dom);
- if ($uhome eq 'no_host') { # User does not exist
- my $create_passwd = 0;
- my $authchk = '';
- unless ($authparam eq '') { $authchk = 'ok'; };
+ my $uhome=&Apache::lonnet::homeserver($uname,$dom);
+ if ($uhome eq 'no_host') { # User does not exist
+ my $create_passwd = 0;
+ my $authchk = '';
+ unless ($authparam eq '') { $authchk = 'ok'; };
# If no account exists and passwords should be generated
- if ($authtype eq "int") {
- if ($authparam eq '') {
- ($authparam,$create_passwd,$authchk) = &create_password();
- }
- } elsif ($authtype eq "local") {
- if ($authparam eq '') {
- ($authparam,$create_passwd,$authchk) = &create_password();
- }
- } elsif ($authtype =~ m/^krb/) {
- if ($authparam eq '') {
- $logmsg .= "No Kerberos domain available for the new user - $uname in course $crs - no enrollment occurred.\n";
+ if ($authtype eq "int") {
+ if ($authparam eq '') {
+ ($authparam,$create_passwd,$authchk) = &create_password();
+ }
+ } elsif ($authtype eq "local") {
+ if ($authparam eq '') {
+ ($authparam,$create_passwd,$authchk) = &create_password();
+ }
+ } elsif ($authtype =~ m/^krb/) {
+ if ($authparam eq '') {
+ $$logmsg .= "No Kerberos domain available for the new user - $uname in course $crs - no enrollment occurred.".$linefeed;
+ $authchk = 'invalid';
+ }
+ } else {
$authchk = 'invalid';
+ $$logmsg .= "Invalid authentication type for new user - $uname in course $crs - no enrollment occurred.".$linefeed;
}
- } else {
- $authchk = 'invalid';
- $logmsg .= "Invalid authentication type for new user - $uname in course $crs - no enrollment occurred.\n";
- }
- unless ($authchk eq 'ok') {
+ if ($authchk eq 'ok') {
# Now create user.
- my $reply=&Apache::lonnet::modifystudent($dom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto',$cid);
- if ($reply eq 'ok') {
- $enrollcount ++;
- $addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$linefeed;
- $logmsg .= "New user $uname added successfully. ";
- unless ($emailenc eq '') {
- my %emailHash;
- $emailHash{'critnotification'} = $emailenc;
- $emailHash{'notification'} = $emailenc;
- my $putresult = &Apache::lonnet::put('environment',\%emailHash,$dom,$uname);
- }
- if ($create_passwd) {
+ my $reply=&Apache::lonnet::modifystudent($dom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto',$cid);
+ if ($reply eq 'ok') {
+ $enrollcount ++;
+ $addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$linefeed;
+ $$logmsg .= "New user $uname added successfully. ";
+ unless ($emailenc eq '') {
+ my %emailHash;
+ $emailHash{'critnotification'} = $emailenc;
+ $emailHash{'notification'} = $emailenc;
+ my $putresult = &Apache::lonnet::put('environment',\%emailHash,$dom,$uname);
+ }
+ if ($create_passwd) {
# Send e-mail with inital password to new user at $emailaddr
- $logmsg .= "Initial password - - sent to $emailaddr\n";
+ $$logmsg .= "Initial password - - sent to ".$emailaddr.$linefeed;
+ } else {
+ $$logmsg .= $linefeed;
+ }
} else {
- $logmsg .= "\n";
+ $$logmsg .= "An error occurred adding new user $uname - ".$reply.$linefeed;
}
- } else {
- $logmsg .= "An error occurred adding new user $uname - $reply\n";
}
- }
- } else {
+ } else {
# Get the user's information and authentication
- my %userenv = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id','critnotification','notification'],$dom,$uname);
- my ($tmp) = keys(%userenv);
- if ($tmp =~ /^(con_lost|error)/i) {
- %userenv = ();
- }
+ my %userenv = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id','critnotification','notification'],$dom,$uname);
+ my ($tmp) = keys(%userenv);
+ if ($tmp =~ /^(con_lost|error)/i) {
+ %userenv = ();
+ }
# Get the user's e-mail address
- if ($userenv{critnotification} =~ m/%40/) {
- unless ($emailenc eq $userenv{critnotification}) {
- $logmsg .= "Current critical notification e-mail - ".$userenv{critnotification}." for $uname is different to e-mail address in Institutional classlist - $emailenc\n";
- }
- }
- if ($userenv{notification} =~ m/%40/) {
- unless ($emailenc eq $userenv{critnotification}) {
- $logmsg .= "Current standard notification e-mail - ".$userenv{notification}." for $uname is different to e-mail address in Institutional classlist - $emailenc\n";
- }
- }
- my $krbdefdom = '';
- my $currentauth=&Apache::lonnet::queryauthenticate($uname,$dom);
- if ($currentauth=~/^krb(4|5):/) {
- $currentauth=~/^krb(4|5):(.*)/;
- $krbdefdom=$1;
- }
- if ($currentauth=~/^krb(4|5):/ ||
- $currentauth=~/^unix:/ ||
- $currentauth=~/^internal:/ ||
- $currentauth=~/^localauth:/) {
+ if ($userenv{critnotification} =~ m/%40/) {
+ unless ($emailenc eq $userenv{critnotification}) {
+ $$logmsg .= "Current critical notification e-mail - ".$userenv{critnotification}." for $uname is different to e-mail address in Institutional classlist - ".$emailenc.$linefeed;
+ }
+ }
+ if ($userenv{notification} =~ m/%40/) {
+ unless ($emailenc eq $userenv{critnotification}) {
+ $$logmsg .= "Current standard notification e-mail - ".$userenv{notification}." for $uname is different to e-mail address in institutional classlist - ".$emailenc.$linefeed;
+ }
+ }
+ my $krbdefdom = '';
+ my $currentauth=&Apache::lonnet::queryauthenticate($uname,$dom);
+ if ($currentauth=~/^krb(4|5):/) {
+ $currentauth=~/^krb(4|5):(.*)/;
+ $krbdefdom=$1;
+ }
+ if ($currentauth=~/^krb(4|5):/ ||
+ $currentauth=~/^unix:/ ||
+ $currentauth=~/^internal:/ ||
+ $currentauth=~/^localauth:/) {
- } else {
- $logmsg .= "Invalid authentication method $currentauth for $uname.\n";
- }
+ } else {
+ $$logmsg .= "Invalid authentication method $currentauth for $uname.".$linefeed;
+ }
# Report if authentication methods are different.
- if ($currentauth ne $auth ) {
- $logmsg .= "Authentication mismatch for $uname - $currentauth in system, $auth for class $crs\n";
- }
+ if ($currentauth ne $auth ) {
+ $$logmsg .= "Authentication mismatch for $uname - $currentauth in system, $auth for class $crs".$linefeed;
+ }
# Check user data
- if ($first ne $userenv{'firstname'} ||
- $middle ne $userenv{'middlename'} ||
- $last ne $userenv{'lastname'} ||
- $gene ne $userenv{'generation'} ||
- $pid ne $userenv{'id'} ) {
+ if ($first ne $userenv{'firstname'} ||
+ $middle ne $userenv{'middlename'} ||
+ $last ne $userenv{'lastname'} ||
+ $gene ne $userenv{'generation'} ||
+ $pid ne $userenv{'id'} ) {
# Make the change(s)
- my %changeHash;
- $changeHash{'firstname'} = $first;
- $changeHash{'middlename'} = $middle;
- $changeHash{'lastname'} = $last;
- $changeHash{'generation'} = $gene;
- $changeHash{'id'} = $pid;
- my $putresult = &Apache::lonnet::put('environment',\%changeHash,$dom,$uname);
- if ($putresult eq 'ok') {
- $logmsg .= "User information updated for user: $uname prior to enrollment in $crs\n";
- } else {
- $logmsg .= "There was a problem modifying user data for existing user - $uname, enrollment will still be attempted for user in $crs.\n";
+ my %changeHash;
+ $changeHash{'firstname'} = $first;
+ $changeHash{'middlename'} = $middle;
+ $changeHash{'lastname'} = $last;
+ $changeHash{'generation'} = $gene;
+ $changeHash{'id'} = $pid;
+ my $putresult = &Apache::lonnet::put('environment',\%changeHash,$dom,$uname);
+ if ($putresult eq 'ok') {
+ $$logmsg .= "User information updated for user: $uname prior to enrollment.".$linefeed;
+ } else {
+ $$logmsg .= "There was a problem modifying user data for existing user - $uname -error: $putresult, enrollment will still be attempted.".$linefeed;
+ }
}
- }
# Assign the role of student in the course.
- my $classlist_reply = &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,$last,$gene,$usec,$end,$start,'auto',$cid);
- if ($classlist_reply eq 'ok') {
- $enrollcount ++;
- $addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$linefeed;
- $logmsg .= "Existing user $uname enrolled successfully in $crs\n";
+ my $classlist_reply = &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,$last,$gene,$usec,$end,$start,'auto',$cid);
+ if ($classlist_reply eq 'ok') {
+ $enrollcount ++;
+ $addresult .= "$first $last ($pid) - $uname enrolled in section/group $usec.".$linefeed;
+ $$logmsg .= "Existing user $uname enrolled successfully.".$linefeed;
- } else {
- $logmsg .= "There was a problem updating the classlist db file for user $uname to show the new enrollment, so no enrollment occurred for this user in $crs\n";
+ } else {
+ $$logmsg .= "There was a problem updating the classlist db file for user $uname to show the new enrollment -error: $classlist_reply, so no enrollment occurred for this user.".$linefeed;
+ }
}
}
}
@@ -354,13 +342,13 @@
# Check for changed usernames by checking studentIDs
if (grep/^$$currlist{$uname}[ $stuid ]$/,@allINids) {
foreach my $match (@{$unameFromINid{$$currlist{$uname}[ $stuid ]}} ) {
- $logmsg .= "A possible change in username has been detected for a student enrolled in $crs. The existing LON-CAPA classlist contains user: $uname and student ID: $$currlist{$uname}[ $place{studentID} ]. This username has been dropped from the institutional classlist, but the same student ID is used for user: $match who still appears in the institutional classlist. You may need to move the student data files for user: $uname to $match\n";
+ $$logmsg .= "A possible change in username has been detected for a student enrolled in $crs. The existing LON-CAPA classlist contains user: $uname and student ID: $$currlist{$uname}[ $place{studentID} ]. This username has been dropped from the institutional classlist, but the same student ID is used for user: $match who still appears in the institutional classlist. You may need to move the student data files for user: $uname to $match.".$linefeed;
push @saved,$uname;
}
} elsif (@saved == 0) {
my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,undef,$cid);
if ($drop_reply !~ /^ok/) {
- $logmsg .= "An error occured during the attempt to expire the $uname from the old section $$currlist{$uname}[$sec] - $drop_reply\n";
+ $$logmsg .= "An error occured during the attempt to expire the $uname from the old section $$currlist{$uname}[$sec] - $drop_reply.".$linefeed;
} else {
$dropcount ++;
my %userenv = &Apache::lonnet::get('environment',['firstname','lastname','id'],$dom,$uname);
@@ -371,6 +359,11 @@
}
}
}
+
+# Terminated explictly allowed access to student creation/modification
+ if ($context eq 'automated') {
+ delete($ENV{'allowed.cst'});
+ }
if ($enrollcount > 0) {
if ($context eq "updatenow") {
$addresult = "The following $enrollcount student(s) was/were added to this LON-CAPA course:<br/><ul><li>".$addresult."</li></ul><br/><br/>";
@@ -401,14 +394,14 @@
$dropresult .="\n";
}
}
- print STDERR $logmsg;
- return $addresult.$dropresult;
+ my $changecount = $enrollcount + $dropcount;
+ return ($changecount,$addresult.$dropresult);
}
sub parse_classlist {
my ($tmpdir,$dom,$crs,$class,$placeref,$groupID,$studentsref) = @_;
my $configvars = &LONCAPA::Configuration::read_conf();
- my $xmlfile = $tmpdir."/tmp/".$dom."_".$crs."_classlist.xml";
+ my $xmlfile = $tmpdir."/tmp/".$dom."_".$crs."_".$class."_classlist.xml";
my $enrolled = XMLin( $xmlfile, KeyAttr => ['username'] );
foreach my $uname ( sort keys %{$$enrolled{'student'}} ) {
@{ $$studentsref{$uname} } = ();
--raeburn1070898700--