Diff for /loncom/homework/lonhomework.pm between versions 1.336 and 1.349.2.3

version 1.336, 2012/12/18 16:48:19 version 1.349.2.3, 2015/05/26 13:25:52
Line 51  use Apache::functionplotresponse(); Line 51  use Apache::functionplotresponse();
 use Apache::drawimage();  use Apache::drawimage();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::loncommon();  use Apache::loncommon();
   use Apace::lonparmset();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use HTML::Entities();  use HTML::Entities();
Line 163  sub get_target { Line 164  sub get_target {
     }      }
         }          }
 #  #
 # End of Construction Space  # End of Authoring Space
 #  #
     }      }
 #  #
Line 451  sub check_access { Line 452  sub check_access {
     $datemsg=$date;      $datemsg=$date;
  } elsif ($type eq 'opendate') {   } elsif ($type eq 'opendate') {
     $status='CLOSED';      $status='CLOSED';
     $datemsg = &mt("will open on")." $date";      $datemsg = &mt('will open on [_1]',$date);
  } elsif ($type eq 'duedate') {   } elsif ($type eq 'duedate') {
     $status='CAN_ANSWER';      $status='CAN_ANSWER';
     $datemsg = &mt("is due at")." $date";      $datemsg = &mt('is due at [_1]',$date);
  } elsif ($type eq 'answerdate') {   } elsif ($type eq 'answerdate') {
     $status='CLOSED';      $status='CLOSED';
     $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";      $datemsg = &mt('was due on [_1], and answers will be available on [_2]',
                                  $lastdate,$date);
  }   }
     }      }
     if ($status eq 'CAN_ANSWER' ||      if ($status eq 'CAN_ANSWER' ||
Line 468  sub check_access { Line 470  sub check_access {
  if ( $tries eq '' ) { $tries = '0'; }   if ( $tries eq '' ) { $tries = '0'; }
  if ( $maxtries eq '' &&    if ( $maxtries eq '' && 
      $env{'request.state'} ne 'construct') { $maxtries = '2'; }        $env{'request.state'} ne 'construct') { $maxtries = '2'; } 
  $Apache::lonhomework::results{'resource.'.$id.'.maxtries'}=$maxtries;  
  if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }   if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
  # if (correct and show prob status) or excused then CANNOT_ANSWER   # if (correct and show prob status) or excused then CANNOT_ANSWER
  if ( ($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/)   if ( ($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/)
Line 508  sub check_access { Line 509  sub check_access {
   #    return ('UNCHECKEDOUT','needs to be checked out');    #    return ('UNCHECKEDOUT','needs to be checked out');
   #}    #}
   
   
     &Apache::lonxml::debug("sending back :$status:$datemsg:");      &Apache::lonxml::debug("sending back :$status:$datemsg:");
     if (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED')) {      if (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED')) {
  &Apache::lonxml::debug("should be allowed to browse a resource when closed");   &Apache::lonxml::debug("should be allowed to browse a resource when closed");
Line 541  sub due_date { Line 541  sub due_date {
     } else {      } else {
  $date = $due_date;   $date = $due_date;
     }      }
     return $date      return $date;
 }  }
   
 sub seconds_to_human_length {  sub seconds_to_human_length {
Line 590  sub showarray { Line 590  sub showarray {
 sub showhashsubset {  sub showhashsubset {
     my ($hash,$keyre) = @_;      my ($hash,$keyre) = @_;
     my $resultkey;      my $resultkey;
     foreach $resultkey (sort keys %$hash) {      foreach $resultkey (sort(keys(%$hash))) {
  if ($resultkey !~ /$keyre/) { next; }   if ($resultkey !~ /$keyre/) { next; }
  if (ref($$hash{$resultkey})  eq 'ARRAY' ) {   if (ref($$hash{$resultkey})  eq 'ARRAY' ) {
     &Apache::lonxml::debug("$resultkey ---- ".      &Apache::lonxml::debug("$resultkey ---- ".
Line 608  sub showhashsubset { Line 608  sub showhashsubset {
   
 sub setuppermissions {  sub setuppermissions {
     $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'});      $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'});
       unless ($Apache::lonhomework::browse eq 'F') {
           $Apache::lonhomework::browse=&Apache::lonnet::allowed('bro',$env{'request.filename'}); 
       }
     my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     if (! $viewgrades &&       if (! $viewgrades && 
  exists($env{'request.course.sec'}) &&    exists($env{'request.course.sec'}) && 
Line 667  sub setupheader { Line 670  sub setupheader {
 }  }
   
 sub handle_save_or_undo {  sub handle_save_or_undo {
     my ($request,$problem,$result) = @_;      my ($request,$problem,$result,$getobjref) = @_;
   
     my $file    = &Apache::lonnet::filelocation("",$request->uri);      my $file    = &Apache::lonnet::filelocation("",$request->uri);
     my $filebak =$file.".bak";      my $filebak =$file.".bak";
Line 710  sub handle_save_or_undo { Line 713  sub handle_save_or_undo {
  my $fh=Apache::File->new(">$file");   my $fh=Apache::File->new(">$file");
  if (defined($fh)) {   if (defined($fh)) {
     print $fh $$result;      print $fh $$result;
               if (ref($getobjref) eq 'SCALAR') {
                   if ($file =~ m{([^/]+)\.(html?)$}) {
                       my $fname = $1;
                       my $ext = $2;
                       my $path = $file;
                       $path =~ s/\Q$fname\E\.\Q$ext\E$//; 
                       my (%allfiles,%codebase);
                       &Apache::lonnet::extract_embedded_items($file,\%allfiles,
                                                              \%codebase,$result);
                       if (keys(%allfiles) > 0) {
                           my $url = $request->uri;
                           my $state = <<STATE;
       <input type="hidden" name="action" value="upload_embedded" />
       <input type="hidden" name="url" value="$url" />
   STATE
                           $$getobjref = "<h3>".&mt("Reference Warning")."</h3>".
                                         "<p>".&mt("Completed upload of the file. This file contained references to other files.")."</p>".
                                         "<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>".
                                         &Apache::loncommon::ask_for_embedded_content($url,$state,\%allfiles,\%codebase,
                                         {'error_on_invalid_names'   => 1,
                                          'ignore_remote_references' => 1,});
                       }
                   }
               }
  } else {   } else {
     &Apache::lonxml::info('<span class="LC_error">'.      &Apache::lonxml::info('<span class="LC_error">'.
   &mt("Unable to write to [_1]",    &mt("Unable to write to [_1]",
Line 728  sub analyze_header { Line 755  sub analyze_header {
   
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),      my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
                    'text' => 'Construction Space'},                     'text' => 'Authoring Space'},
                   {'href' => '',                    {'href' => '',
                    'text' => 'Problem Testing'},                     'text' => 'Problem Testing'},
                   {'href' => '',                    {'href' => '',
Line 741  sub analyze_header { Line 768  sub analyze_header {
        .&Apache::loncommon::head_subbox(         .&Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());                  &Apache::loncommon::CSTR_pageheader());
     $result .=       $result .= 
  &Apache::lonxml::message_location().'      '<form name="lonhomework" method="post" action="'.
             <form name="lonhomework" method="post" action="'.  
     &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
             '<input type="hidden" name="problemmode" value="'.              '<input type="hidden" name="problemmode" value="'.
             $env{'form.problemmode'}.'" />'.              $env{'form.problemmode'}.'" />'.
Line 756  sub analyze_header { Line 782  sub analyze_header {
             <input type="button" name="submitmode" value="'.&mt("View").'" '.              <input type="button" name="submitmode" value="'.&mt("View").'" '.
             'onclick="javascript:setmode(this.form,'."'view'".')" />              'onclick="javascript:setmode(this.form,'."'view'".')" />
             <hr />              <hr />
             </div>              </div>'
             </form>';              .&Apache::lonxml::message_location().
               '</form>';
     &Apache::lonxml::add_messages(\$result);      &Apache::lonxml::add_messages(\$result);
     $request->print($result);      $request->print($result);
     $request->rflush();      $request->rflush();
Line 936  sub editxmlmode { Line 963  sub editxmlmode {
   
  $problem='';   $problem='';
     }      }
   
     if (($env{'form.problemmode'} eq 'saveeditxml') ||      if (($env{'form.problemmode'} eq 'saveeditxml') ||
         ($env{'form.problemmode'} eq 'saveviewxml') ||           ($env{'form.problemmode'} eq 'saveviewxml') ||
         ($env{'form.problemmode'} eq 'undoxml')) {          ($env{'form.problemmode'} eq 'undoxml')) {
  my $error=&handle_save_or_undo($request,\$problem,   my $error=&handle_save_or_undo($request,\$problem,
        \$env{'form.editxmltext'});         \$env{'form.editxmltext'});
Line 962  sub editxmlmode { Line 988  sub editxmlmode {
   
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),      my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
                    'text' => 'Construction Space'},                     'text' => 'Authoring Space'},
                   {'href' => '',                    {'href' => '',
                    'text' => 'Problem Editing'}];                     'text' => 'Problem Editing'}];
   
Line 984  sub editxmlmode { Line 1010  sub editxmlmode {
             '<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'.              '<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'.
     &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
     &Apache::structuretags::remember_problem_state().'      &Apache::structuretags::remember_problem_state().'
             <div class="LC_edit_problem_editxml_header">              <div class="LC_edit_problem_header">
               <table class="LC_edit_problem_header_title"><tr><td>                <div class="LC_edit_problem_header_title">'.
                <h2>'.&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').'</h2>                  &mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').
                 </td><td align="right">                '</div><div class="LC_edit_actionbar" id="actionbar">';
                   '.&Apache::loncommon::helpLatexCheatsheet('Problem_LON-CAPA_Functions','Script Functions').'  
                 </td></tr>  
               </table>';  
   
          $result.='<input type="hidden" name="problemmode" value="saveedit" />'.          $result.='<input type="hidden" name="problemmode" value="saveedit" />'.
                   &Apache::structuretags::problem_edit_buttons('editxml');                    &Apache::structuretags::problem_edit_buttons('editxml');
           $result.='<div class="LC_edit_problem_discards">';
   
    unless ($env{'environment.nocodemirror'}) {
    # dropdown menues
       $result .= '<ol class="LC_primary_menu LC_floatleft">'.
       &Apache::lonmenu::create_submenu("#", "", &mt("Insert Menu"), &Apache::structuretags::insert_menu_datastructure(),"").'</ol>';
    }
       $result .= '<ol class="LC_primary_menu LC_floatleft">'.
       Apache::lonmenu::create_submenu("#", "", &mt("Help"), &Apache::structuretags::helpmenu_datastructure(),"").'</ol>';
       $result.="</div>";
                     
          $result.='<hr style="clear:both;" />'.&Apache::lonxml::message_location().'</div>'.             $result.='<hr style="clear:both;visibility:hidden" /></div></div>'.&Apache::lonxml::message_location().
                   '<textarea '.&Apache::edit::element_change_detection().                    &Apache::loncommon::xmleditor_js().
     '<textarea '.&Apache::edit::element_change_detection().
               ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" '.                ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" '.
       ' name="editxmltext" id="LC_editxmltext">'.        ' name="editxmltext" id="LC_editxmltext">'.
       &HTML::Entities::encode($problem,'<>&"').'</textarea>        &HTML::Entities::encode($problem,'<>&"').'</textarea>
             <div id="LC_aftertextarea">              <div id="LC_aftertextarea">
             </div>              </div>
             </form>'.&Apache::loncommon::end_page();          </form>';
  &Apache::lonxml::add_messages(\$result);      my $resource = $env{'request.ambiguous'};
  $request->print($result);      unless($env{'environment.nocodemirror'}){
           
           $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">
           <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>
           <script>
               CodeMirror.defineMode("mixedmode", function(config) {
                   return CodeMirror.multiplexingMode(
                       CodeMirror.getMode(config, "xml"),
                       {
                           open: "\<script type=\"loncapa/perl\"\>", close: "\</script\>",
                           mode: CodeMirror.getMode(config, "perl"),
                           delimStyle: "tag",
                       }
                 );
               });
               var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"),
               {
                   mode: "mixedmode",
                   lineWrapping: true,
                   lineNumbers: true,
                   tabSize: 4,
                   indentUnit: 4,
   
                   autoCloseTags: true,
                   autoCloseBrackets: true,
                   height: "auto",
                   styleActiveLine: true,
                   
                   extraKeys: {
                       "Tab": "indentMore",
                       "Shift-Tab": "indentLess",
                   }
               });
               restoreScrollPosition("'.$resource.'");
           </script>';
       }
           $result .= &Apache::loncommon::end_page();
           &Apache::lonxml::add_messages(\$result);
           $request->print($result);
     }      }
     return '';      return '';
 }  }
Line 1045  sub renderpage { Line 1117  sub renderpage {
  ."</p>";   ."</p>";
     $result.=      $result.=
  &Apache::loncommon::simple_error_page($request,'Not available',   &Apache::loncommon::simple_error_page($request,'Not available',
       $error);        $error,{'no_auto_mt_msg' => 1});
     return;      return;
  }   }
   
Line 1093  sub finished_parsing { Line 1165  sub finished_parsing {
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
 }  }
   
 sub get_template_list {  # function extracted from get_template_html
   # returns "key" -> list
   # key: path of template
   # value 1: title
   # value 2: category
   # value 3: name of help topic ???
   sub get_template_list{
       my ($extension) = @_;
       
       my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}.
                        '/templates/*.'.$extension);
       @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),
                         (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),
                         &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files);
       @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);
       return @files;
   }
   
   sub get_template_html {
     my ($extension) = @_;      my ($extension) = @_;
     my $result;      my $result;
     my @allnames;      my @allnames;
Line 1102  sub get_template_list { Line 1192  sub get_template_list {
     if ($extension eq 'survey' || $extension eq 'exam') {      if ($extension eq 'survey' || $extension eq 'exam') {
  $glob_extension = 'problem';   $glob_extension = 'problem';
     }      }
     my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}.      my @files = &get_template_list($extension);
      '/templates/*.'.$glob_extension);  
     @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),  
                       (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),  
                       &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files);  
     @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);  
     my ($midpoint,$seconddiv,$numfiles);      my ($midpoint,$seconddiv,$numfiles);
       my @noexamplelink = ('blank.problem','blank.library','script.library');
     $numfiles = 0;      $numfiles = 0;
     foreach my $file (@files) {      foreach my $file (@files) {
         next if ($file->[1] !~ /\S/);          next if ($file->[1] !~ /\S/);
Line 1147  sub get_template_list { Line 1233  sub get_template_list {
         if ($file->[3]) {          if ($file->[3]) {
            $result.=&Apache::loncommon::help_open_topic($file->[3]);             $result.=&Apache::loncommon::help_open_topic($file->[3]);
         }          }
           # Provide example link
         my $filename=$file->[0];          my $filename=$file->[0];
         $filename=~s{^\Q$londocroot\E}{};          $filename=~s{^\Q$londocroot\E}{};
         $result.=' <span class="LC_fontsize_small">'          if (!(grep($filename =~ /\Q$_\E$/,@noexamplelink))) {
                 .&Apache::loncommon::modal_link($filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')              $result .= ' <span class="LC_fontsize_small">'
                 .'</span><br />'."\n";                        .&Apache::loncommon::modal_link(
                              $filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
                         .'</span>';
           }
           $result .= '<br />'."\n";
         $count ++;          $count ++;
     }      }
     if ($numfiles > 0) {      if ($numfiles > 0) {
Line 1163  sub get_template_list { Line 1254  sub get_template_list {
 sub newproblem {  sub newproblem {
     my ($request) = @_;      my ($request) = @_;
   
    if ($env{'form.mode'} eq 'blank'){
           my $dest = &Apache::lonnet::filelocation("",$request->uri);
           &File::Copy::copy('/home/httpd/html/res/adm/includes/templates/blank.problem',$dest);
           &renderpage($request,$dest);
           return;
       }
     if ($env{'form.template'}) {      if ($env{'form.template'}) {
  my $file = $env{'form.template'};   my $file = $env{'form.template'};
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
Line 1173  sub newproblem { Line 1270  sub newproblem {
   
     my ($extension) = ($request->uri =~ m/\.(\w+)$/);      my ($extension) = ($request->uri =~ m/\.(\w+)$/);
     &Apache::lonxml::debug("Looking for :$extension:");      &Apache::lonxml::debug("Looking for :$extension:");
     my $templatelist=&get_template_list($extension);      my $templatelist=&get_template_html($extension);
     if ($env{'form.newfile'} && !$templatelist) {      if ($env{'form.newfile'} && !$templatelist) {
  # no templates found   # no templates found
  my $templatefilename =   my $templatefilename =
Line 1188  sub newproblem { Line 1285  sub newproblem {
  my $errormsg;   my $errormsg;
  my $instructions;   my $instructions;
         my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),          my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
                        'text' => 'Construction Space'},                         'text' => 'Authoring Space'},
                       {'href' => '',                        {'href' => '',
                        'text' => "Create New $extension"}];                         'text' => "Create New $extension"}];
  my $start_page =    my $start_page = 
Line 1235  sub update_construct_style { Line 1332  sub update_construct_style {
     }      }
 }  }
   
   #
   # Sets interval for current user so time left will be zero, either for the entire folder 
   # containing the current resource, or just the resource, depending on value of first item
   # in interval array retrieved from EXT("resource.0.interval");
   #
   sub zero_timer {
       my ($symb) = @_;
       my ($hastimeleft,$first_access,$now);
       my @interval=&Apache::lonnet::EXT("resource.0.interval");
       if (@interval > 1) {
           if ($interval[1] eq 'course') {
               return;
           } else {
               my $now = time;
               my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);
               if ($first_access > 0) {
                   if ($first_access+$interval[0] > $now) {
                       my $done_time = $now - $first_access;
                       my $snum = 1;
                       if ($interval[1] eq 'map') {
                           $snum = 2;
                       }
                       my $result = 
                           &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval',
                                                                        $snum,$done_time,
                                                                        'date_interval',
                                                                        $env{'user.name'},
                                                                        $env{'user.domain'});
                       return $result;
                   }
               }
           }
       }
       return;
   }
   
 sub handler {  sub handler {
     #my $t0 = [&gettimeofday()];      #my $t0 = [&gettimeofday()];
     my $request=$_[0];      my $request=$_[0];
   
     $Apache::lonxml::request=$request;      $Apache::lonxml::request=$request;
     $Apache::lonxml::debug=$env{'user.debug'};      $Apache::lonxml::debug=$env{'user.debug'};
     $env{'request.uri'}=$request->uri;      $env{'request.uri'}=$request->uri;
Line 1261  sub handler { Line 1394  sub handler {
  &unset_permissions();   &unset_permissions();
  return OK;   return OK;
     }      }
   
     &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");      &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");
     &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});      &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
     my ($symb) = &Apache::lonnet::whichuser();      my ($symb) = &Apache::lonnet::whichuser();
Line 1285  sub handler { Line 1419  sub handler {
  &renderpage($request,$file);   &renderpage($request,$file);
     }      }
  } else {   } else {
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
       ['mode']);
     # requested file doesn't exist in contruction space      # requested file doesn't exist in contruction space
     &newproblem($request);      &newproblem($request);
  }   }
     } else {      } else {
           # Set the event timer to zero if the "done button" was clicked.  The button is
           # part of the doneButton form created in lonmenu.pm
           if ($symb && $env{'form.LC_interval_done'} eq 'true') {  
               &zero_timer($symb);
               undef($env{'form.LC_interval_done'});
           }
  # just render the page normally outside of construction space   # just render the page normally outside of construction space
  &Apache::lonxml::debug("not construct");   &Apache::lonxml::debug("not construct");
  &renderpage($request,$file);   &renderpage($request,$file);

Removed from v.1.336  
changed lines
  Added in v.1.349.2.3


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