Diff for /loncom/homework/lonhomework.pm between versions 1.68 and 1.78

version 1.68, 2002/01/03 22:16:53 version 1.78, 2002/05/23 21:12:44
Line 31 Line 31
   
 package Apache::lonhomework;  package Apache::lonhomework;
 use strict;  use strict;
 use Apache::style;  use Apache::style();
 use Apache::lonxml;  use Apache::lonxml();
 use Apache::lonnet;  use Apache::lonnet();
 use Apache::lonplot;  use Apache::lonplot();
 use Apache::inputtags;  use Apache::inputtags();
 use Apache::structuretags;  use Apache::structuretags();
 use Apache::randomlabel;  use Apache::randomlabel();
 use Apache::response;  use Apache::response();
 use Apache::hint;  use Apache::hint();
 use Apache::outputtags;  use Apache::outputtags();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
   use HTML::Entities();
 #use Time::HiRes qw( gettimeofday tv_interval );  #use Time::HiRes qw( gettimeofday tv_interval );
   
 sub BEGIN {  BEGIN {
   &Apache::lonxml::register_insert();    &Apache::lonxml::register_insert();
 }  }
   
Line 60  sub get_target { Line 61  sub get_target {
       return ('web');        return ('web');
     }      }
   } elsif ($ENV{'request.state'} eq "construct") {    } elsif ($ENV{'request.state'} eq "construct") {
       if ( defined($ENV{'form.grade_target'}) ) {
         return ($ENV{'form.grade_target'});
       }
     if ( defined($ENV{'form.preview'})) {      if ( defined($ENV{'form.preview'})) {
       if ( defined($ENV{'form.submitted'})) {        if ( defined($ENV{'form.submitted'})) {
  return ('grade', 'web');   return ('grade', 'web');
Line 128  sub check_access { Line 132  sub check_access {
   my $type;    my $type;
   my $passed;    my $passed;
   &Apache::lonxml::debug("checking for part :$id:");    &Apache::lonxml::debug("checking for part :$id:");
     &Apache::lonxml::debug("time:".time);
   foreach $temp ("opendate","duedate","answerdate") {    foreach $temp ("opendate","duedate","answerdate") {
     $lastdate = $date;      $lastdate = $date;
     $date = &Apache::lonnet::EXT("resource.$id.$temp");      $date = &Apache::lonnet::EXT("resource.$id.$temp");
Line 189  sub showhash { Line 194  sub showhash {
   my (%hash) = @_;    my (%hash) = @_;
   my $resultkey;    my $resultkey;
   foreach $resultkey (sort keys %hash) {    foreach $resultkey (sort keys %hash) {
     &Apache::lonxml::debug("$resultkey ---- $hash{$resultkey}");      if (ref($hash{$resultkey})) {
         if ($hash{$resultkey} =~ /ARRAY/ ) {
    my $string="$resultkey ---- (";
    foreach my $elm (@{ $hash{$resultkey} }) {
     $string.="$elm,";
    }
    chop($string);
    &Apache::lonxml::debug("$string)");
         } else {
    &Apache::lonxml::debug("$resultkey ---- $hash{$resultkey}");
         }
       } else {
         &Apache::lonxml::debug("$resultkey ---- $hash{$resultkey}");
       }
   }    }
   &Apache::lonxml::debug("\n<br />restored values^</br>\n");    &Apache::lonxml::debug("\n<br />restored values^</br>\n");
   return '';    return '';
Line 218  sub setupheader { Line 236  sub setupheader {
   
 sub handle_save_or_undo {  sub handle_save_or_undo {
   my ($request,$problem,$result) = @_;    my ($request,$problem,$result) = @_;
   my $fileout = &Apache::lonnet::filelocation("",$request->uri);    my $file    = &Apache::lonnet::filelocation("",$request->uri);
   my $filesave=$fileout.".bak";    my $filebak =$file.".bak";
     my $filetmp =$file.".tmp";
   my $error=0;    my $error=0;
   
   if ($ENV{'form.Undo'} eq 'undo') {    if ($ENV{'form.Undo'} eq 'undo') {
     if (copy($filesave,$fileout)) {      my $error=0;
       $request->print("<b>Undid changes, Copied $filesave to $fileout<br /></b>");      if (!copy($file,$filetmp)) { $error=1; }
       if ((!$error) && (!copy($filebak,$file))) { $error=1; }
       if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }
       if (!$error) {
         $request->print("<p><b>Undid changes, Switched $filebak and $file</b></p>");
     } else {      } else {
       $request->print("<font color=\"red\" size=\"+1\"><b>Unable to undo, unable to copy $filesave to $fileout<br /></b></font>");        $request->print("<p><font color=\"red\" size=\"+1\"><b>Unable to undo, unable to switch $filebak and $file</b></font></p>");
       $error=1;        $error=1;
     }      }
   } else {    } else {
     my $fs=Apache::File->new(">$filesave");      my $fs=Apache::File->new(">$filebak");
     if (defined($fs)) {      if (defined($fs)) {
       print $fs $$problem;        print $fs $$problem;
       $request->print("<b>Making Backup to $filesave</b><br />");        $request->print("<b>Making Backup to $filebak</b><br />");
     } else {      } else {
       $request->print("<font color=\"red\" size=\"+1\"><b>Unable to make backup $filesave</b></font>");        $request->print("<font color=\"red\" size=\"+1\"><b>Unable to make backup $filebak</b></font>");
       $error=2;        $error=2;
     }      }
     my $fh=Apache::File->new(">$fileout");      my $fh=Apache::File->new(">$file");
     if (defined($fh)) {      if (defined($fh)) {
       print $fh $$result;        print $fh $$result;
       $request->print("<b>Saving Modifications to $fileout</b><br />");        $request->print("<b>Saving Modifications to $file</b><br />");
     } else {      } else {
       $request->print("<font color=\"red\" size=\"+1\"><b>Unable to write to $fileout</b></font>");        $request->print("<font color=\"red\" size=\"+1\"><b>Unable to write to $file</b></font>");
       $error|=4;        $error|=4;
     }      }
   }    }
   return $error;    return $error;
 }  }
   
   sub analyze {
     my ($request,$file) = @_;
     &Apache::lonxml::debug("Analyze");
     my $result=&Apache::lonnet::ssi($request->uri,('grade_target' => 'analyze'));
     &Apache::lonxml::debug(":$result:");
     (my $garbage,$result)=split(/_HASH_REF__/,$result,2);
     &showhash(&Apache::lonnet::str2hash($result));
     return $result;
   }
   
 sub editxmlmode {  sub editxmlmode {
   my ($request,$file) = @_;    my ($request,$file) = @_;
   my $result;    my $result;
Line 276  sub editxmlmode { Line 309  sub editxmlmode {
             <input type="submit" name="Undo" value="undo" />              <input type="submit" name="Undo" value="undo" />
             <hr />              <hr />
             <textarea rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.              <textarea rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.
       $problem.'</textarea>        &HTML::Entities::encode($problem).'</textarea>
             </form></body></html>';              </form></body></html>';
   $request->print($result);    $request->print($result);
   return '';    return '';
Line 286  sub renderpage { Line 319  sub renderpage {
   my ($request,$file) = @_;    my ($request,$file) = @_;
   
   my (@targets) = &get_target();    my (@targets) = &get_target();
     &Apache::lonxml::debug("Running targets ".join(':',@targets));
   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 298  sub renderpage { Line 332  sub renderpage {
     my $result = '';      my $result = '';
     &Apache::inputtags::initialize_inputtags;      &Apache::inputtags::initialize_inputtags;
     &Apache::edit::initialize_edit;      &Apache::edit::initialize_edit;
       if ($target eq 'analyze') { %Apache::lonhomework::anaylze=(); }
     if ($target eq 'web') {      if ($target eq 'web') {
       if (&Apache::lonnet::symbread() eq '') {        my ($symb)=&Apache::lonxml::whichuser();
         if ($symb eq '') {
  if ($ENV{'request.state'} eq "construct") {   if ($ENV{'request.state'} eq "construct") {
  } else {   } else {
   $request->print("Browsing or <a href=\"/adm/ambiguous\">ambiguous</a> reference, submissions ignored<br />");    $request->print("Browsing or <a href=\"/adm/ambiguous\">ambiguous</a> reference, submissions ignored<br />");
Line 314  sub renderpage { Line 350  sub renderpage {
       &Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>");        &Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>");
       $default='';        $default='';
     }      }
     $result = &Apache::lonxml::xmlparse($target, $problem,      &Apache::lonxml::debug("Should be parsing now");
       $result = &Apache::lonxml::xmlparse($request, $target, $problem,
  $default.&setup_vars($target),%mystyle);   $default.&setup_vars($target),%mystyle);
   
     #$request->print("Result follows:");      #$request->print("Result follows:");
     if ($target eq 'modified') {      if ($target eq 'modified') {
       &handle_save_or_undo($request,\$problem,\$result);        &handle_save_or_undo($request,\$problem,\$result);
     } else {      } else {
         if ($target eq 'analyze') {
    $result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze);
    undef(%Apache::lonhomework::analyze);
         }
       #my $td=&tv_interval($t0);        #my $td=&tv_interval($t0);
       #if ( $Apache::lonxml::debug) {        #if ( $Apache::lonxml::debug) {
  #$result =~ s:</body>::;   #$result =~ s:</body>::;
Line 428  sub handler { Line 469  sub handler {
   $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});    $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});
   $Apache::lonhomework::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});    $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
     # the last one
     if ( defined($ENV{'form.problemmode'}) &&
          ref($ENV{'form.problemmode'}) ) {
       my $mode=$ENV{'form.problemmode'}->[-1];
       undef $ENV{'form.problemmode'};
       $ENV{'form.problemmode'}=$mode;
     }
   &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});    &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});
   my $file=&Apache::lonnet::filelocation("",$request->uri);    my $file=&Apache::lonnet::filelocation("",$request->uri);
   
Line 453  sub handler { Line 502  sub handler {
  &renderpage($request,$file);   &renderpage($request,$file);
       } elsif ($ENV{'form.problemmode'} eq 'EditXML') {        } elsif ($ENV{'form.problemmode'} eq 'EditXML') {
  &editxmlmode($request,$file);   &editxmlmode($request,$file);
         } elsif ($ENV{'form.problemmode'} eq 'Answer Distribution') {
    &analyze($request,$file);
       } else {        } else {
  &renderpage($request,$file);   &renderpage($request,$file);
       }        }
Line 462  sub handler { Line 513  sub handler {
     }      }
   } else {    } else {
     # just render the page normally outside of construction space      # just render the page normally outside of construction space
       &Apache::lonxml::debug("not construct");
     &renderpage($request,$file);      &renderpage($request,$file);
   }    }
   #my $td=&tv_interval($t0);    #my $td=&tv_interval($t0);

Removed from v.1.68  
changed lines
  Added in v.1.78


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