--- loncom/homework/bridgetask.pm 2007/02/18 02:04:04 1.225 +++ loncom/homework/bridgetask.pm 2016/08/31 19:08:18 1.267 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.225 2007/02/18 02:04:04 albertel Exp $ +# $Id: bridgetask.pm,v 1.267 2016/08/31 19:08:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,8 +37,8 @@ use Apache::lonmenu; use Apache::lonlocal; use Apache::lonxml; use Apache::slotrequest(); +use Apache::structuretags(); use Time::HiRes qw( gettimeofday tv_interval ); -use lib '/home/httpd/lib/perl/'; use LONCAPA; @@ -83,7 +83,10 @@ sub proctor_check_auth { } } if ($authenticated) { - &check_in($type,$user,$domain,$slot_name); + my $check = &check_in($type,$user,$domain,$slot_name,$slot->{'iptied'}); + if ($check =~ /^error:/) { + return 0; + } return 1; } } @@ -92,20 +95,31 @@ sub proctor_check_auth { } sub check_in { - my ($type,$user,$domain,$slot_name) = @_; + my ($type,$user,$domain,$slot_name,$needsiptied) = @_; my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); + my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'}; if ( $useslots eq 'map_map') { - &check_in_sequence($user,$domain,$slot_name); + my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied); + if ($result =~ /^error: /) { + return $result; + } } else { - &create_new_version($type,$user,$domain,$slot_name); - &Apache::structuretags::finalize_storage(); + my ($symb) = &Apache::lonnet::whichuser(); + my $result = &create_new_version($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied); + if ($result eq 'ok') { + &Apache::structuretags::finalize_storage(); + } + return $result; } return 1; } sub check_in_sequence { - my ($user,$domain,$slot_name) = @_; + my ($user,$domain,$slot_name,$ip,$needsiptied) = @_; my $navmap = Apache::lonnavmaps::navmap->new(); + if (!defined($navmap)) { + return 'error: No navmap'; + } my ($symb) = &Apache::lonnet::whichuser(); my ($map) = &Apache::lonnet::decode_symb($symb); my @resources = @@ -113,20 +127,43 @@ sub check_in_sequence { my %old_history = %Apache::lonhomework::history; my %old_results = %Apache::lonhomework::results; + my $errorcount; foreach my $res (@resources) { &Apache::lonxml::debug("doing ".$res->src); &Apache::structuretags::initialize_storage($res->symb); my $type = ($res->is_task()) ? 'Task' : 'problem'; - &create_new_version($type,$user,$domain,$slot_name); - &Apache::structuretags::finalize_storage($res->symb); + my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied); + if ($result eq 'ok') { + &Apache::structuretags::finalize_storage($res->symb); + } else { + $errorcount ++; + } } %Apache::lonhomework::history = %old_history; %Apache::lonhomework::results = %old_results; + if ($errorcount) { + return 'error: IP taken'; + } } sub create_new_version { - my ($type,$user,$domain,$slot_name) = @_; + my ($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied) = @_; + + if ($needsiptied) { + my $uniqkey = "$slot_name\0$symb\0$ip"; + my ($cdom,$cnum); + if ($env{'request.course.id'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my %hash = ( + "$slot_name\0$symb\0$ip" => $env{'user.name'}.':'.$env{'user.domain'}, + ); + unless (&Apache::lonnet::newput('slot_uniqueips',\%hash,$cdom,$cnum) eq 'ok') { + return 'error: IP taken'; + } + } + } my $id = '0'; if ($type eq 'Task') { @@ -160,11 +197,13 @@ sub create_new_version { $Apache::lonhomework::results{"resource.$id.checkedin"}= $user.':'.$domain; + $Apache::lonhomework::results{"resource.$id.checkedin.ip"}=$ip; if (defined($slot_name)) { $Apache::lonhomework::results{"resource.$id.checkedin.slot"}= $slot_name; } + return 'ok'; } sub get_version { @@ -190,6 +229,10 @@ sub get_version { sub add_previous_version_button { my ($status)=@_; + my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser(); + if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { + return; + } my $result; if ($Apache::lonhomework::history{'resource.0.version'} eq '') { return ''; @@ -226,7 +269,10 @@ sub add_previous_version_button { } sub add_grading_button { - my (undef,$cid)=&Apache::lonnet::whichuser(); + my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser(); + if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { + return; + } my $cnum=$env{'course.'.$cid.'.num'}; my $cdom=$env{'course.'.$cid.'.domain'}; my %sections = &Apache::loncommon::get_sections($cdom,$cnum); @@ -236,20 +282,33 @@ sub add_grading_button { $size=scalar(keys(%sections))+2; } my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n"; - $sec_select .= "\t<option value='all' selected='selected'>all</option>\n"; + $sec_select .= "\t".'<option value="all" selected="selected">'.&mt('all')."</option>\n"; foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) { $sec_select .= "\t<option value=\"$sec\">$sec</option>\n"; } - $sec_select .= "\t<option value='none'>none</option>\n</select>\n"; - - my $result="\n\t".'<input type="submit" name="gradeasubmission" value="'. - &mt("Get a submission to grade").'" />'; - $result.="\n\t".'<input type="hidden" name="grade_target" value="webgrade" />'; - if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) { + $sec_select .= "\t".'<option value="none">'.&mt('none')."</option>\n</select>\n"; + + my $uri=$env{'request.uri'}; + if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); } + my $result = + '<form name="gradesubmission" method="post" action="'.$uri.'">'. + "\n\t".'<input type="submit" name="gradeasubmission" value="'. + &mt("Get a submission to grade").'" />'. + "\n\t".'<input type="hidden" name="grade_target" value="webgrade" />'; + my $see_all = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}); + my $see_sec = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}. + '/'.$env{'request.course.sec'}); + + if ($see_all || $see_sec) { my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue'); $result.="\n\t".'<table>'."\n\t\t".'<tr>'; - $result.="\n\t\t\t".'<td rowspan="4">Specify a section: </td>'. - "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>'; + if ($see_all || (!§ion_restricted())) { + $result.="\n\t\t\t".'<td rowspan="4">'.&mt('Specify a section:').' </td>'. + "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>'; + } else { + $result.="\n\t\t\t".'<td rowspan="4">'.&mt('Grading section:').' </td>'. + "\n\t\t\t".'<td rowspan="4">'.$env{'request.course.sec'}."\n\t\t\t".'</td>'; + } $result.="\n\t\t\t".'<td>'.'<input type="submit" name="reviewagrading" value="'. &mt("Select an entry from the grading queue:").'" /> '; @@ -281,12 +340,47 @@ sub add_grading_button { $result.=&Apache::loncommon::studentbrowser_javascript(); $result.= '</p>'."\n"; } + $result .= '</form>'."\n"; + return $result; +} + +sub add_slotlist_button { + my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser(); + if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { + return; + } + my $symb=&Apache::lonnet::symbread(); + my $result; + if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'}) || + &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { + $result = '<form method="post" name="slotrequest" action="/adm/slotrequest">'. + '<input type="hidden" name="symb" value="'.$symb.'" />'. + '<input type="hidden" name="command" value="showslots" />'. + '<input type="submit" name="requestattempt" value="'. + &mt('Show Slot list').'" />'. + '</form>'; + my $target_id = + &Apache::lonstathelpers::make_target_id({symb => $symb, + part => '0'}); + if (!§ion_restricted()) { + $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'. + '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'. + '<input type="hidden" name="reportSelected" value="grading_analysis" />'. + '<input type="submit" name="grading" value="'. + &mt('Show Grading Status').'" />'. + '</form>'; + } + } return $result; } sub add_request_another_attempt_button { my ($text)=@_; - if (!$text) { $text="Request another attempt"; } + my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser(); + if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { + return; + } + if (!$text) { $text=&mt('Request another attempt'); } my $result; my $symb=&Apache::lonnet::symbread(); # not a slot access based resource @@ -298,13 +392,14 @@ sub add_request_another_attempt_button { my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb); my $action='get_reservation'; if ($slot_name) { - $text="Change reservation."; + $text=&mt('Change reservation'); $action='change_reservation'; my $description=&Apache::slotrequest::get_description($slot_name, $slot); - $result.=(<<STUFF); - <p> Will be next available: $description </p> -STUFF + $result.='<p>' + .&mt('Will be next available:') + .' '.$description + .'</p>'; } if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); } @@ -314,7 +409,7 @@ STUFF '<input type="hidden" name="symb" value="'.$symb.'" />'."\n\t\t". '<input type="hidden" name="command" value="'.$action.'" />'."\n\t\t". '<input type="submit" name="requestattempt" value="'. - &mt($text).'" />'."\n\t". + $text.'" />'."\n\t". '</form>'."\n"; return $result; } @@ -362,6 +457,7 @@ sub show_task { ( $status eq 'BANNED') || ( $status eq 'UNAVAILABLE') || ( $status eq 'NOT_IN_A_SLOT') || + ( $status eq 'NOT_YET_VIEWED') || ( $status eq 'NEEDS_CHECKIN') || ( $status eq 'WAITING_FOR_GRADE') || ( $status eq 'INVALID_ACCESS') || @@ -464,7 +560,7 @@ sub file_list { my $file=$file_url.$partial_file; $file=~s|/+|/|g; &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); - $file_list.='<li><span style="white-space: nowrap;"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'. + $file_list.='<li><span class="LC_nobreak"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'. &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file. '</a></span></li>'."\n"; } @@ -484,55 +580,79 @@ sub webgrade_standard_info { my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"}); - my %lt=('done' => 'Next Item', - 'stop' => 'Quit Grading', - 'fail' => 'Fail Rest', - 'cancel' => 'Cancel', - ); - %lt=&Apache::lonlocal::texthash(%lt); + my %lt = &Apache::lonlocal::texthash( + 'done' => 'Next Item', + 'stop' => 'Quit Grading', + 'fail' => 'Fail Rest', + 'cancel' => 'Cancel', + 'submit' => 'Submit Grades', + ); my $result=<<INFO; <div class="LC_GRADING_maincontrols"> INFO - if (&grade_mode() eq 'regrade') { + if ($env{'request.state'} eq 'construct') { $result.=<<INFO; + <input type="submit" name="next" value="$lt{'submit'}" /> +INFO + } else { + if (&grade_mode() eq 'regrade' && $env{'request.state'} ne 'construct') { + $result.=<<INFO; <input type="submit" name="cancel" value="$lt{'cancel'}" /> INFO - } + } - $result.=<<INFO; + $result.=<<INFO; <input type="submit" name="next" value="$lt{'done'}" /> <input type="submit" name="stop" value="$lt{'stop'}" /> +INFO + } + $result.=<<INFO; <input type="button" name="fail" value="$lt{'fail'}" onclick="javascript:onFailRest()" /> </div> $file_list INFO return $result; + } sub done_screen { my ($version) = @_; - my $title=&Apache::lonnet::gettitle(); + my $title=&Apache::lonnet::gettitle($env{'request.uri'}); my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'}); my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser(); - my $files = '<ul>'; - my $msg; - foreach my $file (@files) { - my $url="/uploaded/$domain/$user/portfolio$file"; - if (! &Apache::lonnet::stat_file($url)) { - $file = &mt('<span class="LC_error"> Nonexistent file:</span> '. - '<span class="LC_filename">[_1]</span>',$file); - $msg .= "<p>Submitted non-existant file $file</p>\n"; - } else { - $file = '<span class="LC_filename">'.$file.'</span>'; - $msg .= "<p>Submitted file $file</p>\n"; - } - $files .= '<li>'.$file.'</li>'; + my ($msg,$files,$shown); + if (@files > 0) { + $files = '<ul>'; + foreach my $file (@files) { + my $url="/uploaded/$domain/$user/portfolio$file"; + if (! &Apache::lonnet::stat_file($url)) { + $file = '<span class="LC_error">' + .&mt('[_1]Nonexistent file:[_2]' + ,'<span class="LC_error"> ' + ,'</span> <span class="LC_filename">'.$file.'</span>'); + $msg .= "<p>".&mt('Submitted non-existent file [_1]',$file)."</p>\n"; + } else { + $file = '<span class="LC_filename">'.$file.'</span>'; + $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n"; + } + $files .= '<li>'.$file.'</li>'; + } + $files.='</ul>'; + $shown = '<p>'.&mt('Files submitted: [_1]',$files).'</p>' + .'<p>'.&mt('You are now done with this Bridge Task').'</p>' + .'<hr />' + .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>' + .'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>'; + } else { + $msg = &mt("Submission status: no files currently submitted, when 'Done' was indicated."); + $shown = '<p class="LC_error">'. + &mt('You did not submit any files. Please try again.').'</span>'. + '</p><p><a href="javascript:history.go(-1);">'.&mt('Back to Bridge Task').'</a></p><hr />'; } - $files.='</ul>'; - my $subject = "Submission message for $title"; + my $subject = &mt('Submission message for [_1]',$title); my ($message_status,$comment_status); my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'}; $setting =~ s/^\s*(\S*)\s*$/$1/; @@ -551,17 +671,11 @@ sub done_screen { $comment_status = '<p>'.&mt('Message sent to instructor: [_1]', $comment_status).' </p>'; } - return <<DONESCREEN; -<h2>$title</h2> -<p> Files submitted: $files </p> -<p> You are now done with this Bridge Task </p> -<hr /> -<p> <a href="/adm/logout">Logout</a> </p> -<p> <a href="/adm/roles">Change to a different course</a> </p> -$message_status -$comment_status -DONESCREEN - + + return "<h2>$title</h2>" + .$shown + .$message_status + .$comment_status; } sub start_Task { @@ -591,36 +705,29 @@ sub start_Task { &Apache::structuretags::page_start($target,$token,$tagstack, $parstack,$parser,$safeeval, $name,&style($target)); + + } + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex') { + if ($env{'form.markaccess'}) { + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + my ($timelimit) = ($interval[0] =~ /^(\d+)/); + &Apache::lonnet::set_first_access($interval[1],$timelimit); + } } if ($target eq 'web' && $env{'request.state'} ne 'construct') { if ($Apache::lonhomework::queuegrade || $Apache::lonhomework::modifygrades) { - $result.='<form name="gradesubmission" method="post" action="'; - my $uri=$env{'request.uri'}; - if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); } - $result.=$uri.'">'.&add_grading_button()."</form>\n"; + $result .= &add_grading_button(); my $symb=&Apache::lonnet::symbread(); - if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) { - $result.='<form method="post" name="slotrequest" action="/adm/slotrequest">'. - '<input type="hidden" name="symb" value="'.$symb.'" />'. - '<input type="hidden" name="command" value="showslots" />'. - '<input type="submit" name="requestattempt" value="'. - &mt('Show Slot list').'" />'. - '</form>'; - my $target_id = - &Apache::lonstathelpers::make_target_id({symb => $symb, - part => '0'}); - $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'. - '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'. - '<input type="hidden" name="reportSelected" value="grading_analysis" />'. - '<input type="submit" name="grading" value="'. - &mt('Show Grading Status').'" />'. - '</form>'; + if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'}) + || &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { + $result .= &add_slotlist_button(); } } } - if ($target eq 'web' && $env{'request.state'} eq 'construct') { + if ($target =~/(web|webgrade)/ && $env{'request.state'} eq 'construct') { $form_tag_start.=&Apache::structuretags::problem_web_to_edit_header($env{'form.rndseed'}); } if ($target eq 'web' @@ -630,19 +737,38 @@ sub start_Task { my ($version,$previous)=&get_version(); ($status,$accessmsg,my $slot_name,$slot) = &Apache::lonhomework::check_slot_access('0','Task'); - if ($status eq 'CAN_ANSWER' && $version eq '') { - # CAN_ANSWER mode, and no current version, unproctored access + if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) { + # CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access # thus self-checkedin - &check_in('Task',undef,undef,$slot_name); + my $needsiptied; + if (ref($slot)) { + $needsiptied = $slot->{'iptied'}; + } + my $check = &check_in('Task',undef,undef,$slot_name,$needsiptied); + if ($check =~ /^error:\s+(.*)$/) { + my $symb=&Apache::lonnet::symbread(); + &Apache::lonnet::logthis("Error: $1 during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name"); + } &add_to_queue('gradingqueue',{'type' => 'Task', 'time' => time, 'slot' => $slot_name}); ($version,$previous)=&get_version(); } - - my $status_id = - ($previous || $status eq 'SHOW_ANSWER') ? 'LC_task_feedback' - : 'LC_task_take'; + if (($target eq 'web') && ($version ne '') && ($slot_name ne '')) { + if (ref($slot) eq 'HASH') { + if ($slot->{'endtime'} > time()) { + $result .= + &Apache::lonhtmlcommon::set_due_date($slot->{'endtime'}); + } + } + } + + my $status_id = 'LC_task_take'; + if ($previous && $target eq 'answer') { + $status_id = 'LC_task_answer'; + } elsif ($previous || $status eq 'SHOW_ANSWER') { + $status_id = 'LC_task_feedback'; + } $result .= '<div class="LC_task" id="'.$status_id.'">'."\n"; push(@Apache::inputtags::status,$status); @@ -660,26 +786,31 @@ sub start_Task { } my $msg; if ($status eq 'UNAVAILABLE') { - $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>'; + $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>'; } elsif ($status eq 'NOT_IN_A_SLOT') { - $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>'; - $msg.=&add_request_another_attempt_button("Sign up for time to work."); + $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>'; + $msg.=&add_request_another_attempt_button("Sign up for time to work"); } elsif ($status eq 'NEEDS_CHECKIN') { - $msg.='<h1>'.&mt('You need the Proctor to validate you.'). - '</h1>'.&proctor_validation_screen($slot); + $msg.='<p class="LC_warning">'.&mt('You need the Proctor to validate you.'). + '</p>'.&proctor_validation_screen($slot); } elsif ($status eq 'WAITING_FOR_GRADE') { - $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>'; + $msg.='<p class="LC_info">'.&mt('Your submission is in the grading queue.').'</p>'; } elsif ($env{'form.donescreen'}) { $result .= &done_screen($version); - } elsif ($status ne 'NOT_YET_VIEWED') { - $msg.='<h1>'.&mt('Not open to be viewed').'</h1>'; + } elsif ($status eq 'NOT_YET_VIEWED') { + my $symb=&Apache::lonnet::symbread(); + $msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb); + } elsif ($status eq 'NEED_DIFFERENT_IP') { +#FIXME + } else { + $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; } if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { $msg.='The problem '.$accessmsg; } $result.=$msg.'<br />'; } elsif ($target eq 'tex') { - $result.='\begin{document}\noindent \vskip 1 mm \begin{minipage}{\textwidth}\vskip 0 mm'; + $result.='\noindent \vskip 1 mm \begin{minipage}{\textwidth}\vskip 0 mm'; if ($status eq 'UNAVAILABLE') { $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm '; } else { @@ -724,8 +855,12 @@ sub start_Task { if ($todo) { &setup_env_for_other_user($todo,$safeeval); my ($symb,$uname,$udom)=&decode_queue_key($todo); - $result.="\n".'<table><tr><td>Found '. - &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>'; + if ($env{'request.state'} eq 'construct') { + $symb = $env{'request.uri'}; + } + $result.="\n".'<p>'. + &mt('Grading [_1] for [_2] at [_3]', + &Apache::lonnet::gettitle($symb),$uname,$udom).'</p>'; $form_tag_start.= '<input type="hidden" name="gradingkey" value="'. &escape($todo).'" />'; @@ -745,6 +880,11 @@ sub start_Task { $result.='<b>'.&mt("Stopped grading.").'</b>'.$back; } elsif ($status_code eq 'cancel') { $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back; + } elsif ($status_code eq 'terminated') { + $result.= '<b>'.&mt('Terminated grading').'</b><br />'. + '<span class="LC_error">'. + &mt('Grading for [_1] has not been saved because of a grading key mismatch.', + '<tt>'.$env{'form.terminated'}.'</tt>').'</span><br />'.$back; } elsif ($status_code eq 'never_versioned') { $result.='<b>'. &mt("Requested user has never accessed the task."). @@ -791,15 +931,20 @@ sub start_Task { $result.='<input type="hidden" name="regrade" value="'. $env{'form.regrade'}.'" />'; } - if ($env{'form.chosensections'}) { - my @chosen_sections= - &Apache::loncommon::get_env_multiple('form.chosensections'); + if ($env{'form.chosensections'} || §ion_restricted()) { + my @chosen_sections = &get_allowed_sections(); foreach my $sec (@chosen_sections) { $result.='<input type="hidden" name="chosensections" value="'.$sec.'" />'; } } if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); } + } elsif ($target eq 'webgrade' + && $env{'request.state'} eq 'construct') { + $result.=$form_tag_start; + $result.='<input type="hidden" name="webgrade" value="'. + $webgrade.'" />'; + $result.=&webgrade_standard_info(); } if ($target eq 'webgrade') { $result.="\n".'<div id="LC_GRADING_criterialist">'; @@ -847,6 +992,12 @@ sub get_key_todo { my ($target)=@_; my $todo; + if ($env{'request.state'} eq 'construct') { + my ($symb,$cid,$udom,$uname) = &Apache::lonnet::whichuser(); + my $gradingkey=&encode_queue_key($symb,$udom,$uname); + return ($gradingkey); + } + if (defined($env{'form.reviewasubmission'})) { &Apache::lonxml::debug("review a submission...."); $env{'form.queue'}='reviewqueue'; @@ -877,7 +1028,14 @@ sub get_key_todo { my $cdom = $env{'course.'.$cid.'.domain'}; my $uname = &LONCAPA::clean_username($env{'form.gradinguser'}); my $udom = &LONCAPA::clean_domain($env{'form.gradingdomain'}); - + + if (§ion_restricted()) { + my $classlist=&get_limited_classlist(); + if (!&allow_grade_user($classlist->{$uname.':'.$udom})) { + return (undef,'not_allowed', + &mt("Requested student ([_1]) is in a section you aren't allowed to grade.",$uname.':'.$udom)); + } + } my $gradingkey=&encode_queue_key($symb,$udom,$uname); my $queue; @@ -947,6 +1105,8 @@ sub get_key_todo { return (undef,'stop'); } elsif ($env{'form.cancel'}) { return (undef,'cancel'); + } elsif ($env{'form.terminated'}) { + return (undef, 'terminated'); } elsif ($env{'form.next'}) { return (undef,'select_user'); } @@ -992,13 +1152,17 @@ sub get_key_todo { if ($env{'form.queuemode'} ne 'selected') { # don't get something new from the queue if they hit the stop button - if (!(($env{'form.cancel'} || $env{'form.stop'}) + if (!(($env{'form.cancel'} || $env{'form.stop'} || $env{'form.terminated'}) && $target eq 'webgrade') && !$env{'form.gradingaction'}) { &Apache::lonxml::debug("Getting anew $queue"); return (&get_from_queue($queue)); } else { - return (undef,'stop'); + if ($env{'form.terminated'}) { + return (undef,'terminated'); + } else { + return (undef,'stop'); + } } } return (undef,undef) @@ -1028,18 +1192,25 @@ sub end_Task { } if ($status eq 'CAN_ANSWER' && !$previous && !$env{'form.donescreen'}) { - $result.="\n".'<table border="1">'. + my ($portheader,$porttext); + if ($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"}) { + $portheader = &mt('Submit Additional Portfolio Files for Grading'); + $porttext = &mt('Indicate which additional files from your portfolio are to be evaluated in grading this task.'); + } else { + $portheader = &mt('Submit Portfolio Files for Grading'); + $porttext = &mt('Indicate the files from your portfolio to be evaluated in grading this task.'); + } + $result.="\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box(). &Apache::inputtags::file_selector("$version.0", "bridgetask","*", 'portfolioonly', - ' -<h2>'.&mt('Submit Portfolio Files for Grading').'</h2> -<p>'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'</p>'). - "</table>"; + '<h3>'.$portheader.'</h3><br />'. + $porttext.'<br />'). + &Apache::lonhtmlcommon::end_pick_box().'</div>'; } if (!$previous && $status ne 'SHOW_ANSWER' && &show_task($status,$previous)) { - $result.=&Apache::inputtags::gradestatus('0'); + $result.=&Apache::inputtags::gradestatus('0',$target,1); } $result.='</form>'; @@ -1047,18 +1218,18 @@ sub end_Task { if (!$previous && $status ne 'SHOW_ANSWER' && &show_task($status,$previous)) { my $action = &Apache::lonenc::check_encrypt($env{'request.uri'}); + my $donetext = &mt('Done'); $result.=<<DONEBUTTON; <form name="done" method="post" action="$action"> <input type="hidden" name="donescreen" value="1" /> - <input type="submit" value="Done" /> + <input type="submit" value="$donetext" /> </form> DONEBUTTON } if (&show_task($status,$previous) && $Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(pass|fail)$/) { my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"}; - my $title=&Apache::lonnet::gettitle(); - + my $title=&Apache::lonnet::gettitle($env{'request.uri'}); my $start_time; my $slot_name= @@ -1084,13 +1255,15 @@ DONEBUTTON "</p>\n"; if ($bt_status eq 'pass') { - $status.='<h2>You passed the '.$title.' given on '. - $start_time.'</h2>'; + $status.='<h2>' + .&mt('You passed the [_1] given on [_2].',$title,$start_time) + .'</h2>'; $status.=$question_status; } if ($bt_status eq 'fail') { - $status.='<h2>You did not pass the '.$title.' given on '. - $start_time.'</h2>'; + $status.='<h2>' + .&mt('You did not pass the [_1] given on [_2].',$title,$start_time) + .'</h2>'; $status.=$question_status; if (!$previous) { $status.=&add_request_another_attempt_button(); @@ -1116,7 +1289,9 @@ DONEBUTTON } $result.="\n</div>\n". &Apache::loncommon::end_page({'discussion' => 1}); - } + } elsif ($target eq 'answer') { + $result.="\n</div>\n"; + } } my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); @@ -1127,13 +1302,16 @@ DONEBUTTON } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) { $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"}; } - + if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous && $status eq 'CAN_ANSWER') { my $award='SUBMITTED'; + my $uploadedflag=0; + my $totalsize=0; + my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$version.'_0_bridgetask_delete'); &Apache::essayresponse::file_submission("$version.0",'bridgetask', - 'portfiles',\$award); + \$award,\$uploadedflag,\$totalsize,\@deletions); if ($award eq 'SUBMITTED' && $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) { $Apache::lonhomework::results{"resource.0.tries"}= @@ -1146,7 +1324,9 @@ DONEBUTTON $Apache::lonhomework::results{"resource.0.submission"}= $Apache::lonhomework::results{"resource.$version.0.submission"}=''; } else { - delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}); + unless($uploadedflag) { + delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}); + } $award = ''; } &Apache::lonhomework::showhash(%Apache::lonhomework::results); @@ -1249,38 +1429,64 @@ DONEBUTTON $Apache::lonhomework::results{"resource.$version.0.solved"}; } &minimize_storage(); - &Apache::structuretags::finalize_storage(); - - # data stored, now handle queue - if ($review) { - if ($env{'form.queue'} eq 'reviewqueue') { - &check_queue_unlock($env{'form.queue'}); - &Apache::lonxml::debug(" still needs review not changing status."); - } else { - if ($env{'form.queue'} ne 'none') { - &move_between_queues($env{'form.queue'},'reviewqueue'); + my ($canstore,$domain,$name,$symb,$courseid); + ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser(); + + if ($env{'form.gradingkey'}) { + my $todo=&unescape($env{'form.gradingkey'}); + my ($keysymb,$uname,$udom)=&decode_queue_key($todo); + if ($symb eq $keysymb) { + if (($domain eq $udom) && ($name eq $uname)) { + $canstore = 1; + } + } + } + if ($canstore) { + &Apache::structuretags::finalize_storage(); + my @interval = &Apache::lonnet::EXT("resource.0.interval"); + if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') { + my $key=$courseid."\0".$symb; + my %times=&Apache::lonnet::get('firstaccesstimes', + [$key],$domain,$name); + if ($times{$key}) { + my $delresult.=&Apache::lonnet::del('firstaccesstimes', + [$key],$domain,$name); + } + } + # data stored, now handle queue + if ($review) { + if ($env{'form.queue'} eq 'reviewqueue') { + &check_queue_unlock($env{'form.queue'}); + &Apache::lonxml::debug(" still needs review not changing status."); } else { - &add_to_queue('reviewqueue',\%queue_data); + if ($env{'form.queue'} ne 'none') { + &move_between_queues($env{'form.queue'},'reviewqueue'); + } else { + &add_to_queue('reviewqueue',\%queue_data); + } } - } - } elsif ($ungraded) { - if ($env{'form.queue'} eq 'reviewqueue') { - &Apache::lonxml::debug("moving back."); - &move_between_queues($env{'form.queue'}, - 'gradingqueue'); - } elsif ($env{'form.queue'} eq 'none' ) { - &add_to_queue('gradingqueue',\%queue_data); - } else { - &check_queue_unlock($env{'form.queue'}); - } - } elsif ($mandatory_failed) { - &remove_from_queue($env{'form.queue'}); - } else { - &remove_from_queue($env{'form.queue'}); - } - } + } elsif ($ungraded) { + if ($env{'form.queue'} eq 'reviewqueue') { + &Apache::lonxml::debug("moving back."); + &move_between_queues($env{'form.queue'}, + 'gradingqueue'); + } elsif ($env{'form.queue'} eq 'none' ) { + &add_to_queue('gradingqueue',\%queue_data); + } else { + &check_queue_unlock($env{'form.queue'}); + } + } elsif ($mandatory_failed) { + &remove_from_queue($env{'form.queue'}); + } else { + &remove_from_queue($env{'form.queue'}); + } + } else { + &check_queue_unlock($env{'form.queue'}); + $env{'form.terminated'} = $name.':'.$domain; + } + } if (exists($Apache::lonhomework::results{'INTERNAL_store'})) { - # instance generation occured and hasn't yet been stored + # instance generation occurred and hasn't yet been stored &Apache::structuretags::finalize_storage(); } } elsif ($target eq 'webgrade') { @@ -1332,12 +1538,17 @@ DONEBUTTON $result.=&Apache::response::meta_stores_write('status','string', 'Bridge Task Status'); } elsif ($target eq 'edit') { - &Apache::structuretags::reset_problem_globals('Task'); - undef($Apache::lonhomework::parsing_a_task); - return ('','no'); + $result.= &Apache::structuretags::problem_edit_footer(); } &Apache::structuretags::reset_problem_globals('Task'); undef($Apache::lonhomework::parsing_a_task); + if ( ($target eq 'grade' && $env{'form.webgrade'}) || + $target eq 'webgrade') { + delete($env{'form.grade_symb'}); + delete($env{'form.grade_domain'}); + delete($env{'form.grade_username'}); + delete($env{'form.grade_courseid'}); + } return $result; } @@ -1496,11 +1707,11 @@ sub get_limited_classlist { } } - if (ref($sections) && !grep('all',@{ $sections })) { + if (ref($sections) && !grep {$_ eq 'all'} (@{ $sections })) { foreach my $student (keys(%$classlist)) { my $section = $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]; - if (! grep($section,@{ $sections })) { + if (! grep {$_ eq $section} (@{ $sections })) { delete($classlist->{$student}); } } @@ -1516,14 +1727,15 @@ sub show_queue { my $cnum=$env{'course.'.$cid.'.num'}; my $cdom=$env{'course.'.$cid.'.domain'}; - my @chosen_sections= - &Apache::loncommon::get_env_multiple('form.chosensections'); + my @chosen_sections = &get_allowed_sections(); my $classlist = &get_limited_classlist(\@chosen_sections); if (!(grep(/^all$/,@chosen_sections))) { - $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections). - '</tt>.</p> '."\n"; + $result.='<p>' + .&mt('Showing only sections [_1].' + ,'<tt>'.join(', ',@chosen_sections).'</tt>') + ."</p>\n"; } my ($view,$view_section); @@ -1537,27 +1749,33 @@ sub show_queue { } } + $result .= + '<p><a href="/adm/flip?postdata=return:">'. + &mt('Return to resource').'</a></p><hr />'. + "\n<h3>".&mt('Current Queue - [_1]',$queue)."</h3>"; my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); my ($tmp)=%queue; if ($tmp=~/^error: 2 /) { - return "\n<h3>Current Queue - $queue</h3>". + $result.= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). '<td>'.&mt('Empty').'</td>'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(); + return $result; } my $title=&Apache::lonnet::gettitle($symb); - $result.="\n<h3>Current Queue - $title $queue </h3>". + $result.= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(); - if ($with_selects) { $result.="<th>Status</th><th></th>"; } - $result.="<th>user</th><th>data</th>". + if ($with_selects) { $result.='<th>'.&mt('Status').'</th><th></th>'; } + $result.='<th>'.&mt('User').'</th><th>'.&mt('Data').'</th>'. &Apache::loncommon::end_data_table_header_row(); foreach my $key (sort(keys(%queue))) { my ($symb,$uname,$udom) = &decode_queue_key($key); - if (!defined($classlist->{$uname.':'.$udom})) { next; } + next if (!defined($classlist->{$uname.':'.$udom})); + next if (!&allow_grade_user($classlist->{$uname.':'.$udom})); my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()]; @@ -1599,7 +1817,7 @@ sub show_queue { 'start'); } my $me=$env{'user.name'}.':'.$env{'user.domain'}; - $status=&mt('Locked by <tt>[_1]</tt> [_2]',$locker,$time); + $status=&mt('Locked by [_1] [_2]','<tt>'.$locker.'</tt>',$time); if ($me eq $locker) { ($action,$description)=('resume',&mt('Resume')); } else { @@ -1615,7 +1833,7 @@ sub show_queue { $result.=(<<FORM); <td>$status</td> <td> -<form style="display: inline" method="post"> +<form style="display: inline" method="post" action=""> <input type="hidden" name="gradingkey" value="$ekey" /> <input type="hidden" name="queue" value="$queue" /> <input type="hidden" name="gradingaction" value="$action" /> @@ -1634,15 +1852,46 @@ FORM } $result.= "<td>".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()]. " <tt>($uname:$udom)</tt> </td>"; - $result.='<td>'.$slot_text.' End time: '. - &Apache::lonlocal::locallocaltime($end_time). - "</td>".&Apache::loncommon::end_data_table_row(); + $result.='<td>'.$slot_text.' ' + .&mt('End time: [_1]' + ,&Apache::lonlocal::locallocaltime($end_time)) + .'</td>' + .&Apache::loncommon::end_data_table_row(); } } $result.= &Apache::loncommon::end_data_table()."<hr />\n"; return $result; } +sub get_allowed_sections { + my @chosen_sections; + if (§ion_restricted()) { + @chosen_sections = ($env{'request.course.sec'}); + } else { + @chosen_sections = + &Apache::loncommon::get_env_multiple('form.chosensections'); + } + + return @chosen_sections; +} + +sub section_restricted { + my $cid =(&Apache::lonnet::whichuser())[1]; + return (lc($env{'course.'.$cid.'.task_grading'}) eq 'section' + && $env{'request.course.sec'} ne '' ); +} + +sub allow_grade_user { + my ($classlist_entry) = @_; + + if (§ion_restricted() + && $env{'request.course.sec'} ne + $classlist_entry->[&Apache::loncoursedata::CL_SECTION()]) { + return 0; + } + return 1; +} + sub get_queue_counts { my ($queue)=@_; my $result; @@ -1658,11 +1907,14 @@ sub get_queue_counts { if ($tmp=~/^error: 2 /) { return (0,0,0); } + my ($entries,$ready_to_grade,$locks)=(0,0,0); my %slot_cache; foreach my $key (sort(keys(%queue))) { my ($symb,$uname,$udom) = &decode_queue_key($key); - if (!defined($classlist->{$uname.':'.$udom})) { next; } + next if (!defined($classlist->{$uname.':'.$udom})); + next if (!&allow_grade_user($classlist->{$uname.':'.$udom})); + if ($key=~/locked$/) { $locks++; } elsif ($key=~/timestamp$/) { @@ -1739,7 +1991,8 @@ sub pick_from_queue_data { if ($key =~ /\0timestamp$/) { next; } my ($symb,$uname,$udom)=&decode_queue_key($key); - if (!defined($classlist->{$uname.':'.$udom})) { next; } + next if (!defined($classlist->{$uname.':'.$udom})); + next if (!&allow_grade_user($classlist->{$uname.':'.$udom})); if ($check_section) { my $section = @@ -1848,7 +2101,7 @@ sub lock_key { sub get_queue_symb_status { my ($queue,$symb,$cdom,$cnum) = @_; if (!defined($cdom) || !defined($cnum)) { - my (undef,$cid)=&Apache::lonnet::whichuser(); + my (undef,$cid) =&Apache::lonnet::whichuser(); $cnum=$env{'course.'.$cid.'.num'}; $cdom=$env{'course.'.$cid.'.domain'}; } @@ -1864,6 +2117,7 @@ sub get_queue_symb_status { next if ($key=~/timestamp$/); my ($symb,$uname,$udom) = &decode_queue_key($key); next if (!defined($classlist->{$uname.':'.$udom})); + next if (!&allow_grade_user($classlist->{$uname.':'.$udom})); push(@users,"$uname:$udom"); } return @users; @@ -1950,15 +2204,15 @@ sub get_from_queue { sub select_user { my ($symb,$cid)=&Apache::lonnet::whichuser(); - my @chosen_sections= - &Apache::loncommon::get_env_multiple('form.chosensections'); - + my @chosen_sections = &get_allowed_sections(); my $classlist = &get_limited_classlist(\@chosen_sections); my $result; if (!(grep(/^all$/,@chosen_sections))) { - $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections). - '</tt>.</p> '."\n"; + $result.='<p>' + .&mt('Showing only sections [_1].' + ,'<tt>'.join(', ',@chosen_sections).'</tt>') + .'</p> '."\n"; } $result.=&Apache::loncommon::start_data_table(); @@ -1994,18 +2248,19 @@ sub select_user { $seclist.='<input type="hidden" name="chosensections" value="'.$sec.'" />'; } + my $buttontext=&mt('Regrade'); $result.=&Apache::loncommon::start_data_table_row(); $result.=<<RESULT; <td> - <form style="display: inline" method="post"> + <form style="display: inline" method="post" action=""> <input type="hidden" name="gradingkey" value="$todo" /> <input type="hidden" name="queue" value="$queue" /> <input type="hidden" name="webgrade" value="no" /> <input type="hidden" name="regrade" value="yes" /> - <input type="submit" name="submit" value="Regrade" /> + <input type="submit" name="submit" value="$buttontext" /> $seclist </form> - <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt></td> + <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt> Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]</td> <td> RESULT } @@ -2078,13 +2333,8 @@ sub start_ClosingParagraph { } elsif ($target eq 'webgrade') { &Apache::lonxml::startredirection(); } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/closingparagraph", - $parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/closingparagraph', - $parser); } return $result; } @@ -2099,6 +2349,14 @@ sub end_ClosingParagraph { return $result; } +sub insert_ClosingParagraph { + return ' +<ClosingParagraph> + <startouttext /> + <endouttext /> +</ClosingParagraph>'; +} + sub get_dim_id { if (@Apache::bridgetask::dimension) { return $Apache::bridgetask::dimension[-1]; @@ -2109,9 +2367,7 @@ sub get_dim_id { sub get_id { my ($parstack,$safeeval)=@_; - my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval); - if (!$id) { $id=$Apache::lonxml::curdepth; } - return $id; + return &Apache::lonxml::get_id($parstack,$safeeval); } sub start_Setup { @@ -2199,8 +2455,8 @@ sub start_Dimension { $result.= &Apache::edit::text_arg('Id:','id',$token,10).' '. &Apache::edit::select_arg('Passing is Mandatory:','Mandatory', - [['yes', 'Yes'], - ['no','No'],], + [['Y', 'Yes'], + ['N','No'],], $token).' <br /> '. &Apache::edit::text_arg('Required number of passed optional elements to pass the '.$token->[1].':', 'OptionalRequired',$token,4). @@ -2225,12 +2481,8 @@ sub start_QuestionText { my $dim = &get_dim_id(); $dimension{$dim}{'questiontext'}=$text; } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/questiontext",$parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/questiontext', - $parser); } return $result; } @@ -2239,6 +2491,14 @@ sub end_QuestionText { return ''; } +sub insert_QuestionText { + return ' +<QuestionText> + <startouttext /> + <endouttext /> +</QuestionText>'; +} + sub get_instance { my ($dim)=@_; my $rand_alg=&Apache::lonnet::get_rand_alg(); @@ -2350,10 +2610,14 @@ sub end_Dimension { ('sub' x $dimension{$dim}{'depth'}).'question'; $ucquestion =~ s/^(.)/uc($1)/e; if ($dim_status eq 'pass') { - $dim_info.='<h3>'.$ucquestion.' : you passed this '.$mandatory.' '.$question.'</h3>'; + $dim_info.='<h3>'.$ucquestion.' : ' + .&mt('you passed this [_1] [_2]',$mandatory,$question) + .'</h3>'; } if ($dim_status eq 'fail') { - $dim_info.='<h3>'.$ucquestion.' : you did not pass this '.$mandatory.' '.$question.'</h3>'; + $dim_info.='<h3>'.$ucquestion.' : ' + .&mt('you did not pass this [_1] [_2]',$mandatory,$question) + .'</h3>'; } my %counts = &get_counts($dim,$instance,$parstack, $safeeval); @@ -2383,8 +2647,11 @@ sub end_Dimension { } } # puts the results at the end of the dimension - $result .= $dim_info; - + if ($result =~m{<QuestionGradeInfo\s*/>}) { + $result=~s{<QuestionGradeInfo\s*/>}{$dim_info}; + } else { + $result .= $dim_info; + } # puts the results at the beginning of the dimension # my $internal_location=&internal_location($dim); # $result=~s/\Q$internal_location\E/$dim_info/; @@ -2549,16 +2816,11 @@ sub question_status_message { } $status .= '.'; if ($counts->{'opt'}) { - $status .= ' You were required to pass '.$counts->{'opt_req'}. - ' optional '; - if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) { - $status .= - ($counts->{'opt_req'} == 1?'criterion':'criteria'); - } else { - $status .= - 'component'.($counts->{'opt_req'} == 1?'':'s'); - } - $status .= '.'; + if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) { + $status .= ' '.&mt('You were required to pass [quant,_1,optional criterion,optional criteria].',$counts->{'opt_req'}); + } else { + $status .= ' '.&mt('You were required to pass [quant,_1,optional component].',$counts->{'opt_req'}); + } } return $status; } @@ -2657,7 +2919,8 @@ sub end_Setup { sub grading_history { my ($version,$dim,$id) = @_; - if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) { + if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'}) + && !&Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { return ''; } my ($result,$grader); @@ -2704,12 +2967,8 @@ sub start_IntroParagraph { } } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/introparagraph",$parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/introparagraph', - $parser); } return $result; } @@ -2721,6 +2980,14 @@ sub end_IntroParagraph { } } +sub insert_IntroParagraph { + return ' +<IntroParagraph> + <startouttext /> + <endouttext /> +</IntroParagraph>'; +} + sub start_Instance { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $dim = &get_dim_id(); @@ -2777,12 +3044,8 @@ sub start_InstanceText { my $instance_id=$Apache::bridgetask::instance{$dim}[-1]; $dimension{$dim}{$instance_id.'.text'}=$text; } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/instancetext",$parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/instancetext', - $parser); } return $result; } @@ -2791,6 +3054,14 @@ sub end_InstanceText { return ''; } +sub insert_InstanceText { + return ' +<InstanceText> + <startouttext /> + <endouttext /> +</InstanceText>'; +} + sub start_Criteria { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; @@ -2823,41 +3094,12 @@ sub start_Criteria { push(@{$dimension{$dim}{'criterias'}},$id); } } elsif ($target eq 'edit') { - if (0) { - $result = &Apache::edit::tag_start($target,$token); - my $text=&Apache::lonxml::get_all_text("/criteria",$parser); - &Apache::lonnet::logthis("get_all_text criteria \n$text"); - my $local_parser = HTML::LCParser->new(\$text); - $local_parser->xml_mode(1); - $local_parser->marked_sections(1); - while (1) { - my $criteria_text = - &Apache::lonxml::get_all_text('gradernote',$local_parser); - $result.= - &Apache::edit::editfield($token->[1],$criteria_text,'',80,4); - - # check for a <GraderNote> next might be end - my $token = $local_parser->get_token(); - # is the end - last if (!$token); - my $gradernote = &Apache::lonxml::get_all_text('/gradernote', - $local_parser); - # purge the end tag - my $token = $local_parser->get_token(); - $gradernote = '<GraderNote>'.$gradernote.'</GraderNote>'; - @Apache::scripttag::parser_env = @_; - $result .= - &Apache::edit::end_row().&Apache::edit::start_spanning_row(). - &Apache::scripttag::xmlparse($gradernote). - &Apache::edit::end_row().&Apache::edit::start_spanning_row(); - } - } $result .=&Apache::edit::tag_start($target,$token); $result.= &Apache::edit::text_arg('Id:','id',$token,10).' '. &Apache::edit::select_arg('Passing is Mandatory:','Mandatory', - [['yes', 'Yes'], - ['no','No'],], + [['Y', 'Yes'], + ['N','No'],], $token) .' <br /> '.&Apache::edit::end_row(). &Apache::edit::start_spanning_row(); @@ -2908,25 +3150,25 @@ sub layout_webgrade_Criteria { my $link=&link($id); my $version = &get_version(); my $status = &get_criteria('status',$version,$dim,$id); - my %lt = ( 'ungraded' => 'Ungraded', - 'fail' => 'Fail', - 'pass' => 'Pass', - 'review' => 'Review', - 'comment' => 'Additional Comment for Student', - ); - %lt = &Apache::lonlocal::texthash(%lt); + my %lt = &Apache::lonlocal::texthash( + 'ungraded' => 'Ungraded', + 'fail' => 'Fail', + 'pass' => 'Pass', + 'review' => 'Review', + 'comment' => 'Additional Comment for Student', + ); my $comment = &get_criteria('comment',$version,$dim,$id); $comment = &HTML::Entities::encode($comment,'<>"&'); my %checked; foreach my $which ('ungraded','fail','pass','review') { - if ($status eq $which) { $checked{$which} = 'checked="checked"'; } + if ($status eq $which) { $checked{$which} = ' checked="checked"'; } } - if (!%checked) { $checked{'ungraded'} = 'checked="checked"'; } + if (!%checked) { $checked{'ungraded'} = ' checked="checked"'; } my $buttons; foreach my $which ('ungraded','fail','pass','review') { $buttons .= <<END_BUTTON; <label class="LC_GRADING_$which"> - <input type="radio" name="HWVAL_$link" value="$which" $checked{$which} /> + <input type="radio" name="HWVAL_$link" value="$which"$checked{$which} /> $lt{$which} </label> END_BUTTON @@ -2957,6 +3199,15 @@ sub end_Criteria { } elsif ($target eq 'modified') { } } +sub insert_Criteria { + return ' +<Criteria> + <CriteriaText> + <startouttext /> + <endouttext /> + </CriteriaText> +</Criteria>'; +} sub start_CriteriaText { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -2964,12 +3215,8 @@ sub start_CriteriaText { if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') { } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/criteriatext",$parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/criteriatext', - $parser); } return $result; } @@ -2978,6 +3225,14 @@ sub end_CriteriaText { return ''; } +sub insert_CriteriaText { + return ' +<CriteriaText> + <startouttext /> + <endouttext /> +</CriteriaText>'; +} + sub start_GraderNote { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; @@ -2985,12 +3240,8 @@ sub start_GraderNote { $result = '<div class="LC_GRADING_gradernote"><b>'. &mt('Note to graders:').'</b>'; } elsif ($target eq 'edit') { - my $bodytext=&Apache::lonxml::get_all_text("/gradernote",$parser); $result = &Apache::edit::tag_start($target,$token); - $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4); } elsif ($target eq 'modified') { - $result = $token->[4].&Apache::edit::modifiedfield('/gradernote', - $parser); } elsif ($target eq 'web' || $target eq 'grade') { my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style); } @@ -3006,46 +3257,90 @@ sub end_GraderNote { return; } +sub insert_GraderNote { + return ' +<GraderNote> + <startouttext /> + <endouttext /> +</GraderNote>'; +} sub proctor_validation_screen { my ($slot) = @_; my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser(); my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg'); + if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') { + $url = "<tr><td colspan=\"2\"><img src=\"$url\" /></td></tr>"; + } else { + undef($url); + } + my $name=&Apache::loncommon::plainname($user,$domain); my $msg; if ($env{'form.proctorpassword'}) { - $msg='<p><font color="red">'.&mt("Failed to authenticate the proctor.") - .'</font></p>'; + $msg.='<p><span class="LC_warning">' + .&mt("Failed to authenticate the proctor.") + .'</span></p>'; } + + my $valid; + my @possible_proctors=split(",",$slot->{'proctor'}); + foreach my $proctor (@possible_proctors) { + if ($proctor =~ /$LONCAPA::username_re:$LONCAPA::domain_re/) { + $valid = 1; + last; + } + } + if (!$valid) { + $msg.='<p><span class="LC_error">' + .&mt("No valid proctors are defined.") + .'</span></p>'; + } + if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; } + my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); + $uri = &HTML::Entities::encode($uri,'<>&"'); + my %lt = &Apache::lonlocal::texthash( + 'prva' => "Proctor Validation", + 'yoro' => "Your room's proctor needs to validate your access to this resource.", + 'prus' => "Proctor's Username:", + 'pasw' => "Password:", + 'prdo' => "Proctor's Domain:", + 'vali' => 'Validate', + 'stui' => "Student who should be logged in is:", + 'name' => "Name:", + 'sid' => "Student/Employee ID", + 'unam' => "Username:", + ); my $result= (<<ENDCHECKOUT); -<h2>Proctor Validation</h2> - <p>Your room's proctor needs to validate your access to this resource.</p> +<h2>$lt{'prva'}</h2> + <p>$lt{'yoro'}</p> $msg -<form name="checkout" method="post" action="$env{'request.uri'}"> +<form name="checkout" method="post" action="$uri"> <input type="hidden" name="validate" value="yes" /> <input type="hidden" name="submitted" value="yes" /> <table> - <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr> - <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr> - <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr> + <tr><td>$lt{'prus'}</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr> + <tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" /></td></tr> + <tr><td>$lt{'prdo'}</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr> </table> -<input type="submit" name="checkoutbutton" value="Validate" /><br /> +<input type="submit" name="checkoutbutton" value="$lt{'vali'}" /><br /> <table border="1"> <tr><td> <table> - <tr><td colspan="2">Student who should be logged in is:</td></tr> - <tr><td>Name:</td><td>$name</td></tr> - <tr><td>Student ID:</td><td>$env{'environment.id'}</td></tr> - <tr><td>Usename</td><td>$user:$domain</td></tr> - <tr><td colspan="2"><img src="$url" /></td></tr> + <tr><td colspan="2">$lt{'stui'}</td></tr> + <tr><td>$lt{'name'}</td><td>$name</td></tr> + <tr><td>$lt{'sid'}</td><td>$env{'environment.id'}</td></tr> + <tr><td>$lt{'unam'}</td><td>$user:$domain</td></tr> + $url </table> </tr></td> </table> </form> ENDCHECKOUT + return $result; }