--- loncom/interface/Attic/londropadd.pm 2006/05/01 19:37:33 1.141 +++ loncom/interface/Attic/londropadd.pm 2007/07/02 21:12:06 1.162 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.141 2006/05/01 19:37:33 albertel Exp $ +# $Id: londropadd.pm,v 1.162 2007/07/02 21:12:06 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,8 @@ use Apache::Constants qw(:common :http R use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; +use Apache::longroup; +use LONCAPA(); ############################################################### ############################################################### @@ -59,8 +61,8 @@ sub modifystudent { # if $csec is undefined, drop the student from all the courses matching # this one. If $csec is defined, drop them from all other sections of # this course and add them to section $csec - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$udom,$unam); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -68,16 +70,16 @@ sub modifystudent { # Go through the roles looking for enrollment in this course my $result = ''; foreach my $course (keys(%roles)) { - if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E(?:\/)*(?:\s+)*(\w+)*\_st$}) { # We are in this course my $section=$1; - $section='' if ($course eq $courseid.'_st'); + $section='' if ($course eq "/$cdom/$cnum".'_st'); if (defined($csec) && $section eq $csec) { $result .= 'ok:'; } 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 @@ -104,7 +106,7 @@ sub domain_form { # Set up domain and server selection forms # # Get the domains - my @domains = &Apache::loncommon::get_domains(); + my @domains = &Apache::lonnet::all_domains(); # build up the menu information to be passed to # &Apache::loncommon::linked_select_forms my %select_menus; @@ -115,7 +117,7 @@ sub domain_form { $select_menus{$dom}->{'default'}= 'default'; $select_menus{$dom}->{'select2'}->{'default'} = 'default'; # Now build up the other items in the second menu - my %servers = &Apache::loncommon::get_library_servers($dom); + my %servers = &Apache::lonnet::get_servers($dom,'library'); foreach my $server (keys(%servers)) { $select_menus{$dom}->{'select2'}->{$server} = "$server $servers{$server}"; @@ -134,7 +136,9 @@ sub print_main_menu { my ($r,$enrl_permission,$view_permission,$grp_manage_permission, $grp_view_permission)=@_; # - my ($cdom,$cnum) = split/_/,$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $cnum=$env{'course.'.$cid.'.num'}; my @menu = ( { text => 'Upload a class list', @@ -181,6 +185,11 @@ sub print_main_menu { permission => $grp_manage_permission, url => '/adm/coursegroups?refpage=enrl&action=delete', }, + { text => 'Re-enable a deleted group', + help => 'Course_Reenable_Group', + permission => $grp_manage_permission, + url => '/adm/coursegroups?refpage=enrl&action=reenable', + }, { text => 'Enter an existing group', help => 'Course_Display_Group', permission => $grp_view_permission, @@ -249,7 +258,7 @@ sub print_upload_manager_header { # my $javascript_validations=&javascript_validations('auth',$krbdefdom, $password_choice); - my $checked=(($env{'form.noFirstLine'})?' checked="1"':''); + my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n". "<hr>\n". '<h3>'.&mt('Identify fields')."</h3>\n"); @@ -268,7 +277,7 @@ sub print_upload_manager_header { $r->print('<input type="button" value="Reverse Association" '. 'name="'.&mt('Reverse Association').'" '. 'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); - $r->print('<label><input type="checkbox" name="noFirstLine" $checked />'. + $r->print('<label><input type="checkbox" name="noFirstLine"'.$checked.'/>'. &mt('Ignore First Line').'</label>'); $r->print("<hr />\n". '<script type="text/javascript" language="Javascript">'."\n". @@ -307,7 +316,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 +402,7 @@ END } END } + my $section_checks; my $optional_checks = ''; if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) { $optional_checks = (<<END); @@ -400,6 +410,7 @@ END } END } else { + $section_checks = §ion_check_js(); $optional_checks = (<<END); var message=''; if (foundname==0) { @@ -440,7 +451,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 +462,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 +555,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 +651,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 +713,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') { @@ -740,17 +752,21 @@ sub enroll_single_student { } $r->print('<h3>'.&mt('Enrolling Student').'</h3>'); - $r->print('<p>'.&mt('Enrolling').' '.$env{'form.cuname'}." \@ ". - $env{'form.lcdomain'}.'</p>'); - if (($env{'form.cuname'})&&($env{'form.cuname'}!~/\W/)&& - ($env{'form.lcdomain'})&&($env{'form.lcdomain'}!~/\W/)) { + $r->print('<p>'.&mt('Enrolling [_1] : [_2]',$env{'form.cuname'}, + $env{'form.lcdomain'}).'</p>'); + if (($env{'form.cuname'}) + && ($env{'form.cuname'} + eq &LONCAPA::clean_username($env{'form.cuname'})) + && ($env{'form.lcdomain'}) + && ($env{'form.lcdomain'} + eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) { # Deal with home server selection my $domain=$env{'form.lcdomain'}; my $desiredhost = $env{'form.lcserver'}; if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers =&Apache::loncommon::get_library_servers($domain); + my %home_servers =&Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print('<font color="#ff0000">'.&mt('Error').':</font>'. &mt('Invalid home server specified')); @@ -806,6 +822,7 @@ sub enroll_single_student { } else { $r->print(&mt('Invalid username or domain')); } + $r->print("<p><a href='/adm/dropadd?action=enrollstudent'>".&mt("Enroll another student")."</a></p>"); } sub setup_date_selectors { @@ -869,7 +886,8 @@ sub date_setting_table { my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); my $dateDefault = '<nobr>'. '<label><input type="checkbox" name="makedatesdefault" /> '. - &mt('make these dates the default for future enrollment').'</label>'; + &mt('make these dates the default for future enrollment'). + '</label></nobr>'; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } @@ -932,11 +950,11 @@ sub get_student_username_domain_form { <input type="hidden" name="state" value="gotusername" /> <h3>$lt{'eos'}</h3> <table> -<tr><th>$lt{'usr'}:</th> +<tr><td class="LC_dropadd_labeltext"><label for="cuname">$lt{'usr'}</label>:</td> <td><input type="text" name="cuname" size="15" /></td></tr> -<tr><th>$lt{'dom'}:</th> +<tr><td class="LC_dropadd_labeltext"><label for="cudomain">$lt{'dom'}</label>:</td> <td>$domform</td></tr> -<tr><th> </th> +<tr><td> </td> <td> <input type="submit" name="Begin Enrollment" value="$lt{'been'}" /> </td></tr> @@ -953,10 +971,8 @@ sub print_enroll_single_student_form { my $r=shift; $r->print("<h3>".&mt('Enroll One Student')."</h3>"); # - my $username = $env{'form.cuname'}; - my $domain = $env{'form.cudomain'}; - $username=~s/\W//gs; - $domain=~s/\W//gs; + my $username = &LONCAPA::clean_username($env{'form.cuname'}); + my $domain = &LONCAPA::clean_domain($env{'form.cudomain'}); my $home = &Apache::lonnet::homeserver($username,$domain); # $new_user flags whether we are creating a new user or using an old one my $new_user = 1; @@ -982,7 +998,7 @@ sub print_enroll_single_student_form { # # Set up domain selection form my $homeserver_form = ''; - my %servers = &Apache::loncommon::get_library_servers($domain); + my %servers = &Apache::lonnet::get_servers($domain,'library'); $homeserver_form = '<select name="lcserver" size="1">'."\n". '<option value="default" selected>default</option>'."\n"; while (my ($servername,$serverdescription) = each (%servers)) { @@ -1005,19 +1021,19 @@ sub print_enroll_single_student_form { ); my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options'); $user_data_html = <<END; -<h3>$lt{'udf'} $username\@$domain</h3> +<h3>$lt{'udf'} $username:$domain</h3> <table> -<tr><th>$lt{'fn'}:</th> - <td><input type="text" name="cfirst" size="15"></td></tr> -<tr><th>$lt{'mn'}:</th> - <td><input type="text" name="cmiddle" size="15"></td></tr> -<tr><th>$lt{'ln'}:</th> - <td><input type="text" name="clast" size="15"></td></tr> -<tr><th>$lt{'gen'}:</th> - <td><input type="text" name="cgen" size="5"> </td></tr> -<tr><th>$lt{'hs'}:</th> +<tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td> + <td><input type="text" name="cfirst" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td> + <td><input type="text" name="cmiddle" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td> + <td><input type="text" name="clast" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td> + <td><input type="text" name="cgen" size="5" /> </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="lcserver">$lt{'hs'}</label>:</td> <td>$homeserver_form</td></tr> -<tr><th>$lt{'mail'}:</th> +<tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td> <td><input type="text" name="emailaddress" size="20" /></td></tr> </table> <h3>$lt{'pswd'}</h3> @@ -1044,29 +1060,19 @@ END 'mail' => "Email Address", ); $user_data_html = <<END; -<h3>$lt{'udf'} $username\@$domain</h3> +<h3>$lt{'udf'} $username:$domain</h3> <input type="hidden" name="lcserver" value="default" /> <table> -<tr><th>$lt{'fn'}:</th> - <td> - <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /> - </td></tr> -<tr><th>$lt{'mn'}:</th> - <td> - <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /> - </td></tr> -<tr><th>$lt{'ln'}:</th> - <td> - <input type="text" name="clast"value="$uenv{'lastname'}" size="15" /> - </td></tr> -<tr><th>$lt{'gen'}:</th> - <td> - <input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> - </td></tr> -<tr><th>$lt{'mail'}:</th> - <td> - <input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" /> - </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td> + <td><input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td> + <td><input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td> + <td><input type="text" name="clast" value="$uenv{'lastname'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td> + <td><input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td> + <td><input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" /></td></tr> </table> END } @@ -1074,7 +1080,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", @@ -1085,7 +1091,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; @@ -1102,6 +1108,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; @@ -1125,20 +1134,19 @@ $user_data_html <h3>$lt{'cd'}</h3> -<p>$lt{'gs'}: <input type="text" name="csec" size="5" /> -<p> -$date_table +<p><label for="csec">$lt{'gs'}</label>: <input type="text" name="csec" size="5" /> </p> +$date_table <h3>$lt{'idsn'}</h3> <p> -$lt{'idsn'}: <input type="text" name="cstid" size="10"> +<label for="cstid">$lt{'idsn'}</label>: <input type="text" name="cstid" size="10" /> </p><p> <label> -<input type="checkbox" name="forceid" value="yes"> +<input type="checkbox" name="forceid" value="yes" /> $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; @@ -1165,12 +1173,12 @@ sub print_html_classlist { if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'username'; } - if ($env{'form.Status'} !~ /^(Any|Expired|Active)$/) { + if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) { $env{'form.Status'} = 'Active'; } my $status_select = &Apache::lonhtmlcommon::StatusOptions ($env{'form.Status'}); - my $cid=$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; # @@ -1216,9 +1224,9 @@ sub print_html_classlist { $output_selector .= "\n".$option; } $output_selector .= '</select>'; - $r->print(&mt('Output Format: [_1]',$output_selector).(' 'x3)); + $r->print('<label>'.&mt('Output Format: [_1]',$output_selector).'</label>'.(' 'x3)); } - $r->print(&mt('Student Status: [_1]',$status_select)."\n"); + $r->print('<label>'.&mt('Student Status: [_1]',$status_select)."</label>\n"); $r->print('<input type="submit" value="'.&mt('Update Display').'" />'. "\n</p>\n"); # @@ -1243,6 +1251,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); @@ -1251,7 +1263,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'})) { @@ -1271,15 +1283,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", @@ -1333,6 +1346,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'}) { @@ -1369,16 +1384,20 @@ END if($statusmode eq 'Expired') { print $CSVfile '"'.&mt('Students with expired roles').'"'."\n"; } + if($statusmode eq 'Future') { + print $CSVfile '"'.&mt('Students with future roles').'"'."\n"; + } if ($statusmode eq 'Any') { 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 @@ -1393,7 +1412,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'}); } # @@ -1403,6 +1423,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@{$keylist}); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1420,9 +1441,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'}]; @@ -1488,6 +1514,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'}) { @@ -1523,6 +1550,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, @@ -1538,6 +1566,7 @@ END } } $excel_sheet->write($row,$col++,$status); + $excel_sheet->write($row,$col++,$active_groups); $row++; } } @@ -1617,7 +1646,7 @@ sub print_modify_student_form { my $date_table = &date_setting_table($starttime,$endtime); # if (! exists($env{'form.Status'}) || - $env{'form.Status'} !~ /^(Any|Expired|Active)$/) { + $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) { $env{'form.Status'} = 'crap'; } # Make sure student is enrolled in course @@ -1634,7 +1663,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'} @@ -1647,7 +1688,7 @@ $lt{'odcc'} <input type="hidden" name="sortby" value="$sortby" /> <input type="hidden" name="Status" value="$env{'form.Status'}" /> <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} -$info{'lastname'} $info{'generation'}, $sname\@$sdom</h2> +$info{'lastname'} $info{'generation'}, $sname:$sdom</h2> <p> <b>$lt{'sn'}</b> <table> @@ -1659,18 +1700,18 @@ $info{'lastname'} $info{'generation'}, $ <input type="text" name="generation" value="$info{'generation'}" /></td></tr> </table> </p><p> -<b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/> +<b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12" /> </p><p> <label> -<input type="checkbox" name="forceid" > +<input type="checkbox" name="forceid" /> $lt{'disn'} </label> </p><p> -<b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/> +<b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14" /> </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; @@ -1708,7 +1749,7 @@ sub modify_single_student { $env{'request.course.id'}); my ($tmp) = keys(%old); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { - $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom."); + $r->print(&mt('There was an error determining the environment values for')." $slogin : $sdom."); return; } undef $tmp; @@ -1748,7 +1789,7 @@ sub modify_single_student { 'et' => "End Time", ); $r->print(<<END); - <h2>$lt{'mdu'} $slogin \@ $sdom </h2> + <h2>$lt{'mdu'} $slogin : $sdom </h2> <h3>$lt{'si'}</h3> <table rules="rows" border="1" cellpadding="3" > <tr> @@ -1808,8 +1849,8 @@ END &mt('The error reported was')." ". $roleresults); &Apache::lonnet::logthis("londropadd:failed attempt to modify student". - " data for ".$slogin." \@ ".$sdom." by ". - $env{'user.name'}." \@ ".$env{'user.domain'}. + " data for ".$slogin." : ".$sdom." by ". + $env{'user.name'}." : ".$env{'user.domain'}. ":".$roleresults); } else { # everything is okay! $r->print(&mt('Student information updated successfully.')." <br />". @@ -1830,7 +1871,8 @@ END sub get_enrollment_data { my ($sname,$sdomain) = @_; my $courseid = $env{'request.course.id'}; - $courseid =~ s:_:/:g; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -1840,7 +1882,7 @@ sub get_enrollment_data { my $section = ''; my $count = scalar(keys(%roles)); while (my ($course,$role) = each(%roles)) { - if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) { # # Get active role $section=$1; @@ -1894,9 +1936,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); @@ -1924,6 +1970,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()); @@ -1937,6 +1984,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 @@ -1958,6 +2006,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 @@ -1969,6 +2019,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@$keylist); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1989,6 +2040,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 { @@ -2012,6 +2068,7 @@ END <td>$section</td> <td>$start</td> <td>$end</td> + <td>$active_groups</td> END $r->print(&Apache::loncommon::end_data_table_row()); } @@ -2104,7 +2161,7 @@ sub upfile_drop_add { if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers = &Apache::loncommon::get_library_servers($domain); + my %home_servers = &Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print('<font color="#ff0000">'.&mt('Error').'</font>'. &mt('Invalid home server specified')); @@ -2138,7 +2195,8 @@ sub upfile_drop_add { $amode = ''; # This causes the loop below to be skipped } } - unless (($domain=~/\W/) || ($amode eq '')) { + if ( $domain eq &LONCAPA::clean_domain($domain) + && ($amode ne '')) { ####################################### ## Enroll Students ## ####################################### @@ -2146,6 +2204,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($_); @@ -2170,7 +2230,8 @@ sub upfile_drop_add { $gen=$entries{$fields{'gen'}}; } } - if ($entries{$fields{'username'}}=~/\W/) { + if ($entries{$fields{'username'}} + ne &LONCAPA::clean_username($entries{$fields{'username'}})) { $r->print('<br />'. &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]', $entries{$fields{'username'}},$fname,$mname,$lname,$gen). @@ -2186,6 +2247,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'})) { @@ -2301,6 +2373,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 +} + ################################################################### ###################################################################