--- loncom/interface/lonmeta.pm 2004/06/16 14:30:15 1.79 +++ loncom/interface/lonmeta.pm 2005/03/16 22:52:04 1.93 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Metadata display handler # -# $Id: lonmeta.pm,v 1.79 2004/06/16 14:30:15 matthew Exp $ +# $Id: lonmeta.pm,v 1.93 2005/03/16 22:52:04 matthew 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,7 +260,7 @@ sub fieldnames { 'owner' => 'Publisher/Owner', 'copyright' => 'Copyright/Distribution', 'customdistributionfile' => 'Custom Distribution File', - 'sourceavail' => 'Source Availible', + 'sourceavail' => 'Source Available', 'sourcerights' => 'Source Custom Distribution File', 'obsolete' => 'Obsolete', 'obsoletereplacement' => 'Suggested Replacement for Obsolete File', @@ -197,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 ' '; } @@ -257,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 ''; } # Evaluations if (($type eq 'clear') || @@ -447,13 +536,19 @@ sub handler { # my ($resdomain,$resuser)= (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); - $r->print(''. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'<head><title>'. '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 @@ -461,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(''); @@ -582,7 +677,7 @@ $disuri
$obsoletewarning $versiondisplay

- +
$table
ENDHEAD @@ -612,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', @@ -637,7 +732,7 @@ sub print_dynamic_metadata { $r->print('

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

'. - '
'); + '
'); $r->print(''. '
'.$lt{'stdno'}.''. &prettyprint('stdno',$dynmeta{'stdno'}). @@ -656,7 +751,7 @@ sub print_dynamic_metadata { $r->print('

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

'); - my $table = ''. + my $table = '
'. ''. ''. ''. @@ -716,7 +811,7 @@ sub print_dynamic_metadata { exists($dynmeta{'correct'}) || exists($dynmeta{'technical'})){ $r->print('

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

'. - '
CourseSection(s)
'); + '
'); foreach ('clear','depth','helpful','correct','technical') { $r->print(''. '
'.$lt{$_}.''. @@ -750,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$/) { @@ -768,13 +863,14 @@ sub print_dynamic_metadata { $name.'.'.$_).'; '; } } - $r->print(''.$display.': '.$content{$name}); + $r->print('\n"); } } + $r->print("
'.$display.''.$content{$name}); if ($otherinfo) { $r->print(' ('.$otherinfo.')'); } - $r->print("
\n"); + $r->print("
"); return; } @@ -786,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; @@ -821,26 +917,30 @@ 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)); $r->print(<Edit Catalog Information -$bodytag

$displayfile

ENDEDIT $r->print(''); - my %lt=&fieldnames(); - foreach ('author','title','subject','keywords','abstract','notes', + my %lt=&fieldnames($file_type); + my $output; + my @fields; + if ($file_type eq 'portfolio') { + @fields = ('author','title','subject','keywords','abstract','notes','lowestgradelevel', + 'highestgradelevel'); + } else { + @fields = ('author','title','subject','keywords','abstract','notes', 'copyright','customdistributionfile','language', 'standards', 'lowestgradelevel','highestgradelevel','sourceavail','sourcerights', - 'obsolete','obsoletereplacement') { + 'obsolete','obsoletereplacement'); + } + foreach (@fields) { if (defined($ENV{'form.new_'.$_})) { $Apache::lonpublisher::metadatafields{$_}= $ENV{'form.new_'.$_}; @@ -849,17 +949,17 @@ ENDEDIT $Apache::lonpublisher::metadatafields{'copyright'}= 'default'; } - $r->print('

'.$lt{$_}.': '. - &prettyinput - ($_,$Apache::lonpublisher::metadatafields{$_}, - 'new_'.$_,'defaultmeta').'

'); + $output.=('

'.$lt{$_}.': '. + &prettyinput($_, + $Apache::lonpublisher::metadatafields{$_}, + 'new_'.$_,'defaultmeta').'

'); } if ($ENV{'form.store'}) { my $mfh; if (! ($mfh=Apache::File->new('>'.$fn))) { - $r->print('

'. + $r->print('

'. &mt('Could not write metadata').', '. - &mt('FAIL').''); + &mt('FAIL').'

'); } else { foreach (sort keys %Apache::lonpublisher::metadatafields) { next if ($_ =~ /\./); @@ -882,10 +982,12 @@ ENDEDIT '<>&"'). ''; } - $r->print('

'.&mt('Wrote Metadata')); + $r->print('

'.&mt('Wrote Metadata'). + ' '.&Apache::lonlocal::locallocaltime(time). + '

'); } } - $r->print('
'); } $r->print('
');