--- loncom/interface/statistics/lonstathelpers.pm 2004/03/16 16:30:31 1.8 +++ loncom/interface/statistics/lonstathelpers.pm 2004/08/03 19:53:12 1.18 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstathelpers.pm,v 1.8 2004/03/16 16:30:31 matthew Exp $ +# $Id: lonstathelpers.pm,v 1.18 2004/08/03 19:53:12 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -109,6 +109,7 @@ all option response and radiobutton prob Returns: A string containing html for a table which lists the sequences and their contents. A radiobutton is provided for each problem. +Skips 'survey' problems. =cut @@ -118,13 +119,14 @@ sub ProblemSelector { my ($AcceptedResponseTypes) = @_; my $Str; $Str = "\n\n"; - foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { + foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) { next if ($seq->{'num_assess'}<1); my $seq_str = ''; foreach my $res (@{$seq->{'contents'}}) { next if ($res->{'type'} ne 'assessment'); foreach my $part (@{$res->{'parts'}}) { my $partdata = $res->{'partdata'}->{$part}; + next if ($partdata->{'Survey'}); for (my $i=0;$i{'ResponseTypes'}});$i++){ my $respid = $partdata->{'ResponseIds'}->[$i]; my $resptype = $partdata->{'ResponseTypes'}->[$i]; @@ -224,7 +226,7 @@ sub get_target_from_id { =pod -=item &get_prev_curr_next($target) +=item &get_prev_curr_next($target,$AcceptableResponseTypes,$granularity) Determine the problem parts or responses preceeding and following the current resource. @@ -232,7 +234,7 @@ current resource. Inputs: $target (see &Apache::lonstathelpers::get_target_from_id()) $AcceptableResponseTypes, regular expression matching acceptable response types, - $granularity, either 'part' or 'response' + $granularity, either 'part', 'response', or 'part_survey' Returns: three hash references, $prev, $curr, $next, which refer to the preceeding, current, or following problem parts or responses, depending @@ -255,12 +257,20 @@ sub get_prev_curr_next { # # Build an array with the data we need to search through my @Resource; - foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { + foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) { foreach my $res (@{$seq->{'contents'}}) { next if ($res->{'type'} ne 'assessment'); foreach my $part (@{$res->{'parts'}}) { my $partdata = $res->{'partdata'}->{$part}; - if ($granularity eq 'part') { + if ($partdata->{'Survey'}) { + if ($granularity eq 'part_survey'){ + push (@Resource, + { symb => $res->{symb}, + part => $part, + resource => $res, + } ); + } + } elsif ($granularity eq 'part') { push (@Resource, { symb => $res->{symb}, part => $part, @@ -290,7 +300,7 @@ sub get_prev_curr_next { my $curr_idx; for ($curr_idx=0;$curr_idx<$#Resource;$curr_idx++) { my $curr_item = $Resource[$curr_idx]; - if ($granularity eq 'part') { + if ($granularity eq 'part' || $granularity eq 'part_survey') { if ($curr_item->{'symb'} eq $target->{'symb'} && $curr_item->{'part'} eq $target->{'part'}) { last; @@ -305,7 +315,7 @@ sub get_prev_curr_next { } } my $curr_item = $Resource[$curr_idx]; - if ($granularity eq 'part') { + if ($granularity eq 'part' || $granularity eq 'part_survey') { if ($curr_item->{'symb'} ne $target->{'symb'} || $curr_item->{'part'} ne $target->{'part'}) { # bogus symb - return nothing @@ -345,6 +355,67 @@ sub get_prev_curr_next { =pod +=item GetStudentAnswers($r,$problem,$Students) + +Determines the correct answer for a set of students on a given problem. +The students answers are stored in the student hashes pointed to by the +array @$Students under the key 'answer'. + +Inputs: $r +$problem: hash reference containing the keys 'resource', 'part', and 'respid'. +$Students: reference to array containing student hashes (need 'username', + 'domain'). + +Returns: nothing + +=cut + +##################################################### +##################################################### +sub GetStudentAnswers { + my ($r,$problem,$Students,$formname,$inputname) = @_; + my $status_type; + if (defined($formname)) { + $status_type = 'inline'; + } else { + $status_type = 'popup'; + } + my $c = $r->connection(); + my %Answers; + my ($resource,$partid,$respid) = ($problem->{'resource'}, + $problem->{'part'}, + $problem->{'respid'}); + # Read in the cache (if it exists) before we start timing things. + &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'}); + # Open progress window + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin + ($r,'Student Answer Compilation Status', + 'Student Answer Compilation Progress', scalar(@$Students), + $status_type,undef,$formname,$inputname); + $r->rflush(); + foreach my $student (@$Students) { + last if ($c->aborted()); + my $sname = $student->{'username'}; + my $sdom = $student->{'domain'}; + my $answer = &Apache::lonstathelpers::analyze_problem_as_student + ($resource,$sname,$sdom,$partid,$respid); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + &mt('last student')); + $student->{'answer'} = $answer; + } + &Apache::lonstathelpers::write_answer_cache(); + return if ($c->aborted()); + $r->rflush(); + # close progress window + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + return; +} + +##################################################### +##################################################### + +=pod + =item analyze_problem_as_student Analyzes a homework problem for a student and returns the correct answer @@ -424,11 +495,11 @@ sub get_answer { } foreach my $foil (@{$Answer{$prefix.'.shown'}}) { if (ref($values{$foil}) eq 'ARRAY') { - $returnvalue.=&HTML::Entities::encode($foil).'='. - join(',',map {&HTML::Entities::encode($_)} @{$values{$foil}}).'&'; + $returnvalue.=&HTML::Entities::encode($foil,'<>&"').'='. + join(',',map {&HTML::Entities::encode($_,'<>&"')} @{$values{$foil}}).'&'; } else { - $returnvalue.=&HTML::Entities::encode($foil).'='. - &HTML::Entities::encode($values{$foil}).'&'; + $returnvalue.=&HTML::Entities::encode($foil,'<>&"').'='. + &HTML::Entities::encode($values{$foil},'<>&"').'&'; } } $returnvalue =~ s/ /\%20/g; @@ -568,7 +639,7 @@ sub ensure_proper_cache { my ($symb) = @_; my $cid = $ENV{'request.course.id'}; my $new_filename = '/home/httpd/perl/tmp/'. - 'problemanalsysis_'.$cid.'answer_cache.db'; + 'problemanalysis_'.$cid.'_answer_cache.db'; if (! defined($cache_filename) || $cache_filename ne $new_filename || ! defined($current_symb) || @@ -947,6 +1018,102 @@ sub get_time_limits { return ($starttime,$endtime); } + + +#################################################### +#################################################### + +=pod + +=item sections_description + +Inputs: @Sections, an array of sections + +Returns: A text description of the sections selected. + +=cut + +#################################################### +#################################################### +sub sections_description { + my @Sections = @_; + my $sectionstring = ''; + if (scalar(@Sections) > 1) { + if (scalar(@Sections) > 2) { + my $last = pop(@Sections); + $sectionstring = "Sections ".join(', ',@Sections).', and '.$last; + } else { + $sectionstring = "Sections ".join(' and ',@Sections); + } + } else { + if ($Sections[0] eq 'all') { + $sectionstring = "All sections"; + } else { + $sectionstring = "Section ".$Sections[0]; + } + } + return $sectionstring; +} + +#################################################### +#################################################### + +=pod + +=item &manage_caches + +Inputs: $r, apache request object + +Returns: An array of scalars containing html for buttons. + +=cut + +#################################################### +#################################################### +sub manage_caches { + my ($r,$formname,$inputname) = @_; + &Apache::loncoursedata::clear_internal_caches(); + my $sectionkey = + join(',', + map { + &Apache::lonnet::escape($_); + } sort(@Apache::lonstatistics::SelectedSections) + ); + my $statuskey = $Apache::lonstatistics::enrollment_status; + if (exists($ENV{'form.ClearCache'}) || + exists($ENV{'form.updatecaches'}) || + (exists($ENV{'form.firstrun'}) && $ENV{'form.firstrun'} ne 'no') || + (exists($ENV{'form.prevsection'}) && + $ENV{'form.prevsection'} ne $sectionkey) || + (exists($ENV{'form.prevenrollstatus'}) && + $ENV{'form.prevenrollstatus'} ne $statuskey) + ) { + &Apache::lonstatistics::Gather_Full_Student_Data($r,$formname, + $inputname); + } + # + my @Buttons = + ('', + ''. + &Apache::loncommon::help_open_topic('Statistics_Cache'), + '', + '' + ); + # + if (! exists($ENV{'form.firstrun'})) { + $r->print(''); + } else { + $r->print(''); + } + # + return @Buttons; +} + + + + #################################################### ####################################################