'."\n".
+ '';
+ #$result.='
Review'.&show_queue('reviewqueue');
+ #$result.='
Grade'.&show_queue('gradingqueue');
+ }
+
+ my ($todo,$status_code,$msg)=&get_key_todo($target);
+
+ if ($todo) {
+ &setup_env_for_other_user($todo,$safeeval);
+ my ($symb,$uname,$udom)=&decode_queue_key($todo);
+ if ($env{'request.state'} eq 'construct') {
+ $symb = $env{'request.uri'};
+ }
+ $result.="\n".'
'.
+ &mt('Grading [_1] for [_2] at [_3]',
+ &Apache::lonnet::gettitle($symb),$uname,$udom).'
';
+ $form_tag_start.=
+ '
';
+ $Apache::bridgetask::queue_key=$todo;
+ &Apache::structuretags::initialize_storage();
+ &Apache::lonhomework::showhash(%Apache::lonhomework::history);
+ if ($target eq 'webgrade' && $status_code eq 'selected') {
+ $form_tag_start.=
+ '
';
+ }
+ } else {
+ if ($target eq 'webgrade') {
+ $result.="\n";
+ my $back='
'.
+ &mt('Return to resource').'
';
+ if ($status_code eq 'stop') {
+ $result.='
'.&mt("Stopped grading.").' '.$back;
+ } elsif ($status_code eq 'cancel') {
+ $result.='
'.&mt("Cancelled grading.").' '.$back;
+ } elsif ($status_code eq 'never_versioned') {
+ $result.='
'.
+ &mt("Requested user has never accessed the task.").
+ ' '.$back;
+ } elsif ($status_code =~ /still_open:(.*)/) {
+ my $date = &Apache::lonlocal::locallocaltime($1);
+ $result.='
'.
+ &mt("Task is still open, will close at [_1].",$date).
+ ' '.$back;
+ } elsif ($status_code eq 'lock_failed') {
+ $result.='
'.&mt("Failed to lock the requested record.")
+ .' '.$back;
+ } elsif ($status_code eq 'unlock') {
+ $result.='
'.&mt("Unlocked the requested record.")
+ .' '.$back;
+ $result.=&show_queue($env{'form.queue'},1);
+ } elsif ($status_code eq 'show_list') {
+ $result.=&show_queue($env{'form.queue'},1);
+ } elsif ($status_code eq 'select_user') {
+ $result.=&select_user();
+ } elsif ($status_code eq 'unable') {
+ $result.='
'.&mt("Unable to aqcuire a user to grade.").' '.$back;
+ } elsif ($status_code eq 'not_allowed') {
+ $result.='
'.&mt('Not allowed to grade the requested user.').' '.$msg.' '.$back;
+ } else {
+ $result.='
'.&mt("No user to be graded.").' '.$back;
}
- $webgrade='no';
- my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
}
+ $webgrade='no';
+ }
+ if (!$todo || $env{'form.cancel'}) {
+ my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
}
if ($target eq 'webgrade' && defined($env{'form.queue'})) {
+ if ($webgrade eq 'yes') {
+ $result.=&submission_time_stamp();
+ }
$result.=$form_tag_start;
$result.='
';
$result.='
';
+ if ($env{'form.regrade'}) {
+ $result.='
';
+ }
+ if ($env{'form.chosensections'} || §ion_restricted()) {
+ my @chosen_sections = &get_allowed_sections();
+ foreach my $sec (@chosen_sections) {
+ $result.='
';
+ }
+ }
+ if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }
+ } elsif ($target eq 'webgrade'
+ && $env{'request.state'} eq 'construct') {
+ $result.=$form_tag_start;
+ $result.='
';
+ $result.=&webgrade_standard_info();
+ }
+ if ($target eq 'webgrade') {
+ $result.="\n".'
';
+ &Apache::lonxml::startredirection();
+ &start_delay();
+ $dimension{$top}{'result'}=$result;
+ undef($result);
+ }
+ } elsif ($target eq 'edit') {
+ $result.=$form_tag_start.
+ &Apache::structuretags::problem_edit_header();
+ $Apache::lonxml::warnings_error_header=
+ &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")."
";
+ $result.= &Apache::edit::text_arg('Required number of passed optional elements to pass the Task:','OptionalRequired',$token,10)."
\n";
+ $result.= &Apache::edit::insertlist($target,$token);
+ } elsif ($target eq 'modified') {
+ my $constructtag=
+ &Apache::edit::get_new_args($token,$parstack,$safeeval,
+ 'OptionalRequired');
+ if ($constructtag) {
+ $result = &Apache::edit::rebuild_tag($token);
}
} else {
# page_start returned a starting result, delete it if we don't need it
@@ -330,38 +859,201 @@ sub start_Task {
return $result;
}
+sub get_task_end_time {
+ my ($queue_entry,$symb,$udom,$uname) = @_;
+
+ my $end_time;
+ if (my $slot = &slotted_access($queue_entry)) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $end_time = $slot_data{'endtime'};
+ } else {
+ $end_time = &Apache::lonhomework::due_date('0',$symb,
+ $udom,$uname);
+ }
+ return $end_time;
+}
+
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';
+ return (undef,'show_list');
+ }
+
+ if (defined($env{'form.reviewagrading'})) {
+ &Apache::lonxml::debug("review a grading....");
+ $env{'form.queue'}='gradingqueue';
+ return (undef,'show_list');
+ }
+
+ if (defined($env{'form.regradeasubmission'})) {
+ &Apache::lonxml::debug("regrade a grading....");
+ $env{'form.queue'}='none';
+ return (undef,'select_user');
+ }
+
+
+ my $me=$env{'user.name'}.':'.$env{'user.domain'};
+
+ #need to try both queues..
+ if (defined($env{'form.regradeaspecificsubmission'}) &&
+ defined($env{'form.gradinguser'}) &&
+ defined($env{'form.gradingdomain'}) ) {
+ my ($symb,$cid)=&Apache::lonnet::whichuser();
+ my $cnum = $env{'course.'.$cid.'.num'};
+ 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;
+
+ if (&in_queue('gradingqueue',$symb,$cdom,$cnum,$udom,$uname)) {
+ $env{'form.queue'} = $queue = 'gradingqueue';
+ } elsif (&in_queue('reviewqueue' ,$symb,$cdom,$cnum,$udom,$uname)) {
+ $env{'form.queue'} = $queue = 'reviewqueue';
+ }
+
+ if (!$queue) {
+ $env{'form.queue'} = $queue = 'none';
+ #not queued so doing either a re or pre grade
+ my %status = &Apache::lonnet::restore($symb,$cid,$udom,$uname);
+ if ($status{'resource.0.version'} < 1) {
+ return (undef,'never_versioned');
+ }
+ return ($gradingkey);
+ }
+
+ if ($queue) {
+ my $queue_entry = &get_queue_data($queue,$udom,$uname);
+
+ my $end_time = &get_task_end_time($queue_entry,$symb,
+ $udom,$uname);
+ if ($end_time > time) {
+ return (undef,"still_open:$end_time");
+ }
+ }
+
+ my $who=&queue_key_locked($queue,$gradingkey);
+ if ($who eq $me) {
+ #already have the lock
+ $env{'form.gradingkey'}=&escape($gradingkey);
+ &Apache::lonxml::debug("already locked");
+ return ($gradingkey);
+ }
+
+ if (!defined($who)) {
+ if (&lock_key($queue,$gradingkey)) {
+ &Apache::lonxml::debug("newly locked");
+ return ($gradingkey);
+ } else {
+ return (undef,'lock_failed');
+ }
+ }
+
+ #otherwise (defined($who) && $who ne $me) some else has it...
+ return (undef,'not_allowed',
+ &mt('Another user ([_1]) currently has the record for [_2] locked.',
+ $who,$env{'form.gradinguser'}.':'.$env{'form.gradingdomain'}));
+ }
+
+
my $queue=$env{'form.queue'};
+
if (!defined($queue)) {
$env{'form.queue'}=$queue='gradingqueue';
}
- my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});
+
+ my $gradingkey=&unescape($env{'form.gradingkey'});
+
+ if ($env{'form.queue'} eq 'none') {
+ if (defined($env{'form.gradingkey'})) {
+ if ($target eq 'webgrade') {
+ if ($env{'form.stop'}) {
+ return (undef,'stop');
+ } elsif ($env{'form.cancel'}) {
+ return (undef,'cancel');
+ } elsif ($env{'form.next'}) {
+ return (undef,'select_user');
+ }
+ }
+ return ($gradingkey,'selected');
+ } else {
+ return (undef,'select_user');
+ }
+ }
if (defined($env{'form.queue'}) && defined($env{'form.gradingkey'})
- && !defined($env{'form.action'})) {
- #FIXME probably need to do some cheking here for more validity
- &Apache::lonnet::logthis("Found a key was given to me");
- return ($gradingkey);
+ && !defined($env{'form.gradingaction'})
+ && $env{'form.queuemode'} eq 'selected') {
+
+ my $who=&queue_key_locked($queue,$gradingkey);
+ if ($who eq $me) {
+ &Apache::lonxml::debug("Found a key was given to me");
+ return ($gradingkey,'selected');
+ } else {
+ return (undef,'show_list');
+ }
+
}
- if ($env{'form.action'} eq 'resume') {
- &Apache::lonnet::logthis("Resuming a key");
- return ($gradingkey);
- } elsif ($env{'form.action'} eq 'unlock') {
- &Apache::lonnet::logthis("Unlocking a key ".
- &check_queue_unlock($queue,$gradingkey,1));
- return (undef,'unlock');
- } elsif ($env{'form.action'} eq 'select') {
- if (&lock_key($queue,$gradingkey)) {
+
+ if ($target eq 'webgrade' && $env{'form.queuemode'} eq 'selected') {
+ if ($env{'form.gradingaction'} eq 'resume') {
+ delete($env{'form.gradingaction'});
+ &Apache::lonxml::debug("Resuming a key");
return ($gradingkey);
+ } elsif ($env{'form.gradingaction'} eq 'unlock') {
+ &Apache::lonxml::debug("Unlocking a key ".
+ &check_queue_unlock($queue,$gradingkey,1));
+ return (undef,'unlock');
+ } elsif ($env{'form.gradingaction'} eq 'select') {
+ &Apache::lonxml::debug("Locking a key");
+ if (&lock_key($queue,$gradingkey)) {
+ &Apache::lonxml::debug("Success $queue");
+ return ($gradingkey);
+ }
+ &Apache::lonxml::debug("Failed $queue");
+ return (undef,'lock_failed');
}
- return (undef,'lock_failed');
}
- # don't get something new from the queue if they hit the stop button
- if (!($env{'form.stop'} && $target eq 'webgrade')) {
- return (&get_from_queue($queue));
- } else {
- return (undef,'stop');
+
+ 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'})
+ && $target eq 'webgrade')
+ && !$env{'form.gradingaction'}) {
+ &Apache::lonxml::debug("Getting anew $queue");
+ return (&get_from_queue($queue));
+ } else {
+ return (undef,'stop');
+ }
+ }
+ return (undef,undef)
+}
+
+sub minimize_storage {
+ foreach my $key (keys(%Apache::lonhomework::results)) {
+ if ($key =~ /regrader$/) { next; }
+ if ($Apache::lonhomework::results{$key} eq
+ $Apache::lonhomework::history{$key}) {
+ delete($Apache::lonhomework::results{$key});
+ }
}
}
@@ -372,25 +1064,115 @@ sub end_Task {
my ($version,$previous)=&get_version();
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
$target eq 'tex') {
- if (
- (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
- ($target eq 'answer') || ($target eq 'tex')
- ) {
+ if ($target eq 'web' || $target eq 'answer' || $target eq 'tex') {
if ($target eq 'web') {
- if ($status eq 'CAN_ANSWER' && !$previous) {
+ if (&show_task($status,$previous)) {
+ $result.=&Apache::lonxml::endredirection();
+ }
+ if ($status eq 'CAN_ANSWER' && !$previous &&
+ !$env{'form.donescreen'}) {
$result.="\n".'
'.
&Apache::inputtags::file_selector("$version.0",
"bridgetask","*",
- 'portfolioonly').
+ 'portfolioonly',
+ '
+'.&mt('Submit Portfolio Files for Grading').'
+'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'
').
"
";
- $result.=&Apache::inputtags::gradestatus('0');
}
- }
- if ($target eq 'web' || $target eq 'webgrade') {
- $result.=&Apache::lonxml::xmlend().'