Diff for /loncom/publisher/testbankimport.pm between versions 1.7 and 1.14

version 1.7, 2005/11/08 17:58:35 version 1.14, 2008/06/05 01:24:59
Line 35  use HTML::Entities(); Line 35  use HTML::Entities();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonupload;  use Apache::lonupload;
 use File::Basename();  use File::Basename();
   use LONCAPA();
   
 # ---------------------------------------------------------------- Display Control  # ---------------------------------------------------------------- Display Control
 sub display_control {  sub display_control {
Line 347  sub jscript_three { Line 348  sub jscript_three {
     if (exists($env{'form.go'}) ) {      if (exists($env{'form.go'}) ) {
         $source = $env{'form.go'};          $source = $env{'form.go'};
     }      }
   
       my %body_layout = ('rightmargin'  => "0",
          'leftmargin'   => "0",
          'marginwidth'  => "0",
          'topmargin'    => "0",
          'marginheight' => "0");
   
       my $start_page = 
    &Apache::loncommon::start_page('Create Testbank directory',undef,
          {'only_body'   => 1,
    'add_entries' => \%body_layout,
    'js_ready'    => 1,});
       my $end_page = 
    &Apache::loncommon::end_page({'js_ready' => 1,});
     $$jsref = <<"END_OF_ONE";      $$jsref = <<"END_OF_ONE";
 function verify() {  function verify() {
     if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {      if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {
Line 371  function createWin() { Line 386  function createWin() {
     document.dataForm.newdir.value = "";      document.dataForm.newdir.value = "";
     newWindow = window.open("","CreateDir","HEIGHT=400,WIDTH=750,scrollbars=yes")      newWindow = window.open("","CreateDir","HEIGHT=400,WIDTH=750,scrollbars=yes")
     newWindow.document.open()      newWindow.document.open()
     newWindow.document.write("<html><head><title>Create Testbank directory</title><meta http-equiv='pragma' content='no-cache'>\\n")      newWindow.document.write('$start_page')
     newWindow.document.write("</head><body bgcolor='#CCFFDD' topmargin='0' leftmargin='0' marginheight='0'marginwidth='0' rightmargin='0'>\\n")  
     newWindow.document.write("<img border='0' src='/adm/lonInterFace/author.jpg' alt='[Author Header]'>\\n")      newWindow.document.write("<img border='0' src='/adm/lonInterFace/author.jpg' alt='[Author Header]'>\\n")
     newWindow.document.write("<table border='0' cellspacing='0' cellpadding='0' width='430' bgcolor='#CCFFDD'>\\n")      newWindow.document.write("<table border='0' cellspacing='0' cellpadding='0' width='430' bgcolor='#CCFFDD'>\\n")
     newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")      newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")
     newWindow.document.write("<td><h3>Location: <tt>$fullpath</tt></h3><h3>New Directory</h3></td></tr>\\n")      newWindow.document.write("<td><h3>Location: <tt>$fullpath</tt></h3><h3>New Directory</h3></td></tr>\\n")
     newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")      newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")
     newWindow.document.write("<td><form name='fileaction' action='/adm/cfile' method='post'>\\n")      newWindow.document.write("<td><form name='fileaction' action='/adm/cfile' method='post'>\\n")
     newWindow.document.write("<font face='arial,helvetica,sans-serif'>Enter the name of the new directory where you will store the converted testbank questions<br /><br />")      newWindow.document.write("<font face='arial,helvetica,sans-serif'>Enter the name of the new directory where you will save the converted testbank questions<br /><br />")
     newWindow.document.write("<input type='hidden' name='filename' value='$fullpath'>")         newWindow.document.write("<input type='hidden' name='filename' value='$fullpath'>")   
     newWindow.document.write("<input type='hidden' name='action' value='newdir'>")      newWindow.document.write("<input type='hidden' name='action' value='newdir'>")
     newWindow.document.write("<input type='hidden' name='callingmode' value='testbank'>")      newWindow.document.write("<input type='hidden' name='callingmode' value='testbank'>")
     newWindow.document.write("$fullpath<input type='text' name='newfilename' value=''/>")      newWindow.document.write("$fullpath<input type='text' name='newfilename' value=''/>")
     newWindow.document.write("<input type='button' value='Go' onClick='document.fileaction.submit();' />")      newWindow.document.write("<input type='button' value='Go' onClick='document.fileaction.submit();' />")
     newWindow.document.write("</td></tr>\\n")      newWindow.document.write("</td></tr>\\n")
     newWindow.document.write("</table></body></html>")      newWindow.document.write("</table>")
       newWindow.document.write('$end_page')
     newWindow.document.close()      newWindow.document.close()
     newWindow.focus()      newWindow.focus()
 }  }
Line 441  The <b>Testbank Upload</b> utility can b Line 456  The <b>Testbank Upload</b> utility can b
          <li>All questions (including question text and all foils) must occur before any of the answers.  Each question should begin on a new line, and should start with the question number. Questions should be numbered sequentially using a number followed immediately by a space, a period, or enclosed in parentheses, i.e., 1 , 1., (1), 1), or (1 .</li>           <li>All questions (including question text and all foils) must occur before any of the answers.  Each question should begin on a new line, and should start with the question number. Questions should be numbered sequentially using a number followed immediately by a space, a period, or enclosed in parentheses, i.e., 1 , 1., (1), 1), or (1 .</li>
          <li><i>Multiple choice</i> and <i>multiple answer correct</i> questions should consist of: (i) the question number followed by (ii) the question text beginning on the same line and (iii) two or more foils, with each foil beginning on a new line and prefixed by a unique letter, or Roman numeral, listed in alphabetic or numeric order, beginning at a (alphabetic) or i (Roman numeral), followed by a period, or enclosed in parentheses, i.e., a., (a), i., or (i).</li>           <li><i>Multiple choice</i> and <i>multiple answer correct</i> questions should consist of: (i) the question number followed by (ii) the question text beginning on the same line and (iii) two or more foils, with each foil beginning on a new line and prefixed by a unique letter, or Roman numeral, listed in alphabetic or numeric order, beginning at a (alphabetic) or i (Roman numeral), followed by a period, or enclosed in parentheses, i.e., a., (a), i., or (i).</li>
          <li>One or more correct answers should be provided for all questions (although blank answers may be provided for <i>essay</i> questions).  Answers should be numbered sequentially, using the same scheme as used for the questions, and must occur after <b>all</b> the questions.                   <li>One or more correct answers should be provided for all questions (although blank answers may be provided for <i>essay</i> questions).  Answers should be numbered sequentially, using the same scheme as used for the questions, and must occur after <b>all</b> the questions.        
          <li>If <i>fill-in-the-blank</i> or <i>multiple answer</i> questions have more than one correct answer, each answer should appear in a comma-, tab-, space-, or new line-delimited list. For a <i>ranking/ordering</i> question, the "answer" should contain the foil identifiers correctly ordered in a similarly delimited list.</li>            <li>If <i>fill-in-the-blank</i> or <i>multiple answer</i> questions have more than one correct answer, each answer should appear in a comma-, tab-, space-, or new line-delimited list. For a <i>ranking/ordering</i> question, the "answer" should contain the foil identifiers correctly ordered in a similarly delimited list. If two or more foils have the same ranking, they should occur together, with an equals sign separating equally ranked foils [e.g., (b),(e)=(a),(d),(c)].</li> 
         </ol>                </ol>
 Five steps are involved in the import process.  Five steps are involved in the import process.
         <ol>          <ol>
          <li>Upload your text file to the server.|);           <li>Upload your text file to the server.|);
Line 455  Five steps are involved in the import pr Line 470  Five steps are involved in the import pr
     $r->print(qq|</li>      $r->print(qq|</li>
          <li>Provide information about the question format - i.e.,  question numbering style, and the number of blocks of questions of each question type.</li>           <li>Provide information about the question format - i.e.,  question numbering style, and the number of blocks of questions of each question type.</li>
          <li>Provide information about the questions in each block, including question type, start and end question numbers for each block, and foil labelling style and answer format where required.</li>           <li>Provide information about the questions in each block, including question type, start and end question numbers for each block, and foil labelling style and answer format where required.</li>
          <li>Create a new directory where you will store the converted testbank questions.</li>            <li>Create a new directory where you will save the converted testbank questions.</li> 
          <li>Complete the import of questions to the selected pool.</li>           <li>Complete the import of questions to the selected pool.</li>
         </ol>          </ol>
         </font>          </font>
Line 1015  END_OF_ONE Line 1030  END_OF_ONE
        <td width='30' align='top'><img src='/res/adm/pages/bl_step4.gif'>         <td width='30' align='top'><img src='/res/adm/pages/bl_step4.gif'>
        </td>         </td>
        <td width='100%' align='left'>&nbsp;&nbsp;         <td width='100%' align='left'>&nbsp;&nbsp;
         <font size='+1' face='arial,helvetica,sans-serif'><b>Create a directory to store your testbank questions.</b></font>          <font size='+1' face='arial,helvetica,sans-serif'><b>Create a directory to save your testbank questions.</b></font>
        </td>         </td>
       </tr>        </tr>
       <tr>        <tr>
Line 1025  END_OF_ONE Line 1040  END_OF_ONE
        <td>&nbsp;</td>         <td>&nbsp;</td>
        <td>         <td>
         <font face='Arial,Helvetica,sans-serif'>          <font face='Arial,Helvetica,sans-serif'>
 Please choose a destination LON-CAPA directory in which to store your uploaded questions.&nbsp;&nbsp;  Please choose a destination LON-CAPA directory in which to save your uploaded questions.&nbsp;&nbsp;
        <input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></font></td>         <input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></font></td>
       </tr>        </tr>
       <tr>        <tr>
Line 1173  sub final_display { Line 1188  sub final_display {
                         $items[$k] =~ tr/A-Z/a-z/;                          $items[$k] =~ tr/A-Z/a-z/;
                         my @corrects = split/$patterns{$ansrtypes[$i]}/,$items[$k];                          my @corrects = split/$patterns{$ansrtypes[$i]}/,$items[$k];
                         foreach my $correct (@corrects) {                          foreach my $correct (@corrects) {
                             $correct =~s/\W//g;                              my @tied;
                               if ($qtype[$i] eq "Ord") {
                                   if ($correct =~ /=/) {
                                       @tied = split(/=/,$correct);
                                       for (my $j=0; $j<@tied; $j++) {
                                           $tied[$j] =~ s/\W//g;
                                       }
                                   } else {
                                       $correct =~s/\W//g;
                                   }
                               } else {
                                   $correct =~s/\W//g;
                               }
                             if ($foilformats[$i] eq "lcperiod" || $foilformats[$i] eq "lcparen" || $foilformats[$i] eq "ucparen" || $foilformats[$i] eq "ucperiod") {                              if ($foilformats[$i] eq "lcperiod" || $foilformats[$i] eq "lcparen" || $foilformats[$i] eq "ucparen" || $foilformats[$i] eq "ucperiod") {
                                 for (my $j=0; $j<@alphabet; $j++) {                                  if (($qtype[$i] eq "Ord") && (@tied > 0)) { 
                                     if ($alphabet[$j] eq $correct) {                                      my @ties;
                                         push @{$answers{$k}}, $j;                                      foreach my $tie (@tied) {
                                         last;                                          for (my $j=0; $j<@alphabet; $j++) {
                                               if ($alphabet[$j] eq $tie) {
                                                   push(@ties,$j);
                                                   last;
                                               }
                                           }
                                       }
                                       my $ans = join('=',@ties);
                                       push(@{$answers{$k}},$ans);
                                   } else {
                                       for (my $j=0; $j<@alphabet; $j++) {
                                           if ($alphabet[$j] eq $correct) {
                                               push @{$answers{$k}}, $j;
                                               last;
                                           }
                                     }                                      }
                                 }                                  }
                             } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod") || ($foilformats[$i] eq "romoneparen") || ($foilformats[$i] eq "romdotparen")) {                              } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod") || ($foilformats[$i] eq "romoneparen") || ($foilformats[$i] eq "romdotparen")) {
                                 for (my $j=0; $j<@romans; $j++) {                                  if (($qtype[$i] eq "Ord") && (@tied > 0)) {
                                     if ($romans[$j] eq $correct) {                                      my @ties;
                                         push @{$answers{$k}}, $j;                                      foreach my $tie (@tied) {
                                         last;                                          for (my $j=0; $j<@romans; $j++) {
                                               if ($romans[$j] eq $tie) {
                                                   push(@ties,$j);
                                                   last;
                                               }
                                           }
                                       }
                                       push(@{$answers{$k}},join('=',@ties));
                                   } else {
                                       for (my $j=0; $j<@romans; $j++) {
                                           if ($romans[$j] eq $correct) {
                                               push @{$answers{$k}}, $j;
                                               last;
                                           }
                                     }                                      }
                                 }                                  }
                             }                              }
Line 1340  END_OF_BLOCK Line 1394  END_OF_BLOCK
    </tr>     </tr>
   </table>    </table>
  </form>   </form>
 </body>  
 </html>  
 END_OF_FAIL  END_OF_FAIL
     return;      return;
   }    }
Line 1438  sub file_split { Line 1490  sub file_split {
     my %multparts = ();      my %multparts = ();
     for (my $i=0; $i<$blocks; $i++) {      for (my $i=0; $i<$blocks; $i++) {
         if (${$numsref}[$i] > 0) {          if (${$numsref}[$i] > 0) {
             if ((${$qtyperef}[$i] eq "MC") || (${$qtyperef}[$i] eq "MA")) {              if ((${$qtyperef}[$i] eq "MC") || (${$qtyperef}[$i] eq "MA") || (${$qtyperef}[$i] eq "Ord")) {
                 my $splitstr = '';                  my $splitstr = '';
                 if (${$foilsref}[$i] eq "lcperiod") {                  if (${$foilsref}[$i] eq "lcperiod") {
                     $splitstr = '[a-z]\.';                      $splitstr = '[a-z]\.';
Line 1555  sub create_mcq { Line 1607  sub create_mcq {
     <foilgroup>      <foilgroup>
         |;          |;
         for (my $k=0; $k<@{$qstnref}-1; $k++) {          for (my $k=0; $k<@{$qstnref}-1; $k++) {
             $output .= "   <foil location=\"random\" name=\"foil".$k."\" value=\"".$$answerref[$k]."\><startouttext />".${$qstnref}[$k+1]."<endouttext /></foil>\n";              my $ansval;
               my $num = 0;
               for (my $i=0; $i<@{$answerref}; $i++) {
                   if ($$answerref[$i] =~ /=/) {
                       my @tied = split(/=/,$$answerref[$i]);
                       foreach my $tie (@tied) {
                           if ($k == $tie) {
                               $ansval = $num + 1;
                               last;
                           }
                       }
                       $num += scalar(@tied);
                   } elsif ($k == $$answerref[$i]) {
                       $ansval = $num + 1;
                       last;
                   } else {
                       $num ++;
                   }
               }
               $output .= "   <foil location=\"random\" name=\"foil".$k."\" value=\"".$ansval."\"><startouttext />".${$qstnref}[$k+1]."<endouttext /></foil>\n";
         }          }
         chomp($output);          chomp($output);
         $output .= qq|          $output .= qq|
Line 1653  sub create_ess { Line 1724  sub create_ess {
    <textfield></textfield>     <textfield></textfield>
    </essayresponse>     </essayresponse>
    <postanswerdate>     <postanswerdate>
       <startouttext />
    $answertxt     $answertxt
       <endouttext />
    </postanswerdate>     </postanswerdate>
   </problem>|;    </problem>|;
     } elsif ($qtype eq "TF") {      } elsif ($qtype eq "TF") {
Line 1699  sub handler { Line 1772  sub handler {
     my $javascript = '';      my $javascript = '';
     my $page_name = '';      my $page_name = '';
     my $current_page = '';      my $current_page = '';
     my $loadentries = '';  
     my $qcount = '';      my $qcount = '';
 #  #
 # phase two: re-attach user  # phase two: re-attach user
Line 1725  sub handler { Line 1797  sub handler {
         $fn=$env{'form.filename'};          $fn=$env{'form.filename'};
         $fn=~s/^http\:\/\/[^\/]+\///;          $fn=~s/^http\:\/\/[^\/]+\///;
         $fn=~s/^\///;          $fn=~s/^\///;
         $fn=~s/(\~|priv\/)(\w+)//;          $fn=~s{(~|priv/)($LONCAPA::username_re)}{};
         $fn=~s/\/+/\//g;          $fn=~s/\/+/\//g;
     } else {      } else {
         $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.          $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
Line 1741  sub handler { Line 1813  sub handler {
     my $dirpath = '/home/'.$uname.'/public_html';      my $dirpath = '/home/'.$uname.'/public_html';
   
     my @text = ();      my @text = ();
     my $loadentries = '';  
     if ($env{'form.phase'} eq 'three') {          if ($env{'form.phase'} eq 'three') {    
         if (-e "$dirpath$fn") {          if (-e "$dirpath$fn") {
             open(TESTBANK,"<$dirpath$fn");              open(TESTBANK,"<$dirpath$fn");
Line 1756  sub handler { Line 1827  sub handler {
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
   
       my %loadentries;
     if ($env{'form.phase'} eq 'three') {      if ($env{'form.phase'} eq 'three') {
         $current_page = &display_control();          $current_page = &display_control();
         my @PAGES = ('Welcome','Blocks','Format','Target','Confirmation');          my @PAGES = ('Welcome','Blocks','Format','Target','Confirmation');
         $page_name = $PAGES[$current_page];          $page_name = $PAGES[$current_page];
   
         if ($page_name eq 'Blocks') {          if ($page_name eq 'Blocks') {
             $loadentries = 'onLoad= "setElements()"';      $loadentries{'onload'} = "setElements()";
             &jscript_one(\$javascript);              &jscript_one(\$javascript);
         } elsif ($page_name eq 'Format') {           } elsif ($page_name eq 'Format') { 
             $qcount = question_count($env{'form.qnumformat'},\@text);              $qcount = question_count($env{'form.qnumformat'},\@text);
      &jscript_two(\$javascript,$qcount);       &jscript_two(\$javascript,$qcount);
          } elsif ($page_name eq 'Target') {           } elsif ($page_name eq 'Target') {
              if ($env{'form.go'} eq "PreviousPage") {               if ($env{'form.go'} eq "PreviousPage") {
                  $loadentries =  'onLoad = "setElements()"';                   $loadentries{'onload'} = "setElements()";
       }        }
      &jscript_three($fullpath,\$javascript);       &jscript_three($fullpath,\$javascript);
         } elsif ($page_name eq 'Confirmation') {          } elsif ($page_name eq 'Confirmation') {
     &jscript_four(\$javascript,$fullpath);      &jscript_four(\$javascript,$fullpath);
         }          }
     }                                                                                      }
   
       $javascript = "<script type=\"text/javascript\">\n//<!--\n".
    $javascript."\n// --></script>\n";
   
       $r->print(&Apache::loncommon::start_page('Upload testbank questions to Construction Space',
        $javascript,
        {'add_entries' => \%loadentries}));
   
     $r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>");  
                                                                                     
     $r->print(&Apache::loncommon::bodytag('Upload testbank questions to Construction Space',undef,$loadentries));  
                                                                                     
     if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {      if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
         $r->print('<h3><font color=red>'.&mt('Co-Author').': '.$uname.          $r->print('<h3><font color=red>'.&mt('Co-Author').': '.$uname.
                   &mt(' at ').$udom.'</font></h3>');                    &mt(' at ').$udom.'</font></h3>');
Line 1805  sub handler { Line 1880  sub handler {
     } else {      } else {
         &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'testbank');          &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'testbank');
     }      }
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
 1;  1;

Removed from v.1.7  
changed lines
  Added in v.1.14


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