Diff for /loncom/homework/externalresponse.pm between versions 1.22 and 1.31

version 1.22, 2013/08/22 11:13:43 version 1.31, 2014/12/07 19:45:08
Line 38  use Apache::lonxml(); Line 38  use Apache::lonxml();
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
   use Apache::essayresponse;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 BEGIN {  BEGIN {
Line 74  sub start_externalresponse { Line 75  sub start_externalresponse {
  }   }
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
   $result=&Apache::response::meta_package_write('externalresponse');    $result=&Apache::response::meta_package_write('externalresponse');
     }      } elsif ($target eq 'web') {
     elsif ($target eq 'web' &&  
         $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {  
         my $part= $Apache::inputtags::part;          my $part= $Apache::inputtags::part;
         my $ncol= &Apache::lonnet::EXT("resource.$part".'_'."$id.maxcollaborators");          my $coll;
         my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');          if ($Apache::lonhomework::history{"resource.$part.$id.collaborators"} =~ /\S/) {
         my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes");              $coll = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');
         $uploadedfiletypes=~s/[^\w\,]//g;  
         my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize");  
         if (!defined($maxfilesize)) {  
             $maxfilesize = 10.0; #FIXME This should become a domain configuration   
         }          }
             if($uploadedfiletypes){          if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
               my $ncol= &Apache::lonnet::EXT("resource.$part".'_'."$id.maxcollaborators");
               my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes");
               $uploadedfiletypes=~s/[^\w\,]//g;
               my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize");
               if (!defined($maxfilesize)) {
                   $maxfilesize = 10.0; #FIXME This should become a domain configuration 
               }
             my $hiddendraft;              my $hiddendraft;
               if ($uploadedfiletypes) {
                 if (($Apache::lonhomework::type eq 'survey') ||                  if (($Apache::lonhomework::type eq 'survey') ||
                     ($Apache::lonhomework::type eq 'surveycred') ||                      ($Apache::lonhomework::type eq 'surveycred') ||
                     ($Apache::lonhomework::type eq 'anonsurvey') ||                      ($Apache::lonhomework::type eq 'anonsurvey') ||
                     ($Apache::lonhomework::type eq 'anonsurveycred')) {                      ($Apache::lonhomework::type eq 'anonsurveycred')) {
                     $hiddendraft = '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" />';                      $hiddendraft = '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" />';
                 } else {                  } else {
                     my $status_text = &mt('Submission type');                      $result = &Apache::essayresponse::draft_row($part,$id,$ncol,$uploadedfiletypes);
                     if ($Apache::lonhomework::history{"resource.$part.award"} eq 'DRAFT') {  
                         $status_text .= '<br />'.&mt('(Currently -- draft)');  
                     }  
                     $result = &Apache::lonhtmlcommon::row_title($status_text);  
                     my $closure;  
                     unless ($ncol || $uploadedfiletypes) {  
                         $closure = 1;  
                     }  
                     $result.=  
                         '<label>'.  
                         '<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="yes" checked="checked" />&nbsp;'.  
                         &mt('Submit entries below as answer to receive credit').  
                         '</label> <br />'.  
                         '<label>'.  
                         '<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="no" />&nbsp;'.  
                         &mt('Save entries below (not submitted for credit yet)').  
                         '</label>'.  
                         &Apache::lonhtmlcommon::row_closure($closure);  
                 }                  }
   
                 if ($ncol > 0) {                  if ($ncol > 0) {
                     $result.= &Apache::lonhtmlcommon::row_title(&mt('Collaborators')).                      $result .= &Apache::essayresponse::get_collab_row($part,$id,$coll,$ncol);
                           '<label>'.  
                           &mt('Collaborators:').' <input type="text" size="70" max="80" name="HWCOL'.  
                           $part.'_'.$id.'" value="'.$coll.'" /><br />'.  
                           &mt('Enter a maximum of [quant,_1,collaborator] using username or username:domain, e.g. smithje or smithje:[_2].',$ncol,$env{'user.domain'});  
                     if ($ncol > 1) {  
                         $result .= '<br />'.&mt('If entering more than one, use spaces to separate the collaborators.');  
             }  
                     $result .= '</label><br />';  
                     $result .= &Apache::essayresponse::check_collaborators($ncol,$coll) if ($coll =~ /\w+/);  
                     $result .= &Apache::lonhtmlcommon::row_closure();  
                 }                  }
                 my $filesfrom = 'both';                  my $filesfrom = 'both';
                 my $stuname = &Apache::lonnet::EXT('user.name');                  my $stuname = &Apache::lonnet::EXT('user.name');
                 my $studom = &Apache::lonnet::EXT('user.domain');                  my $studom = &Apache::lonnet::EXT('user.domain');
                 if (!&Apache::lonnet::usertools_access($stuname,$studom,'portfolio')) {                  if (!&Apache::lonnet::usertools_access($stuname,$studom,'portfolio')) {
                 $filesfrom = 'uploadonly';                      $filesfrom = 'uploadonly';
                 }                  }
                 $result.=&Apache::inputtags::file_selector($part,$id,$uploadedfiletypes,                  $result.=&Apache::inputtags::file_selector($part,$id,$uploadedfiletypes,
                                                    $filesfrom,undef,$maxfilesize);                                                             $filesfrom,undef,$maxfilesize);
                 if ($result) {              } else {
                     $result =                  if ($ncol > 0) {
                         '<div>'.$hiddendraft.                      $result = &Apache::essayresponse::get_collab_row($part,$id,$coll,$ncol,1);
                         &Apache::lonhtmlcommon::start_pick_box().  
                         $result.  
                         &Apache::lonhtmlcommon::end_pick_box().'</div>';  
                 } else {  
                     $result = $hiddendraft;  
                 }                  }
               }
               if ($result) {
                   $result =
                       '<div>'.$hiddendraft.
                       &Apache::lonhtmlcommon::start_pick_box().
                       $result.
                       &Apache::lonhtmlcommon::end_pick_box().'</div>';
               } else {
                   $result = $hiddendraft;
               }
           } else {
               $result = &Apache::essayresponse::show_status_table($part,$id,$coll);
         }          }
     } elsif ($target eq 'web' &&      }
              $Apache::inputtags::status[-1] ne 'CAN_ANSWER') {  
         my $part= $Apache::inputtags::part;  
         my @msgs;  
         if ($Apache::lonhomework::history{"resource.$part.$id.collaborators"} =~ /\S/) {  
             my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');  
             $result .= '<td><i>'.&mt('Collaborated with [_1]',$coll).'</i></td>';  
         }  
   
         my $current_files_display = &Apache::inputtags::current_file_submissions($part,$id);  
         if ($current_files_display) {  
             $result .= '<td><b>'.&mt('Submitted files:').'</b><br />'.  
                        $current_files_display.'</td>';  
         }  
   
         if ($result ne '') {  
             $result =  
                 '<table class="LC_pastsubmission"><tr>'.$result.  
                 '</tr></table>';  
         }  
     }   
     return $result;      return $result;
 }  }
   
 sub end_externalresponse {  sub end_externalresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
       my $response;
     my $part=$Apache::inputtags::part;      my $part=$Apache::inputtags::part;
     my $id = $Apache::inputtags::response['-1'];      my $id = $Apache::inputtags::response['-1'];
     my $increment     = 1;      my $increment     = 1;
     if ($target eq 'grade') {      if ($target eq 'grade') {
         my $collaborators = $env{'form.HWCOL'.$part.'_'.$id};          &Apache::essayresponse::get_collaborators($part,$id);
         my $previous_list= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');  
         if ($collaborators ne $previous_list) {  
 #          &Apache::lonnet::logthis("New collaborators [$collaborators] [$previous_list]");  
            $Apache::lonhomework::results{"resource.$part.$id.collaborators"}=$collaborators;  
         }  
  if (  &Apache::response::submitted('scantron') ) {   if (  &Apache::response::submitted('scantron') ) {
     my $increment=&Apache::response::scored_response($part,$id);      my $increment=&Apache::response::scored_response($part,$id);
  } elsif ( &Apache::response::submitted() ) {   } elsif ( &Apache::response::submitted() ) {
             my $response      = $env{'form.HWVAL_'.$id};              $response      = $env{'form.HWVAL_'.$id};
             my $jspart=$part;              my $jspart=$part;
             $jspart=~s/\./_/g;              $jspart=~s/\./_/g;
             my $filename = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'} ||              my $filename = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'} ||
                            $env{'form.HWFILETOOBIG'.$part.'_'.$id};                             $env{'form.HWFILETOOBIG'.$part.'_'.$id};
             my $portfiles = $env{'form.HWPORT'.$jspart.'_'.$id};              my $portfiles = $env{'form.HWPORT'.$jspart.'_'.$id};
             my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$jspart.'_'.$id.'_delete');              my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$jspart.'_'.$id.'_delete');
             my ($is_submit,$was_draft);              my ($is_submit,$was_draft,$externalgrade,%info);
             if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {              if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {
                  $is_submit = 1;                   $is_submit = 1;
             }              }
             if ($Apache::lonhomework::history{"resource.$part.award"} eq 'DRAFT') {              if ($Apache::lonhomework::history{"resource.$part.award"} eq 'DRAFT') {
                 $was_draft = 1;                  $was_draft = 1;
             }              }
             if (($response =~ /[^\s]/) || ($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/) ||              if (($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/) ||
                 (@deletions > 0) || ($was_draft && $is_submit)) {                  (@deletions > 0) || ($was_draft && $is_submit)) {
                 my $award='DRAFT';                  my $award='DRAFT';
                 if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {                  if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {
Line 216  sub end_externalresponse { Line 173  sub end_externalresponse {
                 }                  }
                 my $uploadedflag=0;                  my $uploadedflag=0;
                 my $totalsize=0;                  my $totalsize=0;
                 &Apache::essayresponse::file_submission($part,$id,\$award,\$uploadedflag,\$totalsize,\@deletions);                  %info = (
                               'is_submit' => $is_submit,
                           );
                   my $url = &Apache::lonxml::get_param('url',$parstack,$safeeval);
                   if ($url =~ m{^https?://([^/]+)/}) {
                       use Socket;
                       my $ip = gethostbyname($1);
                       if (length($ip) eq 4) {
                           $info{'ip'} = inet_ntoa($ip);
                       }
                   } elsif ($url =~ m{^/}) {
                       my $ip = &Apache::lonnet::get_host_ip($Apache::lonnet::perlvar{'lonHostID'});
                       if ($ip =~ /^[\d\.]+$/) {
                           $info{'ip'} = $ip;
                       }
                   }
                   &Apache::essayresponse::file_submission($part,$id,\$award,\$uploadedflag,\$totalsize,
                                                           \@deletions,'externalresponse',\%info);
                 $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response;                  $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response;
                 $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award;                  $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award;
                 my %previous=&Apache::response::check_for_previous($response,$part,$id);                  my %previous=&Apache::response::check_for_previous($response,$part,$id);
Line 243  sub end_externalresponse { Line 217  sub end_externalresponse {
                                          { $akey => $response },$adom,$aname);                                           { $akey => $response },$adom,$aname);
                     }                      }
                 }                  }
               ($award eq 'DRAFT') ? ($externalgrade = 0) : ($externalgrade =1);
             }              }
     my $response = &Apache::response::getresponse();            if (&Apache::response::getresponse() =~ /[^\s]/) {
                  $response = &Apache::response::getresponse();
                  $externalgrade = 1;
             }  
   
             if ($externalgrade) {
             my $filesresults=0;              my $filesresults=0;
 # Previously turned in files  # Previously turned in files
             my %previously_turned_in=();              my %previously_turned_in=();
Line 257  sub end_externalresponse { Line 236  sub end_externalresponse {
             }              }
 # Currently turned in files  # Currently turned in files
             my %currently_turned_in=();              my %currently_turned_in=();
             foreach my $file (split(/\,/,$Apache::lonhomework::results{"resource.$part.$id.portfiles"}.','.             foreach my $file (split(/\,/,$Apache::lonhomework::results{"resource.$part.$id.portfiles"}.','.
                                          $Apache::lonhomework::results{"resource.$part.$id.uploadedurl"})) {                                           $Apache::lonhomework::results{"resource.$part.$id.uploadedurl"})) {
                if ($file=~/\S/) {                if ($file=~/\S/) {
                   $filesresults=1;                    $filesresults=1;
                   $currently_turned_in{'/uploaded/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/portfolio'.$file}=1;                    $currently_turned_in{'/uploaded/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/portfolio'.$file}=1;
                }                 }
             }              }
             my $filelinks=join(',',map{&escape($_)}(keys(%currently_turned_in)));              my $filelinks=join(',',map{$_}(keys(%currently_turned_in)));
             &Apache::lonnet::logthis("Previously: ".join("\n",sort(keys(%previously_turned_in))));              &Apache::lonnet::logthis("Previously: ".join("\n",sort(keys(%previously_turned_in))));
             &Apache::lonnet::logthis("Currently: ".join("\n",sort(keys(%currently_turned_in))));              &Apache::lonnet::logthis("Currently: ".join("\n",sort(keys(%currently_turned_in))));
             &Apache::lonnet::logthis("File flag: ".$filesresults);              &Apache::lonnet::logthis("File flag: ".$filesresults);
             &Apache::lonnet::logthis("Links String: ".$filelinks);              &Apache::lonnet::logthis("Links String: ".$filelinks);
     if (( $response =~ /[^\s]/) ||  $filesresults ) {      if ($filesresults || ( $response =~ /[^\s]/)  ) {
  my $url = &Apache::lonxml::get_param('url',$parstack,$safeeval);   my $url = &Apache::lonxml::get_param('url',$parstack,$safeeval);
  my $answer = &Apache::lonxml::get_param('answer',$parstack,$safeeval);   my $answer = &Apache::lonxml::get_param('answer',$parstack,$safeeval);
  my %form = &Apache::lonxml::get_param_var('form',$parstack,$safeeval);   my %form = &Apache::lonxml::get_param_var('form',$parstack,$safeeval);
Line 282  sub end_externalresponse { Line 261  sub end_externalresponse {
  &Apache::lonhomework::showhash(%form);   &Apache::lonhomework::showhash(%form);
                 my $udom = &Apache::lonnet::EXT('user.domain');                  my $udom = &Apache::lonnet::EXT('user.domain');
                 my $uname = &Apache::lonnet::EXT('user.name');                  my $uname = &Apache::lonnet::EXT('user.name');
                 my $symb = $env{'resource.symb'};                  my $symb = &Apache::lonnet::symbread();
                 my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$udom,$uname);                  my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$udom,$uname);
  my $ua = LWP::UserAgent->new;   my $ua = LWP::UserAgent->new;
  my $res = $ua->request(POST $url, \%form);   my $res = $ua->request(POST $url, \%form);
  my %previous = &Apache::response::check_for_previous($response,                  my @delaccess = keys(%currently_turned_in);
      $part,$id);                  &Apache::lonnet::automated_portfile_access('ip',undef,\@delaccess,\%info);
                   my @submitted_portfiles = split(/,/,$Apache::lonhomework::results{"resource.$part.$id.portfiles"}); 
                   my @versioned_portfiles;
                   &Apache::lonnet::portfiles_versioning($symb,$udom,$uname,\@submitted_portfiles,
                                                         \@versioned_portfiles);
                   $Apache::lonhomework::results{"resource.$part.$id.portfiles"} =
                       join(',',@versioned_portfiles); 
  %Apache::loncapagrade::results=();   %Apache::loncapagrade::results=();
  $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response;   $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response;
  if ($res->is_error()) {   if ($res->is_error()) {
Line 304  sub end_externalresponse { Line 289  sub end_externalresponse {
  $Apache::loncapagrade::results{$key};   $Apache::loncapagrade::results{$key};
  }   }
                 $Apache::externalresponse::message=$Apache::loncapagrade::results{'message'};                  $Apache::externalresponse::message=$Apache::loncapagrade::results{'message'};
  &Apache::response::handle_previous(\%previous,  
    $Apache::loncapagrade::results{'awarddetail'});  
                 if ($Apache::loncapagrade::results{'awarddetail'} eq 'ASSIGNED_SCORE') {                  if ($Apache::loncapagrade::results{'awarddetail'} eq 'ASSIGNED_SCORE') {
                    $Apache::lonhomework::results{"resource.$part.$id.awarded"}=                     $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
                         1.*$Apache::loncapagrade::results{"awarded"};                          1.*$Apache::loncapagrade::results{"awarded"};
                 }                  }
                   my $handbackurl = $Apache::loncapagrade::results{'handbackurl'}
                   &Apache::lonnet::logthis("handbackurl: ". $Apache::loncapagrade::results{'handbackurl'});
  &Apache::lonxml::debug("response of");   &Apache::lonxml::debug("response of");
  &Apache::lonhomework::showhash(%$res);   &Apache::lonhomework::showhash(%$res);
  &Apache::lonxml::debug("capagrade of");   &Apache::lonxml::debug("capagrade of");
Line 318  sub end_externalresponse { Line 303  sub end_externalresponse {
  &Apache::lonhomework::showhash(%Apache::lonhomework::results);   &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     }      }
         }          }
         }
     }      }
     if ($target eq 'web')  {      if ($target eq 'web')  {
         &Apache::response::setup_prior_tries_hash(\&Apache::essayresponse::format_prior_response,          &Apache::response::setup_prior_tries_hash(\&Apache::essayresponse::format_prior_response,
Line 325  sub end_externalresponse { Line 311  sub end_externalresponse {
                                                    'uploadedurl']);                                                     'uploadedurl']);
         if (&Apache::response::show_answer()) {          if (&Apache::response::show_answer()) {
            $result.='<table border="1"><tr><th>'.&mt('Your answer:').'</th></tr><tr><td><pre>'.             $result.='<table border="1"><tr><th>'.&mt('Your answer:').'</th></tr><tr><td><pre>'.
                     $Apache::lonhomework::history{"resource.$part.$id.submission"}.                      &HTML::Entities::encode(
                           $Apache::lonhomework::history{"resource.$part.$id.submission"},'"<>&').
                     '</pre></td></table><br />'.&Apache::lonxml::get_param('answerdisplay',$parstack,$safeeval).                      '</pre></td></table><br />'.&Apache::lonxml::get_param('answerdisplay',$parstack,$safeeval).
                     '<br />';                      '<br />';
         }          }

Removed from v.1.22  
changed lines
  Added in v.1.31


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