--- loncom/homework/bridgetask.pm 2007/08/01 23:57:35 1.234 +++ loncom/homework/bridgetask.pm 2010/09/27 18:45:14 1.253 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.234 2007/08/01 23:57:35 albertel Exp $ +# $Id: bridgetask.pm,v 1.253 2010/09/27 18:45:14 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 = @@ -244,11 +253,20 @@ sub add_grading_button { my $result="\n\t".''; $result.="\n\t".''; - if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) { + 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".''."\n\t\t".''; - $result.="\n\t\t\t".''. - "\n\t\t\t".''; + if ($see_all || (!§ion_restricted())) { + $result.="\n\t\t\t".''. + "\n\t\t\t".''; + } else { + $result.="\n\t\t\t".''. + "\n\t\t\t".''; + } $result.="\n\t\t\t".''. @@ -1580,12 +1651,13 @@ sub show_queue { $result.= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(); - if ($with_selects) { $result.=""; } - $result.="". + if ($with_selects) { $result.=''; } + $result.=''. &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()]; @@ -1627,7 +1699,7 @@ sub show_queue { 'start'); } my $me=$env{'user.name'}.':'.$env{'user.domain'}; - $status=&mt('Locked by [_1] [_2]',$locker,$time); + $status=&mt('Locked by [_1] [_2]',''.$locker.'',$time); if ($me eq $locker) { ($action,$description)=('resume',&mt('Resume')); } else { @@ -1662,15 +1734,46 @@ FORM } $result.= ""; - $result.='".&Apache::loncommon::end_data_table_row(); + $result.='' + .&Apache::loncommon::end_data_table_row(); } } $result.= &Apache::loncommon::end_data_table()."
\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; @@ -1686,11 +1789,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$/) { @@ -1767,7 +1873,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 = @@ -1876,7 +1983,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'}; } @@ -1892,6 +1999,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; @@ -1978,15 +2086,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.='

Showing only sections '.join(', ',@chosen_sections). - '.

'."\n"; + $result.='

' + .&mt('Showing only sections [_1].' + ,''.join(', ',@chosen_sections).'') + .'

'."\n"; } $result.=&Apache::loncommon::start_data_table(); @@ -2022,6 +2130,7 @@ sub select_user { $seclist.=''; } + my $buttontext=&mt('Regrade'); $result.=&Apache::loncommon::start_data_table_row(); $result.=< @@ -2030,10 +2139,10 @@ sub select_user { - + $seclist - +
Specify a section: '.$sec_select."\n\t\t\t".''.&mt('Specify a section:').' '.$sec_select."\n\t\t\t".''.&mt('Grading section:').' '.$env{'request.course.sec'}."\n\t\t\t".''.' '; @@ -285,7 +303,7 @@ sub add_grading_button { sub add_request_another_attempt_button { my ($text)=@_; - if (!$text) { $text="Request another attempt"; } + if (!$text) { $text=&mt('Request another attempt'); } my $result; my $symb=&Apache::lonnet::symbread(); # not a slot access based resource @@ -297,13 +315,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.=(< Will be next available: $description

-STUFF + $result.='

' + .&mt('Will be next available:') + .' '.$description + .'

'; } if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); } @@ -313,7 +332,7 @@ STUFF ''."\n\t\t". ''."\n\t\t". ''."\n\t". + $text.'" />'."\n\t". ''."\n"; return $result; } @@ -463,7 +482,7 @@ sub file_list { my $file=$file_url.$partial_file; $file=~s|/+|/|g; &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); - $file_list.='
  • file icon '.$file. '
  • '."\n"; } @@ -483,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=< @@ -531,17 +550,19 @@ sub done_screen { foreach my $file (@files) { my $url="/uploaded/$domain/$user/portfolio$file"; if (! &Apache::lonnet::stat_file($url)) { - $file = &mt(' Nonexistent file: '. - '[_1]',$file); - $msg .= "

    Submitted non-existant file $file

    \n"; + $file = '' + .&mt('[_1]Nonexistent file:[_2]' + ,' ' + ,' '.$file.''); + $msg .= "

    ".&mt('Submitted non-existent file [_1]',$file)."

    \n"; } else { $file = ''.$file.''; - $msg .= "

    Submitted file $file

    \n"; + $msg .= "

    ".&mt('Submitted file [_1]',$file)."

    \n"; } $files .= '
  • '.$file.'
  • '; } $files.=''; - 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/; @@ -560,16 +581,14 @@ sub done_screen { $comment_status = '

    '.&mt('Message sent to instructor: [_1]', $comment_status).'

    '; } - return <$title -

    Files submitted: $files

    -

    You are now done with this Bridge Task

    -
    -

    Logout

    -

    Change to a different course

    -$message_status -$comment_status -DONESCREEN + 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; } @@ -610,7 +629,8 @@ sub start_Task { if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); } $result.=$uri.'">'.&add_grading_button()."\n"; my $symb=&Apache::lonnet::symbread(); - 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'})) { $result.='
    '. ''. ''. @@ -620,12 +640,14 @@ sub start_Task { my $target_id = &Apache::lonstathelpers::make_target_id({symb => $symb, part => '0'}); - $result.=''. - ''. - ''. - ''. - '
    '; + if (!§ion_restricted()) { + $result.='
    '. + ''. + ''. + ''. + '
    '; + } } } } @@ -642,7 +664,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}); @@ -672,7 +698,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); @@ -688,7 +714,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 { @@ -804,9 +830,8 @@ sub start_Task { $result.=''; } - 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.=''; @@ -902,7 +927,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; @@ -1053,14 +1085,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)) { @@ -1072,10 +1111,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 } @@ -1108,13 +1148,15 @@ DONEBUTTON "

    \n"; if ($bt_status eq 'pass') { - $status.='

    You passed the '.$title.' given on '. - $start_time.'

    '; + $status.='

    ' + .&mt('You passed the [_1] given on [_2].',$title,$start_time) + .'

    '; $status.=$question_status; } if ($bt_status eq 'fail') { - $status.='

    You did not pass the '.$title.' given on '. - $start_time.'

    '; + $status.='

    ' + .&mt('You did not pass the [_1] given on [_2].',$title,$start_time) + .'

    '; $status.=$question_status; if (!$previous) { $status.=&add_request_another_attempt_button(); @@ -1156,8 +1198,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"}= @@ -1170,7 +1215,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); @@ -1273,38 +1320,55 @@ 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; + if ($env{'form.gradingkey'}) { + my ($symb,$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'}); + $result .= '
    '. + &mt('Information extracted from the current gradingkey was for a different BT or user from those for which grading data are to be stored.').' '.&mt('No grading changes stored.').'

    '; + } + } 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') { @@ -1360,6 +1424,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; } @@ -1518,11 +1589,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}); } } @@ -1538,14 +1609,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.='

    Showing only sections '.join(', ',@chosen_sections). - '.

    '."\n"; + $result.='

    ' + .&mt('Showing only sections [_1].' + ,''.join(', ',@chosen_sections).'') + ."

    \n"; } my ($view,$view_section); @@ -1562,13 +1634,12 @@ sub show_queue { $result .= '

    '. &mt('Return to resource').'


    '. - "\n

    Current Queue - $queue

    "; + "\n

    ".&mt('Current Queue - [_1]',$queue)."

    "; my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); my ($tmp)=%queue; if ($tmp=~/^error: 2 /) { $result.= - &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). '
    '.&mt('Empty').'Statususerdata'.&mt('Status').''.&mt('User').''.&mt('Data').'".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()]. " ($uname:$udom) '.$slot_text.' End time: '. - &Apache::lonlocal::locallocaltime($end_time). - "'.$slot_text.' ' + .&mt('End time: [_1]' + ,&Apache::lonlocal::locallocaltime($end_time)) + .'$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student)$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()] RESULT } @@ -2140,9 +2249,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 { @@ -2385,10 +2492,14 @@ sub end_Dimension { ('sub' x $dimension{$dim}{'depth'}).'question'; $ucquestion =~ s/^(.)/uc($1)/e; if ($dim_status eq 'pass') { - $dim_info.='

    '.$ucquestion.' : you passed this '.$mandatory.' '.$question.'

    '; + $dim_info.='

    '.$ucquestion.' : ' + .&mt('you passed this [_1] [_2]',$mandatory,$question) + .'

    '; } if ($dim_status eq 'fail') { - $dim_info.='

    '.$ucquestion.' : you did not pass this '.$mandatory.' '.$question.'

    '; + $dim_info.='

    '.$ucquestion.' : ' + .&mt('you did not pass this [_1] [_2]',$mandatory,$question) + .'

    '; } my %counts = &get_counts($dim,$instance,$parstack, $safeeval); @@ -2587,16 +2698,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; } @@ -2695,7 +2801,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); @@ -2925,25 +3032,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 @@ -3070,39 +3177,52 @@ sub proctor_validation_screen { } if (!$valid) { $msg.='

    ' - .&mt("No valid poctors are defined.") + .&mt("No valid proctors are defined.") .'

    '; } 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= (<Proctor Validation -

    Your room's proctor needs to validate your access to this resource.

    +

    $lt{'prva'}

    +

    $lt{'yoro'}

    $msg
    - - - + + +
    Proctor's Username:
    Password:
    Proctor's Domain:
    $lt{'prus'}
    $lt{'pasw'}
    $lt{'prdo'}
    -
    +
    - - - - + + + + $url
    Student who should be logged in is:
    Name:$name
    Student ID:$env{'environment.id'}
    Usename$user:$domain
    $lt{'stui'}
    $lt{'name'}$name
    $lt{'sid'}$env{'environment.id'}
    $lt{'unam'}$user:$domain
    ENDCHECKOUT + return $result; } 500 Internal Server Error

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.