--- loncom/homework/structuretags.pm 2005/11/08 21:09:08 1.318 +++ loncom/homework/structuretags.pm 2005/11/21 21:51:29 1.324 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.318 2005/11/08 21:09:08 albertel Exp $ +# $Id: structuretags.pm,v 1.324 2005/11/21 21:51:29 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -346,6 +346,8 @@ sub initialize_storage { sub finalize_storage { my $result; if (%Apache::lonhomework::results) { + my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results)); + delete(@Apache::lonhomework::results{@remove}); my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); if ($env{'request.state'} eq 'construct' || $symb eq '') { $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'}; @@ -360,6 +362,8 @@ sub finalize_storage { &store_aggregates($symb,$courseid); } } + } else { + &Apache::lonxml::debug('Nothing to store'); } return $result; } @@ -513,7 +517,9 @@ sub start_problem { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; # We'll use the redirection to fix up printing of duedates. - &Apache::lonxml::startredirection(); + if (!$Apache::lonxml::metamode) { + &Apache::lonxml::startredirection(); + } # Problems don't nest and we don't allow more than one in # a .problem file. @@ -607,17 +613,22 @@ sub start_problem { } $form_tag_start.='
'; } - ($status,$accessmsg) = &Apache::lonhomework::check_access('0'); + + ($status,$accessmsg,my $slot_name,my $slot) = + &Apache::lonhomework::check_slot_access('0','problem'); push (@Apache::inputtags::status,$status); + my $expression='$external::datestatus="'.$status.'";'; $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";'; &Apache::run::run($expression,$safeeval); &Apache::lonxml::debug("Got $status"); + if (( $status eq 'CLOSED' ) || ( $status eq 'UNCHECKEDOUT') || ( $status eq 'NOT_YET_VIEWED') || ( $status eq 'BANNED') || ( $status eq 'UNAVAILABLE') || + ( $status eq 'NOT_IN_A_SLOT') || ( $status eq 'INVALID_ACCESS')) { my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser); if ( $target eq "web" ) { @@ -644,6 +655,16 @@ sub start_problem { $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm "; } } + } elsif ($status eq 'NEEDS_CHECKIN') { + my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser); + if ($target eq 'web') { + $result .= $head_tag_start.''; + $result .= $body_tag_start; + $result .= &Apache::bridgetask::proctor_validation_screen(); + } elsif ($target eq 'grade') { + &Apache::bridgetask::proctor_check_auth($slot_name,$slot, + 'problem'); + } } elsif ($target eq 'web') { my $name= &get_resource_name($parstack,$safeeval); $result.="$head_tag_start$name @@ -661,74 +682,8 @@ sub start_problem { } } } elsif ($target eq 'tex') { - my $startminipage = ''; - if (not $env{'form.problem_split'}=~/yes/) { - $startminipage = '\begin{minipage}{\textwidth}'; - } - my $id = $Apache::inputtags::part; - my $weight = &Apache::lonnet::EXT("resource.$id.weight"); - my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); - my @packages = split /,/,$packages; - my $allow_print_points = 0; - foreach my $partial_key (@packages) { - if ($partial_key=~m/^part_0$/) { - $allow_print_points=1; - } - } - my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries"); - if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; } - if (lc($env{'course.'.$env{'request.course.id'}. - '.disableexampointprint'}) eq 'yes') { - $allow_print_points=0; - } - my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header'); - my $begin_doc='\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource

"'.$name_of_resourse.'"

located in
'.$env{'request.uri'}.'
STAMPOFPASSEDRESOURCEEND} \noindent '; - my $toc_line='\vskip 1 mm\noindent '.$startminipage. - '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}'; - - # Figure out what the due date is and if we need to print - # it in the problem header. We have been logging the - # last due date written to file. - - my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); - my $duedate = POSIX::strftime("%c",localtime($duetime)); - my $temp_file; - my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; - - # Figure out what the last printed due date is or set it - # to the epoch if no duedates have been printed. - - my $due_file_content = 0; # If the file does not yet exist, time is the epoch. - if (-e $filename) { - $temp_file = Apache::File->new($filename); - my @due_file = <$temp_file>; - $due_file_content = $due_file[$#due_file]; - chomp $due_file_content; - } - - # comparisons of the absolute times - if ($due_file_content != $duetime) { - $temp_file = Apache::File->new('>'.$filename); - print $temp_file "$duetime\n"; - if (not $env{'request.symb'} =~ m/\.page_/) { - if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') { - $result .= $begin_doc. - '\textit{Due date: '.$duedate.'} '.$toc_line; - } else { - $result .= $begin_doc.$toc_line; - if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';} - } - } else { - $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\'; - } - } else { - if (not $env{'request.symb'} =~ m/\.page_/) { - $result .= $begin_doc.$toc_line; - if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';} - } else { - $result .= '\vskip 1mm \\\\\\\\'; - } - } + $result .= 'INSERTTEXFRONTMATTERHERE'; + } } elsif ($target eq 'edit') { $result.=$head_tag_start."".$body_tag_start.$form_tag_start. @@ -749,7 +704,101 @@ sub start_problem { sub end_problem { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - my $result= &Apache::lonxml::endredirection(); # started in &start_problem + my $result; + + if (!$Apache::lonxml::metamode) { + $result = &Apache::lonxml::endredirection(); #started in &start_problem + } + + if ($target eq 'tex') { + + # Figure out the front matter and replace the + # INSERTTEXFRONTMATTERHERE in result with it. note that we do + # this in end_problem because whether or not we display due + # dates depends on whether due dates have already been + # displayed in the problem parts. + + my $frontmatter = ''; + my $startminipage = ''; + if (not $env{'form.problem_split'}=~/yes/) { + $startminipage = '\begin{minipage}{\textwidth}'; + } + my $id = $Apache::inputtags::part; + my $weight = &Apache::lonnet::EXT("resource.$id.weight"); + my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); + my @packages = split /,/,$packages; + my $allow_print_points = 0; + foreach my $partial_key (@packages) { + if ($partial_key=~m/^part_0$/) { + $allow_print_points=1; + } + } + my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries"); + if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; } + if (lc($env{'course.'.$env{'request.course.id'}. + '.disableexampointprint'}) eq 'yes') { + $allow_print_points=0; + } + my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header'); + my $begin_doc='\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource

"'.$name_of_resourse.'"

located in
'.$env{'request.uri'}.'
STAMPOFPASSEDRESOURCEEND} \noindent '; + my $toc_line='\vskip 1 mm\noindent '.$startminipage. + '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}'; + + # Figure out what the due date is and if we need to print + # it in the problem header. We have been logging the + # last due date written to file. + + my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); + my $duedate = POSIX::strftime("%c",localtime($duetime)); + my $temp_file; + my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; + + # Figure out what the last printed due date is or set it + # to the epoch if no duedates have been printed. + + my $due_file_content = 0; # If the file does not yet exist, time is the epoch. + if (-e $filename) { + $temp_file = Apache::File->new($filename); + my @due_file = <$temp_file>; + $due_file_content = $due_file[$#due_file]; + chomp $due_file_content; + } + + # We display the due date iff it is not the same as the last + # duedate in problem header ($due_file_content), and + # none of our parts displayed a duedate. + # + my $parts_with_displayduedate; + if (defined $Apache::outputtags::showonce{'displayduedate'}) { + $parts_with_displayduedate = + scalar(@{$Apache::outputtags::showonce{'displayduedate'}}); + } else { + $parts_with_displayduedate = 0; + } + if (($due_file_content != $duetime) && ($parts_with_displayduedate == 0) ) { + $temp_file = Apache::File->new('>'.$filename); + print $temp_file "$duetime\n"; + if (not $env{'request.symb'} =~ m/\.page_/) { + if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') { + $frontmatter .= $begin_doc. + '\textit{Due date: '.$duedate.'} '.$toc_line; + } else { + $frontmatter.= $begin_doc.$toc_line; + if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';} + } + } else { + $frontmatter .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\'; + } + } else { + if (not $env{'request.symb'} =~ m/\.page_/) { + $frontmatter .= $begin_doc.$toc_line; + if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';} + } else { + $frontmatter .= '\vskip 1mm \\\\\\\\'; + } + } + $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/; + } my $status=$Apache::inputtags::status['-1']; if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || @@ -758,6 +807,8 @@ sub end_problem { # if part is zero, no s existed, so we need to the grading if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) { &Apache::inputtags::grade; + } elsif ($status eq 'NEEDS_CHECKIN') { + # no need to grade, and don't want to hide data } else { # move any submission data to .hidden &Apache::inputtags::hidealldata($Apache::inputtags::part); @@ -819,6 +870,9 @@ sub end_problem { } elsif ($target eq 'edit') { &Apache::lonxml::debug("in end_problem with $target, edit"); $result .= &problem_edit_footer(); + } elsif ($target eq 'modified') { + $result .= $token->[2]; + $result.=&Apache::edit::handle_insertafter($token->[1]); } if ($env{'request.state'} eq 'construct' && $target eq 'web') { @@ -1190,8 +1244,10 @@ sub ordered_show_check { sub start_part { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - &Apache::lonxml::startredirection(); # we'll use redirection to fix up - # duedates. + if (!$Apache::lonxml::metamode) { + &Apache::lonxml::startredirection(); # we'll use redirection to fix up + # duedates. + } my $result=''; my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } @@ -1300,7 +1356,10 @@ sub end_part { my $status=$Apache::inputtags::status['-1']; my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); my $in_order_show=&ordered_show_check(); - my $result= &Apache::lonxml::endredirection(); # started in &start_part + my $result; + if (!$Apache::lonxml::metamode) { + $result = &Apache::lonxml::endredirection(); # started in &start_part + } if ($target eq 'grade') { if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) && !$hidden && $in_order_show) { @@ -1320,6 +1379,9 @@ sub end_part { if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} } elsif ($target eq 'edit') { $result.=&Apache::edit::end_table(); + } elsif ($target eq 'modified') { + $result .= $token->[2]; + $result.=&Apache::edit::handle_insertafter($token->[1]); } pop @Apache::inputtags::status; $Apache::inputtags::part='';