--- loncom/homework/grades.pm 2016/01/31 21:25:42 1.737 +++ loncom/homework/grades.pm 2016/10/14 16:47:25 1.738 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.737 2016/01/31 21:25:42 raeburn Exp $ +# $Id: grades.pm,v 1.738 2016/10/14 16:47:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3576,19 +3576,67 @@ sub viewgrades { &build_section_inputs(). ''."\n". - my ($common_header,$specific_header); - if ($env{'form.section'} eq 'all') { - $common_header = &mt('Assign Common Grade to Class'); - $specific_header = &mt('Assign Grade to Specific Students in Class'); - } elsif ($env{'form.section'} eq 'none') { - $common_header = &mt('Assign Common Grade to Students in no Section'); - $specific_header = &mt('Assign Grade to Specific Students in no Section'); - } else { - my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); - $common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display); - $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display); + #retrieve selected groups + my (@groups,$group_display); + @groups = &Apache::loncommon::get_env_multiple('form.group'); + if (grep(/^all$/,@groups)) { + @groups = ('all'); + } elsif (grep(/^none$/,@groups)) { + @groups = ('none'); + } elsif (@groups > 0) { + $group_display = join(', ',@groups); + } + + my ($common_header,$specific_header,@sections,$section_display); + @sections = &Apache::loncommon::get_env_multiple('form.section'); + if (grep(/^all$/,@sections)) { + @sections = ('all'); + if ($group_display) { + $common_header = &mt('Assign Common Grade to Students in Group(s) [_1]',$group_display); + $specific_header = &mt('Assign Grade to Specific Students in Group(s) [_1]',$group_display); + } elsif (grep(/^none$/,@groups)) { + $common_header = &mt('Assign Common Grade to Students not assigned to any groups'); + $specific_header = &mt('Assign Grade to Specific Students not assigned to any groups'); + } else { + $common_header = &mt('Assign Common Grade to Class'); + $specific_header = &mt('Assign Grade to Specific Students in Class'); + } + } elsif (grep(/^none$/,@sections)) { + @sections = ('none'); + if ($group_display) { + $common_header = &mt('Assign Common Grade to Students in no Section and in Group(s) [_1]',$group_display); + $specific_header = &mt('Assign Grade to Specific Students in no Section and in Group(s)',$group_display); + } elsif (grep(/^none$/,@groups)) { + $common_header = &mt('Assign Common Grade to Students in no Section and in no Group'); + $specific_header = &mt('Assign Grade to Specific Students in no Section and in no Group'); + } else { + $common_header = &mt('Assign Common Grade to Students in no Section'); + $specific_header = &mt('Assign Grade to Specific Students in no Section'); + } + } else { + $section_display = join (", ",@sections); + if ($group_display) { + $common_header = &mt('Assign Common Grade to Students in Section(s) [_1], and in Group(s) [_2]', + $section_display,$group_display); + $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1], and in Group(s) [_2]', + $section_display,$group_display); + } elsif (grep(/^none$/,@groups)) { + $common_header = &mt('Assign Common Grade to Students in Section(s) [_1] and no Group',$section_display); + $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1] and no Group',$section_display); + } else { + $common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display); + $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display); + } + } + my %submit_types = &substatus_options(); + my $submission_status = $submit_types{$env{'form.submitonly'}}; + + if ($env{'form.submitonly'} eq 'all') { + $result.= '

'.$common_header.'

'; + } else { + $result.= '

'.$common_header.' '.&mt('(submission status: "[_1]")',$submission_status).'

'; } - $result.= '

'.$common_header.'

'.&Apache::loncommon::start_data_table(); + $result .= &Apache::loncommon::start_data_table(); #radio buttons/text box for assigning points for a section or class. #handles different parts of a problem my $res_error; @@ -3651,8 +3699,12 @@ sub viewgrades { #table listing all the students in a section/class #header of table - $result.= '

'.$specific_header.'

'. - &Apache::loncommon::start_data_table(). + if ($env{'form.submitonly'} eq 'all') { + $result.= '

'.$specific_header.'

'; + } else { + $result.= '

'.$specific_header.' '.&mt('(submission status: "[_1]")',$submission_status).'

'; + } + $result.= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('No.').''. ''.&nameUserString('header')."\n"; @@ -3698,7 +3750,7 @@ sub viewgrades { #get info for each student #list all the students - with points and grade status - my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1'); + my (undef,undef,$fullname) = &getclasslist(\@sections,'1',\@groups); my $ctr = 0; foreach (sort { @@ -3707,35 +3759,142 @@ sub viewgrades { } return $a cmp $b; } (keys(%$fullname))) { - $ctr++; $result.=&viewstudentgrade($symb,$env{'request.course.id'}, - $_,$$fullname{$_},\@parts,\%weight,$ctr,\%last_resets); + $_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets); } $result.=&Apache::loncommon::end_data_table(); $result.=''."\n"; $result.=''."\n"; - if (scalar(%$fullname) eq 0) { - my $colspan=3+scalar(@parts); - my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); + if ($ctr == 0) { my $stu_status = join(' or ',&Apache::loncommon::get_env_multiple('form.Status')); - $result=''. - &mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.', - $section_display, $stu_status). - ''; + $result='

'.&mt('Manual Grading').'

'. + ''; + if ($env{'form.submitonly'} eq 'all') { + if (grep(/^all$/,@sections)) { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students with enrollment status [_1] to modify or grade.', + $stu_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students with no group assigned and with enrollment status [_1] to modify or grade.', + $stu_status); + } else { + $result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] to modify or grade.', + $group_display,$stu_status); + } + } elsif (grep(/^none$/,@sections)) { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students in no section with enrollment status [_1] to modify or grade.', + $stu_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students in no section and no group with enrollment status [_1] to modify or grade.', + $stu_status); + } else { + $result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] to modify or grade.', + $group_display,$stu_status); + } + } else { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.', + $section_display,$stu_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students in section(s) [_1] nd no group with enrollment status [_2] to modify or grade.', + $section_display,$stu_status); + } else { + $result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] to modify or grade.', + $section_display,$group_display,$stu_status); + } + } + } else { + if (grep(/^all$/,@sections)) { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students with enrollment status [_1] and submission status "[_2]" to modify or grade.', + $stu_status,$submission_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students with no group assigned with enrollment status [_1] and submission status "[_2]" to modify or grade.', + $stu_status,$submission_status); + } else { + $result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', + $group_display,$stu_status,$submission_status); + } + } elsif (grep(/^none$/,@sections)) { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students in no section with enrollment status [_1] and submission status "[_2]" to modify or grade.', + $stu_status,$submission_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students in no section and no group with enrollment status [_1] and submission status "[_2]" to modify or grade.', + $stu_status,$submission_status); + } else { + $result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', + $group_display,$stu_status,$submission_status); + } + } else { + if (grep(/^all$/,@groups)) { + $result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', + $section_display,$stu_status,$submission_status); + } elsif (grep(/^none$/,@groups)) { + $result .= &mt('There are no students in section(s) [_1] and no group with enrollment status [_2] and submission status "[_3]" to modify or grade.', + $section_display,$stu_status,$submission_status); + } else { + $result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] and submission status "[_4]" to modify or grade.', + $section_display,$group_display,$stu_status,$submission_status); + } + } + } + $result .= '
'; } return $result; } -#--- call by previous routine to display each student +#--- call by previous routine to display each student who satisfies submission filter. sub viewstudentgrade { my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets) = @_; my ($uname,$udom) = split(/:/,$student); my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); - my %aggregates = (); + my $submitonly = $env{'form.submitonly'}; + unless (($submitonly eq 'all') || ($submitonly eq 'queued')) { + my %partstatus = (); + if (ref($parts) eq 'ARRAY') { + foreach my $apart (@{$parts}) { + my ($part,$type) = &split_part_type($apart); + my ($status,undef) = split(/_/,$record{"resource.$part.solved"},2); + $status = 'nothing' if ($status eq ''); + $partstatus{$part} = $status; + my $subkey = "resource.$part.submitted_by"; + $partstatus{$subkey} = $record{$subkey} if ($record{$subkey} ne ''); + } + my $submitted = 0; + my $graded = 0; + my $incorrect = 0; + foreach my $key (keys(%partstatus)) { + $submitted = 1 if ($partstatus{$key} ne 'nothing'); + $graded = 1 if ($partstatus{$key} =~ /^ungraded/); + $incorrect = 1 if ($partstatus{$key} =~ /^incorrect/); + + my $partid = (split(/\./,$key))[1]; + if ($partstatus{'resource.'.$partid.'.'.$key.'.submitted_by'} ne '') { + $submitted = 0; + } + } + return if (!$submitted && ($submitonly eq 'yes' || + $submitonly eq 'incorrect' || + $submitonly eq 'graded')); + return if (!$graded && ($submitonly eq 'graded')); + return if (!$incorrect && $submitonly eq 'incorrect'); + } + } + if ($submitonly eq 'queued') { + my ($cdom,$cnum) = split(/_/,$courseid); + my %queue_status = + &Apache::bridgetask::get_student_status($symb,$cdom,$cnum, + $udom,$uname); + return if (!defined($queue_status{'gradingqueue'})); + } + $$ctr++; + my %aggregates = (); my $result=&Apache::loncommon::start_data_table_row().''. - ''. - "\n".$ctr.'  '. + ''. + "\n".$$ctr.'  '. ''.$fullname.' '. '('.$uname.($env{'user.domain'} eq $udom ? '' : ':'.$udom).')'."\n"; @@ -3747,7 +3906,6 @@ sub viewstudentgrade { my ($aggtries,$totaltries); unless (exists($aggregates{$part})) { $totaltries = $record{'resource.'.$part.'.tries'}; - $aggtries = $totaltries; if ($$last_resets{$part}) { $aggtries = &get_num_tries(\%record,$$last_resets{$part}, @@ -9480,7 +9638,7 @@ sub submit_options_table { $result.='
'."\n". ''."\n"; - $result.=&selectfield(0). + $result.=&selectfield(1). '
@@ -9536,13 +9694,8 @@ sub submit_options { sub selectfield { my ($full)=@_; my %options = - (&Apache::lonlocal::texthash( - 'yes' => 'with submissions', - 'queued' => 'in grading queue', - 'graded' => 'with ungraded submissions', - 'incorrect' => 'with incorrect submissions', - 'all' => 'with any status'), - 'select_form_order' => ['yes','queued','graded','incorrect','all']); + (&substatus_options, + 'select_form_order' => ['yes','queued','graded','incorrect','all']); my $result='
@@ -9578,6 +9731,15 @@ sub selectfield { return $result; } +sub substatus_options { + return &Apache::lonlocal::texthash( + 'yes' => 'with submissions', + 'queued' => 'in grading queue', + 'graded' => 'with ungraded submissions', + 'incorrect' => 'with incorrect submissions', + 'all' => 'with any status'); +} + sub reset_perm { undef(%perm); }