--- loncom/homework/grades.pm 2007/06/16 01:37:44 1.410
+++ loncom/homework/grades.pm 2007/06/16 20:24:25 1.414
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.410 2007/06/16 01:37:44 www Exp $
+# $Id: grades.pm,v 1.414 2007/06/16 20:24:25 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -6144,7 +6144,7 @@ sub gather_clicker_ids {
my $clickers =
(&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1];
foreach my $id (split(/\,/,$clickers)) {
- $id=~s/^0+//;
+ $id=~s/^[\#0]+//;
if (exists($clicker_ids{$id})) {
$clicker_ids{$id}.=','.$username.':'.$domain;
} else {
@@ -6166,7 +6166,7 @@ sub gather_adv_clicker_ids {
my $clickers =
(&Apache::lonnet::userenvironment($pudom,$puname,'clickers'))[1];
foreach my $id (split(/\,/,$clickers)) {
- $id=~s/^0+//;
+ $id=~s/^[\#0]+//;
if (exists($clicker_ids{$id})) {
$clicker_ids{$id}.=','.$puname.':'.$pudom;
} else {
@@ -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,14 +6199,30 @@ 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");
my $personnel=&mt("Correctness determined from response by course personnel");
- my $specific=&mt("Correctness determined from response with clicker ID");
+ my $specific=&mt("Correctness determined from response with clicker ID(s)");
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').'';
@@ -6279,28 +6308,31 @@ sub process_clicker_file {
%correct_ids=&gather_adv_clicker_ids();
}
if ($env{'form.gradingmechanism'} eq 'specific') {
- my $correct_id=$env{'form.specificid'};
- $correct_id=~tr/a-z/A-Z/;
- $correct_id=~s/\s//gs;
- $correct_id=~s/^0+//;
- $correct_ids{$correct_id}='specified';
+ foreach my $correct_id (split(/[\s\,]/,$env{'form.specificid'})) {;
+ $correct_id=~tr/a-z/A-Z/;
+ $correct_id=~s/\s//gs;
+ $correct_id=~s/^[\#0]+//;
+ if ($correct_id) {
+ $correct_ids{$correct_id}='specified';
+ }
+ }
}
if ($env{'form.gradingmechanism'} eq 'attendance') {
$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);
@@ -6316,6 +6348,7 @@ sub process_clicker_file {
# Were able to get all the info needed, now analyze the file
+ $result.=&Apache::loncommon::studentbrowser_javascript();
my $heading=&mt('Scanning clicker file');
$result.=(<
@@ -6326,6 +6359,9 @@ sub process_clicker_file {
+
+
+
ENDHEADER
my %responses;
my @questiontitles;
@@ -6334,20 +6370,54 @@ ENDHEADER
if ($env{'form.upfiletype'} eq 'iclicker') {
($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses);
}
- $result.=' '.&mt('Found [_1] question(s)',$number).' ';
- my $found_correct_flag=0;
+ $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'}).
+ ' ';
+# Remember Question Titles
+# FIXME: Possibly need delimiter other than ":"
+ for (my $i=0;$i<$number;$i++) {
+ $result.='').'" />';
+ }
+ my $correct_count=0;
+ my $student_count=0;
+ my $unknown_count=0;
+# Match answers with usernames
+# FIXME: Possibly need delimiter other than ":"
foreach my $id (keys(%responses)) {
if ($correct_ids{$id}) {
- $result.="\n".'';
- $found_correct_flag++;
+ $result.="\n".'';
+ $correct_count++;
} elsif ($clicker_ids{$id}) {
$result.="\n".'';
+ $student_count++;
} else {
- $result.="\n Unknown: ".$id." - ".$responses{$id};
+ $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.='';
- $result.='
'."\n".
+ $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!",$correct_count).'';
+ }
+ }
+ if ($errormsg) {
+ $result.=' '.&mt($errormsg).'';
+ } else {
+ $result.=' ';
+ }
+ $result.='
'."\n".
'
'."\n";
return $result.&show_grading_menu_form($symb);
}
@@ -6379,6 +6449,51 @@ sub iclicker_eval {
return ($errormsg,$number);
}
+sub assign_clicker_grades {
+ my ($r)=@_;
+ my ($symb)=&get_symb($r);
+ if (!$symb) {return '';}
+ my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
+ my $heading=&mt('Assigning grades based on clicker file');
+ $result.=(<
+
+$heading
+ENDHEADER
+# Get correct result
+# FIXME: Possibly need delimiter other than ":"
+ my @correct=();
+ if ($env{'form.gradingmechanism'} ne 'attendance') {
+ foreach my $key (keys(%env)) {
+ if ($key=~/^form\.correct\:/) {
+ my @input=split(/\,/,$env{$key});
+ for (my $i=0;$i<=$#input;$i++) {
+ if (($correct[$i]) && ($input[$i]) &&
+ ($correct[$i] ne $input[$i])) {
+ $result.=' '.
+ &mt('More than one correct result given for question "[_1]": [_2] versus [_3].',
+ $env{'form.question:'.$i},$correct[$i],$input[$i]).'';
+ } elsif ($input[$i]) {
+ $correct[$i]=$input[$i];
+ }
+ }
+ }
+ }
+ for (my $i=0;$i<$env{'form.number'};$i++) {
+ if (!$correct[$i]) {
+ $result.=' '.
+ &mt('No correct result given for question "[_1]"!',
+ $env{'form.question:'.$i}).'';
+ }
+ }
+ $result.=' '.&mt("Correct answer: [_1]",join(', ',map { ($_?$_:'-') } @correct));
+ }
+# Start grading
+ $result.='