Diff for /loncom/homework/lonhomework.pm between versions 1.163 and 1.183

version 1.163, 2004/02/13 21:21:30 version 1.183, 2004/11/13 20:40:32
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();
 use Apache::lonlocal;  use Apache::lonlocal;
 #use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register_insert();      &Apache::lonxml::register_insert();
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');
Line 267  sub check_access { Line 280  sub check_access {
  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 278  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 385  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 handle_save_or_undo { Line 449  sub handle_save_or_undo {
   
 sub analyze_header {  sub analyze_header {
     my ($request) = @_;      my ($request) = @_;
       my $bodytag='<body bgcolor="#ffffff">';
       if ($ENV{'environment.remote'} eq 'off') {
    $bodytag=&Apache::loncommon::bodytag();
       }
     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">              '.$bodytag.&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'},'<>&"').'">'.
       &Apache::structuretags::remember_problem_state().'
             <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 450  sub analyze { Line 488  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'));
    if (&Apache::loncommon::connection_aborted($request)) { return; }
  my $subresult=&Apache::lonnet::ssi($request->uri,   my $subresult=&Apache::lonnet::ssi($request->uri,
    ('grade_target' => 'analyze'),     ('grade_target' => 'analyze'),
    ('rndseed' => $i+$rndseed));     ('rndseed' => $i+$rndseed));
Line 475  sub analyze { Line 515  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 530  sub editxmlmode { Line 571  sub editxmlmode {
     &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",      &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",
     "Problem Editing Help").      "Problem Editing Help").
     '</td><td>'.      '</td><td>'.
        &Apache::loncommon::help_open_faq(5).         &Apache::loncommon::help_open_menu('',undef,undef,undef,5,'Authoring').
        &Apache::loncommon::help_open_bug('Authoring').'</td></tr></table>';                  '</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">   my $bodytag='<body bgcolor="#ffffff">';
    if ($ENV{'environment.remote'} eq 'off') {
       $bodytag=&Apache::loncommon::bodytag();
    }
    $result.='<html>'.$bodytag.&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'},'<>&"').'">'.
       &Apache::structuretags::remember_problem_state().'
             <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 561  sub renderpage { Line 608  sub renderpage {
     my (@targets) = &get_target();      my (@targets) = &get_target();
     &Apache::lonhomework::showhashsubset(\%ENV,'form.');      &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) {
    # FIXME need to do something intelligent when a problem goes
           # from viewable to not viewable due to map conditions
    #&setuppermissions();
    #if (   $Apache::lonhomework::browse ne '2'
    #    && $Apache::lonhomework::browse ne 'F' ) {
    #    $request->print(" You most likely shouldn't see me.");
    #}
  #my $t0 = [&gettimeofday()];   #my $t0 = [&gettimeofday()];
  my $problem=&Apache::lonnet::getfile($file);   my $problem=&Apache::lonnet::getfile($file);
  if ($problem eq -1) {   if ($problem eq -1) {
Line 592  sub renderpage { Line 647  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 646  sub newproblem { Line 705  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 686  ENDNEWPROBLEM Line 745  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 695  sub view_or_edit_menu { Line 754  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 710  sub handler { Line 769  sub handler {
     $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;
       &setuppermissions();
     #setup permissions  
     $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 731  sub handler { Line 787  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.163  
changed lines
  Added in v.1.183


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