--- loncom/homework/grades.pm 2007/06/15 22:16:13 1.409 +++ loncom/homework/grades.pm 2007/06/16 14:38:45 1.413 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.409 2007/06/15 22:16:13 albertel Exp $ +# $Id: grades.pm,v 1.413 2007/06/16 14:38:45 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -6178,6 +6178,14 @@ sub gather_adv_clicker_ids { return %clicker_ids; } +sub clicker_grading_parameters { + return ('gradingmechanism' => 'scalar', + 'upfiletype' => 'scalar', + 'specificid' => 'scalar', + 'pcorrect' => 'scalar', + 'pincorrect' => 'scalar'); +} + sub process_clicker { my ($r)=@_; my ($symb)=&get_symb($r); @@ -6191,6 +6199,22 @@ sub process_clicker { $result.=' '.&mt('Specify a file containing the clicker information for this resource'). '.'."\n"; $result.=''."\n"; +# Attempt to restore parameters from last session, set defaults if not present + my %Saveable_Parameters=&clicker_grading_parameters(); + &Apache::loncommon::restore_course_settings('grades_clicker', + \%Saveable_Parameters); + if (!$env{'form.pcorrect'}) { $env{'form.pcorrect'}=100; } + if (!$env{'form.pincorrect'}) { $env{'form.pincorrect'}=100; } + if (!$env{'form.gradingmechanism'}) { $env{'form.gradingmechanism'}='attendance'; } + if (!$env{'form.upfiletype'}) { $env{'form.upfiletype'}='iclicker'; } + + my %checked; + foreach my $gradingmechanism ('attendance','personnel','specific') { + if ($env{'form.gradingmechanism'} eq $gradingmechanism) { + $checked{$gradingmechanism}="checked='checked'"; + } + } + my $upload=&mt("Upload File"); my $type=&mt("Type"); my $attendance=&mt("Award points just for participation"); @@ -6198,7 +6222,7 @@ sub process_clicker { my $specific=&mt("Correctness determined from response with clicker ID"); my $pcorrect=&mt("Percentage points for correct solution"); my $pincorrect=&mt("Percentage points for incorrect solution"); - my $selectform=&Apache::loncommon::select_form('iclicker','upfiletype', + my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype', ('iclicker' => 'i>clicker')); $result.=<
-
-
-
- - -
-
+
+
+
+ + +
+

ENDUPFORM @@ -6268,6 +6292,11 @@ sub process_clicker_file { my ($r)=@_; my ($symb)=&get_symb($r); if (!$symb) {return '';} + + my %Saveable_Parameters=&clicker_grading_parameters(); + &Apache::loncommon::store_course_settings('grades_clicker', + \%Saveable_Parameters); + my ($result) = &showResourceInfo($symb,$env{'form.probTitle'}); if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) { $result.=''.&mt('You need to specify a clicker ID for the correct answer').''; @@ -6289,18 +6318,18 @@ sub process_clicker_file { $result.=&mt('Score based on attendance only'); } else { my $number=0; - $result.='

'.&mt('Correctness determined by the following IDs').'

'; + $result.='

'.&mt('Correctness determined by the following IDs').''; foreach my $id (sort(keys(%correct_ids))) { - $result.=''.$id.' - '; + $result.='
'.$id.' - '; if ($correct_ids{$id} eq 'specified') { $result.=&mt('specified'); } else { my ($uname,$udom)=split(/\:/,$correct_ids{$id}); $result.=&Apache::loncommon::plainname($uname,$udom); } - $result.='
'; $number++; } + $result.="

\n"; if ($number==0) { $result.=''.&mt('No IDs found to determine correct answer').''; return $result.&show_grading_menu_form($symb); @@ -6313,6 +6342,24 @@ sub process_clicker_file { ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').''); return $result.&show_grading_menu_form($symb); } + +# Were able to get all the info needed, now analyze the file + + $result.=&Apache::loncommon::studentbrowser_javascript(); + my $heading=&mt('Scanning clicker file'); + $result.=(<
+
+$heading
+
+ + + + + + + +ENDHEADER my %responses; my @questiontitles; my $errormsg=''; @@ -6320,10 +6367,47 @@ sub process_clicker_file { if ($env{'form.upfiletype'} eq 'iclicker') { ($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); } - $result.='
'.&mt('Found [_1] questions',$number).'
'; + $result.='
'.&mt('Found [_1] question(s)',$number).'
'. + ''. + &mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', + $env{'form.pcorrect'},$env{'form.pincorrect'}). + '
'; + my $correct_count=0; + my $student_count=0; + my $unknown_count=0; foreach my $id (keys(%responses)) { - $result.='
'.$id.' - '.$responses{$id}; + if ($correct_ids{$id}) { + $result.="\n".''; + $correct_count++; + } elsif ($clicker_ids{$id}) { + $result.="\n".''; + $student_count++; + } else { + $result.="\n
".&mt('Unregistered Clicker')." ".$id."
"; + $result.="\n".''. + "\n".&mt("Username").":  ". + "\n".&mt("Domain").": ". + &Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. + &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id); + $unknown_count++; + } + } + $result.='
'. + &mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count); + if ($env{'form.gradingmechanism'} ne 'attendance') { + if ($correct_count==0) { + $errormsg.="Found no correct answers answers for grading!"; + } elsif ($correct_count>1) { + $result.='
'.&mt("Found [_1] entries for grading!").''; + } + } + if ($errormsg) { + $result.='
'.&mt($errormsg).''; + } else { + $result.='
'; } + $result.='
'."\n". + '


'."\n"; return $result.&show_grading_menu_form($symb); } @@ -6332,14 +6416,8 @@ sub iclicker_eval { my $number=0; my $errormsg=''; foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) { - chomp($line); - foreach my $quoted ($line=~/\,\s*\"([^\"]*)\"\s*\,/g) { - my $replace=$quoted; - $replace=~s/\,//g; - &Apache::lonnet::logthis($quoted.' - '.$replace.'
'); - $line=~s/\,\s*\"\Q$quoted\E\"\s*\,/,$replace,/gs; - } - my @entries=split(/\,/,$line); + my %components=&Apache::loncommon::record_sep($line); + my @entries=map {$components{$_}} (sort(keys(%components))); if ($entries[0] eq 'Question') { for (my $i=3;$i<$#entries;$i+=6) { $$questiontitles[$number]=$entries[$i];