Diff for /loncom/homework/bridgetask.pm between versions 1.168 and 1.181

version 1.168, 2006/06/13 15:45:54 version 1.181, 2006/07/17 20:35:11
Line 46  BEGIN { Line 46  BEGIN {
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));      &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));
 }  }
   
 my %dimension_info;  my %dimension;
 sub initialize_bridgetask {  sub initialize_bridgetask {
     # id of current Dimension, 0 means that no dimension is current       # id of current Dimension, 0 means that no dimension is current 
     # (inside <Task> only)      # (inside <Task> only)
     %Apache::bridgetask::dimension=();      @Apache::bridgetask::dimension=();
     # list of all Dimension ids seen      # list of all Dimension ids seen
     %Apache::bridgetask::top_dimensionlist=();      %Apache::bridgetask::top_dimensionlist=();
     # list of all current Instance ids      # list of all current Instance ids
Line 59  sub initialize_bridgetask { Line 59  sub initialize_bridgetask {
     @Apache::bridgetask::instancelist=();      @Apache::bridgetask::instancelist=();
     # key of queud user data that we are currently grading      # key of queud user data that we are currently grading
     $Apache::bridgetask::queue_key='';      $Apache::bridgetask::queue_key='';
     undef(%dimension_info);      undef(%dimension);
 }  }
   
 sub proctor_check_auth {  sub proctor_check_auth {
Line 83  sub proctor_check_auth { Line 83  sub proctor_check_auth {
  }   }
     }      }
     if ($authenticated) {      if ($authenticated) {
  &create_new_version($type,$user,$domain,$slot_name);   &check_in($type,$user,$domain,$slot_name);
  return 1;   return 1;
     }      }
  }   }
Line 91  sub proctor_check_auth { Line 91  sub proctor_check_auth {
     return 0;      return 0;
 }  }
   
   sub check_in {
       my ($type,$user,$domain,$slot_name) = @_;
       my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
       if ( $useslots eq 'map_map') {
    &check_in_sequence($user,$domain,$slot_name);
       } else {
    &create_new_version($type,$user,$domain,$slot_name);
       }
       return 1;
   }
   
   sub check_in_sequence {
       my ($user,$domain,$slot_name) = @_;
       my $navmap = Apache::lonnavmaps::navmap->new();
       my ($symb) = &Apache::lonxml::whichuser();
       my ($map)  = &Apache::lonnet::decode_symb($symb);
       my @resources = 
    $navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);
       my %old_history = %Apache::lonhomework::history;
       my %old_results = %Apache::lonhomework::results;
   
       foreach my $res (@resources) {
    &Apache::lonxml::debug("doing ".$res->src);
    &Apache::structuretags::initialize_storage($res->symb);
    my $type = ($res->is_task()) ? 'Task' : 'problem';
    &create_new_version($type,$user,$domain,$slot_name);
    &Apache::structuretags::finalize_storage($res->symb);
       }
       
       %Apache::lonhomework::history = %old_history;
       %Apache::lonhomework::results = %old_results;
   }
   
 sub create_new_version {  sub create_new_version {
     my ($type,$user,$domain,$slot_name) = @_;      my ($type,$user,$domain,$slot_name) = @_;
       
       my $id = '0';
     if ($type eq 'Task') {      if ($type eq 'Task') {
  # increment version   # increment version
  my $version=   my $version=
Line 107  sub create_new_version { Line 142  sub create_new_version {
  }   }
   
  #setup new version and who did it   #setup new version and who did it
  $Apache::lonhomework::results{'resource.0.version'}=$version;          $Apache::lonhomework::results{'resource.0.version'}=$version;
  if (defined($user) && defined($domain)) {   $id = "$version.0";
     $Apache::lonhomework::results{"resource.$version.0.checkedin"}=   if (!defined($user) || !defined($domain)) {
  $user.':'.$domain;      $user = $env{'user.name'};
  } else {      $domain = $env{'user.domain'};
     $Apache::lonhomework::results{"resource.$version.0.checkedin"}=  
  $env{'user.name'}.':'.$env{'user.domain'};  
  }  
  if (defined($slot_name)) {  
     $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=  
  $slot_name;  
  }   }
   
     } elsif ($type eq 'problem') {      } elsif ($type eq 'problem') {
  &Apache::lonxml::debug("authed $slot_name");   &Apache::lonxml::debug("authed $slot_name");
  if (defined($user) && defined($domain)) {      }
     $Apache::lonhomework::results{"resource.0.checkedin"}=      if (!defined($user) || !defined($domain)) {
  $user.':'.$domain;   $user = $env{'user.name'};
  }   $domain = $env{'user.domain'};
  if (defined($slot_name)) {      }
     $Apache::lonhomework::results{"resource.0.checkedin.slot"}=  
  $slot_name;      $Apache::lonhomework::results{"resource.$id.checkedin"}=
  }   $user.':'.$domain;
   
       if (defined($slot_name)) {
    $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=
       $slot_name;
     }      }
 }  }
   
Line 316  sub show_task { Line 350  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();
    &Apache::lonxml::debug(" tossing out $result ");
    &Apache::lonxml::debug(" usining out $dim 's  ". $dimension{$dim}{'result'});
    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 390  sub webgrade_standard_info { Line 456  sub webgrade_standard_info {
     'fail'   => 'Fail Rest',      'fail'   => 'Fail Rest',
     'cancel' => 'Cancel',      'cancel' => 'Cancel',
     );      );
     my %lt=&Apache::lonlocal::texthash(%lt);      %lt=&Apache::lonlocal::texthash(%lt);
   
     my $result=<<INFO;      my $result=<<INFO;
   <div class="LC_GRADING_maincontrols">    <div class="LC_GRADING_maincontrols">
Line 469  sub start_Task { Line 535  sub start_Task {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
     my ($status,$accessmsg,$slot);      my ($status,$accessmsg,$slot);
       &Apache::structuretags::init_problem_globals('Task');
     if ($target ne 'webgrade') {      if ($target ne 'webgrade') {
  &Apache::structuretags::init_problem_globals('Task');  
  &Apache::structuretags::initialize_storage();   &Apache::structuretags::initialize_storage();
  &Apache::lonhomework::showhash(%Apache::lonhomework::history);   &Apache::lonhomework::showhash(%Apache::lonhomework::history);
  if ($env{'request.state'} eq 'construct') {   if ($env{'request.state'} eq 'construct') {
Line 533  sub start_Task { Line 599  sub start_Task {
  ($status,$accessmsg,my $slot_name,$slot) =    ($status,$accessmsg,my $slot_name,$slot) = 
     &Apache::lonhomework::check_slot_access('0','Task');      &Apache::lonhomework::check_slot_access('0','Task');
  if ($status eq 'CAN_ANSWER' && $version eq '') {   if ($status eq 'CAN_ANSWER' && $version eq '') {
     &create_new_version('Task',undef,undef,$slot_name);      # CAN_ANSWER mode, and no current version, unproctored access
       # thus self-checkedin
       &check_in('Task',undef,undef,$slot_name);
     &add_to_queue('gradingqueue',{'type' => 'Task',      &add_to_queue('gradingqueue',{'type' => 'Task',
   'time' => time,    'time' => time,
   'slot' => $slot_name});    'slot' => $slot_name});
Line 995  DONEBUTTON Line 1063  DONEBUTTON
     &Apache::loncommon::end_page({'discussion' => 1});      &Apache::loncommon::end_page({'discussion' => 1});
     }      }
  }   }
   
    my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
    my %queue_data = ('type' => 'Task',
     'time' => time,);
    if (defined($Apache::inputtags::slot_name)) {
       $queue_data{'slot'} = $Apache::inputtags::slot_name;
    } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {
       $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
    }
   
   
  if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
     my $award='SUBMITTED';      my $award='SUBMITTED';
     &Apache::essayresponse::file_submission("$version.0",'bridgetask',      &Apache::essayresponse::file_submission("$version.0",'bridgetask',
Line 1017  DONEBUTTON Line 1096  DONEBUTTON
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
     if ($award eq 'SUBMITTED') {      if ($award eq 'SUBMITTED') {
  my $useslots = &Apache::lonnet::EXT("resource.0.useslots");   &add_to_queue('gradingqueue',\%queue_data);
  if ($useslots =~ /^\s*no\s*$/i) {  
     &add_to_queue('gradingqueue',  
   {'type' => 'Task',  
    'time' => time});  
  } elsif (defined($Apache::inputtags::slot_name)) {  
     &add_to_queue('gradingqueue',  
   {'type' => 'Task',  
    'time' => time,  
    'slot' => $Apache::inputtags::slot_name});  
  }  
     }      }
  } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {   } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
Line 1075  DONEBUTTON Line 1144  DONEBUTTON
     &check_queue_unlock($env{'form.queue'});      &check_queue_unlock($env{'form.queue'});
     &Apache::lonxml::debug(" still needs review not changing status.");      &Apache::lonxml::debug(" still needs review not changing status.");
  } else {   } else {
     &move_between_queues($env{'form.queue'},'reviewqueue');      if ($env{'form.queue'} ne 'none') {
    &move_between_queues($env{'form.queue'},'reviewqueue');
       } else {
    &add_to_queue('reviewqueue',\%queue_data);
       }
  }   }
     } elsif ($ungraded) {      } elsif ($ungraded) {
  $Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';   $Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';
  if ($env{'form.queue'} eq 'reviewqueue' ||   if ($env{'form.queue'} eq 'reviewqueue') {
     $env{'form.queue'} eq 'none' ) {  
     &Apache::lonxml::debug("moving back.");      &Apache::lonxml::debug("moving back.");
     &move_between_queues($env{'form.queue'},'gradingqueue');      &move_between_queues($env{'form.queue'},
    'gradingqueue');
    } elsif ($env{'form.queue'} eq 'none' ) {
       &add_to_queue('gradingqueue',\%queue_data);
  } else {   } else {
     &check_queue_unlock($env{'form.queue'});      &check_queue_unlock($env{'form.queue'});
  }   }
Line 1158  DONEBUTTON Line 1233  DONEBUTTON
  $result.=&Apache::response::meta_stores_write('status','string',   $result.=&Apache::response::meta_stores_write('status','string',
       'Bridge Task Status');        'Bridge Task Status');
     }      }
       &Apache::structuretags::reset_problem_globals('Task');
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
     return $result;      return $result;
 }  }
Line 1907  sub start_Setup { Line 1983  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} =
    $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.'.mandatory'}=
       &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
    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 1931  sub start_QuestionText { Line 2040  sub start_QuestionText {
     my $dim = &get_dim_id();      my $dim = &get_dim_id();
     my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);      my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
  $dimension_info{$dim}{'questiontext'}=$text;   $dimension{$dim}{'questiontext'}=$text;
     }      }
     return '';      return '';
 }  }
Line 1947  sub get_instance { Line 2056  sub get_instance {
  $rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||   $rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||
  $rand_alg eq '64bit4' ) {   $rand_alg eq '64bit4' ) {
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber();
  my @order=&Math::Random::random_permutation(@{$dimension_info{$dim}{'instances'}});   my @order=&Math::Random::random_permutation(@{$dimension{$dim}{'instances'}});
  my $num=@order;   my $num=@order;
  my $version=&get_version();   my $version=&get_version();
  my $which=($version-1)%$num;   my $which=($version-1)%$num;
Line 1959  sub get_instance { Line 2068  sub get_instance {
  if (defined($instance)) { return $instance; }   if (defined($instance)) { return $instance; }
   
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber();
  my @instances = @{$dimension_info{$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_info{$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;
     }      }
 }  }
   
   sub get_criteria {
       my ($what,$version,$dim,$id) = @_;
       my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
       my $prefix = ($type eq 'criteria') ? "$dim.$id"
                                  : "$id";
       my $entry = "resource.$version.0.$prefix.$what";
       if (exists($Apache::lonhomework::results{$entry})) {
    return $Apache::lonhomework::results{$entry};
       }
       return $Apache::lonhomework::history{$entry};
   }
   
 {  {
     my $last_link;      my $last_link;
     sub link {      sub link {
Line 1991  sub get_instance { Line 2114  sub get_instance {
  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_info{$dim}{'intro'});  
     my @instances = $instance;      my @instances = $instance;
     if (&Apache::response::showallfoils()) {      if (&Apache::response::showallfoils()) {
  @instances = @{$dimension_info{$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_info{$dim}{$instance.'.text'});   [@_]);
  @Apache::scripttag::parser_env = @_;   $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
  $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});   [@_],{'set_dim_id' => undef});
  if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||   my $task_status = 
     $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {      $Apache::lonhomework::history{"resource.$version.0.status"};
    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 2025  sub get_instance { Line 2164  sub get_instance {
     my $man_passed=0;      my $man_passed=0;
     my $opt_count=0;      my $opt_count=0;
     my $opt_passed=0;      my $opt_passed=0;
     foreach my $id ( @{$dimension_info{$dim}{$instance.'.criterias'}},      foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}},
      @{$dimension_info{$dim}{'criterias'}} ) {       @{$dimension{$dim}{'criterias'}} ) {
  if ($dimension_info{$dim}{'criteria.'.$id.'.mandatory'}    my $status = &get_criteria('status',$version,$dim,$id);
    if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} 
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {      if ($status eq 'pass') { $opt_passed++; }
  $opt_passed++;  
     }  
  } else {   } else {
     $man_count++;      $man_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {      if ($status eq 'pass') { $man_passed++; }
  $man_passed++;  
     }  
  }   }
     }      }
     if ($man_passed eq $man_count) { $man_passed='all'; }      if ($man_passed eq $man_count) { $man_passed='all'; }
   
     my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};      my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
     if ($opt_req !~ /\S/) {      if ($opt_req !~ /\S/) {
  $opt_req=   $opt_req=
     &Apache::lonxml::get_param('OptionalRequired',      &Apache::lonxml::get_param('OptionalRequired',
Line 2054  sub get_instance { Line 2190  sub get_instance {
     my $internal_location=&internal_location($dim);      my $internal_location=&internal_location($dim);
     $result=~s/\Q$internal_location\E/$dim_info/;      $result=~s/\Q$internal_location\E/$dim_info/;
   
     foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension_info{$dim}{'criterias'}}) {      @{$dimension{$dim}{'criterias'}}) {
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};   my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
  my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};   if ($type eq 'dimension') {
  my $mandatory=($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');      $result.=$dimension{$id}{'result'};
       next;
    }
    my $status= &get_criteria('status', $version,$dim,$id);
    my $comment=&get_criteria('comment',$version,$dim,$id);
    my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($mandatory) {   if ($mandatory) {
     $mandatory='Mandatory';      $mandatory='Mandatory';
  } else {   } else {
Line 2074  sub get_instance { Line 2215  sub get_instance {
  $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_info{$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 ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}) {   if ($comment) {
     $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</p>';      $result.='<p class="LC_comment">'.
    &mt('Comment: [_1]',$comment).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 2086  sub get_instance { Line 2229  sub get_instance {
     }      }
  } 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_info{$dim}{'intro'});      &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
     @Apache::scripttag::parser_env = @_;      $result.=
     &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});   &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
     @Apache::scripttag::parser_env = @_;        {'set_dim_id'          => undef,
     &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});         'delayed_dim_results' => 1});
     foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension_info{$dim}{'criterias'}} ) {      @{$dimension{$dim}{'criterias'}} ) {
    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
    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=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};   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_info{$dim}{'criteria.'.$id});      &nested_parse(\$dimension{$dim}{'criteria.'.$id},[@_]);
   
  $result.='</div>'."\n".   $result.='</div>'."\n".
     #$dimension_info{$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 2109  sub get_instance { Line 2261  sub get_instance {
     '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".      '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".
     '</div>'."\n".      '</div>'."\n".
     '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".      '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".
     '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</textarea>'."\n".      '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode(&get_criteria('comment',$version,$dim,$id),'<>"&').'</textarea>'."\n".
     '</label>'."\n".      '</label>'."\n".
     '<ul class="LC_GRADING_navbuttons">'."\n".      '<ul class="LC_GRADING_navbuttons">'."\n".
     '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".      '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".
Line 2119  sub get_instance { Line 2271  sub get_instance {
  $result.=&grading_history($version,$dim,$id);   $result.=&grading_history($version,$dim,$id);
  $last_link=$link;   $last_link=$link;
     }      }
       if (&nest()) {
    &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_info{$dim}{'intro'});      $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
     @Apache::scripttag::parser_env = @_;       [@_]);
     $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});      $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
     @Apache::scripttag::parser_env = @_;       [@_],{'set_dim_id' => undef});
     &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});  
   
     foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
     @{$dimension_info{$dim}{'criterias'}}) {      @{$dimension{$dim}{'criterias'}}) {
  my $link=&link($id);   my $link=&link($id);
  my $status=$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};   my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
  my $mandatory=($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');   if ($type eq 'criteria') {
       # 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.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 $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($status eq 'pass') {   if ($status eq 'pass') {
     if (!$mandatory) { $optional_passed++; }      if (!$mandatory) { $optional_passed++; }
  } elsif ($status eq 'fail') {   } elsif ($status eq 'fail') {
Line 2151  sub get_instance { Line 2318  sub get_instance {
  }   }
     }      }
     # FIXME optional required can apply to only <instance> right now...      # FIXME optional required can apply to only <instance> right now...
     my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};      my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
     if ($opt_req !~ /\S/) {      if ($opt_req !~ /\S/) {
  $opt_req=   $opt_req=
     &Apache::lonxml::get_param('OptionalRequired',      &Apache::lonxml::get_param('OptionalRequired',
Line 2161  sub get_instance { Line 2328  sub get_instance {
     if ($optional_passed < $opt_req) {      if ($optional_passed < $opt_req) {
  $mandatory_failed++;   $mandatory_failed++;
     }      }
     &Apache::lonxml::debug("all instance ".join(':',@{$dimension_info{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");      &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
     if ($review) {      if ($review) {
  $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'review';      'review';
Line 2179  sub get_instance { Line 2346  sub get_instance {
     # any other targets no output      # any other targets no output
     undef($result);      undef($result);
  }   }
    &disable_dimension_parsing();
    pop(@Apache::bridgetask::dimension);
  return $result;   return $result;
     }      }
   
Line 2190  sub get_instance { Line 2359  sub get_instance {
  my $version=&get_version();   my $version=&get_version();
  if ($target eq 'web') {   if ($target eq 'web') {
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     $result.=&Apache::scripttag::xmlparse($dimension_info{$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_info{$dim}{'instances'}};   @instances = @{$dimension{$dim}{'instances'}};
     }      }
     foreach my $instance (@instances) {      foreach my $instance (@instances) {
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});   $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});   $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
     }      }
  } elsif ($target eq 'webgrade'    } elsif ($target eq 'webgrade' 
  || $target eq 'grade' && $env{'form.webgrade'}) {   || $target eq 'grade' && $env{'form.webgrade'}) {
     # in case of any side effects that we need      # in case of any side effects that we need
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     &Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});      &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});      &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});      &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
  } else {   } else {
     # any other targets no output      # any other targets no output
     undef($result);      undef($result);
  }   }
    pop(@Apache::bridgetask::dimension);
  return $result;   return $result;
     }      }
 }  }
Line 2256  sub start_IntroParagraph { Line 2426  sub start_IntroParagraph {
     my $dim = &get_dim_id();      my $dim = &get_dim_id();
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
  if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {   if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {
     $dimension_info{$dim}{'intro'}=      $dimension{$dim}{'intro'}=
  &Apache::lonxml::get_all_text('/introparagraph',   &Apache::lonxml::get_all_text('/introparagraph',
       $parser,$style);        $parser,$style);
         } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {          } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
Line 2278  sub start_Instance { Line 2448  sub start_Instance {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $dim = &get_dim_id();      my $dim = &get_dim_id();
     my $id  = &get_id($parstack,$safeeval);      my $id  = &get_id($parstack,$safeeval);
     push(@{$dimension_info{$dim}{'instances'}},$id);      push(@{$dimension{$dim}{'instances'}},$id);
     push(@{$Apache::bridgetask::instance{$dim}},$id);      push(@{$Apache::bridgetask::instance{$dim}},$id);
     push(@Apache::bridgetask::instancelist,$id);      push(@Apache::bridgetask::instancelist,$id);
     $dimension_info{$dim}{$id.'.optionalrequired'}=      $dimension{$dim}{$id.'.optionalrequired'}=
  &Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);   &Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);
     my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);      my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);
     if (lc($disabled) eq 'yes') {      if (lc($disabled) eq 'yes') {
  $dimension_info{$dim}{$id.'.disabled'}='1';   $dimension{$dim}{$id.'.disabled'}='1';
     }      }
     return '';      return '';
 }  }
Line 2299  sub start_InstanceText { Line 2469  sub start_InstanceText {
     my $instance_id=$Apache::bridgetask::instance{$dim}[-1];      my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
     my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);      my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
  $dimension_info{$dim}{$instance_id.'.text'}=$text;   $dimension{$dim}{$instance_id.'.text'}=$text;
     }      }
     return '';      return '';
 }  }
Line 2314  sub start_Criteria { Line 2484  sub start_Criteria {
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
  my $dim = &get_dim_id();   my $dim = &get_dim_id();
  my $id=&get_id($parstack,$safeeval);   my $id=&get_id($parstack,$safeeval);
    &Apache::lonxml::debug("Criteria $id with $dim");
  if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {   if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
     my $instance_id=$Apache::bridgetask::instance{$dim}[-1];      my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
     $dimension_info{$dim}{"criteria.$instance_id.$id"}=$criteria;      $dimension{$dim}{"criteria.$instance_id.$id"}=$criteria;
     $dimension_info{$dim}{"criteria.$instance_id.$id.mandatory"}=      $dimension{$dim}{"criteria.$instance_id.$id.type"}='criteria';
       $dimension{$dim}{"criteria.$instance_id.$id.mandatory"}=
  &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);   &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
     push(@{$dimension_info{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");      push(@{$dimension{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
  } else {   } else {
     $dimension_info{$dim}{'criteria.'.$id}=$criteria;      $dimension{$dim}{'criteria.'.$id}=$criteria;
     $dimension_info{$dim}{'criteria.'.$id.'.mandatory'}=      $dimension{$dim}{'criteria.'.$id.'.type'}='criteria';
       $dimension{$dim}{'criteria.'.$id.'.mandatory'}=
  &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);   &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
     push(@{$dimension_info{$dim}{'criterias'}},$id);      push(@{$dimension{$dim}{'criterias'}},$id);
  }   }
     }      }
     return '';      return '';

Removed from v.1.168  
changed lines
  Added in v.1.181


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