--- loncom/interface/loncoursedata.pm 2004/04/01 20:02:55 1.129 +++ loncom/interface/loncoursedata.pm 2004/09/23 14:46:03 1.139 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursedata.pm,v 1.129 2004/04/01 20:02:55 matthew Exp $ +# $Id: loncoursedata.pm,v 1.139 2004/09/23 14:46:03 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -155,14 +155,9 @@ sub get_sequence_assessment_data { next; } # get the map itself, instead of BEGIN_MAP - $title = $previous->title(); - $title =~ s/\:/\&\#058;/g; + $title = $previous->compTitle; $symb = $previous->symb(); $src = $previous->src(); - # pick up the filename if there is no title available - if (! defined($title) || $title eq '') { - ($title) = ($src=~/\/([^\/]*)$/); - } $randompick = $previous->randompick(); my $newmap = { title => $title, src => $src, @@ -184,14 +179,9 @@ sub get_sequence_assessment_data { next if (! ref($curRes)); next if (! $curRes->is_problem() && $curRes->src() !~ /\.survey$/); # Okay, from here on out we only deal with assessments - $title = $curRes->title(); - $title =~ s/\:/\&\#058;/g; + $title = $curRes->compTitle(); $symb = $curRes->symb(); $src = $curRes->src(); - # Grab the filename if there is not title available - if (! defined($title) || $title eq '') { - ($title) = ($src=~ m:/([^/]*)$:); - } my $parts = $curRes->parts(); my %partdata; foreach my $part (@$parts) { @@ -199,6 +189,7 @@ sub get_sequence_assessment_data { my @Ids = $curRes->responseIds($part); $partdata{$part}->{'ResponseTypes'}= \@Responses; $partdata{$part}->{'ResponseIds'} = \@Ids; + $partdata{$part}->{'Survey'} = $curRes->is_survey($part); # Count how many responses of each type there are in this part foreach (@Responses) { $partdata{$part}->{$_}++; @@ -547,12 +538,14 @@ store student data. ################################################ ################################################ sub init_dbs { - my $courseid = shift; + my ($courseid,$drop) = @_; &setup_table_names($courseid); # # Drop any of the existing tables - foreach my $table (@Tables) { - &Apache::lonmysql::drop_table($table); + if ($drop) { + foreach my $table (@Tables) { + &Apache::lonmysql::drop_table($table); + } } # # Note - changes to this table must be reflected in the code that @@ -580,7 +573,7 @@ sub init_dbs { restrictions => 'NOT NULL', auto_inc => 'yes', }, { name => 'part', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, ], 'PRIMARY KEY' => ['part (100)'], @@ -595,16 +588,16 @@ sub init_dbs { restrictions => 'NOT NULL', auto_inc => 'yes', }, { name => 'student', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL UNIQUE'}, { name => 'section', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, { name => 'status', - type => 'VARCHAR(15)', + type => 'VARCHAR(15) BINARY', restrictions => 'NOT NULL'}, { name => 'classification', - type => 'varchar(100)', }, + type => 'VARCHAR(100) BINARY', }, { name => 'updatetime', type => 'INT UNSIGNED'}, { name => 'fullupdatetime', @@ -629,7 +622,7 @@ sub init_dbs { type => 'MEDIUMINT UNSIGNED', restrictions => 'NOT NULL' }, { name => 'part', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, { name => 'solved', type => 'TINYTEXT' }, @@ -709,7 +702,7 @@ sub init_dbs { { name => 'awarddetail', type => 'TINYTEXT' }, # { name => 'message', -# type => 'CHAR' }, +# type => 'CHAR BINARY'}, { name => 'response_specific', type => 'TINYTEXT' }, { name => 'response_specific_value', @@ -1081,6 +1074,7 @@ sub populate_student_table { } # &setup_table_names($courseid); + &init_dbs($courseid,0); my $dbh = &Apache::lonmysql::get_dbh(); my $request = 'INSERT IGNORE INTO '.$student_table. "(student,section,status) VALUES "; @@ -1594,7 +1588,7 @@ sub ensure_tables_are_set_up { !$found_performance || !$found_parameters || !$found_fulldump_part || !$found_fulldump_response || !$found_fulldump_timestamp || !$found_weight ) { - if (&init_dbs($courseid)) { + if (&init_dbs($courseid,1)) { return 'error'; } } @@ -2030,12 +2024,14 @@ sub get_problem_statistics { } my ($solved) = &execute_SQL_request($dbh,$request); # + $Solved -= $solved; + # $num = 0 if (! defined($num)); $tries = 0 if (! defined($tries)); $max = 0 if (! defined($max)); $min = 0 if (! defined($min)); $STD = 0 if (! defined($STD)); - $Solved = 0 if (! defined($Solved)); + $Solved = 0 if (! defined($Solved) || $Solved < 0); $solved = 0 if (! defined($solved)); # # Compute the more complicated statistics @@ -2056,21 +2052,6 @@ sub get_problem_statistics { # Drop the temporary table $dbh->do('DROP TABLE '.$stats_table); # May return an error # - # Store in metadata - if ($num) { - my %storestats=(); - # - my $urlres=(&Apache::lonnet::decode_symb($symb))[2]; - # - $storestats{$courseid.'___'.$urlres.'___timestamp'}=time; - $storestats{$courseid.'___'.$urlres.'___stdno'}=$num; - $storestats{$courseid.'___'.$urlres.'___avetries'}=$mean; - $storestats{$courseid.'___'.$urlres.'___difficulty'}=$DegOfDiff; - # - $urlres=~/^(\w+)\/(\w+)/; - &Apache::lonnet::put('nohist_resevaldata',\%storestats,$1,$2); - } - # # Return result return { num_students => $num, tries => $tries, @@ -2247,7 +2228,7 @@ sub RNK_student { return 0; }; sub RNK_score { return 1; }; sub rank_students_by_scores_on_resources { - my ($resources,$Sections,$enrollment,$courseid) = @_; + my ($resources,$Sections,$enrollment,$courseid,$starttime,$endtime) = @_; return if (! defined($resources) || ! ref($resources) eq 'ARRAY'); if (! defined($courseid)) { $courseid = $ENV{'request.course.id'}; @@ -2260,6 +2241,7 @@ sub rank_students_by_scores_on_resources my $symb_limits = '('.join(' OR ',map {'a.symb_id='.&get_symb_id($_); } @$resources ).')'; + my $time_limits = &limit_by_start_end_time($starttime,$endtime,'a'); my $request = 'SELECT b.student,SUM(a.awarded*w.weight) AS score FROM '. $performance_table.' AS a '. 'NATURAL LEFT JOIN '.$weight_table.' AS w '. @@ -2271,6 +2253,9 @@ sub rank_students_by_scores_on_resources if (defined($enrollment_limits)) { $request .= $enrollment_limits.' AND '; } + if (defined($time_limits)) { + $request .= $time_limits.' AND '; + } if ($symb_limits ne '()') { $request .= $symb_limits.' AND '; } @@ -2304,18 +2289,30 @@ Returns: the sum of the score on the pro ######################################################## ######################################################## sub get_sum_of_scores { - my ($resource,$part,$students,$courseid) = @_; + my ($resource,$part,$students,$courseid,$starttime,$endtime) = @_; if (! defined($courseid)) { $courseid = $ENV{'request.course.id'}; } + if (defined($students) && + ((@$students == 0) || + (@$students == 1 && (! defined($students->[0]) || + $students->[0] eq '')) + ) + ){ + undef($students); + } # &setup_table_names($courseid); my $dbh = &Apache::lonmysql::get_dbh(); + my $time_limits = &limit_by_start_end_time($starttime,$endtime,'a'); my $request = 'SELECT SUM(a.awarded*w.weight),SUM(w.weight) FROM '. $performance_table.' AS a '. 'NATURAL LEFT JOIN '.$weight_table.' AS w '; $request .= 'WHERE a.symb_id='.&get_symb_id($resource->{'symb'}). ' AND a.part_id='.&get_part_id($part); + if (defined($time_limits)) { + $request .= ' AND '.$time_limits; + } if (defined($students)) { $request .= ' AND ('. join(' OR ',map {'a.student_id='.&get_student_id(split(':',$_)); @@ -2326,7 +2323,9 @@ sub get_sum_of_scores { $sth->execute(); my $rows = $sth->fetchrow_arrayref(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 1 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed, fetchrow_arrayrefed'. + $/.$request); return (undef,undef); } return ($rows->[0],$rows->[1]); @@ -2463,14 +2462,14 @@ sub count_stats { $request .= ' AND '.$enrollment_limits; } $request .= ' GROUP BY a.student_id'; - &Apache::lonnet::logthis('request = '.$/.$request); +# &Apache::lonnet::logthis('request = '.$/.$request); my $sth = $dbh->prepare($request); $sth->execute(); $request = 'SELECT AVG(count),STD(count),MAX(count),MIN(count),COUNT(count) '. 'FROM '.$stats_table; my ($ave,$std,$max,$min,$count) = &execute_SQL_request($dbh,$request); - &Apache::lonnet::logthis('request = '.$/.$request); +# &Apache::lonnet::logthis('request = '.$/.$request); return($min,$max,$ave,$std,$count); } @@ -2506,7 +2505,8 @@ sub get_student_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 2 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2531,7 +2531,15 @@ sub get_response_data { # &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 $response_id = &get_part_id($response); + if (! defined($response_id)) { + &Apache::lonnet::logthis('Unable to find id for '.$response.' in '.$courseid); + return undef; + } # my $dbh = &Apache::lonmysql::get_dbh(); return undef if (! defined($dbh)); @@ -2567,7 +2575,8 @@ sub get_response_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 3 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2623,7 +2632,8 @@ sub get_response_data_by_student { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 4 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2675,7 +2685,8 @@ sub get_response_time_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 5 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2765,7 +2776,8 @@ sub get_student_scores { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &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'; @@ -2773,7 +2785,8 @@ sub get_student_scores { $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 7 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2880,7 +2893,7 @@ $ENV{'course.'.$cid.'.domain'}, and $ENV Returns a reference to a hash which contains: keys '$sname:$sdom' - values [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type] + 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 @@ -2900,6 +2913,7 @@ 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) = @_; @@ -2916,9 +2930,9 @@ sub get_classlist { } my ($sname,$sdom) = split(/:/,$student); my @Values = split(/:/,$info); - my ($end,$start,$id,$section,$fullname,$type); + my ($end,$start,$id,$section,$fullname,$type,$lockedtype); if (@Values > 2) { - ($end,$start,$id,$section,$fullname,$type) = @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); @@ -2955,11 +2969,11 @@ sub get_classlist { $status='Active'; } $classlist{$student} = - [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type]; + [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type,$lockedtype]; } if (wantarray()) { return (\%classlist,['domain','username','end','start','id', - 'section','fullname','status','type']); + 'section','fullname','status','type','lockedtype']); } else { return \%classlist; }