Diff for /loncom/homework/externalresponse.pm between versions 1.14 and 1.26

version 1.14, 2008/11/10 13:18:19 version 1.26, 2014/01/13 15:29:10
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
 =pod  
   
 =head1 NAME  
   
 Apache::externalresponse.pm  
   
 =head1 SYNOPSIS  
   
 Handler to evaluate externally graded responses.  
   
 This is part of the LearningOnline Network with CAPA project  
 described at http://www.lon-capa.org.  
   
   
 =cut  
   
 package Apache::externalresponse;  package Apache::externalresponse;
 use strict;  use strict;
 use HTTP::Request::Common;  use HTTP::Request::Common;
 use Apache::loncapagrade;  use Apache::loncapagrade;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::lonlocal;
   use Apache::lonxml();
   use Apache::lonhtmlcommon;
   use Apache::loncommon;
   use Apache::lonnavmaps;
   use LONCAPA qw(:DEFAULT :match);
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::externalresponse',('externalresponse'));      &Apache::lonxml::register('Apache::externalresponse',('externalresponse'));
Line 54  BEGIN { Line 46  BEGIN {
   
 =pod  =pod
   
 =head1 FIXME  =head1 FIXME (start_externalresponse)
   
 send of response params and their current values (form good enough? what parameters to send?)  send of response params and their current values (form good enough? what parameters to send?)
 Need to get returned message displayed  Need to get returned message displayed
Line 66  sub start_externalresponse { Line 58  sub start_externalresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     my $id = &Apache::response::start_response($parstack,$safeeval);      my $id = &Apache::response::start_response($parstack,$safeeval);
   
     if ($target eq 'edit') {      if ($target eq 'edit') {
   $result .=&Apache::edit::tag_start($target,$token);    $result .=&Apache::edit::tag_start($target,$token);
  $result .=&Apache::edit::text_arg('URL:','url',$token,60).'<br />';   $result .=&Apache::edit::text_arg('URL:','url',$token,60).'<br />';
  $result .=&Apache::edit::text_arg('Answer:','answer',$token);   $result .=&Apache::edit::text_arg(&mt('Answer:'),'answer',$token);
  $result .=&Apache::edit::text_arg('Form:','form',$token);   $result .=&Apache::edit::text_arg(&mt('Form:'),'form',$token).'<br />';
           $result .=&Apache::edit::text_arg(&mt('Answer display:'),'answerdisplay',$token,80);
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag =   my $constructtag =
     &Apache::edit::get_new_args($token,$parstack,$safeeval,      &Apache::edit::get_new_args($token,$parstack,$safeeval,
  'answer','form','url');   'answerdisplay','answer','form','url');
  if ($constructtag) {   if ($constructtag) {
     $result = &Apache::edit::rebuild_tag($token);      $result = &Apache::edit::rebuild_tag($token);
  }   }
     } 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' &&
           $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
           my $part= $Apache::inputtags::part;
           my $ncol= &Apache::lonnet::EXT("resource.$part".'_'."$id.maxcollaborators");
           my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');
           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 
           }
               if($uploadedfiletypes){
               my $hiddendraft;
                   if (($Apache::lonhomework::type eq 'survey') ||
                       ($Apache::lonhomework::type eq 'surveycred') ||
                       ($Apache::lonhomework::type eq 'anonsurvey') ||
                       ($Apache::lonhomework::type eq 'anonsurveycred')) {
                       $hiddendraft = '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" />';
                   } else {
                       my $status_text = &mt('Submission type');
                       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) {
                       $result.= &Apache::lonhtmlcommon::row_title(&mt('Collaborators')).
                             '<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 $stuname = &Apache::lonnet::EXT('user.name');
                   my $studom = &Apache::lonnet::EXT('user.domain');
                   if (!&Apache::lonnet::usertools_access($stuname,$studom,'portfolio')) {
                   $filesfrom = 'uploadonly';
                   }
                   $result.=&Apache::inputtags::file_selector($part,$id,$uploadedfiletypes,
                                                      $filesfrom,undef,$maxfilesize);
                   if ($result) {
                       $result =
                           '<div>'.$hiddendraft.
                           &Apache::lonhtmlcommon::start_pick_box().
                           $result.
                           &Apache::lonhtmlcommon::end_pick_box().'</div>';
                   } else {
                       $result = $hiddendraft;
                   }
           }
       } 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;
Line 97  sub end_externalresponse { Line 181  sub end_externalresponse {
  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 = &Apache::response::getresponse();              $response      = $env{'form.HWVAL_'.$id};
     if ( $response =~ /[^\s]/) {              my $jspart=$part;
               $jspart=~s/\./_/g;
               my $filename = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'} ||
                              $env{'form.HWFILETOOBIG'.$part.'_'.$id};
               my $portfiles = $env{'form.HWPORT'.$jspart.'_'.$id};
               my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$jspart.'_'.$id.'_delete');
               my ($is_submit,$was_draft,$externalgrade);
               if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {
                    $is_submit = 1;
               }
               if ($Apache::lonhomework::history{"resource.$part.award"} eq 'DRAFT') {
                   $was_draft = 1;
               }
               if (($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/) ||
                   (@deletions > 0) || ($was_draft && $is_submit)) {
                   my $award='DRAFT';
                   if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') {
                       if ($Apache::lonhomework::type eq 'anonsurvey') {
                           $award='ANONYMOUS';
                       } elsif ($Apache::lonhomework::type eq 'anonsurveycred') {
                           $award='ANONYMOUS_CREDIT';
                       } elsif ($Apache::lonhomework::type eq 'surveycred') {
                           $award='SUBMITTED_CREDIT';
                       } else {
                           $award='SUBMITTED';
                       }
                   }
                   my $uploadedflag=0;
                   my $totalsize=0;
                   &Apache::essayresponse::file_submission($part,$id,\$award,\$uploadedflag,\$totalsize,\@deletions);
                   $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response;
                   $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award;
                   my %previous=&Apache::response::check_for_previous($response,$part,$id);
                   if ($uploadedflag) {
                       if ($award eq 'FILENAME_INUSE') {
                           delete($Apache::lonhomework::results{"resource.$id.tries"});
                       }
                   } else {
                       &Apache::response::handle_previous(\%previous,$award);
                   }
                   if ($award eq 'SUBMITTED') {
                       my ($symb,$crsid,$domain,$name)=
                           &Apache::lonnet::whichuser();
                       if ($crsid) {
                           my $akey=join('.',&escape($name),&escape($domain),
                                         &escape($crsid));
                           my $essayurl=
                               &Apache::lonnet::declutter($ENV{'REQUEST_URI'});
                           my ($adom,$aname,$apath)=
                               ($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/);
                           $apath=&escape($apath);
                           $apath=~s/\W/\_/gs;
                           &Apache::lonnet::put('nohist_essay_'.$apath,
                                            { $akey => $response },$adom,$aname);
                       }
                   }
               ($award eq 'DRAFT') ? ($externalgrade = 0) : ($externalgrade =1);
               }
             if (&Apache::response::getresponse() =~ /[^\s]/) {
                  $response = &Apache::response::getresponse();
                  $externalgrade = 1;
             }  
   
             if ($externalgrade) {
               my $filesresults=0;
   # Previously turned in files
               my %previously_turned_in=();
               foreach my $file (split(/\,/,$Apache::lonhomework::history{"resource.$part.$id.portfiles"}.','.
                                            $Apache::lonhomework::history{"resource.$part.$id.uploadedurl"})) {
                  if ($file=~/\S/) {
                     $previously_turned_in{'/uploaded/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/portfolio'.$file}=1;
                  }
               }
   # Currently turned in files
               my %currently_turned_in=();
              foreach my $file (split(/\,/,$Apache::lonhomework::results{"resource.$part.$id.portfiles"}.','.
                                            $Apache::lonhomework::results{"resource.$part.$id.uploadedurl"})) {
                 if ($file=~/\S/) {
                     $filesresults=1;
                     $currently_turned_in{'/uploaded/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/portfolio'.$file}=1;
                  }
               }
               my $filelinks=join(',',map{$_}(keys(%currently_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("File flag: ".$filesresults);
               &Apache::lonnet::logthis("Links String: ".$filelinks);
       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 106  sub end_externalresponse { Line 277  sub end_externalresponse {
  $form{'LONCAPA_correct_answer'}=$answer;   $form{'LONCAPA_correct_answer'}=$answer;
  $form{'LONCAPA_language'}=   $form{'LONCAPA_language'}=
     &Apache::lonnet::metadata($ENV{'REQUEST_URI'},'language');      &Apache::lonnet::metadata($ENV{'REQUEST_URI'},'language');
                   $form{'LONCAPA_student_submitted_files'} = $filelinks;
  &Apache::lonxml::debug("Asking $url, with:");   &Apache::lonxml::debug("Asking $url, with:");
  &Apache::lonhomework::showhash(%form);   &Apache::lonhomework::showhash(%form);
                   my $udom = &Apache::lonnet::EXT('user.domain');
                   my $uname = &Apache::lonnet::EXT('user.name');
                   my $symb = $env{'resource.symb'};
                   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,  
      $part,$id);  
  %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 127  sub end_externalresponse { Line 301  sub end_externalresponse {
     $Apache::lonhomework::results{"resource.$part.$id.$key"}=      $Apache::lonhomework::results{"resource.$part.$id.$key"}=
  $Apache::loncapagrade::results{$key};   $Apache::loncapagrade::results{$key};
  }   }
  &Apache::response::handle_previous(\%previous,                  $Apache::externalresponse::message=$Apache::loncapagrade::results{'message'};
    $Apache::loncapagrade::results{'awarddetail'});                  if ($Apache::loncapagrade::results{'awarddetail'} eq 'ASSIGNED_SCORE') {
                      $Apache::lonhomework::results{"resource.$part.$id.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 136  sub end_externalresponse { Line 315  sub end_externalresponse {
  &Apache::lonxml::debug("results of");   &Apache::lonxml::debug("results of");
  &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(\&format_prior_response);          &Apache::response::setup_prior_tries_hash(\&Apache::essayresponse::format_prior_response,
                                                     ['portfiles',
                                                      'uploadedurl']);
           if (&Apache::response::show_answer()) {
              $result.='<table border="1"><tr><th>'.&mt('Your answer:').'</th></tr><tr><td><pre>'.
                       &HTML::Entities::encode(
                           $Apache::lonhomework::history{"resource.$part.$id.submission"},'"<>&').
                       '</pre></td></table><br />'.&Apache::lonxml::get_param('answerdisplay',$parstack,$safeeval).
                       '<br />';
           }
           if ($Apache::externalresponse::message) {
              $result.='<br /><table><tr><td bgcolor="#FFFFAA">'.$Apache::externalresponse::message.'</td></tr></table><br />';
           }
           $Apache::externalresponse::message='';
   
     }      }
   
     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||      if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
Line 151  sub end_externalresponse { Line 345  sub end_externalresponse {
     &Apache::lonhomework::set_bubble_lines();      &Apache::lonhomework::set_bubble_lines();
  }   }
     }      }
       elsif ($target eq 'edit') {
           $result.=&Apache::edit::end_table();
   
       } elsif ($target eq 'tex'
                && $Apache::lonhomework::type eq 'exam') {
           $result .= &Apache::inputtags::exam_score_line($target);
   
       } 
     &Apache::response::end_response();      &Apache::response::end_response();
     return $result;      return $result;
 }  }
   
 sub format_prior_response {  
     my ($mode,$answer) =@_;  
     return '<span class="LC_prior_external">'.  
     &HTML::Entities::encode($answer,'"<>&').'</span>';  
 }  
   
 1;  1;
 __END__  __END__
   
   
   =pod
   
   =head1 NAME
   
   Apache::externalresponse.pm
   
   =head1 SYNOPSIS
   
   Handler to evaluate externally graded responses.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 SUBROUTINES
   
   =over
   
   =item start_externalresponse()
   
   =item end_externalresponse()
   
   =back
   
   =cut

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


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