[$i]->[2] =~ s/(\'$|^\')//g;
}
+ return $dataset;
}
+ return undef; # error occurred
+}
- my $heading = 'Process Course Data';
- my $title = 'LON-CAPA Statistics';
- my $studentCount = scalar(@students);
- if($status eq 'true') {
- &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading);
+sub RT_student_id { return 0; }
+sub RT_awarded { return 1; }
+sub RT_tries { return 2; }
+sub RT_timestamp { return 3; }
+
+sub get_response_time_data {
+ my ($sections,$enrollment,$symb,$part,$courseid) = @_;
+ return undef if (! defined($symb) ||
+ ! defined($part));
+ $courseid = $ENV{'request.course.id'} if (! defined($courseid));
+ #
+ &setup_table_names($courseid);
+ my $symb_id = &get_symb_id($symb);
+ if (! defined($symb_id)) {
+ &Apache::lonnet::logthis('Unable to find symb for '.$symb.' in '.$courseid);
+ return undef;
+ }
+ my $part_id = &get_part_id($part);
+ if (! defined($part_id)) {
+ &Apache::lonnet::logthis('Unable to find id for '.$part.' in '.$courseid);
+ return undef;
+ }
+ #
+ my $dbh = &Apache::lonmysql::get_dbh();
+ return undef if (! defined($dbh));
+ my ($student_requirements,$enrollment_requirements) =
+ &limit_by_section_and_status($sections,$enrollment,'d');
+ my $request = 'SELECT '.
+ 'a.student_id, a.awarded, a.tries, b.timestamp '.
+ 'FROM '.$fulldump_part_table.' AS a '.
+ 'LEFT JOIN '.$fulldump_timestamp_table.' AS b '.
+ 'ON a.symb_id=b.symb_id AND a.student_id=b.student_id AND '.
+ 'a.transaction = b.transaction '.
+ 'LEFT JOIN '.$student_table.' as d '.
+ 'ON a.student_id=d.student_id '.
+ 'WHERE '.
+ 'a.symb_id='.$symb_id.' AND a.part_id='.$part_id;
+ if (defined($student_requirements) || defined($enrollment_requirements)) {
+ $request .= ' AND ';
+ if (defined($student_requirements)) {
+ $request .= $student_requirements.' AND ';
+ }
+ if (defined($enrollment_requirements)) {
+ $request .= $enrollment_requirements.' AND ';
+ }
+ $request =~ s/( AND )$//;
+ }
+ $request .= ' ORDER BY b.timestamp';
+# &Apache::lonnet::logthis("request =\n".$request);
+ my $sth = $dbh->prepare($request);
+ $sth->execute();
+ if ($dbh->err) {
+ &Apache::lonnet::logthis('error 5 = '.$dbh->errstr());
+ &Apache::lonnet::logthis('prepared then executed '.$/.$request);
+ return undef;
+ }
+ my $dataset = $sth->fetchall_arrayref();
+ if (ref($dataset) eq 'ARRAY' && scalar(@$dataset)>0) {
+ return $dataset;
}
- my $count=1;
- foreach my $name (@students) {
- last if($c->aborted());
+}
- if($status eq 'true') {
- my $displayString = $count.'/'.$studentCount.': '.$name;
- &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);
- }
+################################################
+################################################
+
+=pod
+
+=item &get_student_scores($Sections,$Symbs,$enrollment,$courseid)
- if($extract eq 'true') {
- &ExtractStudentData(\%downloadData, \%cache, \%cache, $name);
- } else {
- &ProcessStudentData(\%cache, \%downloadData, $name);
+=cut
+
+################################################
+################################################
+sub get_student_scores {
+ my ($Sections,$Symbs,$enrollment,$courseid,$starttime,$endtime) = @_;
+ $courseid = $ENV{'request.course.id'} if (! defined($courseid));
+ &setup_table_names($courseid);
+ my $dbh = &Apache::lonmysql::get_dbh();
+ return (undef) if (! defined($dbh));
+ my $tmptable = $courseid.'_temp_'.time;
+ #
+ my $symb_requirements;
+ if (defined($Symbs) && @$Symbs) {
+ $symb_requirements = '('.
+ join(' OR ', map{ "(a.symb_id='".&get_symb_id($_->{'symb'}).
+ "' AND a.part_id='".&get_part_id($_->{'part'}).
+ "')"
+ } @$Symbs).')';
+ }
+ #
+ my $student_requirements;
+ if ( (defined($Sections) && $Sections->[0] ne 'all')) {
+ $student_requirements = '('.
+ join(' OR ', map { "b.section='".$_."'" } @$Sections
+ ).')';
+ }
+ #
+ my $enrollment_requirements=undef;
+ if (defined($enrollment) && $enrollment ne 'Any') {
+ $enrollment_requirements = "b.status='".$enrollment."'";
+ }
+ #
+ my $time_requirements = undef;
+ if (defined($starttime)) {
+ $time_requirements .= "a.timestamp>='".$starttime."'";
+ if (defined($endtime)) {
+ $time_requirements .= " AND a.timestamp<='".$endtime."'";
}
- $count++;
+ } elsif (defined($endtime)) {
+ $time_requirements .= "a.timestamp<='".$endtime."'";
+ }
+ ##
+ ##
+ my $request = 'CREATE TEMPORARY TABLE IF NOT EXISTS '.$tmptable.
+ ' SELECT a.student_id,SUM(a.awarded) AS score FROM '.
+ $performance_table.' AS a ';
+ if (defined($student_requirements) || defined($enrollment_requirements)) {
+ $request .= ' NATURAL LEFT JOIN '.$student_table.' AS b ';
+ }
+ if (defined($symb_requirements) ||
+ defined($student_requirements) ||
+ defined($enrollment_requirements) ) {
+ $request .= ' WHERE ';
+ }
+ if (defined($symb_requirements)) {
+ $request .= $symb_requirements.' AND ';
+ }
+ if (defined($student_requirements)) {
+ $request .= $student_requirements.' AND ';
+ }
+ if (defined($enrollment_requirements)) {
+ $request .= $enrollment_requirements.' AND ';
+ }
+ if (defined($time_requirements)) {
+ $request .= $time_requirements.' AND ';
+ }
+ $request =~ s/ AND $//; # Strip of the trailing ' AND '.
+ $request .= ' GROUP BY a.student_id';
+# &Apache::lonnet::logthis("request = \n".$request);
+ my $sth = $dbh->prepare($request);
+ $sth->execute();
+ if ($dbh->err) {
+ &Apache::lonnet::logthis('error 6 = '.$dbh->errstr());
+ &Apache::lonnet::logthis('prepared then executed '.$/.$request);
+ return undef;
+ }
+ $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score';
+# &Apache::lonnet::logthis("request = \n".$request);
+ $sth = $dbh->prepare($request);
+ $sth->execute();
+ if ($dbh->err) {
+ &Apache::lonnet::logthis('error 7 = '.$dbh->errstr());
+ &Apache::lonnet::logthis('prepared then executed '.$/.$request);
+ return undef;
}
+ my $dataset = $sth->fetchall_arrayref();
+ return $dataset;
+}
+
+################################################
+################################################
- if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); }
+=pod
- untie(%cache);
- untie(%downloadData);
+=item &setup_table_names()
- if(!$c->aborted()) {
- my @files = ($residualFile);
- unlink(@files);
- }
+input: course id
+
+output: none
- return 'OK';
+Cleans up the package variables for local caching.
+
+=cut
+
+################################################
+################################################
+sub setup_table_names {
+ my ($courseid) = @_;
+ if (! defined($courseid)) {
+ $courseid = $ENV{'request.course.id'};
+ }
+ #
+ if (! defined($current_course) || $current_course ne $courseid) {
+ # Clear out variables
+ $have_read_part_table = 0;
+ undef(%ids_by_part);
+ undef(%parts_by_id);
+ $have_read_symb_table = 0;
+ undef(%ids_by_symb);
+ undef(%symbs_by_id);
+ $have_read_student_table = 0;
+ undef(%ids_by_student);
+ undef(%students_by_id);
+ #
+ $current_course = $courseid;
+ }
+ #
+ # Set up database names
+ my $base_id = $courseid;
+ $symb_table = $base_id.'_'.'symb';
+ $part_table = $base_id.'_'.'part';
+ $student_table = $base_id.'_'.'student';
+ $performance_table = $base_id.'_'.'performance';
+ $parameters_table = $base_id.'_'.'parameters';
+ $fulldump_part_table = $base_id.'_'.'partdata';
+ $fulldump_response_table = $base_id.'_'.'responsedata';
+ $fulldump_timestamp_table = $base_id.'_'.'timestampdata';
+ $weight_table = $base_id.'_'.'weight';
+ #
+ @Tables = (
+ $symb_table,
+ $part_table,
+ $student_table,
+ $performance_table,
+ $parameters_table,
+ $fulldump_part_table,
+ $fulldump_response_table,
+ $fulldump_timestamp_table,
+ $weight_table,
+ );
+ return;
}
################################################
@@ -1496,6 +2680,24 @@ sub CheckForResidualDownload {
=pod
+=back
+
+=item End of Local Data Caching Subroutines
+
+=cut
+
+################################################
+################################################
+
+} # End scope of table identifiers
+
+################################################
+################################################
+
+=pod
+
+=head3 Classlist Subroutines
+
=item &get_classlist();
Retrieve the classist of a given class or of the current class. Student
@@ -1509,28 +2711,46 @@ $ENV{'course.'.$cid.'.domain'}, and $ENV
Returns a reference to a hash which contains:
keys '$sname:$sdom'
- values [$end,$start,$id,$section,$fullname]
+ values [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type,$lockedtype]
+
+The constant values CL_SDOM, CL_SNAME, CL_END, etc. can be used
+as indices into the returned list to future-proof clients against
+changes in the list order.
=cut
################################################
################################################
+sub CL_SDOM { return 0; }
+sub CL_SNAME { return 1; }
+sub CL_END { return 2; }
+sub CL_START { return 3; }
+sub CL_ID { return 4; }
+sub CL_SECTION { return 5; }
+sub CL_FULLNAME { return 6; }
+sub CL_STATUS { return 7; }
+sub CL_TYPE { return 8; }
+sub CL_LOCKEDTYPE { return 9; }
+
sub get_classlist {
my ($cid,$cdom,$cnum) = @_;
$cid = $cid || $ENV{'request.course.id'};
$cdom = $cdom || $ENV{'course.'.$cid.'.domain'};
$cnum = $cnum || $ENV{'course.'.$cid.'.num'};
- my $now = time;
+ my $now = time;
#
my %classlist=&Apache::lonnet::dump('classlist',$cdom,$cnum);
while (my ($student,$info) = each(%classlist)) {
- return undef if ($student =~ /^(con_lost|error|no_such_host)/i);
+ if ($student =~ /^(con_lost|error|no_such_host)/i) {
+ &Apache::lonnet::logthis('get_classlist error for '.$cid.':'.$student);
+ return undef;
+ }
my ($sname,$sdom) = split(/:/,$student);
my @Values = split(/:/,$info);
- my ($end,$start,$id,$section,$fullname);
+ my ($end,$start,$id,$section,$fullname,$type,$lockedtype);
if (@Values > 2) {
- ($end,$start,$id,$section,$fullname) = @Values;
+ ($end,$start,$id,$section,$fullname,$type,$lockedtype) = @Values;
} else { # We have to get the data ourselves
($end,$start) = @Values;
$section = &Apache::lonnet::getsection($sdom,$sname,$cid);
@@ -1545,14 +2765,13 @@ sub get_classlist {
&Apache::lonnet::logthis('unable to retrieve environment '.
'for '.$sname.':'.$sdom);
} else {
- $fullname = &ProcessFullName(@info{qw/lastname generation
- firstname middlename/});
+ $fullname = &Apache::lonnet::format_name(@info{qw/firstname middlename lastname generation/},'lastname');
$id = $info{'id'};
}
# Update the classlist with this students information
if ($fullname ne 'not available') {
- my $enrolldata = join(':',$end,$start,$id,$section,$fullname);
- my $reply=&Apache::lonnet::cput('classlist',
+ my $enrolldata = join(':',$end,$start,$id,$section,$fullname);
+ my $reply=&Apache::lonnet::cput('classlist',
{$student => $enrolldata},
$cdom,$cnum);
if ($reply !~ /^(ok|delayed)/) {
@@ -1567,11 +2786,11 @@ sub get_classlist {
$status='Active';
}
$classlist{$student} =
- [$sdom,$sname,$end,$start,$id,$section,$fullname,$status];
+ [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type,$lockedtype];
}
if (wantarray()) {
return (\%classlist,['domain','username','end','start','id',
- 'section','fullname','status']);
+ 'section','fullname','status','type','lockedtype']);
} else {
return \%classlist;
}
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.