--- loncom/interface/lonmeta.pm 2004/04/14 18:56:36 1.69 +++ loncom/interface/lonmeta.pm 2004/05/07 17:17:58 1.77 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Metadata display handler # -# $Id: lonmeta.pm,v 1.69 2004/04/14 18:56:36 matthew Exp $ +# $Id: lonmeta.pm,v 1.77 2004/05/07 17:17:58 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -114,21 +114,21 @@ sub evalgraph { return ''; } my $val=int($value*10.+0.5)-10; - my $output=''; + my $output='
'; if ($val>=20) { - $output.=''; + $output.=''; } else { - $output.=''. - ''; + $output.=''. + ''; } $output.=''; if ($val>20) { - $output.=''. - ''; + $output.=''. + ''; } else { - $output.=''; + $output.=''; } - $output.='
                  ('.$value.')
'; + $output.=' ('.sprintf("%5.2f",$value).') '; return $output; } @@ -140,15 +140,15 @@ sub diffgraph { my $val=int(40.0*$value+0.5); my @colors=('#FF9933','#EEAA33','#DDBB33','#CCCC33', '#BBDD33','#CCCC33','#DDBB33','#EEAA33'); - my $output=''; + my $output='
'; for (my $i=0;$i<8;$i++) { if ($val>$i*5) { - $output.=''; + $output.=''; } else { - $output.=''; + $output.=''; } } - $output.='
     ('.$value.')
'; + $output.=' ('.sprintf("%3.2f",$value).') '; return $output; } @@ -193,7 +193,8 @@ sub fieldnames { 'technical' => 'Resource is technically correct', 'avetries' => 'Average number of tries till solved', 'stdno' => 'Total number of students who have worked on this problem', - 'difficulty' => 'Degree of difficulty' + 'difficulty' => 'Degree of difficulty', + 'disc' => 'Degree of discrimination', ); } @@ -252,9 +253,26 @@ sub prettyprint { ($type eq 'comefrom_list') || ($type eq 'sequsage_list')) { return join('
',map { - my $url=&Apache::lonnet::clutter($_); - ''.&Apache::lonnet::gettitle($url).''. - &Apache::lonhtmlcommon::crumbs($url,'preview','',undef,'+0'); + my $url = &Apache::lonnet::clutter($_); + my $title = &Apache::lonnet::gettitle($url); + if ($title eq '') { + $title = 'Untitled'; + if ($url =~ /\.sequence$/) { + $title .= ' Sequence'; + } elsif ($url =~ /\.page$/) { + $title .= ' Page'; + } elsif ($url =~ /\.problem$/) { + $title .= ' Problem'; + } elsif ($url =~ /\.html$/) { + $title .= ' HTML document'; + } elsif ($url =~ m:/syllabus$:) { + $title .= ' Syllabus'; + } + } + $_ = ''.$title.' '. + ''. + ''.$url.''. + '' } split(/\s*\,\s*/,$value)); } # Evaluations @@ -266,17 +284,24 @@ sub prettyprint { return &evalgraph($value); } # Difficulty - if ($type eq 'difficulty') { + if ($type eq 'difficulty' || $type eq 'disc') { return &diffgraph($value); } # List of courses if ($type=~/\_list/) { - return join('
',map { - my %courseinfo=&Apache::lonnet::coursedescription($_); - ''. - $courseinfo{'description'}.''; - } split(/\s*\,\s*/,$value)); + my @Courses = split(/\s*\,\s*/,$value); + my $Str; + foreach my $course (@Courses) { + my %courseinfo = &Apache::lonnet::coursedescription($course); + if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') { + next; + } + if ($Str ne '') { $Str .= '
'; } + $Str .= ''. + $courseinfo{'description'}.''; + } + return $Str; } # No pretty print found return $value; @@ -320,7 +345,10 @@ sub relatedfield { sub prettyinput { my ($type,$value,$fieldname,$formname, - $relatedsearchflag,$relatedsep,$relatedvalue)=@_; + $relatedsearchflag,$relatedsep,$relatedvalue,$size)=@_; + if (! defined($size)) { + $size = 80; + } # Language if ($type eq 'language') { return &selectbox($fieldname, @@ -376,9 +404,9 @@ sub prettyinput { $value=~s/^\s+//gs; $value=~s/\s+$//gs; $value=~s/\s+/ /gs; - $value=~s/\"/\&quod\;/gs; + $value=~s/\"/\"\;/gs; return - ''. &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname, $relatedvalue); @@ -390,26 +418,13 @@ sub handler { # my $uri=$r->uri; # - # Check to see if this server is overloaded - my $loaderror=&Apache::lonnet::overloaderror($r); - if ($loaderror) { - return $loaderror; - } - # - # Check to see if original resource server is overloaded - my ($resdomain,$resuser)= - (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); - $loaderror=&Apache::lonnet::overloaderror - ($r,&Apache::lonnet::homeserver($resuser,$resdomain)); - if ($loaderror) { - return $loaderror; - } - # # Set document type &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; # + my ($resdomain,$resuser)= + (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); $r->print(''. 'Catalog Information'. ''); @@ -450,10 +465,10 @@ sub report_bombs { &Apache::lonmsg::all_url_author_res_msg($author,$domain); foreach (sort(keys(%brokenurls))) { if ($_=~/^\Q$uri\E/) { - $r->print(&Apache::lonhtmlcommon::crumbs - (&Apache::lonnet::clutter($_)). - &Apache::lonmsg::retrieve_author_res_msg($_). - '
'); + $r->print + (''.$_.''. + &Apache::lonmsg::retrieve_author_res_msg($_). + '
'); } } } else { @@ -494,8 +509,9 @@ sub present_uneditable_metadata { } else { $versiondisplay='Version: '.$currentversion; } - # crumbify displayed URL - $disuri=&Apache::lonhtmlcommon::crumbs($disuri); + # crumbify displayed URL uri target prefix form size + $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef,'+1'); + $disuri =~ s:
::g; # obsolete my $obsolete=$content{'obsolete'}; my $obsoletewarning=''; @@ -507,6 +523,10 @@ sub present_uneditable_metadata { # my %lt=&fieldnames(); my $table=''; + my $title = $content{'title'}; + if (! defined($title)) { + $title = 'Untitled Resource'; + } foreach ('title', 'author', 'subject', @@ -532,10 +552,12 @@ sub present_uneditable_metadata { } # $r->print(<$content{'title'} -

$disuri

+

$title

+

+$disuri
$obsoletewarning -$versiondisplay
+$versiondisplay +

$table
@@ -554,58 +576,153 @@ sub print_dynamic_metadata { # my $description = 'Dynamic Metadata (updated periodically)'; $r->print('

'.&mt($description).'

'. - &mt('Processing').' ...
'); + &mt('Processing')); $r->rflush(); my %items=&fieldnames(); my %dynmeta=&dynamicmeta($uri); + &Apache::lonnet::logthis('dynamic metadata keys:'.$/. + join("\n",keys(%dynmeta))); # # General Access and Usage Statistics - $r->print('

'.&mt('Access and Usage Statistics').'

'. - ''); - foreach ('count', - 'sequsage','sequsage_list', - 'comefrom','comefrom_list', - 'goto','goto_list', - 'course','course_list') { - $r->print(''. - '\n"); + if (exists($dynmeta{'count'}) || + exists($dynmeta{'sequsage'}) || + exists($dynmeta{'comefrom'}) || + exists($dynmeta{'goto'}) || + exists($dynmeta{'course'})) { + $r->print('

'.&mt('Access and Usage Statistics').'

'. + '
'.$lt{$_}.''. - &prettyprint($_,$dynmeta{$_})."
'); + foreach ('count', + 'sequsage','sequsage_list', + 'comefrom','comefrom_list', + 'goto','goto_list', + 'course','course_list') { + $r->print(''. + '\n"); + } + $r->print('
'.$lt{$_}.''. + &prettyprint($_,$dynmeta{$_})."
'); + } else { + $r->print('

'.&mt('No Access or Usages Statistics are available for this resource.').'

'); } - $r->print(''); # # Assessment statistics if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) { - # This is an assessment, print assessment data - $r->print( - '

'.&mt('Assessment Statistical Data').'

'. + if (exists($dynmeta{'stdno'}) || + exists($dynmeta{'avetries'}) || + exists($dynmeta{'difficulty'}) || + exists($dynmeta{'disc'})) { + # This is an assessment, print assessment data + $r->print('

'. + &mt('Overall Assessment Statistical Data'). + '

'. + ''); + $r->print(''. + ''."\n"); + foreach ('avetries','difficulty','disc') { + $r->print(''. + ''."\n"); + } + $r->print('
'.$lt{'stdno'}.''. + &prettyprint('stdno',$dynmeta{'stdno'}). + '
'.$lt{$_}.''. + &prettyprint($_,sprintf('%5.2f',$dynmeta{$_})). + '
'); + } + if (exists($dynmeta{'stats'})) { + # + # New assessment statistics + $r->print('

'. + &mt('Detailed Assessment Statistical Data'). + '

'); + my $table = ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''.$/; + foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) { + my $data = $dynmeta{'stats'}->{$identifier}; + my $course = $data->{'course'}; + my %courseinfo = &Apache::lonnet::coursedescription($course); + if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') { + &Apache::lonnet::logthis('lookup for '.$course.' failed'); + next; + } + $table .= ''; + $table .= + ''; + $table .= + ''; + $table .= + ''; + foreach ('avetries','difficulty','disc') { + $table .= ''; + } + $table .= + ''; + $table .= + ''.$/; + } + $table .= '
CourseSection(s)Num StudentsMean TriesDegree of DifficultyDegree of DiscriminationTime of computation
'.$courseinfo{'description'}.''.$data->{'sections'}.''.$data->{'stdno'}.''; + if (exists($data->{$_})) { + $table .= sprintf('%.2f',$data->{$_}).' '; + } else { + $table .= ''; + } + $table .= ''. + &Apache::lonlocal::locallocaltime($data->{'timestamp'}). + '
'.$/; + $r->print($table); + } else { + $r->print('No new dynamic data found.'); + } + } else { + $r->print('

'. + &mt('No Assessment Statistical Data is available for this resource'). + '

'); + } + + # + # + if (exists($dynmeta{'clear'}) || + exists($dynmeta{'depth'}) || + exists($dynmeta{'helpful'}) || + exists($dynmeta{'correct'}) || + exists($dynmeta{'technical'})){ + $r->print('

'.&mt('Evaluation Data').'

'. ''); - foreach ('stdno','avetries','difficulty') { + foreach ('clear','depth','helpful','correct','technical') { $r->print(''. '\n"); } - $r->print('
'.$lt{$_}.''. &prettyprint($_,$dynmeta{$_})."
'); - } - - $r->print('

'.&mt('Evaluation Data').'

'. - ''); - foreach ('clear','depth','helpful','correct','technical') { - $r->print(''. - '\n"); + $r->print('
'.$lt{$_}.''. - &prettyprint($_,$dynmeta{$_})."
'); + } else { + $r->print('

'.&mt('No Evaluation Data is available for this resource.').'

'); } - $r->print(''); $uri=~/^\/res\/(\w+)\/(\w+)\//; if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2)) || ($ENV{'user.role.ca./'.$1.'/'.$2})) { - $r->print('

'.&mt('Evaluation Comments').' ('. - &mt('visible to author and co-authors only'). - ')

'. - '
'.$dynmeta{'comments'}.'
'); - $r->print('

'.&mt('Error Messages').' ('. - &mt('visible to author and co-authors only').')'. - '

'. - &Apache::lonmsg::retrieve_author_res_msg($uri)); + if (exists($dynmeta{'comments'})) { + $r->print('

'.&mt('Evaluation Comments').' ('. + &mt('visible to author and co-authors only'). + ')

'. + '
'.$dynmeta{'comments'}.'
'); + } else { + $r->print('

'.&mt('There are no Evaluation Comments on this resource.').'

'); + } + my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri); + if (defined($bombs) && $bombs ne '') { + $r->print('

'.&mt('Error Messages').' ('. + &mt('visible to author and co-authors only').')'. + '

'.$bombs); + } else { + $r->print('

'.&mt('There are currently no Error Messages for this resource.').'

'); + } } # # All other stuff