--- loncom/interface/Attic/londropadd.pm 2005/04/07 07:34:52 1.128 +++ loncom/interface/Attic/londropadd.pm 2006/05/18 01:08:51 1.143 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.128 2005/04/07 07:34:52 albertel Exp $ +# $Id: londropadd.pm,v 1.143 2006/05/18 01:08:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,19 +39,14 @@ use Apache::Constants qw(:common :http R use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; +use Apache::longroup; ############################################################### ############################################################### sub header { - my $html=&Apache::lonxml::xmlbegin(); - my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager'); - my $title = &mt('LON-CAPA Enrollment Manager'); + my $start_page=&Apache::loncommon::start_page('Enrollment Manager'); return(< -$title - -$bodytag +$start_page
ENDHEAD @@ -83,7 +78,7 @@ sub modifystudent { } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) { my (undef,$end,$start)=split(/\_/,$roles{$course}); my $now=time; - # if this is an active role + # if this is an active role if (!($start && ($now<$start)) || !($end && ($now>$end))) { my $reply=&Apache::lonnet::modifystudent # dom name id mode pass f m l g @@ -137,7 +132,8 @@ sub domain_form { ############################################################### # Menu Phase One sub print_main_menu { - my ($r,$enrl_permission,$view_permission)=@_; + my ($r,$enrl_permission,$view_permission,$grp_manage_permission, + $grp_view_permission)=@_; # my ($cdom,$cnum) = split/_/,$env{'request.course.id'}; my @menu = @@ -171,6 +167,26 @@ sub print_main_menu { permission => &Apache::lonnet::auto_run($cnum,$cdom), url => '/adm/populate', }, + { text => 'Create a new group', + help => 'Course_Create_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=create', + }, + { text => 'Modify an existing group', + help => 'Course_Modify_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=modify', + }, + { text => 'Delete an existing group', + help => 'Course_Delete_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=delete', + }, + { text => 'Enter an existing group', + help => 'Course_Display_Group', + permission => $grp_view_permission, + url => '/adm/coursegroups?refpage=enrl&action=view', + }, ); my $menu_html = ''; foreach my $menu_item (@menu) { @@ -253,8 +269,8 @@ sub print_upload_manager_header { $r->print(''); - $r->print(''. - &mt('Ignore First Line')); + $r->print(''); $r->print("
\n". ''); @@ -292,7 +308,7 @@ sub javascript_validations { ipass => 'You need to specify the initial password.', name => 'The optional name field was not specified.', snum => 'The optional student number field was not specified.', - section => 'The optional section or group field was not specified.', + section => 'The optional section field was not specified.', email => 'The optional email address field was not specified.', continue => 'Continue enrollment?', ); @@ -378,6 +394,7 @@ END } END } + my $section_checks; my $optional_checks = ''; if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $optional_checks = (<\n"; $Str .= "

\n". &mt('Note: this will not take effect if the user already exists'). + &Apache::loncommon::help_open_topic('Auth_Options'). "

\n"; $Str .= $krbform."\n

\n". $intform."\n

\n". @@ -616,15 +635,16 @@ sub print_upload_manager_footer { $Str .= "

".&mt('Starting and Ending Dates')."

\n"; $Str .= "

\n".$date_table."

\n"; $Str .= "

".&mt('Full Update')."

\n"; - $Str .= ''. + $Str .= '

\n"; $Str .= "

".&mt('Student Number')."

\n"; - $Str .= "

\n".''; + $Str .= "

\n".'

\n"; - $Str .= '\n

\n"; + $Str .= ''."
\n"; $Str .= &mt('Note: for large courses, this operation may be time '. 'consuming'); @@ -685,7 +705,7 @@ sub print_upload_manager_form { ['lname',&mt('Last Name'), $env{'form.lname_choice'}], ['gen', &mt('Generation'), $env{'form.gen_choice'}], ['id', &mt('ID/Student Number'),$env{'form.id_choice'}], - ['sec', &mt('Group/Section'), $env{'form.sec_choice'}], + ['sec', &mt('Section'), $env{'form.sec_choice'}], ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}], ['email',&mt('EMail Address'), $env{'form.email_choice'}]); if ($env{'form.upfile_associate'} eq 'reverse') { @@ -852,16 +872,16 @@ sub date_setting_table { my ($starttime,$endtime,$mode) = @_; my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); my $dateDefault = ''. - ' '. - &mt('make these dates the default for future enrollment'); + ''; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } - my $perpetual = ''; + $perpetual.= ' /> '.&mt('no ending date').''; if ($mode eq 'create_enrolldates') { $perpetual = ' '; } @@ -889,7 +909,8 @@ sub make_dates_default { $result .= "Set default start and end dates for course
"; # # Refresh the course environment - &Apache::lonnet::coursedescription($env{'request.course.id'}); + &Apache::lonnet::coursedescription($env{'request.course.id'}, + {'freshen_cache' => 1}); } else { $result .= &mt('Unable to set default dates for course').":".$put_result. '
'; @@ -986,6 +1007,7 @@ sub print_enroll_single_student_form { 'psam' => "Please select an authentication mechanism", 'mail' => "Email Address" ); + my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options'); $user_data_html = <$lt{'udf'} $username\@$domain @@ -1003,7 +1025,7 @@ sub print_enroll_single_student_form {

$lt{'pswd'}

-$lt{'psam'} +$lt{'psam'}$authhelp

$krbform @@ -1056,7 +1078,7 @@ END # Print it all out my %lt=&Apache::lonlocal::texthash( 'cd' => "Course Data", - 'gs' => "Group/Section", + 'gs' => "Section", 'idsn' => "ID/Student Number", 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)", 'eas' => "Enroll as student", @@ -1067,7 +1089,7 @@ END + '); + } $r->print("

-

+".&Apache::loncommon::start_data_table()." "); if ($mode eq 'autoenroll') { @@ -1292,9 +1345,26 @@ END $lt{'start'} - END + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + my %photo_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $photochg = 'on'; + if ($displayphotos eq 'on') { + $photochg = 'off'; + } + $r->print(' '."\n"); + } + $r->print(" \n"); } elsif ($mode eq 'csv') { # # Open a file @@ -1317,12 +1387,13 @@ END print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","status")).'"'."\n"; + "section","start date","end date","status","active groups")) + .'"'."\n"; } else { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date")).'"'."\n"; + "section","start date","end date","active groups")).'"'."\n"; } } elsif ($mode eq 'excel') { # Create the excel spreadsheet @@ -1337,7 +1408,8 @@ END # $excel_sheet->write($row++,0,["username","domain","ID", "student name","section", - "start date","end date","status"], + "start date","end date","status", + "active groups"], $format->{'bold'}); } # @@ -1347,6 +1419,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@{$keylist}); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1364,9 +1437,14 @@ END my $lockcount = 0; foreach my $student (@Sorted_Students) { my $sdata = $classlist->{$student}; + my $groups = $classgroups->{$student}; my $username = $sdata->[$index{'username'}]; my $domain = $sdata->[$index{'domain'}]; my $section = $sdata->[$index{'section'}]; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } my $name = $sdata->[$index{'fullname'}]; my $id = $sdata->[$index{'id'}]; my $status = $sdata->[$index{'status'}]; @@ -1385,22 +1463,22 @@ END } else { $end = &Apache::lonlocal::locallocaltime($end); } - $r->print("\n "); + $r->print(&Apache::loncommon::start_data_table_row()); if ($mode eq 'autoenroll') { my $lockedtype = $sdata->[$index{'lockedtype'}]; $studentcount++; my $cellentry; if ($type eq 'auto') { - $cellentry = ''.&mt('auto').'  Change'; + $cellentry = ''.&mt('auto').' '; $autocount ++; } else { - $cellentry = '
$lt{'end'} + + $lt{'grp'}
'."\n".' '. + ''. + $photo_options{$photochg}.' '.$lt{'photo'}."\n". + '
- + END + if ($env{'course.'.$env{'request.course.id'}. + '.internal.showphoto'}) { + if ($displayphotos eq 'on') { + my $imgurl = + &Apache::lonnet::retrievestudentphoto($domain, + $username,'gif', + 'thumbnail'); + + $r->print(' '); + } else { + $r->print(' '); + } + } + $r->print(&Apache::loncommon::end_data_table_row()); } elsif ($mode eq 'csv') { next if (! defined($CSVfile)); # no need to bother with $linkto @@ -1454,22 +1546,28 @@ END if ($statusmode eq 'Any') { push @line,&Apache::loncommon::csv_translate($status); } + push @line,&Apache::loncommon::csv_translate($active_groups); print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { $excel_sheet->write($row,0,[$username,$domain,$id, $name,$section]); my $col = 5; foreach my $time ($start,$end) { - $excel_sheet->write($row,$col++, + if (defined($time) && $time != 0) { + $excel_sheet->write($row,$col++, &Apache::lonstathelpers::calc_serial($time), $format->{'date'}); + } else { + $excel_sheet->write($row,$col++,'none'); + } } $excel_sheet->write($row,$col++,$status); + $excel_sheet->write($row,$col++,$active_groups); $row++; } } if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { - $r->print('
'.&mt('manual').' Change
'; + $cellentry = '
'.&mt('manual').'
'; $manualcount ++; if ($lockedtype) { - $cellentry .= ' '.&mt('Unlock'); + $cellentry .= ''; $unlockcount ++; } else { - $cellentry .= ' '.&mt('Lock'); + $cellentry .= ''; $lockcount ++; } $cellentry .= '
'; @@ -1432,8 +1510,22 @@ END
$section $start $end
$active_groups 

'); + $r->print(&Apache::loncommon::end_data_table().'
'); } elsif ($mode eq 'excel') { $excel_workbook->close(); $r->print('

'. @@ -1509,7 +1607,7 @@ sub print_modify_student_form { '

'. &mt('Unable to retrieve environment data for').' '.$sname. &mt('in domain').' '.$sdom.'

'. - &mt('Please contact your LON-CAPA administrator regarding this situation.').'

'); + &mt('Please contact your LON-CAPA administrator regarding this situation.').'

'.&Apache::loncommon::end_page()); return; } # determine the students starting and ending times and section @@ -1561,7 +1659,19 @@ sub print_modify_student_form { 'sec' => "Section", 'sm' => "Submit Modifications", ); - $r->print(<print(<<"END"); +

$lt{'odcc'} @@ -1588,16 +1698,18 @@ $info{'lastname'} $info{'generation'}, $

$lt{'sid'}:

+

$lt{'sec'}:

$current_date_description

$date_table

- - + END + $r->print(&Apache::loncommon::end_page()); return; } @@ -1605,7 +1717,7 @@ END # modify a single students section # sub modify_single_student { - my $r = shift; + my ($r) = @_; # # Remove non alphanumeric values from the section $env{'form.section'} =~ s/\W//g; @@ -1747,8 +1859,8 @@ END
$Masd - END + $r->print(&Apache::loncommon::end_page()); return; } @@ -1819,9 +1931,13 @@ sub show_drop_list { ['sortby']); } my $sortby = $env{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) { + if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) { $sortby = 'username'; } + my $cdom = $env{'course.'.$cid.'.domain'}; + my $cnum = $env{'course.'.$cid,'.num'}; + my ($classgroups) = &Apache::loncoursedata::get_group_memberships( + $classlist,$keylist,$cdom,$cnum); # my $action = "drop"; $r->print(< "section", 'start' => "start date", 'end' => "end date", + 'groups' => "active groups", ); if ($nosort) { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1862,12 +1979,13 @@ my %lt=&Apache::lonlocal::texthash('usrn $lt{'sec'} $lt{'start'} $lt{'end'} + $lt{'groups'} END } else { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1883,6 +2001,8 @@ END $lt{'start'} $lt{'end'} + + $lt{'groups'} END @@ -1894,6 +2014,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@$keylist); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1914,6 +2035,11 @@ END my $id = $sdata->[$index{'id'}]; my $start = $sdata->[$index{'start'}]; my $end = $sdata->[$index{'end'}]; + my $groups = $classgroups->{$student}; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } if (! defined($start) || $start == 0) { $start = &mt('none'); } else { @@ -1927,8 +2053,8 @@ END my $status = $sdata->[$index{'status'}]; next if ($status ne 'Active'); # + $r->print(&Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - $username $domain @@ -1937,10 +2063,11 @@ END $section $start $end - + $active_groups END + $r->print(&Apache::loncommon::end_data_table_row()); } - $r->print('
'); + $r->print(&Apache::loncommon::end_data_table().'
'); %lt=&Apache::lonlocal::texthash( 'dp' => "Drop Students", 'ca' => "check all", @@ -1969,15 +2096,15 @@ sub print_first_courselist_upload_form { $str .= "

\n"; $str .= ''."\n"; - $str .= ' '. - &mt('Ignore First Line')."

\n"; + $str .= '

\n"; $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a class list from a spreadsheet")). "
\n"; $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", &mt("How do I create a CSV file from a spreadsheet")). "
\n"; - $str .= "\n\n"; + $str .= &Apache::loncommon::end_page(); $r->print($str); return; } @@ -2033,7 +2160,7 @@ sub upfile_drop_add { if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').''. &mt('Invalid home server specified')); - $r->print("\n\n"); + $r->print(&Apache::loncommon::end_page()); return; } } @@ -2071,6 +2198,8 @@ sub upfile_drop_add { my $count=0; my $flushc=0; my %student=(); + # Get information about course groups + my %curr_groups = &Apache::longroup::coursegroups(); # Get new classlist foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); @@ -2111,6 +2240,17 @@ sub upfile_drop_add { } # remove non alphanumeric values from section $sec =~ s/\W//g; + if ($sec eq "none" || $sec eq 'all') { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } elsif (($sec ne '') && (exists($curr_groups{$sec}))) { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } # determine student id number my $id=''; if (defined($fields{'id'})) { @@ -2226,6 +2366,33 @@ sub drop_student_list { $r->print('

'.&mt('Re-enrollment will re-activate data.')) if ($count); } +sub section_check_js { + my $groupslist; + my %curr_groups = &Apache::longroup::coursegroups(); + if (%curr_groups) { + $groupslist = join('","',sort(keys(%curr_groups))); + } + return <<"END"; +function validate(caller) { + var groups = new Array("$groupslist"); + var secname = caller.value; + if ((secname == 'all') || (secname == 'none')) { + alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name."); + return 'error'; + } + if (secname != '') { + for (var k=0; kprint(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); + &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission, + $grp_view_permission); } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=upload&state=', text=>"Upload Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Upload Classlist','Course_Create_Class_List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist', + 'Course_Create_Class_List')); if (! exists($env{'form.state'})) { &print_first_courselist_upload_form($r); } elsif ($env{'form.state'} eq 'got_file') { @@ -2328,8 +2506,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=drop', text=>"Drop Students"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Drop Students','Course_Drop_Student')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); if (! exists($env{'form.state'})) { &print_drop_menu($r); } elsif ($env{'form.state'} eq 'done') { @@ -2341,8 +2519,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=enrollstudent', text=>"Enroll Student"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enroll Student','Course_Add_Student')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); if (! exists($env{'form.state'})) { &get_student_username_domain_form($r); } elsif ($env{'form.state'} eq 'gotusername') { @@ -2356,8 +2534,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=classlist', text=>"View Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'View Classlist','Course_View_Class_List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist', + 'Course_View_Class_List')); if (! exists($env{'form.state'})) { &print_html_classlist($r,undef); } elsif ($env{'form.state'} eq 'csv') { @@ -2371,8 +2549,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=modifystudent', text=>"Modify Student Data"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Modify Student Data','Course_Modify_Student_Data')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data', + 'Course_Modify_Student_Data')); if (! exists($env{'form.state'})) { &print_html_classlist($r); } elsif ($env{'form.state'} eq 'selected') { @@ -2387,13 +2565,12 @@ sub handler { &Apache::lonnet::logthis("Undetermined state in londropadd.pm. ". "form.action = ".$env{'form.action'}. "Someone should fix this."); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); &print_main_menu($r,$enrl_permission,$view_permission); } # # Finish up - $r->print(''); + $r->print(''.&Apache::loncommon::end_page()); return OK; }