--- loncom/interface/lonmeta.pm 2004/04/13 16:03:46 1.66 +++ loncom/interface/lonmeta.pm 2004/04/14 16:14:29 1.67 @@ -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.67 2004/04/14 16:14:29 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,9 +40,6 @@ use Apache::lonlocal; use Apache::lonmysql; use Apache::lonmsg; -# MySQL table columns - -my @columns; # Fetch and evaluate dynamic metadata sub dynamicmeta { @@ -60,6 +57,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; } @@ -146,18 +152,6 @@ sub diffgraph { 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 { @@ -394,39 +388,67 @@ sub prettyinput { sub handler { my $r=shift; # + my $uri=$r->uri; + # + # Check to see if this server is overloaded my $loaderror=&Apache::lonnet::overloaderror($r); - if ($loaderror) { return $loaderror; } + if ($loaderror) { + return $loaderror; + } # - my $uri=$r->uri; + # 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; # + $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(''); return OK; } +##################################################### +##################################################### +### ### +### Report Bombs ### +### ### +##################################################### +##################################################### sub report_bombs { my ($r,$uri) = @_; # Set document type - $uri=~ s:/adm/bombs/::; - $uri=&Apache::lonnet::declutter($uri); - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - # - return OK if $r->header_only; - $r->print(&Apache::loncommon::bodytag('Error Messages')); + $uri =~ s:/adm/bombs/::; + $uri = &Apache::lonnet::declutter($uri); $r->print('

'.&Apache::lonnet::clutter($uri).'

'); my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//); if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) { - my %brokenurls=&Apache::lonmsg::all_url_author_res_msg($author, - $domain); - foreach (sort keys %brokenurls) { + my %brokenurls = + &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($_)). @@ -437,26 +459,20 @@ sub report_bombs { } else { $r->print(&mt('Not authorized')); } - $r->print(''); return; } +##################################################### +##################################################### +### ### +### Uneditable Metadata Display ### +### ### +##################################################### +##################################################### sub present_uneditable_metadata { my ($r,$uri) = @_; - my ($resdomain,$resuser)= - (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); - my $loaderror=&Apache::lonnet::overloaderror - ($r, - &Apache::lonnet::homeserver($resuser,$resdomain)); - if ($loaderror) { - return $loaderror; - } # my %content=(); - # Set document type - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - return OK if $r->header_only; # Read file foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) { $content{$_}=&Apache::lonnet::metadata($uri,$_); @@ -491,8 +507,6 @@ sub present_uneditable_metadata { # my %lt=&fieldnames(); my $table=''; - my $bodytag=&Apache::loncommon::bodytag - ('Catalog Information','','','',$resdomain); foreach ('title', 'author', 'subject', @@ -518,8 +532,6 @@ sub present_uneditable_metadata { } # $r->print(<Catalog Information -$bodytag

$content{'title'}

$disuri

$obsoletewarning @@ -529,98 +541,108 @@ $table ENDHEAD if ($ENV{'user.adv'}) { - # Dynamic Metadata + &print_dynamic_metadata($r,$uri); + } + return; +} + +sub print_dynamic_metadata { + my ($r,$uri) = @_; + # + my $description = 'Dynamic Metadata (updated periodically)'; + $r->print('

'.&mt($description).'

'. + &mt('Processing').' ...
'); + $r->rflush(); + my %items=&fieldnames(); + my %dynmeta=&dynamicmeta($uri); + # + # 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"); + } + $r->print('
'.$lt{$_}.''. + &prettyprint($_,$dynmeta{$_})."
'); + if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) { + # This is an assessment, print assessment data $r->print( - '

'.&mt('Dynamic Metadata').' ('. - &mt('updated periodically').')

'.&mt('Processing'). - ' ...
'); - $r->rflush(); - my %items=&fieldnames(); - my %dynmeta=&dynamicmeta($uri); - # General Access and Usage Statistics - $r->print('

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

'. + '

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

'. ''); - foreach ('count', - 'sequsage','sequsage_list', - 'comefrom','comefrom_list', - 'goto','goto_list', - 'course','course_list') { + foreach ('stdno','avetries','difficulty') { $r->print(''. '\n"); } - $r->print('
'.$lt{$_}.''. &prettyprint($_,$dynmeta{$_})."
'); - if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) { - # This is an assessment, print assessment data - $r->print( - '

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

'. - ''); - foreach ('stdno','avetries','difficulty') { - $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{$_})."
'); - $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)); - } - # All other stuff - $r->print('

'. - &mt('Additional Metadata (non-standard, parameters, exports)'). - '

'); - foreach (sort keys %content) { - my $name=$_; - if ($name!~/\.display$/) { - my $display=&Apache::lonnet::metadata($uri, - $name.'.display'); - if (! $display) { - $display=$name; - }; - my $otherinfo=''; - foreach ('name','part','type','default') { - if (defined(&Apache::lonnet::metadata($uri, - $name.'.'.$_))) { - $otherinfo.=' '.$_.'='. - &Apache::lonnet::metadata($uri, - $name.'.'.$_).'; '; - } - } - $r->print(''.$display.': '.$content{$name}); - if ($otherinfo) { - $r->print(' ('.$otherinfo.')'); + $r->print(''); + } + + $r->print('

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

'. + ''); + foreach ('clear','depth','helpful','correct','technical') { + $r->print(''. + '\n"); + } + $r->print('
'.$lt{$_}.''. + &prettyprint($_,$dynmeta{$_})."
'); + $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)); + } + # All other stuff + $r->print('

'. + &mt('Additional Metadata (non-standard, parameters, exports)'). + '

'); + foreach (sort(keys(%content))) { + my $name=$_; + if ($name!~/\.display$/) { + my $display=&Apache::lonnet::metadata($uri, + $name.'.display'); + if (! $display) { + $display=$name; + }; + my $otherinfo=''; + foreach ('name','part','type','default') { + if (defined(&Apache::lonnet::metadata($uri, + $name.'.'.$_))) { + $otherinfo.=' '.$_.'='. + &Apache::lonnet::metadata($uri, + $name.'.'.$_).'; '; } - $r->print("
\n"); } + $r->print(''.$display.': '.$content{$name}); + if ($otherinfo) { + $r->print(' ('.$otherinfo.')'); + } + $r->print("
\n"); } } + return; } +##################################################### +##################################################### +### ### +### Editable metadata display ### +### ### +##################################################### +##################################################### sub present_editable_metadata { my ($r,$uri) = @_; # Construction Space Call - # Set document type - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - # - return OK if $r->header_only; # Header my $disuri=$uri; my $fn=&Apache::lonnet::filelocation('',$uri); @@ -638,18 +660,12 @@ sub present_editable_metadata { $bombs=&mt('Error deleting messages'); } } - my $bodytag=&Apache::loncommon::bodytag('Error Messages'); my $del=&mt('Delete Messages'); $r->print(<Edit Catalog Information -$bodytag

$disuri


$bombs -
- - ENDBOMBS } else { my $displayfile='Catalog Information for '.$disuri; @@ -701,42 +717,60 @@ ENDEDIT &mt('FAIL').''); } else { foreach (sort keys %Apache::lonpublisher::metadatafields) { - if ($_!~/\./) { - my $unikey=$_; - $unikey=~/^([A-Za-z]+)/; - my $tag=$1; - $tag=~tr/A-Z/a-z/; - print $mfh "\n\<$tag"; - foreach (split(/\,/, + next if ($_ =~ /\./); + my $unikey=$_; + $unikey=~/^([A-Za-z]+)/; + my $tag=$1; + $tag=~tr/A-Z/a-z/; + print $mfh "\n\<$tag"; + foreach (split(/\,/, $Apache::lonpublisher::metadatakeys{$unikey}) - ) { - my $value= - $Apache::lonpublisher::metadatafields{$unikey.'.'.$_}; - $value=~s/\"/\'\'/g; - print $mfh ' '.$_.'="'.$value.'"'; - } - print $mfh '>'. - &HTML::Entities::encode - ($Apache::lonpublisher::metadatafields{$unikey}, - '<>&"'). - ''; + ) { + my $value= + $Apache::lonpublisher::metadatafields{$unikey.'.'.$_}; + $value=~s/\"/\'\'/g; + print $mfh ' '.$_.'="'.$value.'"'; } + print $mfh '>'. + &HTML::Entities::encode + ($Apache::lonpublisher::metadatafields{$unikey}, + '<>&"'). + ''; } $r->print('

'.&mt('Wrote Metadata')); } } $r->print('
'. - ''); + &mt('Store Catalog Information').'">'); } + $r->print(''); return; } -# BEGIN Block +############################################################## +############################################################## +# MySQL table columns + +my @columns; + BEGIN { # Get columns of MySQL metadata table @columns=&Apache::lonmysql::col_order('metadata'); } +# +# Turn MySQL row into hash +# This routine should be moved to lonmetadata +# 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; +} + + 1; __END__