--- loncom/homework/caparesponse/caparesponse.pm 2010/10/14 04:02:07 1.240 +++ loncom/homework/caparesponse/caparesponse.pm 2010/10/14 19:55:04 1.241 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.240 2010/10/14 04:02:07 raeburn Exp $ +# $Id: caparesponse.pm,v 1.241 2010/10/14 19:55:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,6 +33,7 @@ use Safe::Hole; use Apache::lonmaxima(); use Apache::lonlocal; use Apache::lonnet; +use Apache::lonmsg(); use Apache::response(); use Storable qw(dclone); @@ -465,6 +466,48 @@ sub check_submission { return($ad,$msg, $name); } +sub stringresponse_gradechange { + my ($part,$id,$previous,$caller,$response,$ad,$type) = @_; + return unless (ref($previous) eq 'HASH'); + my ($prevarray,$prevaward); + my %typenames = ( + cs => 'Case sensitive', + ci => 'Case insensitive', + ); + if ($caller eq 'cs') { + return unless (ref($previous->{'version'}) eq 'ARRAY'); + $prevarray = $previous->{'version'}; + $prevaward = $previous->{'award'}; + } elsif ($caller eq 'ci') { + return unless (ref($previous->{'versionci'}) eq 'ARRAY'); + $prevarray = $previous->{'versionci'}; + $prevaward = $previous->{'awardci'}; + } else { + return; + } + my $count=0; + my %count_lookup; + foreach my $i (1..$Apache::lonhomework::history{'version'}) { + my $prefix = $i.":resource.$part"; + next if (!exists($Apache::lonhomework::history{"$prefix.award"})); + $count++; + $count_lookup{$i} = $count; + } + my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser(); + my %coursedesc = &Apache::lonnet::coursedescription($courseid); + my $cdom = $coursedesc{'domain'}; + my $versions = ' (submissions: '.join(', ',map {$count_lookup{$_} } @{$prevarray}).')'; + my $warning = "String Response ($typenames{$type}) grading discrepancy: award for response of $response changed from $prevaward".$versions." to $ad; user: $name:$domain in course: $courseid for part: $part response: $id for symb: $symb"; + &Apache::lonnet::logthis($warning); + my $origmail = $Apache::lonnet::perlvar{'lonAdmEMail'}; + my $recipients = &Apache::loncommon::build_recipient_list(undef,'errormail', + $cdom,$origmail); + if ($recipients ne '') { + &Apache::lonmsg::sendemail($recipients,'Stringresponse Grading Discrepancy',$warning); + } + return; +} + sub add_in_tag_answer { my ($parstack,$safeeval,$response_level) = @_; my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval, @@ -1153,7 +1196,8 @@ sub end_stringresponse { my $response = &Apache::response::getresponse(); if ( $response =~ /[^\s]/) { my %previous = &Apache::response::check_for_previous($response, - $part,$id); + $part,$id, + undef,$type); &Apache::lonxml::debug("submitted a $response
\n"); &Apache::lonxml::debug($$parstack[-1] . "\n
"); $Apache::lonhomework::results{"resource.$part.$id.submission"}= @@ -1184,6 +1228,14 @@ sub end_stringresponse { &Apache::lonxml::debug(" doing $name with ".join(':',@{ $answer{$name}{'answers'} })); ${$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=dclone($answer{$name}); my ($result, @msgs)=&Apache::run::run("&caparesponse_check_list()",$safeeval); + if ($$args_ref{'type'} =~ /^c[si]$/) { + my $error = pop(@msgs); + if ($error ne '') { + my ($symb,$courseid,$domain,$name) = + &Apache::lonnet::whichuser(); + &Apache::lonnet::logthis("Stringresponse grading error: $error for $name:$domain in $courseid for part: $part response: $id and symb: $symb"); + } + } &Apache::lonxml::debug('msgs are'.join(':',@msgs)); my ($awards)=split(/:/,$result); my (@awards) = split(/,/,$awards); @@ -1211,6 +1263,19 @@ sub end_stringresponse { $ad='ANONYMOUS_CREDIT'; } } + unless ($env{'request.state'} eq 'construct') { + if ($previous{'used'}) { + if ($ad ne $previous{'award'} && $previous{'award'} ne '') { + &stringresponse_gradechange($part,$id,\%previous, + 'cs',$response,$ad,$type); + } + } elsif ($previous{'usedci'}) { + if ($ad ne $previous{'awardci'} && $previous{'awardci'} ne '') { + &stringresponse_gradechange($part,$id,\%previous, + 'ci',$response,$ad,$type); + } + } + } &Apache::response::handle_previous(\%previous,$ad); $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad; $Apache::lonhomework::results{"resource.$part.$id.awardmsg"}=$msg;