--- loncom/interface/lonmeta.pm 2004/04/13 16:03:46 1.66
+++ loncom/interface/lonmeta.pm 2004/06/17 15:05:59 1.81
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.66 2004/04/13 16:03:46 matthew Exp $
+# $Id: lonmeta.pm,v 1.81 2004/06/17 15:05:59 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,9 +40,86 @@ use Apache::lonlocal;
use Apache::lonmysql;
use Apache::lonmsg;
-# MySQL table columns
-my @columns;
+############################################################
+############################################################
+##
+## &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',
+ 'goto','goto_list',
+ 'comefrom','comefrom_list',
+ 'sequsage','sequsage_list',
+ 'stdno','stdno_list',
+ '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 {
@@ -60,6 +137,15 @@ sub dynamicmeta {
#
# Deal with 'count' separately
$Data{'count'} = &access_count($url,$aauthor,$adomain);
+ #
+ # Debugging code I will probably need later
+ if (0) {
+ &Apache::lonnet::logthis('Dynamic Metadata');
+ while(my($k,$v)=each(%Data)){
+ &Apache::lonnet::logthis(' "'.$k.'"=>"'.$v.'"');
+ }
+ &Apache::lonnet::logthis('-------------------');
+ }
return %Data;
}
@@ -108,21 +194,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;
}
@@ -134,30 +220,18 @@ 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;
}
-#
-# Turn MySQL row into hash
-# This routine is here for historic reasons. Probably should be moved to
-# a more generic place since it has nothing to do with metadata
-sub metadata_col_to_hash {
- my @cols=@_;
- my %hash=();
- for (my $i=0; $i<=$#columns; $i++) {
- $hash{$columns[$i]}=$cols[$i];
- }
- return %hash;
-}
# The field names
sub fieldnames {
@@ -181,6 +255,8 @@ sub fieldnames {
'owner' => 'Publisher/Owner',
'copyright' => 'Copyright/Distribution',
'customdistributionfile' => 'Custom Distribution File',
+ 'sourceavail' => 'Source Availible',
+ 'sourcerights' => 'Source Custom Distribution File',
'obsolete' => 'Obsolete',
'obsoletereplacement' => 'Suggested Replacement for Obsolete File',
'count' => 'Network-wide number of accesses (hits)',
@@ -199,7 +275,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',
);
}
@@ -229,6 +306,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 ' '.
@@ -258,9 +339,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
@@ -272,17 +370,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;
@@ -326,7 +431,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,
@@ -343,6 +451,14 @@ sub prettyinput {
(&Apache::loncommon::copyrightids)).
&relatedfield(0,$relatedsearchflag,$relatedsep);
}
+ # Source Copyright
+ if ($type eq 'sourceavail') {
+ return &selectbox($fieldname,
+ $value,
+ \&Apache::loncommon::source_copyrightdescription,
+ (&Apache::loncommon::source_copyrightids)).
+ &relatedfield(0,$relatedsearchflag,$relatedsep);
+ }
# Gradelevels
if (($type eq 'lowestgradelevel') ||
($type eq 'highestgradelevel')) {
@@ -371,6 +487,14 @@ sub prettyinput {
",'rights')\">".&mt('Select').''.
&relatedfield(0,$relatedsearchflag,$relatedsep);
}
+ # Source Customdistribution file
+ if ($type eq 'sourcerights') {
+ return '".&mt('Select').''.
+ &relatedfield(0,$relatedsearchflag,$relatedsep);
+ }
# Dates
if (($type eq 'creationdate') ||
($type eq 'lastrevisiondate')) {
@@ -382,9 +506,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);
@@ -394,69 +518,78 @@ sub prettyinput {
sub handler {
my $r=shift;
#
- my $loaderror=&Apache::lonnet::overloaderror($r);
- if ($loaderror) { return $loaderror; }
- #
my $uri=$r->uri;
#
+ # 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'.
+ '');
if ($uri=~m:/adm/bombs/(.*)$:) {
+ $r->print(&Apache::loncommon::bodytag('Error Messages'));
# Looking for all bombs?
&report_bombs($r,$uri);
} elsif ($uri=~/^\/\~/) {
# Construction space
+ $r->print(&Apache::loncommon::bodytag
+ ('Edit Catalog Information','','','',$resdomain));
&present_editable_metadata($r,$uri);
} else {
+ $r->print(&Apache::loncommon::bodytag
+ ('Catalog Information','','','',$resdomain));
&present_uneditable_metadata($r,$uri);
}
+ $r->print('