--- loncom/interface/Attic/londropadd.pm 2002/09/26 13:29:44 1.54 +++ loncom/interface/Attic/londropadd.pm 2002/10/16 15:02:28 1.58 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.54 2002/09/26 13:29:44 matthew Exp $ +# $Id: londropadd.pm,v 1.58 2002/10/16 15:02:28 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -594,17 +594,25 @@ sub enroll_single_student { my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, $ENV{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { + # Clean out any old roles the student has in this class. &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, $ENV{'request.course.id'},$ENV{'form.csec'}, $desiredhost); - $r->print(&Apache::lonnet::modifystudent( - $ENV{'form.lcdomain'},$ENV{'form.cuname'}, - $ENV{'form.cstid'},$amode,$genpwd, - $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, - $ENV{'form.clast'},$ENV{'form.cgen'}, - $ENV{'form.csec'},$ENV{'form.enddate'}, - $ENV{'form.startdate'},$ENV{'form.forceid'}, - $desiredhost)); + my $login_result = &Apache::lonnet::modifystudent + ($ENV{'form.lcdomain'},$ENV{'form.cuname'}, + $ENV{'form.cstid'},$amode,$genpwd, + $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, + $ENV{'form.clast'},$ENV{'form.cgen'}, + $ENV{'form.csec'},$ENV{'form.enddate'}, + $ENV{'form.startdate'},$ENV{'form.forceid'}, + $desiredhost); + if ($login_result =~ /^ok/) { + $r->print($login_result); + $r->print("

If active, the new role will be available ". + "when the student next logs in to LON-CAPA.

"); + } else { + $r->print("unable to enroll: ".$login_result); + } } else { $r->print('

ERROR '. 'Invalid login mode or password. '. @@ -726,58 +734,58 @@ END return; } -# =================================================== get the current classlist -sub get_current_classlist { - my $r = shift; - # Call DownloadClasslist - my $cid = $ENV{'request.course.id'}; - my $c = $r->connection; - my $classlisthash = &Apache::loncoursedata::DownloadClasslist - ($cid,'Not downloaded',$c); - # Call ProcessClasslist - my %cache; - my @students = &Apache::loncoursedata::ProcessClasslist(\%cache, - $classlisthash, - $cid,$c); - return (\@students,\%cache); -} - # ========================================================= Menu Phase Two Drop sub print_drop_menu { my $r=shift; $r->print("

Drop Students

"); my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); return; } # Print out the available choices - &show_drop_list($student_array,$student_data,$r); + &show_drop_list($r,$classlist,$keylist); return; } # ============================================== view classlist sub print_html_classlist { my $r=shift; + if (! exists($ENV{'form.sortby'})) { + $ENV{'form.sortby'} = 'username'; + } + if (! exists($ENV{'form.Status'}) || + $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) { + $ENV{'form.Status'} = 'Active'; + } + my $status_select = &Apache::lonhtmlcommon::StatusOptions + ($ENV{'form.Status'},'studentform'); $r->print(< +

-Current Classlist      -CSV format +Current Classlist +      + +CSV format + +      +$status_select

END my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); } else { # Print out the available choices if ($ENV{'form.action'} eq 'modifystudent') { &show_class_list($r,'view','modify','modifystudent', - 'any',$student_array,$student_data); + $ENV{'form.Status'},$classlist,$keylist); } else { &show_class_list($r,'view','aboutme','classlist', - 'any',$student_array,$student_data); + $ENV{'form.Status'},$classlist,$keylist); } } } @@ -786,21 +794,21 @@ END sub print_csv_classlist { my $r=shift; my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); } else { &show_class_list($r,'csv','nolink','csv', - 'any',$student_array,$student_data); + $ENV{'form.Status'},$classlist,$keylist); } } # =================================================== Show student list to drop sub show_class_list { - my ($r,$mode,$linkto,$action,$statusmode,$students,$s_data)=@_; + my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_; my $cid=$ENV{'request.course.id'}; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['sortby']); +# &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, +# ['sortby']); my $sortby = $ENV{'form.sortby'}; if ($sortby !~ /^(username|domain|section|fullname|id)$/) { $sortby = 'username'; @@ -808,7 +816,7 @@ sub show_class_list { # Print out header if ($mode eq 'view') { if ($linkto eq 'aboutme') { - $r->print('Select a user name to view the users page.'); + $r->print('Select a user name to view the users personal page.'); } elsif ($linkto eq 'modify') { $r->print('Select a user name to modify the students information'); } @@ -817,49 +825,55 @@ sub show_class_list {

END } elsif ($mode eq 'csv') { - $r->print('"'.join('","',("username","domain","ID","student name", - "section")).'"'."\n"); + if($statusmode eq 'Expired') { + $r->print('"Students with expired roles"'); + } + if ($statusmode eq 'Any') { + $r->print('"'.join('","',("username","domain","ID","student name", + "section","status")).'"'."\n"); + } else { + $r->print('"'.join('","',("username","domain","ID","student name", + "section")).'"'."\n"); + } + } + # + # Sort the students + my %index; + my $i; + foreach (@$keylist) { + $index{$_} = $i++; } + my $index = $index{$sortby}; + my $second = $index{'username'}; + my $third = $index{'domain'}; my @Sorted_Students = sort { - lc($s_data->{$a.':'.$sortby}) cmp lc($s_data->{$b.':'.$sortby}) - || - lc($s_data->{$a.':username'}) cmp lc($s_data->{$b.':username'}) - || - lc($s_data->{$a.':domain'}) cmp lc($s_data->{$b.':domain'}) - } @$students; + lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index]) + || + lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second]) + || + lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) + } (keys(%$classlist)); foreach my $student (@Sorted_Students) { - my $error; - if (exists($s_data->{$student.':error'})) { - $error = $s_data->{$student.':error'}; - } - if ($error) { - $r->print(''."\n"); - next; - } - my $username = $s_data->{$student.':username'}; - my $domain = $s_data->{$student.':domain'}; - my $section = $s_data->{$student.':section'}; - my $name = $s_data->{$student.':fullname'}; - my $status = $s_data->{$student.':Status'}; - my $id = $s_data->{$student.':id'}; - next if (($statusmode ne 'any') && ($status ne $statusmode)); + my $username = $classlist->{$student}->[$index{'username'}]; + my $domain = $classlist->{$student}->[$index{'domain'}]; + my $section = $classlist->{$student}->[$index{'section'}]; + my $name = $classlist->{$student}->[$index{'fullname'}]; + my $id = $classlist->{$student}->[$index{'id'}]; + my $status = $classlist->{$student}->[$index{'status'}]; + next if (($statusmode ne 'Any') && ($status ne $statusmode)); if ($mode eq 'view') { $r->print("\n + + + + + + + +END + + } else { + $r->print(< END + } + # + # Sort the students + my %index; + my $i; + foreach (@$keylist) { + $index{$_} = $i++; + } + my $index = $index{$sortby}; + my $second = $index{'username'}; + my $third = $index{'domain'}; my @Sorted_Students = sort { - lc($s_data->{$a.':'.$sortby}) cmp lc($s_data->{$b.':'.$sortby}) - || - lc($s_data->{$a.':username'}) cmp lc($s_data->{$b.':username'}) - || - lc($s_data->{$a.':domain'}) cmp lc($s_data->{$b.':domain'}) - } @$students; + lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index]) + || + lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second]) + || + lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) + } (keys(%$classlist)); foreach my $student (@Sorted_Students) { my $error; - if (exists($s_data->{$student.':error'})) { - $error = $s_data->{$student.':error'}; - } - if ($error) { - $r->print(''."\n"); - next; - } - my $username = $s_data->{$student.':username'}; - my $domain = $s_data->{$student.':domain'}; - my $section = $s_data->{$student.':section'}; - my $name = $s_data->{$student.':fullname'}; - my $status = $s_data->{$student.':Status'}; - my $id = $s_data->{$student.':id'}; + my $username = $classlist->{$student}->[$index{'username'}]; + my $domain = $classlist->{$student}->[$index{'domain'}]; + my $section = $classlist->{$student}->[$index{'section'}]; + my $name = $classlist->{$student}->[$index{'fullname'}]; + my $id = $classlist->{$student}->[$index{'id'}]; + my $status = $classlist->{$student}->[$index{'status'}]; next if ($status ne 'Active'); # $r->print(<<"END"); @@ -1365,6 +1426,11 @@ sub upfile_drop_add { } } } + # Clean up whitespace + foreach (\$domain,\$username,\$id,\$fname,\$mname, + \$lname,\$gen,\$sec) { + $$_ =~ s/(\s+$|^\s+)//g; + } if ($password) { &modifystudent($domain,$username,$cid,$sec, $desiredhost); @@ -1391,73 +1457,35 @@ sub upfile_drop_add { } } } # end of foreach (@studentdata) - $r->print('

Processed Students: '.$count); + $r->print('

Processed Students: '.$count.'

'); + $r->print("

If active, the new role will be available when the ". + "students next log in to LON-CAPA.

"); ##################################### # Drop students # ##################################### if ($ENV{'form.fullup'} eq 'yes') { $r->print('

Dropping Students

'); # Get current classlist - my ($error,%currentlist)=&get_current_classlist($r); - if (defined($error)) { - $r->print('
ERROR:$error
'); - } - if (defined(%currentlist)) { - # Drop the students + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { + $r->print("There are no students currently enrolled.\n"); + } else { + # Remove the students we just added from the list of students. foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); unless (($entries{$fields{'username'}} eq '') || (!defined($entries{$fields{'username'}}))) { - delete($currentlist{$entries{$fields{'username'}}. + delete($classlist->{$entries{$fields{'username'}}. ':'.$domain}); } } - # Print out list of dropped students - &show_drop_list($r,%currentlist); - } else { - $r->print("There are no students currently enrolled.\n"); + # Print out list of dropped students. + &show_drop_list($r,$classlist,$keylist,'nosort'); } } } # end of unless } -################################################################### -################################################################### - -=pod - -=item &drop_students - -Inputs: \@droplist, a pointer to an array of students to drop. -Students should be in format of studentname:studentdomain - -Returns: $errors, a string describing any errors encountered. -$successes, a string describing the successful dropping of students. - -=cut - -################################################################### -################################################################### -sub drop_students { - my @droplist = @{shift()}; - my $courseid = $ENV{'request.course.id'}; - my $successes = ''; - my $errors = ''; - foreach (@droplist) { - my ($sname,$sdom)=split(/:/,$_); - my $result = &drop_student($sname,$sdom,$courseid); - if ($result !~ /ok/) { - $errors .= "Error dropping $sname\@$sdom: $result\n"; - } else { - $successes .= "Dropped $sname\@$sdom\n"; - } - } - return ($errors,$successes); -} -################################################################### -################################################################### - - # ================================================================== Phase four sub drop_student_list { my $r=shift; @@ -1470,6 +1498,7 @@ sub drop_student_list { } foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); + # drop student my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'}); if ($result eq 'ok' || $result eq 'ok:') { $r->print('Dropped '.$uname.' @ '.$udom.'
'); @@ -1568,7 +1597,7 @@ sub handler { } elsif ($ENV{'form.state'} eq 'done') { &drop_student_list($r); } else { - &menu_phase_two_drop($r); + &print_drop_menu($r); } } elsif ($ENV{'form.action'} eq 'enrollstudent') { if (! exists($ENV{'form.state'})) {
- username + username - domain + domain - ID + ID - student name + student name - section + section
'. - 'Error'. - 'Error retrieving data for '. - join('@',split(/:/,$student)). - ', '.$error.'
\n "); if ($linkto eq 'nothing') { @@ -888,6 +902,9 @@ END foreach ($username,$domain,$id,$name,$section) { push @line,&Apache::loncommon::csv_translate($_); } + if ($statusmode eq 'Any') { + push @line,&Apache::loncommon::csv_translate($status); + } my $tmp = $"; $" = '","'; $r->print("\"@line\"\n"); @@ -1128,9 +1145,35 @@ sub get_enrollment_data { return ($start,$end,$section); } -# =================================================== Show student list to drop +################################################# +################################################# + +=pod + +=item show_drop_list + +Display a list of students to drop +Inputs: + +=over 4 + +=item $r, Apache request + +=item $classlist, hash pointer returned from loncoursedata::get_classlist(); + +=item $keylist, array pointer returned from loncoursedata::get_classlist() +which describes the order elements are stored in the %$classlist values. + +=item $nosort, if true, sorting links are omitted. + +=back + +=cut + +################################################# +################################################# sub show_drop_list { - my ($students,$s_data,$r)=@_; + my ($r,$classlist,$keylist,$nosort)=@_; my $cid=$ENV{'request.course.id'}; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sortby']); @@ -1138,6 +1181,7 @@ sub show_drop_list { if ($sortby !~ /^(username|domain|section|fullname|id)$/) { $sortby = 'username'; } + # my $action = "drop"; $r->print(< @@ -1156,6 +1200,23 @@ function uncheckAll(field) {

+END + + if ($nosort) { + $r->print(< +

 usernamedomainIDstudent namesection
  @@ -1171,32 +1232,32 @@ function uncheckAll(field) {
'. - 'Error'. - 'Error retrieving data for '. - join('@',split(/:/,$student)). - ', '.$error.'