Diff for /loncom/homework/structuretags.pm between versions 1.451 and 1.470

version 1.451, 2009/06/11 16:48:28 version 1.470, 2010/07/29 18:00:06
Line 66  use lib '/home/httpd/lib/perl/'; Line 66  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));      &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
 }  }
   
 sub start_web {  sub start_web {
Line 209  sub page_start { Line 209  sub page_start {
     } elsif (!defined($found{'body'})       } elsif (!defined($found{'body'}) 
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   if ($target eq 'web' || $target eq 'edit') {
     if ($env{'environment.remote'} ne 'off') {  
  $body_args{'only_body'}  = 1;  
     }  
         # Breadcrumbs for Construction Space          # Breadcrumbs for Construction Space
         &Apache::lonhtmlcommon::clear_breadcrumbs();          &Apache::lonhtmlcommon::clear_breadcrumbs();
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'Construction Space',              'text'  => 'Construction Space',
             'href'  => &Apache::loncommon::authorspace(),              'href'  => &Apache::loncommon::authorspace(),
         });          });
           # breadcrumbs (and tools) will be created 
           # in start_page->bodytag->innerregister
   
 # FIXME Where are we?  # FIXME Where are we?
 #        &Apache::lonhtmlcommon::add_breadcrumb({  #        &Apache::lonhtmlcommon::add_breadcrumb({
 #            'text'  => 'Problem Editing', # 'Problem Testing'  #            'text'  => 'Problem Editing', # 'Problem Testing'
 #            'href'  => '',  #            'href'  => '',
 #        });  #        });
         $pageheader = &Apache::lonhtmlcommon::breadcrumbs()          $pageheader =&Apache::loncommon::head_subbox(
                      .&Apache::loncommon::head_subbox(  
                 &Apache::loncommon::CSTR_pageheader());                  &Apache::loncommon::CSTR_pageheader());
  }   }
     } elsif (!defined($found{'body'})) {      } elsif (!defined($found{'body'})) {
Line 243  sub page_start { Line 242  sub page_start {
         # $body_args{'no_title'}       = 1;          # $body_args{'no_title'}       = 1;
         $body_args{'force_register'} = 1;          $body_args{'force_register'} = 1;
         $body_args{'add_entries'}    = \%add_entries;          $body_args{'add_entries'}    = \%add_entries;
         if ($env{'environment.remote'} eq 'off'          if ( $env{'request.state'} eq   'construct') {
             && $env{'request.state'} eq   'construct') {  
             $body_args{'only_body'}  = 1;              $body_args{'only_body'}  = 1;
         }          }
     }      }
Line 257  sub page_start { Line 255  sub page_start {
  && ($target eq 'web' || $target eq 'webgrade')) {   && ($target eq 'web' || $target eq 'webgrade')) {
   
  my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();   my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
  if ($symb eq '' && !$publicuser) {          if ($symb eq '' && !$publicuser) {
     my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");              $page_start .= '<p class="LC_info">'
     $help=&mt("Browsing resource, all submissions are temporary.")."<br />";                            .&mt('Browsing resource, all submissions are temporary.')
     $page_start .= $help;                            .'</p>';
  }          }
     }      }
   
     if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {      if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {
Line 271  sub page_start { Line 269  sub page_start {
     my $form_tag_start;      my $form_tag_start;
     if (!defined($found{'form'})) {      if (!defined($found{'form'})) {
  $form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="';   $form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="';
  my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});   my $uri = &Apache::loncommon::inhibit_menu_check(
                   &Apache::lonenc::check_encrypt($env{'request.uri'}));
           $uri = &HTML::Entities::encode($uri,'<>&"');
  $form_tag_start.=$uri.'" ';   $form_tag_start.=$uri.'" ';
  if ($target eq 'edit') {   if ($target eq 'edit') {
     $form_tag_start.=&Apache::edit::form_change_detection();      $form_tag_start.=&Apache::edit::form_change_detection();
Line 386  sub problem_edit_header { Line 386  sub problem_edit_header {
 '.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'  '.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
 </div>'.  </div>'.
 &problem_edit_buttons().'  &problem_edit_buttons().'
 <hr class="LC_edit_problem_divide" />  <hr style="clear:both;" />
 '.&Apache::lonxml::message_location().'  '.&Apache::lonxml::message_location().'
 </div>  </div>
 '.  '.
        '<table border="0" width="100%"><tr><td bgcolor="#DDDDDD">';         '<table border="0" width="100%"><tr><td bgcolor="#F8F8F8">';
 }  }
   
 sub problem_edit_footer {  sub problem_edit_footer {
     return '</td></tr></table><br />      return '</td></tr></table><br />
 <div class="LC_edit_problem_footer">  <div class="LC_edit_problem_footer">
   <hr class="LC_edit_problem_divide" />'.    <hr />'.
 &problem_edit_buttons().'  &problem_edit_buttons().'
   <hr class="LC_edit_problem_divide" />    <hr style="clear:both;" />
 </div>  </div>
 '.  '.
   
Line 435  sub problem_web_to_edit_header { Line 435  sub problem_web_to_edit_header {
           
     my $show_all_foils_text =       my $show_all_foils_text = 
  ($Apache::lonhomework::parsing_a_task) ?   ($Apache::lonhomework::parsing_a_task) ?
  &mt('&nbsp;Show&nbsp;All&nbsp;Instances')   &mt('Show All Instances')
  : &mt('&nbsp;Show&nbsp;All&nbsp;Foils');   : &mt('Show All Foils');
   
     my $show_all= '<span class="LC_nobreak"><label><input type="checkbox" name="showallfoils"';      my $show_all= '<span class="LC_nobreak"><label for="showallfoils">'
                    .'<input type="checkbox" name="showallfoils"';
     if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; }      if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; }
     $show_all.= ' />'.$show_all_foils_text.'</label></span>';      $show_all.= ' /> '.$show_all_foils_text
                  .'</label></span>';
   
   
   
Line 466  sub problem_web_to_edit_header { Line 468  sub problem_web_to_edit_header {
   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>    ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>
   ".&option('problem','problemtype').&mt("Homework Problem")."</option>    ".&option('problem','problemtype').&mt("Homework Problem")."</option>
   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>    ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
     ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
     ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>
     ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>
   ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>    ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>
 </select>  </select>
 </span>  </span>
Line 513  $show_all Line 518  $show_all
      <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />       <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
      <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />       <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
    </div>     </div>
    <hr class="LC_edit_problem_divide" />     <hr />
    <div class="LC_edit_problem_header_randomize_row">     <div class="LC_edit_problem_header_randomize_row">
      <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />       <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
      <input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />       <input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
Line 537  $show_all Line 542  $show_all
   
     $result.='      $result.='
    </div>     </div>
    <hr class="LC_edit_problem_divide" />     <hr />
    <div>';     <div>';
     $result.='<input type="hidden" name="problemmode" value="view" />';      $result.='<input type="hidden" name="problemmode" value="view" />';
     $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.      $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
Line 546  $show_all Line 551  $show_all
                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';                 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
     $result.='      $result.='
    </div>     </div>
    <hr class="LC_edit_problem_divide" />     <hr />
    '.&Apache::lonxml::message_location().'     '.&Apache::lonxml::message_location().'
 </div>';  </div>';
     return $result;      return $result;
Line 624  sub finalize_storage { Line 629  sub finalize_storage {
     $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,      $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
     $symb,$courseid,$domain,$name);      $symb,$courseid,$domain,$name);
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             if ($env{'request.role'} =~/^st/) {              &store_aggregates($symb,$courseid);
                 &store_aggregates($symb,$courseid);  
             }  
  }   }
     } else {      } else {
  &Apache::lonxml::debug('Nothing to store');   &Apache::lonxml::debug('Nothing to store');
Line 656  sub store_aggregates { Line 659  sub store_aggregates {
         }          }
     }      }
     foreach my $part (@parts) {      foreach my $part (@parts) {
         if ($Apache::lonhomework::results{'resource.'.$part.'.award'}          if ($env{'request.role'} =~/^st/) {
     eq 'APPROX_ANS' ||              if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
     $Apache::lonhomework::results{'resource.'.$part.'.award'}          eq 'APPROX_ANS' ||
     eq 'EXACT_ANS') {          $Apache::lonhomework::results{'resource.'.$part.'.award'}
             $aggregate{$symb."\0".$part."\0correct"} = 1;          eq 'EXACT_ANS') {
                   $aggregate{$symb."\0".$part."\0correct"} = 1;
               }
               if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
                   $aggregate{$symb."\0".$part."\0users"} = 1;
               } else {
                   my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); 
                   if ($last_reset) {
                       if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
                           $aggregate{$symb."\0".$part."\0users"} = 1;
                       }
                   }
               }
               $aggregate{$symb."\0".$part."\0attempts"} = 1;
         }          }
         if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {          if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') || 
             $aggregate{$symb."\0".$part."\0users"} = 1;              ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred')) {
         } else {              $aggregate{$symb."\0".$part."\0anonymous"} = 1;
             my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]);               my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};
             if ($last_reset) {              if ($needsrelease) {   
                 if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {                  my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
                     $aggregate{$symb."\0".$part."\0users"} = 1;                  if ($curr_required eq '') {
                       &update_courseenv($needsrelease,$cdomain,$cname);
                   } else {
                       my ($currmajor,$currminor) = split(/\./,$curr_required);
                       my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
                       if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) {
                           &update_courseenv($needsrelease,$cdomain,$cname);
                       }
                 }                  }
             }              }
         }          }
         $aggregate{$symb."\0".$part."\0attempts"} = 1;  
     }      }
     if (keys (%aggregate) > 0) {      if (keys (%aggregate) > 0) {
  &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,   &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
Line 680  sub store_aggregates { Line 702  sub store_aggregates {
     }      }
 }  }
   
   sub update_courseenv {
       my ($needsrelease,$cdom,$cnum) = @_;
       my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
       my %needshash = (
                         'internal.releaserequired' => $needsrelease,
                       );
       my $putresult = &put('environment',\%needshash,$cdom,$cnum);
       if ($putresult eq 'ok') {
           &appenv({'course.'.$env{'request.course.id'}.'.internal.releaserequired' => $needsrelease});
           my %crsinfo =
               &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,undef,undef,'.');
           if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
               $crsinfo{$env{'request.course.id'}}{'releaserequired'} = $needsrelease;
           }
           &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime');
       }
   }
   
 sub checkout_msg {  sub checkout_msg {
     my %lt=&Apache::lonlocal::texthash(       my %lt=&Apache::lonlocal::texthash( 
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
Line 888  sub start_problem { Line 928  sub start_problem {
     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }      if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
  #handle exam checkout  
  if ($Apache::lonhomework::type eq 'exam') {  
     my $token=  
  $Apache::lonhomework::history{"resource.0.outtoken"};  
     if (($env{'form.doescheckout'}) && (!$token)) {  
  $token=&Apache::lonxml::maketoken();  
  $Apache::lonhomework::history{"resource.0.outtoken"}=  
     $token;  
     }  
     $result.=&Apache::lonxml::printtokenheader($target,$token);  
  }  
  if ($env{'form.markaccess'}) {   if ($env{'form.markaccess'}) {
     my @interval=&Apache::lonnet::EXT("resource.0.interval");      my @interval=&Apache::lonnet::EXT("resource.0.interval");
     &Apache::lonnet::set_first_access($interval[1]);      &Apache::lonnet::set_first_access($interval[1]);
Line 918  sub start_problem { Line 947  sub start_problem {
                              value="'.$env{'form.username'}.'" />';                               value="'.$env{'form.username'}.'" />';
     }      }
     if ($env{'request.role.adv'}) {      if ($env{'request.role.adv'}) {
  $form_tag_start.=   $form_tag_start.= ' <label class="LC_nobreak">'
     ' <label><input type="checkbox" name="showallfoils"';                           .'<input type="checkbox" name="showallfoils"';
  if (defined($env{'form.showallfoils'})) {   if (defined($env{'form.showallfoils'})) {
     $form_tag_start.=' checked="checked"';      $form_tag_start.=' checked="checked"';
  }   }
  $form_tag_start.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').                  $form_tag_start.= ' /> '
     '</label>';                                   .&mt('Show All Foils')
                                    .'</label>';
     }      }
             if ($Apache::lonhomework::type eq 'practice') {              if ($Apache::lonhomework::type eq 'practice') {
                 $form_tag_start.=&practice_problem_header();                  $form_tag_start.=&practice_problem_header();
Line 1119  sub end_problem { Line 1149  sub end_problem {
  '\textit{'.$duedate_text.'} '.$toc_line;   '\textit{'.$duedate_text.'} '.$toc_line;
  } else {   } else {
     $frontmatter.= $begin_doc.$toc_line;      $frontmatter.= $begin_doc.$toc_line;
     if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}      if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { 
    $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
       }
  }   }
     } else {      } else {
  $frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage;   $frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage;
Line 1127  sub end_problem { Line 1159  sub end_problem {
  } else {   } else {
     if (not $env{'request.symb'} =~ m/\.page_/) {      if (not $env{'request.symb'} =~ m/\.page_/) {
  $frontmatter .= $begin_doc.$toc_line;   $frontmatter .= $begin_doc.$toc_line;
  if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}   if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { 
       $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
    }
     } else {      } else {
  $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;   $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
     }      }
Line 1480  sub start_instructorcomment { Line 1514  sub start_instructorcomment {
   
     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
  $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {   $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
         $result=($env{'request.role'}=~/^(in|cc|au|ca|li)/);          $result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/);
  if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {   if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
     my $skip=&Apache::lonxml::get_all_text("/instructorcomment",      my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
    $parser,$style);     $parser,$style);
Line 1685  sub ordered_show_check { Line 1719  sub ordered_show_check {
     return $in_order_show;      return $in_order_show;
 }  }
   
   
   sub start_startpartmarker {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result='';
       if ($target eq 'edit') {
           $result=&Apache::edit::tag_start($target,$token);
           $result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>';
           $result.=&Apache::edit::end_table();
   
       } 
       return $result;
   }
   
   sub end_startpartmarker {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my @result;
       if ($target eq 'edit') { $result[1]='no'; }
       return @result;
   }
   
   sub start_endpartmarker {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $result='';
       if ($target eq 'edit') {
           $result=&Apache::edit::tag_start($target,$token);
           $result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>';
           $result.=&Apache::edit::end_table();
   
       }
       return $result;
   }
   
   sub end_endpartmarker {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my @result;
       if ($target eq 'edit') { $result[1]='no'; }
       return @result;
   }
   
   
   
   
   
 sub start_part {  sub start_part {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     if (!$Apache::lonxml::metamode) {      if (!$Apache::lonxml::metamode) {
Line 1769  sub start_part { Line 1846  sub start_part {
     '.disableexampointprint'}) eq 'yes') {      '.disableexampointprint'}) eq 'yes') {
  $allow_print_points=0;   $allow_print_points=0;
     }      }
     if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}      if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { 
    $result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
   
       }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     $result.='<a name="'.&escape($Apache::inputtags::part).'" />';      $result.='<a name="'.&escape($Apache::inputtags::part).'" />';
  }   }
Line 1938  sub start_problemtype { Line 2018  sub start_problemtype {
  $result .=&Apache::edit::checked_arg('When used as type(s):','for',   $result .=&Apache::edit::checked_arg('When used as type(s):','for',
      [ ['exam','Exam/Quiz Problem'],       [ ['exam','Exam/Quiz Problem'],
        ['survey','Survey'],         ['survey','Survey'],
                                                  ['surveycred','Survey (with credit)'],
                                                  ['anonsurvey','Anonymous Survey'],
                                                  ['anonsurveycred','Anonymous Survey (with credit)'],
        ['problem','Homework Problem'],         ['problem','Homework Problem'],
                                                ['practice','Practice Problem'] ]                                                 ['practice','Practice Problem'] ]
      ,$token);       ,$token);

Removed from v.1.451  
changed lines
  Added in v.1.470


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