--- loncom/homework/bridgetask.pm 2008/09/11 14:47:17 1.240
+++ loncom/homework/bridgetask.pm 2010/10/12 16:07:43 1.255
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: bridgetask.pm,v 1.240 2008/09/11 14:47:17 bisitz Exp $
+# $Id: bridgetask.pm,v 1.255 2010/10/12 16:07:43 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -82,7 +82,10 @@ sub proctor_check_auth {
}
}
if ($authenticated) {
- &check_in($type,$user,$domain,$slot_name);
+ my $check = &check_in($type,$user,$domain,$slot_name);
+ if ($check =~ /^error:/) {
+ return 0;
+ }
return 1;
}
}
@@ -94,7 +97,10 @@ sub check_in {
my ($type,$user,$domain,$slot_name) = @_;
my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
if ( $useslots eq 'map_map') {
- &check_in_sequence($user,$domain,$slot_name);
+ my $result = &check_in_sequence($user,$domain,$slot_name);
+ if ($result =~ /^error: /) {
+ return $result;
+ }
} else {
&create_new_version($type,$user,$domain,$slot_name);
&Apache::structuretags::finalize_storage();
@@ -105,6 +111,9 @@ sub check_in {
sub check_in_sequence {
my ($user,$domain,$slot_name) = @_;
my $navmap = Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ return 'error: ';
+ }
my ($symb) = &Apache::lonnet::whichuser();
my ($map) = &Apache::lonnet::decode_symb($symb);
my @resources =
@@ -306,7 +315,7 @@ sub add_request_another_attempt_button {
my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
my $action='get_reservation';
if ($slot_name) {
- $text=&mt('Change reservation.');
+ $text=&mt('Change reservation');
$action='change_reservation';
my $description=&Apache::slotrequest::get_description($slot_name,
$slot);
@@ -473,7 +482,7 @@ sub file_list {
my $file=$file_url.$partial_file;
$file=~s|/+|/|g;
&Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
- $file_list.='
'.$file.
' '."\n";
}
@@ -493,13 +502,13 @@ 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',
- 'submit' => 'Submit Grades',
- );
- %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=<
@@ -536,23 +545,35 @@ sub done_screen {
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 = '';
- my $msg;
- foreach my $file (@files) {
- my $url="/uploaded/$domain/$user/portfolio$file";
- if (! &Apache::lonnet::stat_file($url)) {
- $file = ''
- .&mt('[_1]Nonexistent file:[_2]'
- ,' '
- ,' '.$file.' ');
- $msg .= "".&mt('Submitted non-existant file [_1]',$file)."
\n";
- } else {
- $file = ''.$file.' ';
- $msg .= "".&mt('Submitted file [_1]',$file)."
\n";
- }
- $files .= ''.$file.' ';
+ my ($msg,$files,$shown);
+ if (@files > 0) {
+ $files = '';
+ foreach my $file (@files) {
+ my $url="/uploaded/$domain/$user/portfolio$file";
+ if (! &Apache::lonnet::stat_file($url)) {
+ $file = ''
+ .&mt('[_1]Nonexistent file:[_2]'
+ ,' '
+ ,' '.$file.' ');
+ $msg .= "".&mt('Submitted non-existent file [_1]',$file)."
\n";
+ } else {
+ $file = ''.$file.' ';
+ $msg .= "".&mt('Submitted file [_1]',$file)."
\n";
+ }
+ $files .= ''.$file.' ';
+ }
+ $files.=' ';
+ $shown = ''.&mt('Files submitted: [_1]',$files).'
'
+ .''.&mt('You are now done with this Bridge Task').'
'
+ .' '
+ .''.&mt('Logout').'
'
+ .''.&mt('Change to a different course').'
';
+ } else {
+ $msg = &mt("Submission status: no files currently submitted, when 'Done' was indicated.");
+ $shown = ''.
+ &mt('You did not submit any files. Please try again.').'
'.
+ ''.&mt('Back to Bridge Task').'
';
}
- $files.=' ';
my $subject = &mt('Submission message for [_1]',$title);
my ($message_status,$comment_status);
my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};
@@ -572,15 +593,11 @@ sub done_screen {
$comment_status = ''.&mt('Message sent to instructor: [_1]',
$comment_status).'
';
}
+
return "$title "
- .''.&mt('Files submitted: [_1]',$files).'
'
- .''.&mt('You are now done with this Bridge Task').'
'
- .' '
- .''.&mt('Logout').'
'
-.''.&mt('Change to a different course').'
'
-.$message_status
-.$comment_status
-
+ .$shown
+ .$message_status
+ .$comment_status;
}
sub start_Task {
@@ -655,7 +672,11 @@ sub start_Task {
if ($status eq 'CAN_ANSWER' && $version eq '') {
# CAN_ANSWER mode, and no current version, unproctored access
# thus self-checkedin
- &check_in('Task',undef,undef,$slot_name);
+ my $check = &check_in('Task',undef,undef,$slot_name);
+ if ($check =~ /^error: /) {
+ my $symb=&Apache::lonnet::symbread();
+ &Apache::lonnet::logthis("Error 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});
@@ -685,7 +706,7 @@ sub start_Task {
$msg.=''.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').' ';
} elsif ($status eq 'NOT_IN_A_SLOT') {
$msg.=''.&mt('You are not currently signed up to work at this time and/or place.').' ';
- $msg.=&add_request_another_attempt_button("Sign up for time to work.");
+ $msg.=&add_request_another_attempt_button("Sign up for time to work");
} elsif ($status eq 'NEEDS_CHECKIN') {
$msg.=''.&mt('You need the Proctor to validate you.').
' '.&proctor_validation_screen($slot);
@@ -701,7 +722,7 @@ sub start_Task {
}
$result.=$msg.' ';
} 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 {
@@ -771,6 +792,11 @@ sub start_Task {
$result.=''.&mt("Stopped grading.").' '.$back;
} elsif ($status_code eq 'cancel') {
$result.=''.&mt("Cancelled grading.").' '.$back;
+ } elsif ($status_code eq 'terminated') {
+ $result.= ''.&mt('Terminated grading').' '.
+ ''.
+ &mt('Grading for [_1] has not been saved because of a grading key mismatch.',
+ ''.$env{'form.terminated'}.' ').' '.$back;
} elsif ($status_code eq 'never_versioned') {
$result.=''.
&mt("Requested user has never accessed the task.").
@@ -991,6 +1017,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');
}
@@ -1036,13 +1064,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)
@@ -1072,14 +1104,21 @@ sub end_Task {
}
if ($status eq 'CAN_ANSWER' && !$previous &&
!$env{'form.donescreen'}) {
- $result.="\n".''.
+ 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".''.&Apache::lonhtmlcommon::start_pick_box().
&Apache::inputtags::file_selector("$version.0",
"bridgetask","*",
'portfolioonly',
- '
-
'.&mt('Submit Portfolio Files for Grading').'
-'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'
').
- "
";
+ ''.$portheader.' '.
+ $porttext.' ').
+ &Apache::lonhtmlcommon::end_pick_box().'';
}
if (!$previous && $status ne 'SHOW_ANSWER' &&
&show_task($status,$previous)) {
@@ -1091,10 +1130,11 @@ 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
}
@@ -1177,8 +1217,11 @@ DONEBUTTON
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"}=
@@ -1191,7 +1234,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);
@@ -1294,36 +1339,52 @@ 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);
+ if ($env{'form.gradingkey'}) {
+ (my $symb,my $courseid,$domain,$name) =
+ &Apache::lonnet::whichuser();
+ 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();
+ # 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 occurred and hasn't yet been stored
&Apache::structuretags::finalize_storage();
@@ -1381,6 +1442,13 @@ DONEBUTTON
}
&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;
}
@@ -2080,6 +2148,7 @@ sub select_user {
$seclist.=' ';
}
+ my $buttontext=&mt('Regrade');
$result.=&Apache::loncommon::start_data_table_row();
$result.=<
@@ -2088,7 +2157,7 @@ sub select_user {
-
+
$seclist
$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]
@@ -2647,17 +2716,11 @@ sub question_status_message {
}
$status .= '.';
if ($counts->{'opt'}) {
- # FIXME &mt() missing!
- $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;
}
@@ -2987,25 +3050,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 .= <
-
+
$lt{$which}
END_BUTTON
@@ -3139,33 +3202,45 @@ sub proctor_validation_screen {
if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
$uri = &HTML::Entities::encode($uri,'<>&"');
- # FIXME &mt() missing!
+ 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= (<Proctor Validation
- Your room's proctor needs to validate your access to this resource.
+$lt{'prva'}
+ $lt{'yoro'}
$msg
ENDCHECKOUT
+
return $result;
}