--- loncom/interface/Attic/londropadd.pm 2006/04/22 01:06:48 1.139 +++ loncom/interface/Attic/londropadd.pm 2006/07/19 12:26:06 1.145 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.139 2006/04/22 01:06:48 albertel Exp $ +# $Id: londropadd.pm,v 1.145 2006/07/19 12:26:06 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,7 @@ use Apache::Constants qw(:common :http R use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; +use Apache::longroup; ############################################################### ############################################################### @@ -77,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 @@ -307,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?', ); @@ -393,6 +394,7 @@ END } END } + my $section_checks; my $optional_checks = ''; if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $optional_checks = (<<END); @@ -400,6 +402,7 @@ END } END } else { + $section_checks = §ion_check_js(); $optional_checks = (<<END); var message=''; if (foundname==0) { @@ -440,7 +443,7 @@ END if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $result .= $auth_checks; } - $result .= $optional_checks; + $result .= $optional_checks."\n".$section_checks; if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $result .= $authheader; } @@ -451,7 +454,7 @@ END ############################################################### sub upload_manager_javascript_forward_associate { return(<<ENDPICK); -function verify(vf) { +function verify(vf,sec_caller) { var founduname=0; var foundpwd=0; var foundname=0; @@ -544,7 +547,7 @@ ENDPICK ############################################################### sub upload_manager_javascript_reverse_associate { return(<<ENDPICK); -function verify(vf) { +function verify(vf,sec_caller) { var founduname=0; var foundpwd=0; var foundname=0; @@ -640,7 +643,8 @@ sub print_upload_manager_footer { $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '. 'of Conflicting IDs (only do if you know what you are doing)'). "</label>\n</p><p>\n"; - $Str .= '<input type="button" onClick="javascript:verify(this.form)" '. + $Str .= '<input type="button"'. + 'onClick="javascript:verify(this.form,this.form.csec)" '. 'value="Update Class List" />'."<br />\n"; $Str .= &mt('Note: for large courses, this operation may be time '. 'consuming'); @@ -701,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') { @@ -905,7 +909,8 @@ sub make_dates_default { $result .= "Set default start and end dates for course<br />"; # # 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. '<br />'; @@ -1073,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", @@ -1084,7 +1089,7 @@ END <input type="hidden" name="cuname" value="$username" /> <input type="hidden" name="lcdomain" value="$domain" /> <script type="text/javascript" language="Javascript"> -function verify(vf) { +function verify(vf,sec_caller) { var founduname=0; var foundpwd=0; var foundname=0; @@ -1101,6 +1106,9 @@ function verify(vf) { } if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) { foundsec=1; + if (validate(sec_caller) == "error") { + return; + } } if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) { foundid=1; @@ -1137,7 +1145,7 @@ $lt{'idsn'}: <input type="text" name="cs $lt{'disn'} </label> </p><p> -<input type="button" onClick="verify(this.form)" value="$lt{'eas'}"> +<input type="button" onClick="verify(this.form,this.form.csec)" value="$lt{'eas'}"> </p> END return; @@ -1242,6 +1250,10 @@ sub print_html_classlist { sub show_class_list { my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_; my $cid=$env{'request.course.id'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + my $cnum = $env{'course.'.$cid.'.num'}; + my ($classgroups) = &Apache::loncoursedata::get_group_memberships( + $classlist,$keylist,$cdom,$cnum); # # Variables for excel output my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); @@ -1250,7 +1262,7 @@ sub show_class_list { my ($CSVfile,$CSVfilename); # my $sortby = $env{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) { + if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end|type)$/) { $sortby = 'username'; } if (! exists($env{'form.displayphotos'})) { @@ -1270,15 +1282,16 @@ END END if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { if ($linkto eq 'aboutme') { - $r->print(&mt('Select a user name to view the users personal page.')); + $r->print(&mt("Select a user name to view the user's personal page.")); } elsif ($linkto eq 'modify') { - $r->print(&mt('Select a user name to modify the students information')); + $r->print(&mt("Select a user name to modify the student's information")); } my %lt=&Apache::lonlocal::texthash( 'usrn' => "username", 'dom' => "domain", 'sn' => "student name", 'sec' => "section", + 'grp' => "active groups", 'start' => "start date", 'end' => "end date", 'type' => "enroll type/action", @@ -1332,6 +1345,8 @@ function photowindow(photolink) { <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a> </th><th> <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a> + </th><th> + <a href="javascript:document.studentform.sortby.value='groups';document.studentform.submit();">$lt{'grp'}</a> </th> END if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { @@ -1372,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 @@ -1392,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'}); } # @@ -1402,6 +1419,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@{$keylist}); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1419,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'}]; @@ -1487,6 +1510,7 @@ END <td>$section</td> <td>$start</td> <td>$end</td> + <td>$active_groups</td> END if ($env{'course.'.$env{'request.course.id'}. '.internal.showphoto'}) { @@ -1522,6 +1546,7 @@ 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, @@ -1537,6 +1562,7 @@ END } } $excel_sheet->write($row,$col++,$status); + $excel_sheet->write($row,$col++,$active_groups); $row++; } } @@ -1633,7 +1659,19 @@ sub print_modify_student_form { 'sec' => "Section", 'sm' => "Submit Modifications", ); - $r->print(<<END); +# Check if section name is valid + my $section_check = §ion_check_js(); + $r->print(<<"END"); +<script type="text/javascript"> +$section_check +function secverify(formname,caller) { + if (validate(caller) == "error") { + return; + } else { + formname.submit(); + } +} +</script> <p> <font size="+1"> $lt{'odcc'} @@ -1669,7 +1707,7 @@ $lt{'disn'} </p> <p>$current_date_description</p> <p>$date_table</p> -<input type="submit" value="$lt{'sm'}" /> +<input type="button" value="$lt{'sm'}" onClick="secverify(this.form,this.form.section)" /> END $r->print(&Apache::loncommon::end_page()); return; @@ -1893,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(<<END); @@ -1923,6 +1965,7 @@ my %lt=&Apache::lonlocal::texthash('usrn 'sec' => "section", 'start' => "start date", 'end' => "end date", + 'groups' => "active groups", ); if ($nosort) { $r->print(&Apache::loncommon::start_data_table()); @@ -1936,6 +1979,7 @@ my %lt=&Apache::lonlocal::texthash('usrn <th>$lt{'sec'}</th> <th>$lt{'start'}</th> <th>$lt{'end'}</th> + <th>$lt{'groups'}</th> </tr> END @@ -1957,6 +2001,8 @@ END <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a> </th><th> <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a> + </th><th> + <a href="/adm/dropadd?action=$action&sortby=groups">$lt{'groups'}</a> </th> </tr> END @@ -1968,6 +2014,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@$keylist); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1988,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 { @@ -2011,6 +2063,7 @@ END <td>$section</td> <td>$start</td> <td>$end</td> + <td>$active_groups</td> END $r->print(&Apache::loncommon::end_data_table_row()); } @@ -2145,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($_); @@ -2185,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('<br />'. + &mt('<b>[_1]</b>: 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('<br />'. + &mt('<b>[_1]</b>: 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'})) { @@ -2300,6 +2366,33 @@ sub drop_student_list { $r->print('<p>'.&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; k<groups.length; k++) { + if (secname == groups[k]) { + alert("'"+secname+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name."); + return 'error'; + } + } + } + return 'ok'; +} +END +} + ################################################################### ################################################################### @@ -2387,16 +2480,15 @@ sub handler { # # Main switch on form.action and form.state, as appropriate if (! exists($env{'form.action'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); + $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') { @@ -2414,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') { @@ -2427,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') { @@ -2442,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') { @@ -2457,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') { @@ -2473,8 +2565,7 @@ 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); } #