--- loncom/interface/lonmeta.pm 2004/05/07 17:17:58 1.77
+++ loncom/interface/lonmeta.pm 2005/03/17 21:32:17 1.94
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.77 2004/05/07 17:17:58 matthew Exp $
+# $Id: lonmeta.pm,v 1.94 2005/03/17 21:32:17 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);
@@ -155,9 +236,9 @@ sub diffgraph {
# The field names
sub fieldnames {
- return &Apache::lonlocal::texthash
- (
- 'title' => 'Title',
+ my $file_type=shift;
+ my %fields =
+ ('title' => 'Title',
'author' =>'Author(s)',
'authorspace' => 'Author Space',
'modifyinguser' => 'Last Modifying User',
@@ -166,7 +247,11 @@ sub fieldnames {
'notes' => 'Notes',
'abstract' => 'Abstract',
'lowestgradelevel' => 'Lowest Grade Level',
- 'highestgradelevel' => 'Highest Grade Level',
+ 'highestgradelevel' => 'Highest Grade Level');
+ if (! defined($file_type) || $file_type ne 'portfolio') {
+ %fields =
+ (%fields,
+ 'domain' => 'Domain',
'standards' => 'Standards',
'mime' => 'MIME Type',
'language' => 'Language',
@@ -175,6 +260,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)',
@@ -195,13 +282,17 @@ sub fieldnames {
'stdno' => 'Total number of students who have worked on this problem',
'difficulty' => 'Degree of difficulty',
'disc' => 'Degree of discrimination',
+ 'dependencies' => 'Resources used by this resource',
);
+ }
+ return &Apache::lonlocal::texthash(%fields);
}
# 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 ' ';
}
@@ -224,6 +315,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 ' '.
@@ -251,8 +346,9 @@ sub prettyprint {
($type eq 'obsoletereplacement') ||
($type eq 'goto_list') ||
($type eq 'comefrom_list') ||
- ($type eq 'sequsage_list')) {
- return join('
',map {
+ ($type eq 'sequsage_list') ||
+ ($type eq 'dependencies')) {
+ return '
'.join("\n",map {
my $url = &Apache::lonnet::clutter($_);
my $title = &Apache::lonnet::gettitle($url);
if ($title eq '') {
@@ -269,11 +365,10 @@ sub prettyprint {
$title .= ' Syllabus';
}
}
- $_ = ''.$title.' '.
- ''.
- ''.$url.''.
- ''
- } split(/\s*\,\s*/,$value));
+ $_ = '- '.$title.' '.
+ &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'-1',$noformat).
+ '
'
+ } split(/\s*\,\s*/,$value)).'
';
}
# Evaluations
if (($type eq 'clear') ||
@@ -365,6 +460,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')) {
@@ -393,6 +496,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')) {
@@ -425,13 +536,19 @@ sub handler {
#
my ($resdomain,$resuser)=
(&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);
- $r->print(''.
+ my $html=&Apache::lonxml::xmlbegin();
+ $r->print($html.''.
'Catalog Information'.
'');
if ($uri=~m:/adm/bombs/(.*)$:) {
$r->print(&Apache::loncommon::bodytag('Error Messages'));
# Looking for all bombs?
&report_bombs($r,$uri);
+ } elsif ($uri=~/\/portfolio\//) {
+ $r->print(&Apache::loncommon::bodytag
+ ('Edit Portfolio File Information','','','',$resdomain));
+ &present_editable_metadata($r,$uri,'portfolio');
+
} elsif ($uri=~/^\/\~/) {
# Construction space
$r->print(&Apache::loncommon::bodytag
@@ -439,7 +556,7 @@ sub handler {
&present_editable_metadata($r,$uri);
} else {
$r->print(&Apache::loncommon::bodytag
- ('Catalog Information','','','',$resdomain));
+ ('Catalog Information','','','',$resdomain));
&present_uneditable_metadata($r,$uri);
}
$r->print('');
@@ -542,7 +659,9 @@ sub present_uneditable_metadata {
'lastrevisiondate',
'owner',
'copyright',
- 'customdistributionfile',
+ 'customdistributionfile',
+ 'sourceavail',
+ 'sourcerights',
'obsolete',
'obsoletereplacement') {
$table.=''.$lt{$_}.
@@ -558,7 +677,7 @@ $disuri
$obsoletewarning
$versiondisplay
-
+
ENDHEAD
@@ -580,8 +699,6 @@ sub print_dynamic_metadata {
$r->rflush();
my %items=&fieldnames();
my %dynmeta=&dynamicmeta($uri);
- &Apache::lonnet::logthis('dynamic metadata keys:'.$/.
- join("\n",keys(%dynmeta)));
#
# General Access and Usage Statistics
if (exists($dynmeta{'count'}) ||
@@ -590,7 +707,7 @@ sub print_dynamic_metadata {
exists($dynmeta{'goto'}) ||
exists($dynmeta{'course'})) {
$r->print(''.&mt('Access and Usage Statistics').''.
- '');
+ '');
foreach ('count',
'sequsage','sequsage_list',
'comefrom','comefrom_list',
@@ -615,7 +732,7 @@ sub print_dynamic_metadata {
$r->print(''.
&mt('Overall Assessment Statistical Data').
''.
- '');
+ '');
$r->print(''.$lt{'stdno'}.' | '.
''.
&prettyprint('stdno',$dynmeta{'stdno'}).
@@ -634,7 +751,7 @@ sub print_dynamic_metadata {
$r->print(''.
&mt('Detailed Assessment Statistical Data').
'');
- my $table = ''.
+ my $table = ''.
''.
'Course | '.
'Section(s) | '.
@@ -694,7 +811,7 @@ sub print_dynamic_metadata {
exists($dynmeta{'correct'}) ||
exists($dynmeta{'technical'})){
$r->print(''.&mt('Evaluation Data').''.
- '');
+ '');
foreach ('clear','depth','helpful','correct','technical') {
$r->print(''.$lt{$_}.' | '.
''.
@@ -728,7 +845,7 @@ sub print_dynamic_metadata {
# All other stuff
$r->print(''.
&mt('Additional Metadata (non-standard, parameters, exports)').
- '');
+ '');
foreach (sort(keys(%content))) {
my $name=$_;
if ($name!~/\.display$/) {
@@ -746,13 +863,14 @@ sub print_dynamic_metadata {
$name.'.'.$_).'; ';
}
}
- $r->print(''.$display.': '.$content{$name});
+ $r->print(''.$display.' | '.$content{$name});
if ($otherinfo) {
$r->print(' ('.$otherinfo.')');
}
- $r->print(" \n");
+ $r->print(" | \n");
}
}
+ $r->print(" ");
return;
}
@@ -764,7 +882,7 @@ sub print_dynamic_metadata {
#####################################################
#####################################################
sub present_editable_metadata {
- my ($r,$uri) = @_;
+ my ($r,$uri, $file_type) = @_;
# Construction Space Call
# Header
my $disuri=$uri;
@@ -799,26 +917,36 @@ ENDBOMBS
&mt('Default Cataloging Information for Directory').' '.
$dir;
}
- my $bodytag=
- &Apache::loncommon::bodytag('Edit Catalog Information');
%Apache::lonpublisher::metadatafields=();
%Apache::lonpublisher::metadatakeys=();
- &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile($fn));
+ my $result=&Apache::lonnet::getfile($fn);
+ if ($result == -1){
+ $r->print('Unable to get '.$fn);
+ return ;
+ } else {
+ &Apache::lonpublisher::metaeval($result);
+ }
$r->print(<Edit Catalog Information
-$bodytag
$displayfile
');
| | |