Diff for /loncom/homework/bridgetask.pm between versions 1.170 and 1.173

version 1.170, 2006/06/13 20:48:05 version 1.173, 2006/06/16 09:27:38
Line 316  sub show_task { Line 316  sub show_task {
     return 1;      return 1;
 }  }
   
   my @delay;
   sub nest { 
       if (@delay) {
    return $delay[-1];
       } else {
    return;
       }
   }
   
   sub nested_parse {
       my ($str,$env,$args) = @_;
       my @old_env = @Apache::scripttag::parser_env;
       @Apache::scripttag::parser_env = @$env;
       if (exists($args->{'set_dim_id'})) {
    &enable_dimension_parsing($args->{'set_dim_id'});
       }
       push(@delay,(($args->{'delayed_dim_results'})? 1 : 0));
       my $result = &Apache::scripttag::xmlparse($$str);
       pop(@delay);
       if (exists($args->{'set_dim_id'})) {
    &disable_dimension_parsing();
       }
       @Apache::scripttag::parser_env = @old_env;
       if ($args->{'delayed_dim_results'}) {
    my $dim = &get_dim_id();
    return $dimension{$dim}{'result'};
       }
       return $result;
   }
   
 sub internal_location {  sub internal_location {
     my ($id)=@_;      my ($id)=@_;
     return '<!-- LONCAPA_INTERNAL_ADD_TASK_STATUS'.$id.' -->';      return '<!-- LONCAPA_INTERNAL_ADD_TASK_STATUS'.$id.' -->';
Line 1907  sub start_Setup { Line 1937  sub start_Setup {
     &Apache::lonxml::startredirection();      &Apache::lonxml::startredirection();
     return &internal_location($dim);      return &internal_location($dim);
 }  }
   
   {
       my @allowed;
       sub enable_dimension_parsing {
    my ($id) = @_;
    push(@allowed,$id);
       }
       sub disable_dimension_parsing {
    pop(@allowed);
       }
       sub skip_dimension_parsing {
    my ($check) = @_;
    if (!@allowed) { return 0;}
    # if unspecified allow any id
    if ($allowed[-1] eq undef) { return 0;}
   
    return ($check ne $allowed[-1]);
       }
   }
   
 sub start_Question { return &start_Dimension(@_); }  sub start_Question { return &start_Dimension(@_); }
 sub start_Dimension {  sub start_Dimension {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $dim = &get_id($parstack,$safeeval);      my $dim = &get_id($parstack,$safeeval);
     my $previous_dim;      my $previous_dim;
     if (@Apache::bridgetask::dimension) {      if (@Apache::bridgetask::dimension) {
  $previous_dim = $Apache::bridgetask::dimension[-1];   $previous_dim = $Apache::bridgetask::dimension[-1];
  push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},   push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},
      $dim);       $dim);
  # FIXME need to add as a 'criteria' for nesting   if(&skip_dimension_parsing($dim)) {
  $dimension{$previous_dim}{'criteria.'.$dim}='';      $dimension{$previous_dim}{'criteria.'.$dim} =
    $token->[4]
    .&Apache::lonxml::get_all_text('/'.$tagstack->[-1],$parser,
         $style)
    .'</'.$tagstack->[-1].'>';
    }
  $dimension{$previous_dim}{'criteria.'.$dim.'.type'}='dimension';   $dimension{$previous_dim}{'criteria.'.$dim.'.type'}='dimension';
  $dimension{$previous_dim}{'criteria.'.$dim.'.mandatory'}=   $dimension{$previous_dim}{'criteria.'.$dim.'.mandatory'}=
     &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);      &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
  push(@{$dimension{$previous_dim}{'criterias'}},$dim);   push(@{$dimension{$previous_dim}{'criterias'}},$dim);
    $dimension{$dim}{'nested'}=$previous_dim;
    &Apache::lonxml::debug("adding $dim as criteria to $previous_dim");
     } else {      } else {
  $Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=   $Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=
     &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);      &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
     }      }
     push(@Apache::bridgetask::dimension,$dim);      push(@Apache::bridgetask::dimension,$dim);
     &Apache::lonxml::startredirection();      &Apache::lonxml::startredirection();
       &enable_dimension_parsing($dim);
     return &internal_location($dim);      return &internal_location($dim);
 }  }
   
Line 1964  sub get_instance { Line 2022  sub get_instance {
  if (defined($instance)) { return $instance; }   if (defined($instance)) { return $instance; }
   
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber();
  my @instances = @{$dimension{$dim}{'instances'}};   if (ref($dimension{$dim}{'instances'}) eq 'ARRAY') {
  # remove disabled instances      my @instances = @{$dimension{$dim}{'instances'}};
  for (my $i=0; $i < $#instances; $i++) {      # remove disabled instances
     if ($dimension{$dim}{$instances[$i].'.disabled'}) {      for (my $i=0; $i < $#instances; $i++) {
  splice(@instances,$i,1);   if ($dimension{$dim}{$instances[$i].'.disabled'}) {
  $i--;      splice(@instances,$i,1);
       $i--;
    }
       }
       @instances = &Math::Random::random_permutation(@instances);
       $instance  = $instances[($version-1)%scalar(@instances)];
       if ($version =~ /^\d$/) {
    $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = 
       $instance;
    $Apache::lonhomework::results{'INTERNAL_store'} = 1; 
     }      }
  }  
  @instances = &Math::Random::random_permutation(@instances);  
  $instance  = $instances[($version-1)%scalar(@instances)];  
  if ($version =~ /^\d$/) {  
     $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =   
  $instance;  
     $Apache::lonhomework::results{'INTERNAL_store'} = 1;   
  }   }
  &Apache::response::poprandomnumber();   &Apache::response::poprandomnumber();
  return $instance;   return $instance;
Line 2008  sub get_criteria { Line 2068  sub get_criteria {
  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  my $result=&Apache::lonxml::endredirection();   my $result=&Apache::lonxml::endredirection();
  my $dim=&get_id($parstack,$safeeval);   my $dim=&get_id($parstack,$safeeval);
    if (&skip_dimension_parsing($dim)) {
       &disable_dimension_parsing($dim);
       pop(@Apache::bridgetask::dimension);
       return;
    }
  my $instance=&get_instance($dim);   my $instance=&get_instance($dim);
  my $version=&get_version();   my $version=&get_version();
  if ($target eq 'web') {   if ($target eq 'web') {
     @Apache::scripttag::parser_env = @_;      $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
     $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});  
     my @instances = $instance;      my @instances = $instance;
     if (&Apache::response::showallfoils()) {      if (&Apache::response::showallfoils()) {
  @instances = @{$dimension{$dim}{'instances'}};   @instances = @{$dimension{$dim}{'instances'}};
     }      }
     my $shown_question_text;      my $shown_question_text;
     foreach my $instance (@instances) {      foreach my $instance (@instances) {
  @Apache::scripttag::parser_env = @_;   $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
  $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});   [@_]);
  @Apache::scripttag::parser_env = @_;   $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
  $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});   [@_],{'set_dim_id' => undef});
   
  my $task_status =    my $task_status = 
     $Apache::lonhomework::history{"resource.$version.0.status"};      $Apache::lonhomework::history{"resource.$version.0.status"};
  if ($task_status eq 'pass' || $task_status eq 'fail') {   if ($task_status ne 'pass' && $task_status ne 'fail') {
   
       foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
       @{$dimension{$dim}{'criterias'}}) {
    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
    &Apache::lonxml::debug("$id is $type");
    if ($type eq 'dimension') {
       $result.=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
    }
       }
    } else {
     my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};      my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
     my $mandatory='Mandatory';      my $mandatory='Mandatory';
     if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {      if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
Line 2072  sub get_criteria { Line 2146  sub get_criteria {
   
     foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension{$dim}{'criterias'}}) {      @{$dimension{$dim}{'criterias'}}) {
  # FIXME need to collect the dimension style criteria   
  # and output them here.  
  my $type = $dimension{$dim}{'criteria.'.$id.'.type'};   my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
  next if ($type eq 'dimension');   if ($type eq 'dimension') {
       $result.=$dimension{$id}{'result'};
       next;
    }
  my $status= &get_criteria('status', $version,$dim,$id);   my $status= &get_criteria('status', $version,$dim,$id);
  my $comment=&get_criteria('comment',$version,$dim,$id);   my $comment=&get_criteria('comment',$version,$dim,$id);
  my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');   my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
Line 2094  sub get_criteria { Line 2169  sub get_criteria {
  $result.=   $result.=
     '<div class="LC_'.$status.' LC_criteria"><h4>'      '<div class="LC_'.$status.' LC_criteria"><h4>'
     .$mandatory.' Criteria</h4><p>';      .$mandatory.' Criteria</h4><p>';
  @Apache::scripttag::parser_env = @_;   $result.=
  $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'criteria.'.$id});      &nested_parse(\$dimension{$dim}{'criteria.'.$id},
     [@_],{'set_dim_id' => $id});
  $result.='</p><p class="LC_grade">'.$status_display.'</p>';   $result.='</p><p class="LC_grade">'.$status_display.'</p>';
  if ($comment) {   if ($comment) {
     $result.='<p class="LC_comment">'.      $result.='<p class="LC_comment">'.
Line 2107  sub get_criteria { Line 2183  sub get_criteria {
     }      }
  } elsif ($target eq 'webgrade') {   } elsif ($target eq 'webgrade') {
     # in case of any side effects that we need      # in case of any side effects that we need
     @Apache::scripttag::parser_env = @_;      &nested_parse(\$dimension{$dim}{'intro'},[@_]);
     &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});      &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
     @Apache::scripttag::parser_env = @_;      $result.=
     &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});   &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
     @Apache::scripttag::parser_env = @_;        {'set_dim_id'        => undef,
     &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});         'delay_dim_results' => 1});
     foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension{$dim}{'criterias'}} ) {      @{$dimension{$dim}{'criterias'}} ) {
  # dimensional 'criteria' don't get assigned grades  
  my $type = $dimension{$dim}{'criteria.'.$id.'.type'};   my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
  next if ($type eq 'dimension');   if ($type eq 'dimension') {
       # dimensional 'criteria' don't get assigned grades
       $result.=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
       next;
    }
   
  my $link=&link($id);   my $link=&link($id);
  my $status= &get_criteria('status',$version,$dim,$id);   my $status= &get_criteria('status',$version,$dim,$id);
  $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".   $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".
     '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";      '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";
  @Apache::scripttag::parser_env = @_;   $result.=
  $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'criteria.'.$id});      &nested_parse(\$dimension{$dim}{'criteria.'.$id},[@_]);
   
  $result.='</div>'."\n".   $result.='</div>'."\n".
     #$dimension{$dim}{'criteria.'.$id}.  
     '<div class="LC_GRADING_grade">'."\n".      '<div class="LC_GRADING_grade">'."\n".
     '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".      '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".
     '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".      '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
Line 2144  sub get_criteria { Line 2225  sub get_criteria {
  $result.=&grading_history($version,$dim,$id);   $result.=&grading_history($version,$dim,$id);
  $last_link=$link;   $last_link=$link;
     }      }
       if (&delay_result()) {
    &Apache::lonxml::debug(" for $dim stashing results into ".$dimension{$dim}{'nested'});
    $dimension{$dimension{$dim}{'nested'}}{'result'}.=$result;
    undef($result);
       }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
     my $optional_passed=0;      my $optional_passed=0;
     my $mandatory_failed=0;      my $mandatory_failed=0;
     my $ungraded=0;      my $ungraded=0;
     my $review=0;      my $review=0;
   
     @Apache::scripttag::parser_env = @_;      $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
     $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});      $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
     @Apache::scripttag::parser_env = @_;       [@_]);
     $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});      $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
     @Apache::scripttag::parser_env = @_;       [@_],{'set_dim_id' => undef});
     &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});  
   
     foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension{$dim}{'criterias'}}) {      @{$dimension{$dim}{'criterias'}}) {
Line 2166  sub get_criteria { Line 2251  sub get_criteria {
     # dimensional 'criteria' don't get assigned grades      # dimensional 'criteria' don't get assigned grades
     $Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};      $Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
     $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};      $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
    } else {
       $result .=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
  }   }
  my $status= &get_criteria('status',$version,$dim,$id);   my $status= &get_criteria('status',$version,$dim,$id);
   
Line 2211  sub get_criteria { Line 2300  sub get_criteria {
     # any other targets no output      # any other targets no output
     undef($result);      undef($result);
  }   }
    &disable_dimension_parsing();
  pop(@Apache::bridgetask::dimension);   pop(@Apache::bridgetask::dimension);
  return $result;   return $result;
     }      }

Removed from v.1.170  
changed lines
  Added in v.1.173


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