Diff for /loncom/homework/lonhomework.pm between versions 1.153 and 1.226

version 1.153, 2003/10/14 15:47:50 version 1.226, 2005/11/21 21:51:29
Line 24 Line 24
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  
 # Guy Albertelli  
 # 11/30 Gerd Kortemeyer  
 # 6/1,8/17,8/18 Gerd Kortemeyer  
 # 7/18 Jeremy Bowers  
   
 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();
Line 51  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 );
   use Apache::lonnet();
   
   # FIXME - improve commenting
   
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register_insert();      &Apache::lonxml::register_insert();
 }  }
   
   
   #
   # Decides what targets to render for.
   # Implicit inputs:
   #   Various session environment variables:
   #      request.state -  published  - is a /res/ resource
   #                       uploaded   - is a /uploaded/ resource
   #                       contruct   - is a /priv/ resource
   #      form.grade_target - a form parameter requesting a specific target
 sub get_target {  sub get_target {
     if (($ENV{'request.state'} eq "published") ||      &Apache::lonxml::debug("request.state = $env{'request.state'}");
  ($ENV{'request.state'} eq "uploaded")) {      if( defined($env{'form.grade_target'})) {
  if ( defined($ENV{'form.grade_target'}  )    &Apache::lonxml::debug("form.grade_target= $env{'form.grade_target'}");
      && ($ENV{'form.grade_target'} eq 'tex')) {      } else {
     return ($ENV{'form.grade_target'});   &Apache::lonxml::debug("form.grade_target <undefined>");
  } elsif ( defined($ENV{'form.grade_target'}  )       }
       if (($env{'request.state'} eq "published") ||
    ($env{'request.state'} eq "uploaded")) {
    if ( defined($env{'form.grade_target'}  ) 
        && ($env{'form.grade_target'} eq 'tex')) {
       return ($env{'form.grade_target'});
    } elsif ( defined($env{'form.grade_target'}  ) 
   && ($Apache::lonhomework::viewgrades eq 'F' )) {    && ($Apache::lonhomework::viewgrades eq 'F' )) {
     return ($ENV{'form.grade_target'});      return ($env{'form.grade_target'});
  }   }
    if ($env{'form.webgrade'} &&
  if ( defined($ENV{'form.submitted'}) &&      $Apache::lonhomework::modifygrades eq 'F') {
      ( !defined($ENV{'form.resetdata'})) &&      return ('grade','webgrade');
      ( !defined($ENV{'form.newrandomization'}))) {   }
    if ( defined($env{'form.submitted'}) &&
        ( !defined($env{'form.resetdata'})) &&
        ( !defined($env{'form.newrandomization'}))) {
     return ('grade', 'web');      return ('grade', 'web');
  } else {   } else {
     return ('web');      return ('web');
  }   }
     } elsif ($ENV{'request.state'} eq "construct") {      } elsif ($env{'request.state'} eq "construct") {
  if ( defined($ENV{'form.grade_target'}) ) {   if ( defined($env{'form.grade_target'}) ) {
     return ($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');
     } else {      } else {
  return ('web');   return ('web');
     }      }
  } else {   } else {
     if ( $ENV{'form.problemmode'} eq &mt('View') ||      if ( $env{'form.problemmode'} eq &mt('View') ||
  $ENV{'form.problemmode'} eq &mt('Discard Edits and View')) {   $env{'form.problemmode'} eq &mt('Discard Edits and View')) {
  if ( defined($ENV{'form.submitted'}) &&   if ( defined($env{'form.submitted'}) &&
      (!defined($ENV{'form.resetdata'})) &&       (!defined($env{'form.resetdata'})) &&
      (!defined($ENV{'form.newrandomization'}))) {       (!defined($env{'form.newrandomization'}))) {
     return ('grade', 'web','answer');      return ('grade', 'web','answer');
  } else {   } else {
     return ('web','answer');      return ('web','answer');
  }   }
     } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') ) {      } elsif ( $env{'form.problemmode'} eq &mt('Edit') ||
  if ( $ENV{'form.submitted'} eq 'edit' ) {        $env{'form.problemmode'} eq 'Edit') {
     if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) {   if ( $env{'form.submitted'} eq 'edit' ) {
       if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {
  return ('modified','web','answer');   return ('modified','web','answer');
     } else {      } else {
  return ('modified','edit');   return ('modified','no_output_web','edit');
     }      }
  } else {   } else {
     return ('edit');      return ('no_output_web','edit');
  }   }
     } else {      } else {
  return ('web');   return ('web');
Line 126  sub setup_vars { Line 146  sub setup_vars {
 sub send_header {  sub send_header {
     my ($request)= @_;      my ($request)= @_;
     $request->print(&Apache::lontexconvert::header());      $request->print(&Apache::lontexconvert::header());
 #  $request->print('<form name='.$ENV{'form.request.prefix'}.'lonhomework method="POST" action="'.$request->uri.'">');  #  $request->print('<form name='.$env{'form.request.prefix'}.'lonhomework method="POST" action="'.$request->uri.'">');
 }  }
   
 sub createmenu {  sub createmenu {
Line 145  sub send_footer { Line 165  sub send_footer {
     $request->print(&Apache::lontexconvert::footer());      $request->print(&Apache::lontexconvert::footer());
 }  }
   
 $Apache::lonxml::browse='';  sub proctor_checked_in {
       my ($slot_name,$slot,$type)=@_;
       my @possible_proctors=split(",",$slot->{'proctor'});
       
       my $key;
       if ($type eq 'Task') {
    my $version=$Apache::lonhomework::history{'resource.version'};
    $key ="resource.$version.checkedin";
       } elsif ($type eq 'problem') {
    $key ='resource.0.checkedin';
       }
       
       foreach my $possible (@possible_proctors) { 
    if ($Apache::lonhomework::history{$key} eq $possible
       && $Apache::lonhomework::history{$key.'.slot'} eq $slot_name) {
       return 1;
    }
       }
       
       return 0;
   }
   
   $Apache::lonxml::browse='';
 sub check_ip_acc {  sub check_ip_acc {
     my ($acc)=@_;      my ($acc)=@_;
     if (!defined($acc)) { return 1; }      &Apache::lonxml::debug("acc is $acc");
       if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { 
    return 1;
       }
     my $allowed=0;      my $allowed=0;
     my $ip=$ENV{'REMOTE_ADDR'};      my $ip=$ENV{'REMOTE_ADDR'};
     my $name;      my $name;
Line 174  sub check_ip_acc { Line 218  sub check_ip_acc {
  use Socket;   use Socket;
  my $netaddr=inet_aton($ip);   my $netaddr=inet_aton($ip);
  ($name)=gethostbyaddr($netaddr,AF_INET);   ($name)=gethostbyaddr($netaddr,AF_INET);
  }      }
     if ($name =~ /\Q$pattern\E$/i) { $allowed=1; }      if ($name =~ /\Q$pattern\E$/i) { $allowed=1; }
  } elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) {   } elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) {
     #127.0.0.1      #127.0.0.1
Line 192  sub check_ip_acc { Line 236  sub check_ip_acc {
     }      }
     return $allowed;      return $allowed;
 }  }
   
   sub check_slot_access {
       my ($id,$type)=@_;
   
       # does it pass normal muster
       my ($status,$datemsg)=&check_access($id);
       
       my $useslots = &Apache::lonnet::EXT("resource.$id.useslots");
       if ($useslots ne 'resource') {
    return ($status,$datemsg);
       }
   
       if ($status eq 'SHOW_ANSWER' ||
    $status eq 'CLOSED' ||
    $status eq 'INVALID_ACCESS' ||
    $status eq 'UNAVAILABLE') {
    return ($status,$datemsg);
       }
       if ($env{'request.state'} eq "construct") {
    return ($status,$datemsg);
       }
       
       if ($type eq 'Task') {
    my $version=$Apache::lonhomework::history{'resource.version'};
    if ($Apache::lonhomework::history{"resource.$version.checkedin"} &&
       $Apache::lonhomework::history{"resource.$version.status"} eq 'pass') {
       return ('SHOW_ANSWER');
    }
       }
   
       my @slots=
    (split(':',&Apache::lonnet::EXT("resource.$id.availablestudent")),
    split(':',&Apache::lonnet::EXT("resource.$id.available")));
   
   #    if (!@slots) {
   # return ($status,$datemsg);
   #    }
       my $slotstatus='NOT_IN_A_SLOT';
       my ($returned_slot,$slot_name);
       foreach my $slot (@slots) {
    &Apache::lonxml::debug("getting $slot");
    my %slot=&Apache::lonnet::get_slot($slot);
    &Apache::lonhomework::showhash(%slot);
    if ($slot{'starttime'} < time &&
       $slot{'endtime'} > time &&
       &check_ip_acc($slot{'ip'})) {
       &Apache::lonxml::debug("$slot is good");
       $slotstatus='NEEDS_CHECKIN';
       $returned_slot=\%slot;
       $slot_name=$slot;
       last;
    }
       }
       if ($slotstatus eq 'NEEDS_CHECKIN' &&
    &proctor_checked_in($slot_name,$returned_slot,$type)) {
    &Apache::lonxml::debug("protoctor checked in");
    $slotstatus='CAN_ANSWER';
       }
   
       my ($pass_status,$checkedin);
       if ($type eq 'Task') {
    my $version=$Apache::lonhomework::history{'resource.version'};
    $pass_status = 
       $Apache::lonhomework::history{"resource.$version.status"} eq 'fail';
    $checkedin =
       $Apache::lonhomework::history{"resource.$version.checkedin"};
       } elsif ($type eq 'problem') {
    $pass_status = 1;
    $checkedin = $Apache::lonhomework::history{"resource.0.checkedin"};
       }
       
       if ($slotstatus eq 'NOT_IN_A_SLOT' 
    && $checkedin ) {
   
    if ($pass_status) {
       return ('SHOW_ANSWER');
    } else {
       return ('WAITING_FOR_GRADE');
    }
   
       }
       if ( $status eq 'CANNOT_ANSWER' && 
    ($slotstatus ne 'NEEDS_CHECKIN' && $slotstatus ne 'NOT_IN_A_SLOT')) {
    return ($status,$datemsg);
       }
   
       return ($slotstatus,$datemsg,$slot_name,$returned_slot);
   }
   
 # JB, 9/24/2002: Any changes in this function may require a change  # JB, 9/24/2002: Any changes in this function may require a change
 # in lonnavmaps::resource::getDateStatus.  # in lonnavmaps::resource::getDateStatus.
 sub check_access {  sub check_access {
Line 200  sub check_access { Line 333  sub check_access {
     my $status;      my $status;
     my $datemsg = '';      my $datemsg = '';
     my $lastdate = '';      my $lastdate = '';
     my $temp;  
     my $type;      my $type;
     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("may be open from a different computer.");  
  return($status,$date);  
     }  
   
     foreach $temp ("opendate","duedate","answerdate") {      my ($symb)=&Apache::lonxml::whichuser();
  $lastdate = $date;      &Apache::lonxml::debug("symb:".$symb);
  $date = &Apache::lonnet::EXT("resource.$id.$temp");      #if ($env{'request.state'} ne "construct" && $symb ne '') {
  my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type");      if ($env{'request.state'} ne "construct") {
  if ($thistype =~ /^(con_lost|no_such_host)/ ||   my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));
     $date     =~ /^(con_lost|no_such_host)/) {   if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {
     $status='UNAVAILABLE';      $status='INVALID_ACCESS';
     $date=&mt("may open later.");      $date=&mt("can not be accessed from your location.");
     return($status,$date);      return($status,$date);
  }   }
  if ($thistype eq 'date_interval') {  
     if ($temp eq 'opendate') {   foreach my $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';
  &Apache::lonxml::debug("found :$date: for :$temp:");   $date=&mt("may open later.");
  if ($date eq '') {   return($status,$date);
     $date = &mt("an unknown date"); $passed = 0;      }
  } elsif ($date eq 'con_lost') {      if ($thistype eq 'date_interval') {
     $date = &mt("an indeterminate date"); $passed = 0;   if ($temp eq 'opendate') {
  } else {      $date=&Apache::lonnet::EXT("resource.$id.duedate")-$date;
     if (time < $date) { $passed = 0; } else { $passed = 1; }   }
     $date = localtime $date;   if ($temp eq 'answerdate') {
  }      $date=&Apache::lonnet::EXT("resource.$id.duedate")+$date;
  if (!$passed) { $type=$temp; last; }   }
     }      }
     &Apache::lonxml::debug("have :$type:$passed:");      &Apache::lonxml::debug("found :$date: for :$temp:");
     if ($passed) {      if ($date eq '') {
  $status='SHOW_ANSWER';   $date = &mt("an unknown date"); $passed = 0;
  $datemsg=$date;      } elsif ($date eq 'con_lost') {
     } elsif ($type eq 'opendate') {   $date = &mt("an indeterminate date"); $passed = 0;
  $status='CLOSED';      } else {
  $datemsg = &mt("will open on")." $date";   if (time < $date) { $passed = 0; } else { $passed = 1; }
     } elsif ($type eq 'duedate') {   $date = localtime $date;
  $status='CAN_ANSWER';      }
  $datemsg = &mt("is due at")." $date";      if (!$passed) { $type=$temp; last; }
     } elsif ($type eq 'answerdate') {   }
  $status='CLOSED';   &Apache::lonxml::debug("have :$type:$passed:");
  $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";   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' ||
    (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED'))) {
  #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 280  sub check_access { Line 431  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=&seconds_to_human_length($interval);
       } 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 297  sub check_access { Line 467  sub check_access {
     return ($status,$datemsg);      return ($status,$datemsg);
 }  }
   
   sub seconds_to_human_length {
       my ($length)=@_;
   
       my $seconds=$length%60; $length=int($length/60);
       my $minutes=$length%60; $length=int($length/60);
       my $hours=$length%24;   $length=int($length/24);
       my $days=$length;
   
       my $timestr;
       if ($days > 0) { $timestr.=&mt('[quant,_1,day]',$days); }
       if ($hours > 0) { $timestr.=($timestr?", ":"").
     &mt('[quant,_1,hour]',$hours); }
       if ($minutes > 0) { $timestr.=($timestr?", ":"").
       &mt('[quant,_1,minute]',$minutes); }
       if ($seconds > 0) { $timestr.=($timestr?", ":"").
       &mt('[quant,_1,second]',$seconds); }
       return $timestr;
   }
   
 sub showhash {  sub showhash {
     my (%hash) = @_;      my (%hash) = @_;
     &showhashsubset(\%hash,'.');      &showhashsubset(\%hash,'.');
Line 307  sub showarray { Line 496  sub showarray {
     my ($array)=@_;      my ($array)=@_;
     my $string="(";      my $string="(";
     foreach my $elm (@{ $array }) {      foreach my $elm (@{ $array }) {
  if (ref($elm)) {   if (ref($elm) eq 'ARRAY') {
     if ($elm =~ /ARRAY/ ) {      $string.=&showarray($elm);
  $string.=&showarray($elm);   } elsif (ref($elm) eq 'HASH') {
     }      $string.= "HASH --- \n<br />";
       $string.= &showhashsubset($elm,'.');
  } else {   } else {
     $string.="$elm,"      $string.="$elm,"
  }   }
Line 324  sub showhashsubset { Line 514  sub showhashsubset {
     my ($hash,$keyre) = @_;      my ($hash,$keyre) = @_;
     my $resultkey;      my $resultkey;
     foreach $resultkey (sort keys %$hash) {      foreach $resultkey (sort keys %$hash) {
  if ($resultkey =~ /$keyre/) {   if ($resultkey !~ /$keyre/) { next; }
     if (ref($$hash{$resultkey})) {   if (ref($$hash{$resultkey})  eq 'ARRAY' ) {
  if ($$hash{$resultkey} =~ /ARRAY/ ) {      &Apache::lonxml::debug("$resultkey ---- ".
     &Apache::lonxml::debug("$resultkey ---- ".     &showarray($$hash{$resultkey}));
    &showarray($$hash{$resultkey}));   } elsif (ref($$hash{$resultkey}) eq 'HASH' ) {
  } elsif ($$hash{$resultkey} =~ /HASH/ ) {      &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
     &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");      &showhashsubset($$hash{$resultkey},'.');
     &showhashsubset($$hash{$resultkey},'.');   } else {
  } else {      &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
     &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");
Line 345  sub showhashsubset { Line 530  sub showhashsubset {
 }  }
   
 sub setuppermissions {  sub setuppermissions {
     $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});      $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'});
     my $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});      my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     if (! $viewgrades &&       if (! $viewgrades && 
  exists($ENV{'request.course.sec'}) &&    exists($env{'request.course.sec'}) && 
  $ENV{'request.course.sec'} !~ /^\s*$/) {   $env{'request.course.sec'} !~ /^\s*$/) {
  $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}.   $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}.
                                                '/'.$ENV{'request.course.sec'});                                                 '/'.$env{'request.course.sec'});
       }
       $Apache::lonhomework::viewgrades = $viewgrades; # File global variable...dirt.
       if ($Apache::lonhomework::browse eq 'F' && 
    $env{'form.devalidatecourseresdata'} eq 'on') {
    my (undef,$courseid) = &Apache::lonxml::whichuser();
    &Apache::lonnet::devalidatecourseresdata($env{"course.$courseid.num"},
         $env{"course.$courseid.domain"});
       }
       my $modifygrades = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
       if (! $modifygrades && 
    exists($env{'request.course.sec'}) && 
    $env{'request.course.sec'} !~ /^\s*$/) {
    $modifygrades = 
       &Apache::lonnet::allowed('mgr',$env{'request.course.id'}.
        '/'.$env{'request.course.sec'});
     }      }
     $Apache::lonhomework::viewgrades = $viewgrades;      $Apache::lonhomework::modifygrades = $modifygrades;
     return ''      return '';
 }  }
   
 sub setupheader {  sub setupheader {
     my $request=$_[0];      my $request=$_[0];
     if ($ENV{'browser.mathml'}) {      &Apache::loncommon::content_type($request,'text/html');
  &Apache::loncommon::content_type($request,'text/xml');  
     } else {  
  &Apache::loncommon::content_type($request,'text/html');  
     }  
     if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) {      if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) {
  &Apache::loncommon::no_cache($request);   &Apache::loncommon::no_cache($request);
     }      }
   #    $request->set_last_modified(&Apache::lonnet::metadata($request->uri,
   #  'lastrevisiondate'));
     $request->send_http_header;      $request->send_http_header;
     return OK if $request->header_only;      return OK if $request->header_only;
     return ''      return ''
Line 379  sub handle_save_or_undo { Line 577  sub handle_save_or_undo {
     my $filetmp =$file.".tmp";      my $filetmp =$file.".tmp";
     my $error=0;      my $error=0;
   
     if ($ENV{'form.Undo'} eq &mt('undo')) {      &Apache::lonnet::correct_line_ends($result);
   
       if ($env{'form.Undo'} eq &mt('undo')) {
  my $error=0;   my $error=0;
  if (!copy($file,$filetmp)) { $error=1; }   if (!copy($file,$filetmp)) { $error=1; }
  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 616  sub handle_save_or_undo {
   
 sub analyze_header {  sub analyze_header {
     my ($request) = @_;      my ($request) = @_;
     my $result.='<html>      my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
       ($env{'environment.remote'} ne 'off'));
       my $html=&Apache::lonxml::xmlbegin();
       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 444  sub analyze { Line 648  sub analyze {
     &Apache::lonxml::debug("Analyze");      &Apache::lonxml::debug("Analyze");
     my $result;      my $result;
     my %overall;      my %overall;
       my %seedexample;
     my %allparts;      my %allparts;
     my $rndseed=$ENV{'form.rndseed'};      my $rndseed=$env{'form.rndseed'};
     &analyze_header($request);      &analyze_header($request);
     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'},
     for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) {        'inline',undef);
       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 $thisseed=$i+$rndseed;
  my $subresult=&Apache::lonnet::ssi($request->uri,   my $subresult=&Apache::lonnet::ssi($request->uri,
    ('grade_target' => 'analyze'),     ('grade_target' => 'analyze'),
    ('rndseed' => $i+$rndseed));     ('rndseed' => $thisseed));
  (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2);   (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2);
  my %analyze=&Apache::lonnet::str2hash($subresult);   my %analyze=&Apache::lonnet::str2hash($subresult);
  my @parts;   my @parts;
Line 468  sub analyze { Line 676  sub analyze {
     if ($analyze{$part.'.type'} eq 'numericalresponse' ||      if ($analyze{$part.'.type'} eq 'numericalresponse' ||
  $analyze{$part.'.type'} eq 'stringresponse' ||   $analyze{$part.'.type'} eq 'stringresponse' ||
  $analyze{$part.'.type'} eq 'formularesponse'   ) {   $analyze{$part.'.type'} eq 'formularesponse'   ) {
    my $concatanswer=join("\0",@{ $analyze{$part.'.answer'} });
    if (($concatanswer eq '') || ($concatanswer=~/^\@/)) {
       @{$analyze{$part.'.answer'}}=('<font color="red">'.&mt('Error').'</font>');
    }
  push( @{ $overall{$part.'.answer'} },   push( @{ $overall{$part.'.answer'} },
       [@{ $analyze{$part.'.answer'} }]);        [@{ $analyze{$part.'.answer'} }]);
                   $seedexample{join("\0",@{ $analyze{$part.'.answer'}})}=$thisseed;
     }      }
  }   }
     }      }
     &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] });
     $request->print('<table><tr><td colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part.'</td></tr>');      $request->print('<table class="thinborder"><tr><th colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part.'</th></tr>');
     my %frequency;      my %frequency;
     foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'} })) {      foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'} })) {
  $frequency{join("\0",@{ $answer })}++;   $frequency{join("\0",@{ $answer })}++;
     }      }
     $request->print('<tr><td colspan="'.($num_cols).'">'.&mt('Answer').'</td><td>'.&mt('Frequency').'</td></tr>');      $request->print('<tr><th colspan="'.($num_cols).'">'.&mt('Answer').'</th><th>'.&mt('Frequency').'<br />('
       .&mt('click for example').')</th></tr>');
     foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {      foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {
  $request->print('<tr><td align="right">'.   $request->print('<tr><td class="center">'.
  join('</td><td align="right">',split("\0",$answer)).   join('</td><td class="center">',split("\0",$answer)).
  '</td><td>('.$frequency{$answer}.   '</td><td class="center"><a href="'.$request->uri.'?rndseed='.$seedexample{$answer}.'">'.$frequency{$answer}.
  ')</td></tr>');   '</a></td></tr>');
     }      }
     $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 responses 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 514  sub editxmlmode { Line 729  sub editxmlmode {
        " <i>$file</i></b>");         " <i>$file</i></b>");
  $problem='';   $problem='';
     }      }
     if (defined($ENV{'form.editxmltext'}) || defined($ENV{'form.Undo'})) {      if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) {
  my $error=&handle_save_or_undo($request,\$problem,   my $error=&handle_save_or_undo($request,\$problem,
        \$ENV{'form.editxmltext'});         \$env{'form.editxmltext'});
  if (!$error) { $problem=&Apache::lonnet::getfile($file); }   if (!$error) { $problem=&Apache::lonnet::getfile($file); }
     }      }
     &Apache::lonhomework::showhashsubset(\%ENV,'^form');      &Apache::lonhomework::showhashsubset(\%env,'^form');
     if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) {      if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {
  &Apache::lonhomework::showhashsubset(\%ENV,'^form');   &Apache::lonhomework::showhashsubset(\%env,'^form');
  $ENV{'form.problemmode'}='View';   $env{'form.problemmode'}='View';
  &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">   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
    ($env{'environment.remote'} ne 'off'));
    my $html=&Apache::lonxml::xmlbegin();
    $result.=$html.$bodytag.
       &renderpage($request,$file,['no_output_web'],1).
       &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 style="width:100%" 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 '';
 }  }
   
   #
   #    Render the page in whatever target desired.
   #
 sub renderpage {  sub renderpage {
     my ($request,$file) = @_;      my ($request,$file,$targets,$return_string) = @_;
   
     my (@targets) = &get_target();      my @targets = @{$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) {
    # 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 $output=1;
    if ($target eq 'no_output_web') {
       $target = 'web'; $output=0;
    }
  my $problem=&Apache::lonnet::getfile($file);   my $problem=&Apache::lonnet::getfile($file);
    my $result;
  if ($problem eq -1) {   if ($problem eq -1) {
     &Apache::lonxml::error("<b> ".&mt('Unable to find')." <i>$file</i></b>");      my $filename=(split('/',$file))[-1];
       $result.="<b> ".&mt('Unable to find')." <i>$filename</i></b>";
     $problem='';      $problem='';
  }   }
   
  my %mystyle;   my %mystyle;
  my $result = '';  
  if ($target eq 'analyze') { %Apache::lonhomework::analyze=(); }   if ($target eq 'analyze') { %Apache::lonhomework::analyze=(); }
  if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }   if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }
  if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%ENV,'^form');}   if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');}
   
  &Apache::lonxml::debug("Should be parsing now");   &Apache::lonxml::debug("Should be parsing now");
  $result = &Apache::lonxml::xmlparse($request, $target, $problem,   $result .= &Apache::lonxml::xmlparse($request, $target, $problem,
     &setup_vars($target),%mystyle);       &setup_vars($target),%mystyle);
  undef($Apache::lonhomework::parsing_a_problem);   undef($Apache::lonhomework::parsing_a_problem);
    if (!$output) { $result = ''; }
  #$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);
Line 587  sub renderpage { Line 831  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);
     }      }
       if (!$return_string) {
    &Apache::lonxml::add_messages(\$overall_result);
    $request->print($overall_result);   
    $request->rflush();   
       } else {
    return $overall_result;
       }
 }  }
   
 # 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 624  sub newproblem { Line 876  sub newproblem {
     $extension=~s:^.*\.([\w]+)$:$1:;      $extension=~s:^.*\.([\w]+)$:$1:;
     &Apache::lonxml::debug("Looking for :$extension:");      &Apache::lonxml::debug("Looking for :$extension:");
     my $templatelist=&get_template_list('',$extension);      my $templatelist=&get_template_list('',$extension);
     if ($ENV{'form.template'} &&      if ($env{'form.template'} &&
  $ENV{'form.template'} ne "Select a $extension template") {   $env{'form.template'} ne "Select a $extension template") {
  use File::Copy;   use File::Copy;
  my $file = &get_template_list($ENV{'form.template'},$extension);   my $file = &get_template_list($env{'form.template'},$extension);
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  copy($file,$dest);   copy($file,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } elsif($ENV{'form.newfile'} && !$templatelist) {      } elsif($env{'form.newfile'} && !$templatelist) {
  # I don't like hard-coded filenames but for now, this will work.   # I don't like hard-coded filenames but for now, this will work.
  use File::Copy;   use File::Copy;
  my $templatefilename =   my $templatefilename =
Line 641  sub newproblem { Line 893  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;
    $shownurl=~s-^/~-/priv/-;
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  my $errormsg;   my $errormsg;
  if ($ENV{'form.newfile'}) {   if ($env{'form.newfile'}) {
     $errormsg='<p><font color="red">'.&mt('You did not select a template.').'</font></p>'."\n";      $errormsg='<p><font color="red">'.&mt('You did not select a template.').'</font></p>'."\n";
  }   }
  my $instructions;   my $instructions;
    my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
    ($env{'environment.remote'} ne 'off'));
  if ($templatelist) { $instructions=&mt(", select a template from the pull-down menu below.").'<br />'.&mt("Then");}   if ($templatelist) { $instructions=&mt(", select a template from the pull-down menu below.").'<br />'.&mt("Then");}
  my %lt=&Apache::lonlocal::texthash( 'create' => 'Creating a new',   my %lt=&Apache::lonlocal::texthash( 'create' => 'Creating a new',
   'resource' => 'resource',    'resource' => 'resource',
Line 658  sub newproblem { Line 914  sub newproblem {
   'Create' => 'Create',    'Create' => 'Create',
   'button' => 'button');    'button' => 'button');
  $request->print(<<ENDNEWPROBLEM);   $request->print(<<ENDNEWPROBLEM);
 <body bgcolor="#FFFFFF">  $bodytag
 <h1>$lt{'create'} $extension $lt{'resource'}</h1>  <h1>$lt{'create'} $extension $lt{'resource'}</h1>
 $errormsg  $errormsg
 $lt{'requested'} <tt>$url</tt> $lt{'not exist'}.  $lt{'requested'} <tt>$shownurl</tt> $lt{'not exist'}.
 <p>  <p>
 <b>$lt{'createnew'} $extension$instructions $lt{'click'} "$lt{'Create'} $extension" $lt{'button'}.</b>  <b>$lt{'createnew'} $extension$instructions $lt{'click'} "$lt{'Create'} $extension" $lt{'button'}.</b>
 </p>  </p>
Line 678  ENDNEWPROBLEM Line 934  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 687  sub view_or_edit_menu { Line 943  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 698  EDITMENU Line 954  EDITMENU
 sub handler {  sub handler {
     #my $t0 = [&gettimeofday()];      #my $t0 = [&gettimeofday()];
     my $request=$_[0];      my $request=$_[0];
           $Apache::lonxml::request=$request;
     $Apache::lonxml::debug=$ENV{'user.debug'};      $Apache::lonxml::debug=$env{'user.debug'};
       $env{'request.uri'}=$request->uri;
     if (&setupheader($request)) { return OK; }      &setuppermissions();
     $ENV{'request.uri'}=$request->uri;  
   
     #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:");  
     # some times multiple problemmodes are submitted, need to select      # some times multiple problemmodes are submitted, need to select
     # the last one      # the last one
     &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});      if ( defined($env{'form.problemmode'}) && ref($env{'form.problemmode'}) ) {
     if ( defined($ENV{'form.problemmode'}) &&   my $mode=$env{'form.problemmode'}->[-1];
  ref($ENV{'form.problemmode'}) ) {   undef $env{'form.problemmode'};
  &Apache::lonxml::debug("Problem Mode ".join(",",@$ENV{'form.problemmode'}));   $env{'form.problemmode'}=$mode;
  my $mode=$ENV{'form.problemmode'}->[-1];  
  undef $ENV{'form.problemmode'};  
  $ENV{'form.problemmode'}=$mode;  
     }      }
     &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});  
     my $file=&Apache::lonnet::filelocation("",$request->uri);      my $file=&Apache::lonnet::filelocation("",$request->uri);
   
     #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 ) {      $request->internal_redirect('/adm/ambiguous'); return OK;
  &Apache::lonnet::cleanenv();  
     }  
     $request->internal_redirect('/adm/ambiguous'); return;  
  }   }
     }      }
       if (&setupheader($request)) { return OK; }
       &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:");
       &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
     my ($symb) = &Apache::lonxml::whichuser();      my ($symb) = &Apache::lonxml::whichuser();
     &Apache::lonxml::debug('symb is '.$symb);      &Apache::lonxml::debug('symb is '.$symb);
     if ($ENV{'request.state'} eq "construct" || $symb eq '') {      if ($env{'request.state'} eq "construct" || $symb eq '') {
  if ($ENV{'form.resetdata'} eq &mt('Reset Submissions') ||   if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
     $ENV{'form.resetdata'} eq &mt('New Problem Variation') ||      $env{'form.resetdata'} eq &mt('New Problem Variation') ||
     $ENV{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();      my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
     &Apache::lonnet::tmpreset($symb,'',$domain,$name);      &Apache::lonnet::tmpreset($symb,'',$domain,$name);
     &Apache::lonxml::debug("Attempt reset");      &Apache::lonxml::debug("Attempt reset");
  }   }
     }      }
     if ($ENV{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  if ( -e $file ) {   if ( -e $file ) {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['problemmode']);      ['problemmode']);
     if (!(defined $ENV{'form.problemmode'})) {      if (!(defined $env{'form.problemmode'})) {
  #first visit to problem in construction space   #first visit to problem in construction space
  #&view_or_edit_menu($request);   #&view_or_edit_menu($request);
  $ENV{'form.problemmode'}='View';   $env{'form.problemmode'}='View';
  &renderpage($request,$file);   &renderpage($request,$file);
     } elsif ($ENV{'form.problemmode'} eq &mt('EditXML')) {      } elsif ($env{'form.problemmode'} eq &mt('EditXML') ||
        $env{'form.problemmode'} eq 'EditXML') {
  &editxmlmode($request,$file);   &editxmlmode($request,$file);
     } elsif ($ENV{'form.problemmode'} eq &mt('Calculate answers')) {      } elsif ($env{'form.problemmode'} eq &mt('Calculate answers')) {
  &analyze($request,$file);   &analyze($request,$file);
     } else {      } else {
  &renderpage($request,$file);   &renderpage($request,$file);

Removed from v.1.153  
changed lines
  Added in v.1.226


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.