--- loncom/interface/lonmeta.pm 2004/04/14 16:14:29 1.67
+++ loncom/interface/lonmeta.pm 2005/02/10 22:01:40 1.91
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.67 2004/04/14 16:14:29 matthew Exp $
+# $Id: lonmeta.pm,v 1.91 2005/02/10 22:01:40 banghart Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -41,6 +41,87 @@ use Apache::lonmysql;
use Apache::lonmsg;
+############################################################
+############################################################
+##
+## &get_dynamic_metadata_from_sql($url)
+##
+## Queries sql database for dynamic metdata
+## Returns a hash of hashes, with keys of urls which match $url
+## Returned fields are given below.
+##
+## Examples:
+##
+## %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql
+## ('/res/msu/korte/');
+##
+## $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}
+##
+############################################################
+############################################################
+sub get_dynamic_metadata_from_sql {
+ my ($url) = shift();
+ my ($authordom,$author)=($url=~m:^/res/(\w+)/(\w+)/:);
+ if (! defined($authordom)) {
+ $authordom = shift();
+ }
+ if (! defined($author)) {
+ $author = shift();
+ }
+ if (! defined($authordom) || ! defined($author)) {
+ return ();
+ }
+ my @Fields = ('url','count','course',
+ 'goto','goto_list',
+ 'comefrom','comefrom_list',
+ 'sequsage','sequsage_list',
+ 'stdno','stdno_list',
+ 'dependencies',
+ 'avetries','avetries_list',
+ 'difficulty','difficulty_list',
+ 'disc','disc_list',
+ 'clear','technical','correct',
+ 'helpful','depth');
+ #
+ my $query = 'SELECT '.join(',',@Fields).
+ ' FROM metadata WHERE url LIKE "'.$url.'%"';
+ my $server = &Apache::lonnet::homeserver($author,$authordom);
+ my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
+ ,[$server]);
+ return () if (! defined($reply) || ref($reply) ne 'HASH');
+ my $filename = $reply->{$server};
+ if (! defined($filename) || $filename =~ /^error/) {
+ return ();
+ }
+ my $max_time = time + 10; # wait 10 seconds for results at most
+ my %ReturnHash;
+ #
+ # Look for results
+ my $finished = 0;
+ while (! $finished && time < $max_time) {
+ my $datafile=$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename;
+ if (! -e "$datafile.end") { next; }
+ my $fh;
+ if (!($fh=Apache::File->new($datafile))) { next; }
+ while (my $result = <$fh>) {
+ chomp($result);
+ next if (! $result);
+ my @Data =
+ map {
+ &Apache::lonnet::unescape($_);
+ } split(',',$result);
+ my $url = $Data[0];
+ for (my $i=0;$i<=$#Fields;$i++) {
+ $ReturnHash{$url}->{$Fields[$i]}=$Data[$i];
+ }
+ }
+ $finished = 1;
+ }
+ #
+ return %ReturnHash;
+}
+
+
# Fetch and evaluate dynamic metadata
sub dynamicmeta {
my $url=&Apache::lonnet::declutter(shift);
@@ -114,21 +195,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,21 +221,36 @@ 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;
}
# The field names
sub fieldnames {
+ my $file_type=shift;
+ if ($file_type eq 'portfolio') {
+ return &Apache::lonlocal::texthash
+ (
+ 'title' => 'Title',
+ 'author' =>'Author(s)',
+ 'authorspace' => 'Author Space',
+ 'modifyinguser' => 'Last Modifying User',
+ 'subject' => 'Subject',
+ 'keywords' => 'Keyword(s)',
+ 'notes' => 'Notes',
+ 'abstract' => 'Abstract',
+ 'lowestgradelevel' => 'Lowest Grade Level',
+ 'highestgradelevel' => 'Highest Grade Level');
+ } else {
return &Apache::lonlocal::texthash
(
'title' => 'Title',
@@ -175,6 +271,8 @@ sub fieldnames {
'owner' => 'Publisher/Owner',
'copyright' => 'Copyright/Distribution',
'customdistributionfile' => 'Custom Distribution File',
+ 'sourceavail' => 'Source Available',
+ 'sourcerights' => 'Source Custom Distribution File',
'obsolete' => 'Obsolete',
'obsoletereplacement' => 'Suggested Replacement for Obsolete File',
'count' => 'Network-wide number of accesses (hits)',
@@ -193,14 +291,18 @@ 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',
+ 'dependencies' => 'Resources used by this resource',
);
+ }
}
# Pretty printing of metadata field
sub prettyprint {
- my ($type,$value)=@_;
+ my ($type,$value,$target,$prefix,$form,$noformat)=@_;
+# $target,$prefix,$form are optional and for filecrumbs only
if (! defined($value)) {
return ' ';
}
@@ -223,6 +325,10 @@ sub prettyprint {
if ($type eq 'copyright') {
return &Apache::loncommon::copyrightdescription($value);
}
+ # Copyright
+ if ($type eq 'sourceavail') {
+ return &Apache::loncommon::source_copyrightdescription($value);
+ }
# MIME
if ($type eq 'mime') {
return ' '.
@@ -250,12 +356,29 @@ sub prettyprint {
($type eq 'obsoletereplacement') ||
($type eq 'goto_list') ||
($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');
- } split(/\s*\,\s*/,$value));
+ ($type eq 'sequsage_list') ||
+ ($type eq 'dependencies')) {
+ return '