Diff for /loncom/homework/lonhomework.pm between versions 1.159 and 1.178.2.2

version 1.159, 2003/12/22 22:15:27 version 1.178.2.2, 2004/09/29 06:50:31
Line 47  use Apache::externalresponse(); Line 47  use Apache::externalresponse();
 use Apache::rankresponse();  use Apache::rankresponse();
 use Apache::matchresponse();  use Apache::matchresponse();
 use Apache::chemresponse();  use Apache::chemresponse();
   use Apache::drawimage();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use HTML::Entities();  use HTML::Entities();
 use Apache::loncommon();  use Apache::loncommon();
Line 201  sub check_access { Line 202  sub check_access {
     my $passed;      my $passed;
   
     if ($ENV{'request.state'} eq "construct") {      if ($ENV{'request.state'} eq "construct") {
    if ($ENV{'form.problemstate'}) {
       if ($ENV{'form.problemstate'} =~ /^CANNOT_ANSWER/) {
    if ( ! ($ENV{'form.problemstate'} eq 'CANNOT_ANSWER_correct' &&
    lc($Apache::lonhomework::problemstatus) eq 'no')) {
       return ('CANNOT_ANSWER',
       &mt('is in this state due to author settings.'));
    }
       } else {
    return ($ENV{'form.problemstate'},
    &mt('is in this state due to author settings.'));
       }
    }
  &Apache::lonxml::debug("in construction ignoring dates");   &Apache::lonxml::debug("in construction ignoring dates");
  $status='CAN_ANSWER';   $status='CAN_ANSWER';
  $datemsg=&mt('is in under construction');   $datemsg=&mt('is in under construction');
  return ($status,$datemsg);  # return ($status,$datemsg);
     }      }
   
     &Apache::lonxml::debug("checking for part :$id:");      &Apache::lonxml::debug("checking for part :$id:");
     &Apache::lonxml::debug("time:".time);      &Apache::lonxml::debug("time:".time);
       
     my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));  
     if (!$allowed) {  
  $status='INVALID_ACCESS';  
  $date=&mt("can not be accessed from your location.");  
  return($status,$date);  
     }  
   
     foreach $temp ("opendate","duedate","answerdate") {      if ($ENV{'request.state'} ne "construct") {
  $lastdate = $date;   my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));
  $date = &Apache::lonnet::EXT("resource.$id.$temp");   if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {
  my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type");      $status='INVALID_ACCESS';
  if ($thistype =~ /^(con_lost|no_such_host)/ ||      $date=&mt("can not be accessed from your location.");
     $date     =~ /^(con_lost|no_such_host)/) {  
     $status='UNAVAILABLE';  
     $date=&mt("may open later.");  
     return($status,$date);      return($status,$date);
  }   }
  if ($thistype eq 'date_interval') {  
     if ($temp eq 'opendate') {   foreach $temp ("opendate","duedate","answerdate") {
  $date=&Apache::lonnet::EXT("resource.$id.duedate")-$date;      $lastdate = $date;
     }      $date = &Apache::lonnet::EXT("resource.$id.$temp");
     if ($temp eq 'answerdate') {      my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type");
  $date=&Apache::lonnet::EXT("resource.$id.duedate")+$date;      if ($thistype =~ /^(con_lost|no_such_host)/ ||
    $date     =~ /^(con_lost|no_such_host)/) {
    $status='UNAVAILABLE';
    $date=&mt("may open later.");
    return($status,$date);
       }
       if ($thistype eq 'date_interval') {
    if ($temp eq 'opendate') {
       $date=&Apache::lonnet::EXT("resource.$id.duedate")-$date;
    }
    if ($temp eq 'answerdate') {
       $date=&Apache::lonnet::EXT("resource.$id.duedate")+$date;
    }
       }
       &Apache::lonxml::debug("found :$date: for :$temp:");
       if ($date eq '') {
    $date = &mt("an unknown date"); $passed = 0;
       } elsif ($date eq 'con_lost') {
    $date = &mt("an indeterminate date"); $passed = 0;
       } else {
    if (time < $date) { $passed = 0; } else { $passed = 1; }
    $date = localtime $date;
     }      }
       if (!$passed) { $type=$temp; last; }
  }   }
  &Apache::lonxml::debug("found :$date: for :$temp:");   &Apache::lonxml::debug("have :$type:$passed:");
  if ($date eq '') {   if ($passed) {
     $date = &mt("an unknown date"); $passed = 0;      $status='SHOW_ANSWER';
  } elsif ($date eq 'con_lost') {      $datemsg=$date;
     $date = &mt("an indeterminate date"); $passed = 0;   } elsif ($type eq 'opendate') {
  } else {      $status='CLOSED';
     if (time < $date) { $passed = 0; } else { $passed = 1; }      $datemsg = &mt("will open on")." $date";
     $date = localtime $date;   } elsif ($type eq 'duedate') {
       $status='CAN_ANSWER';
       $datemsg = &mt("is due at")." $date";
    } elsif ($type eq 'answerdate') {
       $status='CLOSED';
       $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";
  }   }
  if (!$passed) { $type=$temp; last; }  
     }  
     &Apache::lonxml::debug("have :$type:$passed:");  
     if ($passed) {  
  $status='SHOW_ANSWER';  
  $datemsg=$date;  
     } elsif ($type eq 'opendate') {  
  $status='CLOSED';  
  $datemsg = &mt("will open on")." $date";  
     } elsif ($type eq 'duedate') {  
  $status='CAN_ANSWER';  
  $datemsg = &mt("is due at")." $date";  
     } elsif ($type eq 'answerdate') {  
  $status='CLOSED';  
  $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";  
     }      }
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
  #check #tries, and if correct.   #check #tries, and if correct.
  my $tries = $Apache::lonhomework::history{"resource.$id.tries"};   my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
  my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");   my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
  if ( $tries eq '' ) { $tries = '0'; }   if ( $tries eq '' ) { $tries = '0'; }
  if ( $maxtries eq '' ) { $maxtries = '2'; }    if ( $maxtries eq '' && 
  if ($tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }       $ENV{'request.state'} ne 'construct') { $maxtries = '2'; } 
    if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
  # if (correct and show prob status) or excused then CANNOT_ANSWER   # if (correct and show prob status) or excused then CANNOT_ANSWER
  if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/   if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/
     &&      &&
Line 276  sub check_access { Line 292  sub check_access {
     $status = 'CANNOT_ANSWER';      $status = 'CANNOT_ANSWER';
  }   }
     }      }
       if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') {
    my $interval=&Apache::lonnet::EXT("resource.$id.interval");
    &Apache::lonxml::debug("looking for interval $interval");
    if ($interval) {
       my $first_access=&Apache::lonnet::get_first_access('map');
       &Apache::lonxml::debug("looking for accesstime $first_access");
       if (!$first_access) {
    $status='NOT_YET_VIEWED';
    $datemsg=' '.$interval.' seconds';
       } else {
    my $newdate=localtime($first_access+$interval);
    if (time > ($first_access+$interval)) {
       $status='CLOSED';
       $datemsg = &mt("was due on")." $newdate".&mt(", and answers will be available on")." $date";
    } else {
       $datemsg = &mt("is due at")." $newdate";
    }
       }
    }
       }
   #if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') &&    #if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') &&
   #    (!$Apache::lonhomework::history{"resource.0.outtoken"})) {    #    (!$Apache::lonhomework::history{"resource.0.outtoken"})) {
   #    return ('UNCHECKEDOUT','needs to be checked out');    #    return ('UNCHECKEDOUT','needs to be checked out');
Line 383  sub handle_save_or_undo { Line 418  sub handle_save_or_undo {
  if ((!$error) && (!copy($filebak,$file))) { $error=1; }   if ((!$error) && (!copy($filebak,$file))) { $error=1; }
  if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }   if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }
  if (!$error) {   if (!$error) {
     $request->print("<p><b>".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file</b></p>");      &Apache::lonxml::info("<p><b>".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file</b></p>");
  } else {   } else {
     $request->print("<p><font color=\"red\" size=\"+1\"><b>".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file</b></font></p>");      &Apache::lonxml::info("<p><font color=\"red\" size=\"+1\"><b>".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file</b></font></p>");
     $error=1;      $error=1;
  }   }
     } else {      } else {
  my $fs=Apache::File->new(">$filebak");   my $fs=Apache::File->new(">$filebak");
  if (defined($fs)) {   if (defined($fs)) {
     print $fs $$problem;      print $fs $$problem;
     $request->print("<b>".&mt("Making Backup to").      &Apache::lonxml::info("<b>".&mt("Making Backup to").
     " $filebak</b><br />");    " $filebak</b>");
  } else {   } else {
     $request->print("<font color=\"red\" size=\"+1\"><b>".&mt("Unable to make backup")." $filebak</b></font>");      &Apache::lonxml::info("<font color=\"red\" size=\"+1\"><b>".&mt("Unable to make backup")." $filebak</b></font>");
     $error=2;      $error=2;
  }   }
  my $fh=Apache::File->new(">$file");   my $fh=Apache::File->new(">$file");
  if (defined($fh)) {   if (defined($fh)) {
     print $fh $$result;      print $fh $$result;
     $request->print("<b>".&mt("Saving Modifications to").      &Apache::lonxml::info("<b>".&mt("Saving Modifications to").
     " $file</b><br />");    " $file</b>");
  } else {   } else {
     $request->print("<font color=\"red\" size=\"+1\"><b>".      &Apache::lonxml::info("<font color=\"red\" size=\"+1\"><b>".
     &mt("Unable to write to")." $file</b></font>");    &mt("Unable to write to")." $file</b></font>");
     $error|=4;      $error|=4;
  }   }
     }      }
Line 416  sub analyze_header { Line 451  sub analyze_header {
     my ($request) = @_;      my ($request) = @_;
     my $result.='<html>      my $result.='<html>
             <head><title>'.&mt("Analyzing a problem").'</title></head>              <head><title>'.&mt("Analyzing a problem").'</title></head>
             <body bgcolor="#FFFFFF">              <body bgcolor="#FFFFFF">'.&Apache::lonxml::message_location().'
             <form name="lonhomework" method="POST" action="'.              <form name="lonhomework" method="POST" action="'.
     $ENV{'request.uri'}.'">      &HTML::Entities::encode($ENV{'request.uri'},'<>&"').'">
             <input type="submit" name="problemmode" value="'.&mt("EditXML").'" />              <input type="submit" name="problemmode" value="'.&mt("EditXML").'" />
             <input type="submit" name="problemmode" value="'.&mt('Edit').'" />              <input type="submit" name="problemmode" value="'.&mt('Edit').'" />
             <hr />              <hr />
             <input type="submit" name="submit" value="'.&mt("View").'" />              <input type="submit" name="submit" value="'.&mt("View").'" />
             <hr />              <hr />
             '.&mt('List of possible answers').':  
             </form>';              </form>';
       &Apache::lonxml::add_messages(\$result);
     $request->print($result);      $request->print($result);
     $request->rflush();      $request->rflush();
 }  }
Line 448  sub analyze { Line 483  sub analyze {
     my %prog_state=      my %prog_state=
  &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'),   &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'),
       &mt('Getting Problem Variants'),        &mt('Getting Problem Variants'),
       $ENV{'form.numtoanalyze'});        $ENV{'form.numtoanalyze'},
         'inline',undef);
     for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) {      for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) {
  &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state,   &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state,
  &mt('last problem'));   &mt('last problem'));
Line 473  sub analyze { Line 509  sub analyze {
     }      }
     &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,
   &mt('Analyzing Results'));    &mt('Analyzing Results'));
       $request->print('<hr />'.&mt('List of possible answers').': ');
     foreach my $part (sort(keys(%allparts))) {      foreach my $part (sort(keys(%allparts))) {
  if (defined(@{ $overall{$part.'.answer'} })) {   if (defined(@{ $overall{$part.'.answer'} })) {
     my $num_cols=scalar(@{ $overall{$part.'.answer'}->[0] });      my $num_cols=scalar(@{ $overall{$part.'.answer'}->[0] });
Line 490  sub analyze { Line 527  sub analyze {
     }      }
     $request->print('</table>');      $request->print('</table>');
  } else {   } else {
     $request->print('<p>'.&mt('Part').' '.$part.' '.      $request->print('<p>'.&mt('Response').' '.$part.' '.
     &mt('is not analyzable at this time').'</p>');      &mt('is not analyzable at this time').'</p>');
  }   }
     }      }
     if (scalar(keys(%allparts)) == 0 ) {      if (scalar(keys(%allparts)) == 0 ) {
  $request->print('<p>'.&mt('Found no analyzable parts in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>');   $request->print('<p>'.&mt('Found no analyzable respones in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>');
     }      }
     &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);
     &analyze_footer($request);      &analyze_footer($request);
Line 524  sub editxmlmode { Line 561  sub editxmlmode {
  &renderpage($request,$file);   &renderpage($request,$file);
     } else {      } else {
  my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);   my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);
  my $xml_help = Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",   my $xml_help = '<table><tr><td>'.
       "Problem Editing Help");      &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",
       "Problem Editing Help").
       '</td><td>'.
          &Apache::loncommon::help_open_menu('',undef,undef,undef,5,'Authoring').
                   '</td></tr></table>';
  if ($cols > 80) { $cols = 80; }   if ($cols > 80) { $cols = 80; }
  if ($cols < 70) { $cols = 70; }   if ($cols < 70) { $cols = 70; }
  if ($rows < 20) { $rows = 20; }   if ($rows < 20) { $rows = 20; }
  $result.='<html><body bgcolor="#FFFFFF">   $result.='<html><body bgcolor="#FFFFFF">'.
       &Apache::lonxml::message_location().'
             <form name="lonhomework" method="POST" action="'.              <form name="lonhomework" method="POST" action="'.
     $ENV{'request.uri'}.'">      &HTML::Entities::encode($ENV{'request.uri'},'<>&"').'">
             <input type="hidden" name="problemmode" value="'.&mt('EditXML').'" />              <input type="hidden" name="problemmode" value="'.&mt('EditXML').'" />
             <input type="submit" name="problemmode" value="'.&mt('Discard Edits and View').'" />              <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />
             <input type="submit" name="problemmode" value="'.&mt('Edit').'" />              <input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />
             <hr />              <hr />
             <input type="submit" name="submit" value="'.&mt('Submit Changes').'" />              <input type="submit" name="submit" accesskey="s" value="'.&mt('Submit Changes').'" />
             <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />              <input type="submit" name="submit" accesskey="v" value="'.&mt('Submit Changes and View').'" />
             <input type="submit" name="Undo" value="'.&mt('undo').'" />              <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
             <hr />              <hr />
             ' . $xml_help . '              ' . $xml_help . '
             <textarea rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.              <textarea rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.
     &HTML::Entities::encode($problem).'</textarea>      &HTML::Entities::encode($problem,'<>&"').'</textarea>
             </form></body></html>';              </form></body></html>';
    &Apache::lonxml::add_messages(\$result);
  $request->print($result);   $request->print($result);
     }      }
     return '';      return '';
Line 553  sub renderpage { Line 596  sub renderpage {
     my ($request,$file) = @_;      my ($request,$file) = @_;
   
     my (@targets) = &get_target();      my (@targets) = &get_target();
       &Apache::lonhomework::showhashsubset(\%ENV,'form.');
     &Apache::lonxml::debug("Running targets ".join(':',@targets));      &Apache::lonxml::debug("Running targets ".join(':',@targets));
       my $overall_result;
     foreach my $target (@targets) {      foreach my $target (@targets) {
  #my $t0 = [&gettimeofday()];   #my $t0 = [&gettimeofday()];
  my $problem=&Apache::lonnet::getfile($file);   my $problem=&Apache::lonnet::getfile($file);
Line 585  sub renderpage { Line 630  sub renderpage {
     #$result =~ s:</body>::;      #$result =~ s:</body>::;
     #$result.="<br />Spent $td seconds processing target $target\n</body>";      #$result.="<br />Spent $td seconds processing target $target\n</body>";
     #}      #}
     $request->print($result);  #    $request->print($result);
     $request->rflush();      $overall_result.=$result;
   #    $request->rflush();
  }   }
  #$request->print(":Result ends");   #$request->print(":Result ends");
  #my $td=&tv_interval($t0);   #my $td=&tv_interval($t0);
     }      }
       &Apache::lonxml::add_messages(\$overall_result);
       $request->print($overall_result);   
       $request->rflush();   
 }  }
   
 # with no arg it returns a HTML <option> list of the template titles  # with no arg it returns a HTML <option> list of the template titles
Line 639  sub newproblem { Line 688  sub newproblem {
  copy($templatefilename,$dest);   copy($templatefilename,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } else {      } else {
  my $url=$request->uri;   my $url=&HTML::Entities::encode($request->uri,'<>&"');
  my $shownurl=$url;   my $shownurl=$url;
  $shownurl=~s-^/~-/priv/-;   $shownurl=~s-^/~-/priv/-;
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  my $errormsg;   my $errormsg;
Line 679  ENDNEWPROBLEM Line 728  ENDNEWPROBLEM
   
 sub view_or_edit_menu {  sub view_or_edit_menu {
     my ($request) = @_;      my ($request) = @_;
     my $url=$request->uri;      my $url=&HTML::Entities::encode($request->uri,'<>&"');
     my %lt=&Apache::lonlocal::texthash( 'would' => 'Would you like to',      my %lt=&Apache::lonlocal::texthash( 'would' => 'Would you like to',
       'view' => 'View',        'view' => 'View',
       'Edit' => 'edit',        'Edit' => 'edit',
Line 688  sub view_or_edit_menu { Line 737  sub view_or_edit_menu {
     $request->print(<<EDITMENU);      $request->print(<<EDITMENU);
 <body bgcolor="#FFFFFF">  <body bgcolor="#FFFFFF">
 <form action="$url" method="POST">  <form action="$url" method="POST">
 $lt{'would'} <input type="submit" name="problemmode" value="&lt{'view'}">  $lt{'would'} <input type="submit" name="problemmode" accesskey="v" value="&lt{'view'}">
 &lt{'or'} <input type="submit" name="problemmode" value="&lt{'Edit'}">  &lt{'or'} <input type="submit" name="problemmode" accesskey="e" value="&lt{'Edit'}">
 &lt{'the problem'}.  &lt{'the problem'}.
 </form>  </form>
 </body>  </body>
Line 701  sub handler { Line 750  sub handler {
     my $request=$_[0];      my $request=$_[0];
           
     $Apache::lonxml::debug=$ENV{'user.debug'};      $Apache::lonxml::debug=$ENV{'user.debug'};
   
     if (&setupheader($request)) { return OK; }      if (&setupheader($request)) { return OK; }
     $ENV{'request.uri'}=$request->uri;      $ENV{'request.uri'}=$request->uri;
   
     #setup permissions      &setuppermissions();
     $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});  
     $Apache::lonhomework::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});  
     &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:");      &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:");
     # some times multiple problemmodes are submitted, need to select      # some times multiple problemmodes are submitted, need to select
     # the last one      # the last one
Line 725  sub handler { Line 771  sub handler {
     #check if we know where we are      #check if we know where we are
     if ($ENV{'request.course.fn'} && !&Apache::lonnet::symbread()) {       if ($ENV{'request.course.fn'} && !&Apache::lonnet::symbread()) { 
  # if we are browsing we might not be able to know where we are   # if we are browsing we might not be able to know where we are
  if ($Apache::lonhomework::browse ne 'F') {   if ($Apache::lonhomework::browse ne 'F' && 
       $ENV{'request.state'} ne "construct") {
     #should know where we are, so ask      #should know where we are, so ask
     if ( &Apache::lonnet::mod_perl_version() == 2 ) {      if ( &Apache::lonnet::mod_perl_version() == 2 ) {
  &Apache::lonnet::cleanenv();   &Apache::lonnet::cleanenv();

Removed from v.1.159  
changed lines
  Added in v.1.178.2.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>