--- loncom/homework/grades.pm 2010/04/20 21:53:33 1.627 +++ loncom/homework/grades.pm 2010/04/27 00:06:34 1.632 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.627 2010/04/20 21:53:33 www Exp $ +# $Id: grades.pm,v 1.632 2010/04/27 00:06:34 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -820,9 +820,7 @@ sub listStudents { $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; } - my $result='<h3><span class="LC_info"> ' - .&mt("View/Grade/Regrade Submissions for a Student or a Group of Students") - .'</span></h3>'; + my $result=''; my $res_error; my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); @@ -891,7 +889,7 @@ LISTJAVASCRIPT '<label><input type="radio" name="lastSub" value="last" /> '. &mt('last submission & parts info').' </label></span>'."\n". '<span class="LC_nobreak">'. - '<label><input type="radio" name="lastSub" value="datesub" /> '. + '<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. &mt('by dates and submissions').'</label></span>'."\n". '<span class="LC_nobreak">'. '<label><input type="radio" name="lastSub" value="all" /> '. @@ -1323,7 +1321,8 @@ sub sub_page_kw_js { my $iconpath = $request->dir_config('lonIconsURL'); &commonJSfunctions($request); - my $inner_js_msg_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); + my $inner_js_msg_central= (<<INNERJS); +<script type="text/javascript"> function checkInput() { opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value); var nmsg = opener.document.SCORE.savemsgN.value; @@ -1360,9 +1359,11 @@ sub sub_page_kw_js { self.close() } +</script> INNERJS - my $inner_js_highlight_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); + my $inner_js_highlight_central= (<<INNERJS); +<script type="text/javascript"> function updateChoice(flag) { opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); @@ -1373,6 +1374,7 @@ INNERJS } self.close() } +</script> INNERJS my $start_page_msg_central = @@ -1909,7 +1911,6 @@ sub submission { if ($counter == 0) { &sub_page_js($request); &sub_page_kw_js($request); - $request->print('<h3> <span class="LC_info">'.&mt('Submission Record').'</span></h3>'); # option to display problem, only once else it cause problems # with the form later since the problem has a form. @@ -2337,10 +2338,10 @@ sub check_collaborators { next if ($record->{'resource.'.$part.'.collaborators'} eq ''); my (@good_collaborators, @bad_collaborators); foreach my $possible_collaborator - (split(/,?\s+/,$record->{'resource.'.$part.'.collaborators'})) { + (split(/[,;\s]+/,$record->{'resource.'.$part.'.collaborators'})) { $possible_collaborator =~ s/[\$\^\(\)]//g; next if ($possible_collaborator eq ''); - my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator); + my ($co_name,$co_dom) = split(/:/,$possible_collaborator); $co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); next if ($co_name eq $uname && $co_dom eq $udom); # Doing this grep allows 'fuzzy' specification @@ -2353,13 +2354,13 @@ sub check_collaborators { } } if (scalar(@good_collaborators) != 0) { - $result.='<br />'.&mt('Collaborators: '); + $result.='<br />'.&mt('Collaborators:').'<ol>'; foreach my $name (@good_collaborators) { my ($lastname,$givenn) = split(/,/,$$fullname{$name}); push(@col_fullnames, $givenn.' '.$lastname); - $result.=$fullname->{$name}.' '; + $result.='<li>'.$fullname->{$name}.'</li>'; } - $result.='<br />'."\n"; + $result.='</ol><br />'."\n"; my ($part)=split(/\./,$part); $result.='<input type="hidden" name="collaborator'.$counter. '" value="'.$part.':'.(join ':',@good_collaborators).'" />'. @@ -2689,9 +2690,7 @@ sub processHandGrade { $ctr++; } if ($total < 0) { - my $the_end = '<h3><span class="LC_info">'.&mt('LON-CAPA User Message').'</span></h3><br />'."\n"; - $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n"; - $the_end.=&mt('Click on the button below to return to the grading menu.').'<br /><br />'."\n"; + my $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n"; $request->print($the_end); } return ''; @@ -3371,6 +3370,9 @@ sub viewgrades { if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } my ($partid) = &split_part_type($part); push(@partids,$partid); +# +# FIXME: Looks like $display looks at English text +# my $display_part=&get_display_part($partid,$symb); if ($display =~ /^Partial Credit Factor/) { $result.='<th>'. @@ -3817,18 +3819,14 @@ sub csvuploadmap_header { $javascript=&csvupload_javascript_forward_associate(); } - my $result=''; $symb = &Apache::lonenc::check_encrypt($symb); + $request->print('<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">'. + &mt('Total number of records found in file: [_1]',$distotal).'<hr />'. + &mt('Associate entries from the uploaded file with as many fields as you can.')); + my $reverse=&mt("Reverse Association"); $request->print(<<ENDPICK); -<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> -<h3><span class="LC_info">Uploading Class Grades</span></h3> -$result -<hr /> -<h3>Identify fields</h3> -Total number of records found in file: $distotal <hr /> -Enter as many fields as you can. The system will inform you and bring you back -to this page if the data selected is insufficient to run your class.<hr /> -<input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> +<br /> +<input type="button" value="$reverse" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> <input type="hidden" name="associate" value="" /> <input type="hidden" name="phase" value="three" /> <input type="hidden" name="datatoken" value="$datatoken" /> @@ -3901,11 +3899,11 @@ sub upcsvScores_form { my ($request,$symb) = @_; if (!$symb) {return '';} my $result=&checkforfile_js(); - $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; - $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; - $result.=' <b>'.&mt('Specify a file containing the class scores for current resource.'). - '</b></td></tr>'."\n"; - $result.='<tr bgcolor=#ffffe6><td>'."\n"; + $result.=&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Specify a file containing the class scores for current resource.').'</th>'. + &Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row().'<td>'; my $upload=&mt("Upload Scores"); my $upfile_select=&Apache::loncommon::upfile_select_html(); my $ignore=&mt('Ignore First Line'); @@ -3919,9 +3917,10 @@ $upfile_select </form> ENDUPFORM $result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", - &mt("How do I create a CSV file from a spreadsheet")) - .'</td></tr></table>'."\n"; - $result.='</td></tr></table><br /><br />'."\n"; + &mt("How do I create a CSV file from a spreadsheet")). + '</td>'. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); return $result; } @@ -3973,29 +3972,21 @@ sub csvuploadmap { sub csvuploadoptions { my ($request,$symb)= @_; + my $overwrite=&mt('Overwrite any existing score'); $request->print(<<ENDPICK); <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> -<h3><span class="LC_info">Uploading Class Grade Options</span></h3> <input type="hidden" name="command" value="csvuploadassign" /> -<!-- -<p> -<label> - <input type="checkbox" name="show_full_results" /> - Show a table of all changes -</label> -</p> ---> <p> <label> <input type="checkbox" name="overwite_scores" checked="checked" /> - Overwrite any existing score + $overwrite </label> </p> ENDPICK my %fields=&get_fields(); if (!defined($fields{'domain'})) { my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain'); - $request->print("\n<p> Users are in domain: ".$domform."</p>\n"); + $request->print("\n<p>".&mt('Users are in domain: [_1]',$domform)."</p>\n"); } foreach my $key (sort(keys(%env))) { if ($key !~ /^form\.(.*)$/) { next; } @@ -4035,7 +4026,6 @@ sub csvuploadassign { &Apache::loncommon::load_tmp_file($request); my @gradedata = &Apache::loncommon::upfile_record_sep(); my %fields=&get_fields(); - $request->print('<h3>Assigning Grades</h3>'); my $courseid=$env{'request.course.id'}; my ($classlist) = &getclasslist('all',0); my @notallowed; @@ -8494,11 +8484,7 @@ sub submit_options_sequence { $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; - $result.=' -<h2> - '.&mt('Grade page/folder for one student').' -</h2>'. - &selectfield(0). + $result.=&selectfield(0). '<input type="hidden" name="command" value="pickStudentPage" /> <div> <input type="submit" value="'.&mt('Next').' →" /> @@ -8517,11 +8503,7 @@ sub submit_options_table { $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; - $result.=' -<h2> - '.&mt('Grading table').' -</h2>'. - &selectfield(0). + $result.=&selectfield(0). '<input type="hidden" name="command" value="viewgrades" /> <div> <input type="submit" value="'.&mt('Next').' →" /> @@ -8563,10 +8545,7 @@ sub submit_options { $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; - $result.=' -<h2> - '.&mt('Select individual students to grade').' -</h2>'.&selectfield(1).' + $result.=&selectfield(1).' <input type="hidden" name="command" value="submission" /> <input type="submit" value="'.&mt('Next').' →" /> </div> @@ -8708,11 +8687,11 @@ sub process_clicker { my ($r,$symb)=@_; if (!$symb) {return '';} my $result=&checkforfile_js(); - $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; - $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; - $result.=' <b>'.&mt('Specify a file containing the clicker information for this resource.'). - '</b></td></tr>'."\n"; - $result.='<tr bgcolor="#ffffe6"><td>'."\n"; + $result.=&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Specify a file containing clicker information and set grading options.').'</th>'. + &Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row()."<td>\n"; # Attempt to restore parameters from last session, set defaults if not present my %Saveable_Parameters=&clicker_grading_parameters(); &Apache::loncommon::restore_course_settings('grades_clicker', @@ -8729,7 +8708,7 @@ sub process_clicker { } } - my $upload=&mt("Upload File"); + my $upload=&mt("Evaluate File"); my $type=&mt("Type"); my $attendance=&mt("Award points just for participation"); my $personnel=&mt("Correctness determined from response by course personnel"); @@ -8787,7 +8766,10 @@ ENDUPFORM <input type="hidden" name="command" value="processclickerfile" /> <input type="file" name="upfile" size="50" /> <br /><label>$type: $selectform</label> -<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label> +ENDUPFORM + $result.='</td>'.&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDGRADINGFORM); + <label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label> <br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label> <br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label> <input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> @@ -8795,13 +8777,17 @@ ENDUPFORM <br /> <input type="text" name="givenanswer" size="50" /> <input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> -<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> +ENDGRADINGFORM + $result.='</td>'.&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); + <label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> <br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> <br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> </form>' -ENDUPFORM - $result.='</td></tr></table>'."\n". - '</td></tr></table><br /><br />'."\n"; +ENDPERCFORM + $result.='</td>'. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); return $result; } @@ -8881,11 +8867,12 @@ sub process_clicker_file { $result.=&Apache::loncommon::studentbrowser_javascript(); $symb = &Apache::lonenc::check_encrypt($symb); - my $heading=&mt('Scanning clicker file'); - $result.=(<<ENDHEADER); -<br /><table width="100%" border="0"><tr><td bgcolor="#777777"> -<table width="100%" border="0"><tr bgcolor="#e6ffff"><td> -<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td> + $result.=&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Evaluate clicker file').'</th>'. + &Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row().(<<ENDHEADER); +<td> <form method="post" action="/adm/grades" name="clickeranalysis"> <input type="hidden" name="symb" value="$symb" /> <input type="hidden" name="command" value="assignclickergrades" /> @@ -8933,7 +8920,9 @@ ENDHEADER } elsif ($clicker_ids{$id}) { if ($clicker_ids{$id}=~/\,/) { # More than one user with the same clicker! - $result.="\n<hr />".&mt('Clicker registered more than once').": <tt>".$id."</tt><br />"; + $result.="</td>".&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row()."<td>". + &mt('Clicker registered more than once').": <tt>".$id."</tt><br />"; $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. "<select name='multi".$id."'>"; foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) { @@ -8947,7 +8936,9 @@ ENDHEADER $student_count++; } } else { - $result.="\n<hr />".&mt('Unregistered Clicker')." <tt>".$id."</tt><br />"; + $result.="</td>".&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row()."<td>". + &mt('Unregistered Clicker')." <tt>".$id."</tt><br />"; $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. "\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". "\n".&mt("Domain").": ". @@ -8973,8 +8964,9 @@ ENDHEADER } else { $result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />'; } - $result.='</form></td></tr></table>'."\n". - '</td></tr></table><br /><br />'."\n"; + $result.='</form></td>'. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); return $result; } @@ -9048,14 +9040,11 @@ sub assign_clicker_grades { # FIXME: This should probably look for the first handgradeable part my $part=$$partlist[0]; # Start screen output - my $result=''; - - my $heading=&mt('Assigning grades based on clicker file'); - $result.=(<<ENDHEADER); -<br /><table width="100%" border="0"><tr><td bgcolor="#777777"> -<table width="100%" border="0"><tr bgcolor="#e6ffff"><td> -<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td> -ENDHEADER + my $result=&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Assigning grades based on clicker file').'</th>'. + &Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row().'<td>'; # Get correct result # FIXME: Possibly need delimiter other than ":" my @correct=(); @@ -9090,6 +9079,7 @@ ENDHEADER my $pcorrect=$env{'form.pcorrect'}; my $pincorrect=$env{'form.pincorrect'}; my $storecount=0; + my %users=(); foreach my $key (keys(%env)) { my $user=''; if ($key=~/^form\.student\:(.*)$/) { @@ -9103,7 +9093,13 @@ ENDHEADER $user=$env{'form.multi'.$id}; } } - if ($user) { + if ($user) { + if ($users{$user}) { + $result.='<br /><span class="LC_warning">'. + &mt("More than one entry found for <tt>[_1]</tt>!",$user). + '</span><br />'; + } + $users{$user}=1; my @answer=split(/\,/,$env{$key}); my $sum=0; my $realnumber=$number; @@ -9143,8 +9139,9 @@ ENDHEADER } # We are done $result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount). - '</td></tr></table>'."\n". - '</td></tr></table><br /><br />'."\n"; + '</td>'. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); return $result; } @@ -9160,6 +9157,7 @@ sub startpage { unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); $r->print(&Apache::loncommon::start_page('Grading',undef, {'bread_crumbs' => $crumbs})); + $r->print('<h3>'.$$crumbs[-1]{'text'}.'</h3>'); unless ($nodisplayflag) { $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag)); } @@ -9167,7 +9165,7 @@ sub startpage { sub select_problem { my ($r)=@_; - $r->print('<h2>'.&mt('Select the problem or one of the problems you want to grade').'</h2><form action="/adm/grades">'); + $r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); $r->print(&Apache::lonstathelpers::problem_selector('.',undef,1)); $r->print('<input type="hidden" name="command" value="gradingmenu" />'); $r->print('<input type="submit" value="'.&mt('Next').' →" /></form>');