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

version 1.46, 2013/08/14 00:38:50 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';
   
Line 39  use strict; Line 41  use strict;
   
 sub update_LC {  sub update_LC {
     my ($dom,$crs,$adds,$drops,$startdate,$enddate,$authtype,$autharg,      my ($dom,$crs,$adds,$drops,$startdate,$enddate,$authtype,$autharg,
         $showcredits,$defaultcredits,$classesref,$groupref,$logmsg,$newusermsg,          $showcredits,$defaultcredits,$autofailsafe,$classesref,$groupref,
         $context,$phototypes) = @_;          $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 56  sub update_LC { Line 58  sub update_LC {
     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 $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 129  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 196  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 206  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,$added,$inststatus);              my ($access,$added,$inststatus,$instsec);
             my $credits;              my $credits;
             if ($showcredits) {              if ($showcredits) {
                 $credits = $stuinfo[$place{'credits'}];                  $credits = $stuinfo[$place{'credits'}];
Line 216  sub update_LC { Line 224  sub update_LC {
                 }                  }
             }              }
             $inststatus = $stuinfo[$place{inststatus}];              $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 252  sub update_LC { Line 261  sub update_LC {
                         &execute_add($context,'switchtype',$uname,$dom,$auth,                          &execute_add($context,'switchtype',$uname,$dom,$auth,
                                      $authparam,$first,$middle,$last,$gene,                                       $authparam,$first,$middle,$last,$gene,
                                      $pid,$usec,$end,$start,$emailenc,                                       $pid,$usec,$end,$start,$emailenc,
                                      $credits,$cid,\$addresult,\$enrollcount,                                       $credits,$instsec,$cid,\$addresult,\$enrollcount,
                                      $linefeed,$logmsg);                                       $linefeed,$logmsg);
                         $added = 1;                          $added = 1;
                     }                      }
Line 263  sub update_LC { Line 272  sub update_LC {
                     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,$credits);                              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;
Line 286  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,$credits);                                  $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,$credits);                                  $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/) {
Line 310  sub update_LC { Line 319  sub update_LC {
                 if (($showcredits) &&                   if (($showcredits) && 
                     ($$currlist{$uname}[$credidx] ne $credits) && (!$added)) {                      ($$currlist{$uname}[$credidx] ne $credits) && (!$added)) {
                     my $modify_credits_result =                      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);                          &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 ($modify_credits_result =~ /^ok/) {
                         if ($credits ne '') {                          if ($credits ne '') {
                             $$logmsg .= &mt('Credits change for [_1] from [_2] to [_3].',$uname,$$currlist{$uname}[$credidx],$credits).$linefeed;                              $$logmsg .= &mt('Credits change for [_1] from [_2] to [_3].',$uname,$$currlist{$uname}[$credidx],$credits).$linefeed;
Line 321  sub update_LC { Line 330  sub update_LC {
                         $$logmsg .= &mt('Error when attempting to change credits for [_1] in section: [_2] -error [_3].',$uname,$stuinfo[$place{groupID}],$modify_credits_result).$linefeed;                          $$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 339  sub update_LC { Line 358  sub update_LC {
                     my ($auth,$authparam,$first,$middle,$last,$gene,$usec,$end,$start,$emailaddr,$pid,$emailenc,$credithours);                      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 361  sub update_LC { Line 381  sub update_LC {
                                     'context' => $context,                                      'context' => $context,
                                     'linefeed' => $linefeed,                                      'linefeed' => $linefeed,
                                     'inststatus' => $inststatus,                                      'inststatus' => $inststatus,
                                       'instsec'  => $instsec,
                                     'role' => 'st',                                      'role' => 'st',
                                    };                                     };
                         if ($credits) {                          if ($credits) {
Line 370  sub update_LC { Line 391  sub update_LC {
                     } else {                      } else {
                         &execute_add($context,'newstudent',$uname,$dom,$auth,                          &execute_add($context,'newstudent',$uname,$dom,$auth,
                                      $authparam,$first,$middle,$last,$gene,$pid,                                       $authparam,$first,$middle,$last,$gene,$pid,
                                      $usec,$end,$start,$emailenc,$credits,                                       $usec,$end,$start,$emailenc,$credits,$instsec,
                                      $cid,\$addresult,\$enrollcount,$linefeed,                                       $cid,\$addresult,\$enrollcount,$linefeed,
                                      $logmsg);                                       $logmsg);
                     }                      }
Line 416  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 423  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 occurred 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;
Line 442  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 517  sub create_newuser { Line 580  sub create_newuser {
     my $role = $args->{'role'};      my $role = $args->{'role'};
     my $inststatus = $args->{'inststatus'};      my $inststatus = $args->{'inststatus'};
     my $credits = $args->{'credits'};      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 524  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 561  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,$inststatus,$credits);              $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 651  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 680  sub prepare_add { Line 744  sub prepare_add {
   
 sub execute_add {  sub execute_add {
     my ($context,$caller,$uname,$dom,$auth,$authparam,$first,$middle,$last,      my ($context,$caller,$uname,$dom,$auth,$authparam,$first,$middle,$last,
         $gene,$pid,$usec,$end,$start,$emailenc,$credits,$cid,$addresult,          $gene,$pid,$usec,$end,$start,$emailenc,$credits,$instsec,$cid,$addresult,
         $enrollcount,$linefeed,$logmsg) = @_;          $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','inststatus'],$dom,$uname);      my %userenv = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id','critnotification','notification','permanentemail','inststatus'],$dom,$uname);
Line 756  sub execute_add { Line 820  sub execute_add {
         &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,          &Apache::lonnet::modify_student_enrollment($dom,$uname,$pid,$first,$middle,
                                                    $last,$gene,$usec,$end,$start,                                                     $last,$gene,$usec,$end,$start,
                                                    'auto','',$cid,'',$context,                                                     'auto','',$cid,'',$context,
                                                    $credits);                                                     $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 830  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 887  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 {
Line 942  sub place_hash { Line 1064  sub place_hash {
                   studentID  => 10,                    studentID  => 10,
                   credits    => 11,                    credits    => 11,
                   inststatus => 12,                    inststatus => 12,
                     instsec    => 13,
                 );                  );
     return %place;      return %place;
 }  }

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


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