Diff for /loncom/enrollment/Enrollment.pm between versions 1.43 and 1.55

version 1.43, 2010/08/20 21:44:59 version 1.55, 2021/09/08 12:13:13
Line 31  use Apache::loncommon(); Line 31  use Apache::loncommon();
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonlocal;  use Apache::lonlocal;
 use HTML::Entities;  use HTML::Entities;
   use HTML::Parser;
 use LONCAPA::Configuration;  use LONCAPA::Configuration;
   use Math::Random;
 use Time::Local;  use Time::Local;
 use lib '/home/httpd/lib/perl';  use lib '/home/httpd/lib/perl';
   
 use strict;  use strict;
   
 sub update_LC {  sub update_LC {
     my ($dom,$crs,$adds,$drops,$startdate,$enddate,$authtype,$autharg,$classesref,$groupref,$logmsg,$newusermsg,$context,$phototypes) = @_;       my ($dom,$crs,$adds,$drops,$startdate,$enddate,$authtype,$autharg,
           $showcredits,$defaultcredits,$autofailsafe,$classesref,$groupref,
           $logmsg,$newusermsg,$context,$phototypes) = @_;
 # Get institutional code and title of this class  # Get institutional code and title of this class
     my %courseinfo = ();      my %courseinfo = ();
     &get_courseinfo($dom,$crs,\%courseinfo);      &get_courseinfo($dom,$crs,\%courseinfo);
Line 53  sub update_LC { Line 57  sub update_LC {
     my $status=&Apache::loncoursedata::CL_STATUS;      my $status=&Apache::loncoursedata::CL_STATUS;
     my $type=&Apache::loncoursedata::CL_TYPE;      my $type=&Apache::loncoursedata::CL_TYPE;
     my $lockedtype=&Apache::loncoursedata::CL_LOCKEDTYPE;      my $lockedtype=&Apache::loncoursedata::CL_LOCKEDTYPE;
       my $credidx=&Apache::loncoursedata::CL_CREDITS;
       my $instidx = &Apache::loncoursedata::CL_INSTSEC;
     my @localstudents = ();      my @localstudents = ();
     my @futurestudents = ();      my @futurestudents = ();
     my @activestudents = ();      my @activestudents = ();
     my @excludedstudents = ();      my @excludedstudents = ();
     my $currlist;      my $currlist;
       my $now = time;
     foreach my $uname (keys %{$roster} ) {      foreach my $uname (keys %{$roster} ) {
         if ($uname =~ m/^(.+):$dom$/) {          if ($uname =~ m/^(.+):$dom$/) {
             if ($$roster{$uname}[$status] eq "Active") {              if ($$roster{$uname}[$status] eq "Active") {
Line 126  sub update_LC { Line 133  sub update_LC {
     my %place = &place_hash();       my %place = &place_hash(); 
     my %ucount = ();      my %ucount = ();
     my %enrollinfo = ();      my %enrollinfo = ();
       my %classcount;
     foreach my $class (@{$classesref}) {      foreach my $class (@{$classesref}) {
         my %enrolled = ();          my %enrolled = ();
         &parse_classlist($$configvars{'lonDaemons'},$dom,$crs,$class,\%place,$$groupref{$class},\%enrolled);          &parse_classlist($$configvars{'lonDaemons'},$dom,$crs,$class,\%place,$$groupref{$class},\%enrolled);
           $classcount{$class} = scalar(keys(%enrolled));
         foreach my $uname (sort keys %enrolled ) {          foreach my $uname (sort keys %enrolled ) {
             if (!grep/^$uname$/,@reg_students) {              if (!grep/^$uname$/,@reg_students) {
                 push @reg_students,$uname;                  push @reg_students,$uname;
Line 193  sub update_LC { Line 202  sub update_LC {
         }          }
     }      }
   
 # Explicitly allow access to creation/modification of students if called as an automated process.  # Explicitly allow access to creation/modification of students and group membership changes 
   # when called as an automated process.
     if ($context eq 'automated') {      if ($context eq 'automated') {
         $env{'allowed.cst'}='F';          $env{'allowed.cst'}='F';
           $env{'allowed.mdg'}='F';
     }      }
   
 # Compare IDs with existing LON-CAPA enrollment for this class  # Compare IDs with existing LON-CAPA enrollment for this class
Line 203  sub update_LC { Line 214  sub update_LC {
         unless ($uname eq '') {          unless ($uname eq '') {
             my %uidhash=&Apache::lonnet::idrget($dom,$uname);              my %uidhash=&Apache::lonnet::idrget($dom,$uname);
             my @stuinfo = @{$enrollinfo{$uname}};              my @stuinfo = @{$enrollinfo{$uname}};
             my $access = '';              my ($access,$added,$inststatus,$instsec);
               my $credits;
               if ($showcredits) {
                   $credits = $stuinfo[$place{'credits'}];
                   $credits =~ s/[^\d\.]//g;
                   if ($credits eq $defaultcredits) {
                       undef($credits);
                   }
               }
               $inststatus = $stuinfo[$place{inststatus}];
               $instsec = $stuinfo[$place{instsec}];
             if (grep/^$uname$/,@localstudents) {              if (grep/^$uname$/,@localstudents) {
 # Check for studentID changes  # Check for studentID changes
                 if ( ($uidhash{$uname}) && ($uidhash{$uname} !~ /error\:/) )  {                  if ( ($uidhash{$uname}) && ($uidhash{$uname} !~ /error\:/) )  {
Line 217  sub update_LC { Line 238  sub update_LC {
                     my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context);                      my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context);
 # re-enroll as auto student  # re-enroll as auto student
                     if ($drop_reply !~ /^ok/) {                      if ($drop_reply !~ /^ok/) {
                             $$logmsg .= &mt('An error occured during the attempt to convert [_1] from a manual type to an auto type student - [_2].',$uname,$drop_reply).$linefeed;                              $$logmsg .= &mt('An error occurred during the attempt to convert [_1] from a manual type to an auto type student - [_2].',$uname,$drop_reply).$linefeed;
                     } else {                      } else {
 # re-enroll as auto student  # re-enroll as auto student
                         my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc);                          my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc);
Line 231  sub update_LC { Line 252  sub update_LC {
                             if ($usec eq '') {                              if ($usec eq '') {
                                 $showsec = &mt('none');                                  $showsec = &mt('none');
                             }                              }
                             $switchresult .= &mt("Section for [_1] switched from '[_2]' to '[_3]'.",$uname,$showoldsec,$showsec).$linefeed;                              $switchresult .= &mt('Section for [_1] switched from [_2] to [_3].',$uname,$showoldsec,$showsec).$linefeed;
                             if ($context eq 'automated') {                              if ($context eq 'automated') {
                                 $$logmsg .= &mt("Section switch for [_1] from '[_2]' to '[_3]'.",$uname,$showoldsec,$usec).$linefeed;                                  $$logmsg .= &mt('Section switch for [_1] from [_2] to [_3].',$uname,$showoldsec,$usec).$linefeed;
                             }                              }
                             $switchcount ++;                              $switchcount ++;
                         }                          }
                         &execute_add($context,'switchtype',$uname,$dom,$auth,$authparam,$first,$middle,$last,$gene,$pid,$usec,$end,$start,$emailenc,$cid,\$addresult,\$enrollcount,$linefeed,$logmsg);                          &execute_add($context,'switchtype',$uname,$dom,$auth,
                                        $authparam,$first,$middle,$last,$gene,
                                        $pid,$usec,$end,$start,$emailenc,
                                        $credits,$instsec,$cid,\$addresult,\$enrollcount,
                                        $linefeed,$logmsg);
                           $added = 1;
                     }                      }
                 }                   }
 # Check for section changes  # Check for section changes
                 if ($$currlist{$uname}[$sec] eq $stuinfo[ $place{groupID} ]) {                  if ($$currlist{$uname}[$sec] eq $stuinfo[ $place{groupID} ]) {
 # Check for access date changes for students with access starting in the future.  # Check for access date changes for students with access starting in the future.
                     if ( (grep/^$uname$/,@futurestudents) && ($$currlist{$uname}[$type] eq "auto") && ($adds == 1) ) {                      if ( (grep/^$uname$/,@futurestudents) && ($$currlist{$uname}[$type] eq "auto") && ($adds == 1) ) {
                         my $datechange = &datechange_check($$currlist{$uname}[$cstart],$$currlist{$uname}[$cend],$startdate,$enddate);                          my $datechange = &datechange_check($$currlist{$uname}[$cstart],$$currlist{$uname}[$cend],$startdate,$enddate);
                         if ($datechange) {                          if ($datechange) {
                             my $modify_access_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context);                              my $modify_access_result = &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context,$credits,$instsec);
                             $access = &showaccess($enddate,$startdate);                              $access = &showaccess($enddate,$startdate);
                             if ($modify_access_result =~ /^ok/) {                              if ($modify_access_result =~ /^ok/) {
                                 $$logmsg .= &mt('Change in access dates for [_1].',$uname).$access.$linefeed;                                  $$logmsg .= &mt('Change in access dates for [_1].',$uname).$access.$linefeed;
                                   $added = 1;
                             } else {                              } else {
                                 $$logmsg .= &mt('Error when attempting to change start and/or end access dates for [_1] in section: [_2] -error [_3].',$uname,$stuinfo[$place{groupID}],$modify_access_result).$linefeed;                                  $$logmsg .= &mt('Error when attempting to change start and/or end access dates for [_1] in section: [_2] -error [_3].',$uname,$stuinfo[$place{groupID}],$modify_access_result).$linefeed;
                             }                              }
Line 268  sub update_LC { Line 295  sub update_LC {
                         if ($expire_role_result eq 'ok') {                          if ($expire_role_result eq 'ok') {
                             my $modify_section_result;                              my $modify_section_result;
                             if (grep/^$uname$/,@activestudents) {                              if (grep/^$uname$/,@activestudents) {
                                 $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,'',$context);                                  $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,'',$context,$credits,$instsec);
                             } else {                              } else {
                                 $modify_section_result =  &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context);                                  $modify_section_result =  &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context,$credits,$instsec);
                                 $access =  &showaccess($enddate,$startdate);                                  $access =  &showaccess($enddate,$startdate);
                             }                              }
                             if ($modify_section_result =~ /^ok/) {                              if ($modify_section_result =~ /^ok/) {
                                 $switchresult .= &mt("Section for [_1] switched from old section: '[_2]' to new section: '[_3]'.",$uname,$$currlist{$uname}[$sec],$stuinfo[ $place{groupID} ]).$access.$linefeed;                                  $switchresult .= &mt('Section for [_1] switched from old section: [_2] to new section: [_3].',$uname,$$currlist{$uname}[$sec],$stuinfo[ $place{groupID} ]).$access.$linefeed;
                                   $added = 1;
                                 if ($context eq 'automated') {                                  if ($context eq 'automated') {
                                     $$logmsg .= &mt('Section switch for [_1] from [_2] to [_3]',$uname,$$currlist{$uname}[$sec],$stuinfo[ $place{groupID} ]).$linefeed;                                      $$logmsg .= &mt('Section switch for [_1] from [_2] to [_3].',$uname,$$currlist{$uname}[$sec],$stuinfo[ $place{groupID} ]).$linefeed;
                                 }                                  }
                                 $switchcount ++;                                  $switchcount ++;
                             } else {                              } else {
Line 287  sub update_LC { Line 315  sub update_LC {
                         }                          }
                     }                      }
                 }                  }
   # Check for credits changes
                   if (($showcredits) && 
                       ($$currlist{$uname}[$credidx] ne $credits) && (!$added)) {
                       my $modify_credits_result =
                           &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context,$credits,$instsec);
                       if ($modify_credits_result =~ /^ok/) {
                           if ($credits ne '') {
                               $$logmsg .= &mt('Credits change for [_1] from [_2] to [_3].',$uname,$$currlist{$uname}[$credidx],$credits).$linefeed;
                           } else {
                               $$logmsg .= &mt('Credits change for [_1] from [_2] to course default [_3].',$uname,$$currlist{$uname}[$credidx],$defaultcredits).$linefeed;
                           }
                       } else {
                           $$logmsg .= &mt('Error when attempting to change credits for [_1] in section: [_2] -error [_3].',$uname,$stuinfo[$place{groupID}],$modify_credits_result).$linefeed;
                       }
                   }
   # Check for institutional section change
                   if (($$currlist{$uname}[$instidx] ne $instsec) && (!$added) && ($$currlist{$uname}[$type] eq "auto")) {
                       my $modify_instsec_result =
                           &Apache::lonnet::modify_student_enrollment($dom,$uname,undef,undef,undef,undef,undef,$stuinfo[ $place{groupID} ],$enddate,$startdate,'auto','',$cid,'',$context,$credits,$instsec);
                       if ($modify_instsec_result =~ /^ok/) {
                           $$logmsg .= &mt('Institutional section change for [_1] from [_2] to [_3].',$uname,$$currlist{$uname}[$instidx],$instsec).$linefeed;
                       } else {
                           $$logmsg .= &mt('Error when attempting to change institutional section for [_1] in section: [_2] -error [_3].',$uname,$stuinfo[$place{groupID}],$modify_instsec_result).$linefeed;
                       }
                   }
             } else {              } else {
 # Check for changed usernames by checking studentIDs  # Check for changed usernames by checking studentIDs
                 if ( ($stuinfo[ $place{studentID} ] ne '') && (grep/^$stuinfo[ $place{studentID} ]$/,@LCids) ) {                  if ( ($stuinfo[ $place{studentID} ] ne '') && (grep/^$stuinfo[ $place{studentID} ]$/,@LCids) ) {
Line 302  sub update_LC { Line 355  sub update_LC {
                         $$logmsg .= &mt('Because of this student/employee ID conflict, the new username - [_1] - has not been added to the LON-CAPA classlist',$uname).$linefeed;                          $$logmsg .= &mt('Because of this student/employee ID conflict, the new username - [_1] - has not been added to the LON-CAPA classlist',$uname).$linefeed;
                     }                      }
                 } elsif ($adds == 1) {                  } elsif ($adds == 1) {
                     my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc);                      my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc,$credithours);
                     &prepare_add($authtype,$autharg,$enddate,$startdate,\@stuinfo,\%place,\$dom,\$uname,\$auth,\$authparam,\$first,\$middle,\$last,\$gene,\$usec,\$end,\$start,\$emailaddr,\$pid,\$emailenc);                      &prepare_add($authtype,$autharg,$enddate,$startdate,\@stuinfo,\%place,\$dom,\$uname,\$auth,\$authparam,\$first,\$middle,\$last,\$gene,\$usec,\$end,\$start,\$emailaddr,\$pid,\$emailenc);
 # Check for existing account in this LON-CAPA domain for this username  # Check for existing account in this LON-CAPA domain for this username
                       next if (($end) && ($end < $now));
                     my $uhome=&Apache::lonnet::homeserver($uname,$dom);                      my $uhome=&Apache::lonnet::homeserver($uname,$dom);
                     if ($uhome eq 'no_host') { # User does not exist                      if ($uhome eq 'no_host') { # User does not exist
                         my $args = {'auth' => $auth,                          my $args = {'auth' => $auth,
Line 326  sub update_LC { Line 380  sub update_LC {
                                     'cdom' => $dom,                                      'cdom' => $dom,
                                     'context' => $context,                                      'context' => $context,
                                     'linefeed' => $linefeed,                                      'linefeed' => $linefeed,
                                     'role' => 'st'                                      'inststatus' => $inststatus,
                                       'instsec'  => $instsec,
                                       'role' => 'st',
                                    };                                     };
                           if ($credits) {
                               $args->{'credits'} = $credits;
                           }
                         my $outcome = &create_newuser($args,$logmsg,$newusermsg,\$enrollcount,\$addresult,\%longroles,\%courseinfo,$context);                          my $outcome = &create_newuser($args,$logmsg,$newusermsg,\$enrollcount,\$addresult,\%longroles,\%courseinfo,$context);
                     } else {                      } else {
                         &execute_add($context,'newstudent',$uname,$dom,$auth,$authparam,$first,$middle,$last,$gene,$pid,$usec,$end,$start,$emailenc,$cid,\$addresult,\$enrollcount,$linefeed,$logmsg);                          &execute_add($context,'newstudent',$uname,$dom,$auth,
                                        $authparam,$first,$middle,$last,$gene,$pid,
                                        $usec,$end,$start,$emailenc,$credits,$instsec,
                                        $cid,\$addresult,\$enrollcount,$linefeed,
                                        $logmsg);
                     }                      }
                     if ($courseinfo{'showphoto'}) {                      if ($courseinfo{'showphoto'}) {
                         my ($result,$resulttype) =                           my ($result,$resulttype) = 
Line 374  sub update_LC { Line 437  sub update_LC {
   
 # Do drops  # Do drops
     if ( ($drops == 1) && (@reg_students > 0) ) {      if ( ($drops == 1) && (@reg_students > 0) ) {
           my %delaydrops;
         foreach my $uname (@localstudents) {          foreach my $uname (@localstudents) {
             if ($$currlist{$uname}[$type] eq "auto") {              if ($$currlist{$uname}[$type] eq "auto") {
                 my @saved = ();                  my @saved = ();
Line 381  sub update_LC { Line 445  sub update_LC {
 # Check for changed usernames by checking studentIDs  # Check for changed usernames by checking studentIDs
                     if (grep/^$$currlist{$uname}[ $stuid ]$/,@allINids) {                      if (grep/^$$currlist{$uname}[ $stuid ]$/,@allINids) {
                         foreach my $match (@{$unameFromINid{$$currlist{$uname}[ $stuid ]}} ) {                          foreach my $match (@{$unameFromINid{$$currlist{$uname}[ $stuid ]}} ) {
                             $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student/employee ID: [_2].',$uname,$$currlist{$uname}[ $place{studentID} ]).' '.&mt('This username has been dropped from the institutional classlist, but the same student/employee ID is used for user: [_1] who still appears in the institutional classlist.',$match).' '.&mt('You may need to move the student data files for user: [_1] to [_2]',$uname,$match).' '.&mt('Because of this, user [_1] has not been dropped from the course.',$uname).$linefeed;                              $$logmsg .= &mt('A possible change in username has been detected for a student enrolled in this course.').' '.&mt('The existing LON-CAPA classlist contains user: [_1] and student/employee ID: [_2].',$uname,$$currlist{$uname}[ $stuid ]).' '.&mt('This username has been dropped from the institutional classlist, but the same student/employee ID is used for user: [_1] who still appears in the institutional classlist.',$match).' '.&mt('You may need to move the student data files for user: [_1] to [_2]',$uname,$match).' '.&mt('Because of this, user [_1] has not been dropped from the course.',$uname).$linefeed;
                             push @saved,$uname;                              push @saved,$uname;
                         }                          }
                     } elsif (@saved == 0) {                      } elsif (@saved == 0) {
   # Check enrollment count for institutional section of student to be dropped 
                           if ($$currlist{$uname}[$instidx]) {
                               if (exists($classcount{$$currlist{$uname}[$instidx]})) {
                                   if ($classcount{$$currlist{$uname}[$instidx]} == 0) {
                                       if ($autofailsafe) {
                                           push(@{$delaydrops{$$currlist{$uname}[$instidx]}},$uname);    
                                           next;
                                       }
                                   }
                               }
                           }
                         my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context);                          my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context);
                         if ($drop_reply !~ /^ok/) {                          if ($drop_reply !~ /^ok/) {
                             $$logmsg .= &mt('An error occured during the attempt to expire the [_1] from the old section [_2] - [_3].',$uname,$$currlist{$uname}[$sec],$drop_reply).$linefeed;                              $$logmsg .= &mt('An error occurred during the attempt to expire the [_1] from the old section [_2] - [_3].',$uname,$$currlist{$uname}[$sec],$drop_reply).$linefeed;
                         } else {                          } else {
                             $dropcount ++;                              $dropcount ++;
                             my %userenv = &Apache::lonnet::get('environment',['firstname','lastname','id'],$dom,$uname);                              my %userenv = &Apache::lonnet::get('environment',['firstname','lastname','id'],$dom,$uname);
Line 400  sub update_LC { Line 475  sub update_LC {
                 }                  }
             }              }
         }          }
           if (scalar(keys(%delaydrops)) > 0) {
               foreach my $class (keys(%delaydrops)) {
                   if (ref($delaydrops{$class}) eq 'ARRAY') {
                       if ($autofailsafe < scalar(@{$delaydrops{$class}})) {
                           $$logmsg .= &mt('The following students were not expired from the old section [_1] because the enrollment count retrieved for that institutional section was zero, and the number of students with roles to expire exceeded the failsafe threshold of [_2]:',$class,$autofailsafe);
                           if ($context eq "updatenow") {
                               $$logmsg .= '<br />'.join('<br />',@{$delaydrops{$class}}).$linefeed; 
                           } elsif ($context eq "automated") {
                               $$logmsg .= $linefeed.join($linefeed,@{$delaydrops{$class}}).$linefeed;
                           }
                       } else {
                           foreach my $uname (@{$delaydrops{$class}}) {
                               my $drop_reply = &Apache::lonnet::modifystudent($dom,$uname,'','','',undef,undef,undef,undef,$$currlist{$uname}[$sec],time,undef,undef,undef,undef,'auto','',$cid,'',$context);
                               if ($drop_reply !~ /^ok/) {
                                   $$logmsg .= &mt('An error occurred during the attempt to expire the [_1] from the old section [_2] - [_3].',$uname,$$currlist{$uname}[$sec],$drop_reply).$linefeed;
                               } else {
                                   $dropcount ++;
                                   my %userenv = &Apache::lonnet::get('environment',['firstname','lastname','id'],$dom,$uname);
                                   $dropresult .= $userenv{'firstname'}." ".$userenv{'lastname'}." (".$userenv{'id'}.") - ".$uname.' '.&mt("dropped from section: '[_1]'.",$$currlist{$uname}[$sec]).$linefeed;
                                   if ($context eq 'automated') {
                                      $$logmsg .= &mt('User [_1] student role expired from course.',$uname).$linefeed;
                                   }
                               }
                           }
                       }
                   }
               }
           }
     }      }
   
 # Terminated explictly allowed access to student creation/modification  # Terminated explictly allowed access to student creation/modification 
   # and group membership changes
     if ($context eq 'automated') {      if ($context eq 'automated') {
         delete($env{'allowed.cst'});          delete($env{'allowed.cst'});
           delete($env{'allowed.mdg'});
     }      }
     if ($enrollcount > 0) {      if ($enrollcount > 0) {
         if ($context eq "updatenow") {          if ($context eq "updatenow") {
Line 473  sub create_newuser { Line 578  sub create_newuser {
     my $context = $args->{'context'};      my $context = $args->{'context'};
     my $linefeed = $args->{'linefeed'};      my $linefeed = $args->{'linefeed'};
     my $role = $args->{'role'};      my $role = $args->{'role'};
       my $inststatus = $args->{'inststatus'};
       my $credits = $args->{'credits'};
       my $instsec = $args->{'instsec'};
     my $create_passwd = 0;      my $create_passwd = 0;
     my $authchk = '';      my $authchk = '';
     my $outcome;      my $outcome;
Line 480  sub create_newuser { Line 588  sub create_newuser {
 # If no account exists and passwords should be generated  # If no account exists and passwords should be generated
     if ($auth eq "internal") {      if ($auth eq "internal") {
         if ($authparam eq '') {          if ($authparam eq '') {
             $authparam = &create_password();              $authparam = &create_password($udom);
             if ($authparam eq '') {              if ($authparam eq '') {
                 $authchk = '';                  $authchk = '';
             } else {              } else {
Line 517  sub create_newuser { Line 625  sub create_newuser {
                 $outcome = $result;                  $outcome = $result;
             }              }
         } else {          } else {
             $outcome=&Apache::lonnet::modifystudent($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid,'',$called_context);              $outcome=&Apache::lonnet::modifystudent($udom,$uname,$pid,$auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,'',undef,$emailaddr,'auto','',$cid,'',$called_context,$inststatus,$credits,$instsec);
         }          }
         if ($outcome eq 'ok') {          if ($outcome eq 'ok') {
             my $access = &showaccess($end,$start);              my $access = &showaccess($end,$start);
Line 569  sub create_newuser { Line 677  sub create_newuser {
                         if ($start > 0) {                          if ($start > 0) {
                             $access_start = localtime($start)                              $access_start = localtime($start)
                         }                          }
                         $body = &mt('You have been enrolled in the LON-CAPA system at your institution, because you are a registered student in a class which is using the LON-CAPA couse management and online homework system.')."\n\n".&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n".&mt('The URL you should use to access the LON-CAPA system at your institution is: ').$portalurl."\n\n".&mt('When you log-in you will be able to access the LON-CAPA course for [_1] - [_2] starting [_3].',$$courseinfo{'description'},$$courseinfo{'inst_code'},$access_start)."\n";                          $body =
                               &mt('You have been enrolled in the LON-CAPA system at your institution, because you are a registered student in a class which is using the LON-CAPA course management and online homework system.')."\n\n"
                              .&mt("You should log-in to the system using the following credentials:\nusername: [_1]\npassword: [_2]",$uname,$authparam)."\n\n"
                              .&mt('The URL you should use to access the LON-CAPA system at your institution is: ').$portalurl."\n\n"
                              .&mt('When you log-in you will be able to access the LON-CAPA course for [_1] - [_2] starting [_3].',$$courseinfo{'description'},$$courseinfo{'inst_code'},$access_start)."\n";
                     }                      }
                     &Apache::lonmsg::sendemail($emailaddr,$subject,$body);                      &Apache::lonmsg::sendemail($emailaddr,$subject,$body);
                 }                  }
Line 603  sub prepare_add { Line 715  sub prepare_add {
     $$start = $$stuinfo[ $$place{'startdate'} ];      $$start = $$stuinfo[ $$place{'startdate'} ];
     $$emailaddr = $$stuinfo[ $$place{'email'} ];      $$emailaddr = $$stuinfo[ $$place{'email'} ];
     $$pid = $$stuinfo[ $$place{'studentID'} ];      $$pid = $$stuinfo[ $$place{'studentID'} ];
                                                                                     
 # remove non alphanumeric values from section  # remove non alphanumeric values from section
     $$usec =~ s/\W//g;      $$usec =~ s/\W//g;
                                                                                                                                                                       
Line 631  sub prepare_add { Line 743  sub prepare_add {
 }  }
   
 sub execute_add {  sub execute_add {
     my ($context,$caller,$uname,$dom,$auth,$authparam,$first,$middle,$last,$gene,$pid,$usec,$end,$start,$emailenc,$cid,$addresult,$enrollcount,$linefeed,$logmsg) = @_;      my ($context,$caller,$uname,$dom,$auth,$authparam,$first,$middle,$last,
           $gene,$pid,$usec,$end,$start,$emailenc,$credits,$instsec,$cid,$addresult,
           $enrollcount,$linefeed,$logmsg) = @_;
 # Get the user's information and authentication  # Get the user's information and authentication
     my %userenv = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id','critnotification','notification','permanentemail'],$dom,$uname);      my %userenv = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id','critnotification','notification','permanentemail','inststatus'],$dom,$uname);
     my ($tmp) = keys(%userenv);      my ($tmp) = keys(%userenv);
     if ($tmp =~ /^(con_lost|error)/i) {      if ($tmp =~ /^(con_lost|error)/i) {
         %userenv = ();          %userenv = ();
Line 702  sub execute_add { Line 816  sub execute_add {
     }      }
                                                                                                                                                                       
 # Assign the role of student in the course.  # 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,'',$context);      my $classlist_reply = 
           &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,
                                                      $last,$gene,$usec,$end,$start,
                                                      'auto','',$cid,'',$context,
                                                      $credits,$instsec);
     if ($classlist_reply eq 'ok') {      if ($classlist_reply eq 'ok') {
         my $access = &showaccess($end,$start);          my $access = &showaccess($end,$start);
         my $showsec = $usec;          my $showsec = $usec;
Line 765  sub parse_classlist { Line 883  sub parse_classlist {
     my $xmlfile = $tmpdir."/tmp/".$dom."_".$crs."_".$class."_classlist.xml";      my $xmlfile = $tmpdir."/tmp/".$dom."_".$crs."_".$class."_classlist.xml";
     my $uname = '';      my $uname = '';
     my @state;      my @state;
     my @items = ('autharg','authtype','email','firstname','generation','lastname','middlename','studentID');      my @items = ('autharg','authtype','email','firstname','generation','lastname','middlename','studentID','credits','inststatus');
     my $p = HTML::Parser->new      my $p = HTML::Parser->new
     (      (
         xml_mode => 1,          xml_mode => 1,
Line 776  sub parse_classlist { Line 894  sub parse_classlist {
                  if ("@state" eq "students student") {                   if ("@state" eq "students student") {
                      $uname = $attr->{username};                       $uname = $attr->{username};
                      $$studentsref{$uname}[ $$placeref{'groupID'} ] = $groupID;                       $$studentsref{$uname}[ $$placeref{'groupID'} ] = $groupID;
                        $$studentsref{$uname}[ $$placeref{'instsec'} ] = $class;
                  }                   }
             }, "tagname, attr"],              }, "tagname, attr"],
          text_h =>           text_h =>
Line 833  sub process_date { Line 952  sub process_date {
 }  }
   
 sub create_password {  sub create_password {
     my $passwd = '';      my ($udom) = @_;
     my @letts = ("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");      my %passwdconf = &Apache::lonnet::get_passwdconf($udom);
     for (my $i=0; $i<8; $i++) {      my ($min,$max,@chars);
       $min = $Apache::lonnet::passwdmin;
       if (ref($passwdconf{'chars'}) eq 'ARRAY') {
           if ($passwdconf{'min'} =~ /^\d+$/) {
               if ($passwdconf{'min'} > $min) {
                   $min = $passwdconf{'min'};
               }
           }
           if ($passwdconf{'max'} =~ /^\d+$/) {
               $max = $passwdconf{'max'};
           }
           @chars = @{$passwdconf{'chars'}};
       }
       my @letts = qw(b c d f g h j k l m n p q r s t v w x y z);
       my (@included,%reqd);
       if (@chars) {
           map { $reqd{$_} = 1; } @chars;
       }
       if ($reqd{'uc'}) {
           my $letter = $letts[int( rand(21) )];   
           $letter =~ tr/a-z/A-Z/;
           if ($letter ne '') {
               push(@included,$letter); 
           }
       }
       if ($reqd{'lc'}) {
           my $letter = $letts[int( rand(21) )];
           if ($letter ne '') {
               push(@included,$letter);
           } 
       }
       if ($reqd{'num'}) {
           my $number = int( rand(10) );
           if ($number ne '') {
               push(@included,$number);
           }
       }
       if ($reqd{'spec'}) {
           my @specs = qw(! # * & _ - + $);
           my $special = $specs[int( rand(8) )];
           if ($special ne '') {
               push(@included,$special);
           }
       }
       my $start = 0;
       if (scalar(@included) > 0) {
           $start = scalar(@included);
       }
       my $end = 8;
       if ($min =~ /^\d+$/) {
           if ($min > $end) {
               $end = $min;
           } 
       }
       for (my $i=$start; $i<$end; $i++) {
         my $lettnum = int (rand 2);          my $lettnum = int (rand 2);
         my $item = '';          my $item = '';
         if ($lettnum) {          if ($lettnum) {
             $item = $letts[int( rand(26) )];              $item = $letts[int( rand(21) )];
             my $uppercase = int(rand 2);              my $uppercase = int(rand 2);
             if ($uppercase) {              if ($uppercase) {
                 $item =~ tr/a-z/A-Z/;                  $item =~ tr/a-z/A-Z/;
             }              }
         } else {          } else {
             $item = int( rand(10) );              $item = int( rand(10) );
         }           }
         $passwd .= $item;          if ($item ne '') {
               push(@included,$item);
           }
     }      }
     return ($passwd);      my $passwd = join('',&Math::Random::random_permutation(@included));
       return $passwd;
 }  }
   
 sub get_courseinfo {  sub get_courseinfo {
     my ($dom,$crs,$courseinfo) = @_;      my ($dom,$crs,$courseinfo) = @_;
     my $owner;      my $owner;
     if (defined($dom) && defined($crs)) {      if (defined($dom) && defined($crs)) {
         my %settings = &Apache::lonnet::get('environment',['internal.coursecode','internal.showphoto','description'],$dom,$crs);          my %settings = &Apache::lonnet::get('environment',['internal.coursecode','internal.showphoto','description','internal.defaultcredits'],$dom,$crs);
         if ( defined($settings{'internal.coursecode'}) ) {          if ( defined($settings{'internal.coursecode'}) ) {
             $$courseinfo{'inst_code'} = $settings{'internal.coursecode'};              $$courseinfo{'inst_code'} = $settings{'internal.coursecode'};
         }          }
Line 866  sub get_courseinfo { Line 1042  sub get_courseinfo {
         if ( defined($settings{'internal.showphoto'}) ) {          if ( defined($settings{'internal.showphoto'}) ) {
             $$courseinfo{'showphoto'} = $settings{'internal.showphoto'};              $$courseinfo{'showphoto'} = $settings{'internal.showphoto'};
         }          }
           if ( defined($settings{'internal.credithours'}) ) {
               $$courseinfo{'defaultcredits'} = $settings{'internal.defaultcredits'};
           }
     }      }
     return;      return;
 }  }
Line 883  sub place_hash { Line 1062  sub place_hash {
                   middlename => 8,                    middlename => 8,
                   startdate  => 9,                    startdate  => 9,
                   studentID  => 10,                    studentID  => 10,
                     credits    => 11,
                     inststatus => 12,
                     instsec    => 13,
                 );                  );
     return %place;      return %place;
 }  }

Removed from v.1.43  
changed lines
  Added in v.1.55


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