--- loncom/interface/lonmeta.pm 2001/12/19 17:17:46 1.8 +++ loncom/interface/lonmeta.pm 2005/10/25 18:46:03 1.117 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Metadata display handler # -# $Id: lonmeta.pm,v 1.8 2001/12/19 17:17:46 albertel Exp $ +# $Id: lonmeta.pm,v 1.117 2005/10/25 18:46:03 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -17,121 +17,1129 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License +# You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ -# -# (TeX Content Handler -# -# 05/29/00,05/30,10/11 Gerd Kortemeyer) -# -# 10/19,10/21,10/23,11/27,08/09/01 Gerd Kortemeyer + package Apache::lonmeta; use strict; +use LONCAPA::lonmetadata(); use Apache::Constants qw(:common); -use Apache::lonnet(); +use Apache::lonnet; +use Apache::loncommon(); +use Apache::lonhtmlcommon(); +use Apache::lonmsg; +use Apache::lonpublisher; +use Apache::lonlocal; +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; +} -# ================================================================ Main Handler +# Fetch and evaluate dynamic metadata +sub dynamicmeta { + my $url=&Apache::lonnet::declutter(shift); + $url=~s/\.meta$//; + my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//); + my $regexp=$url; + $regexp=~s/(\W)/\\$1/g; + $regexp='___'.$regexp.'___'; + my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain, + $aauthor,$regexp); + my %DynamicData = &LONCAPA::lonmetadata::process_reseval_data(\%evaldata); + my %Data = &LONCAPA::lonmetadata::process_dynamic_metadata($url, + \%DynamicData); + # + # 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; +} -sub handler { - my $r=shift; - my %content=(); +sub access_count { + my ($src,$author,$adomain) = @_; + my %countdata=&Apache::lonnet::dump('nohist_accesscount',$adomain, + $author,$src); + if (! exists($countdata{$src})) { + return &mt('Not Available'); + } else { + return $countdata{$src}; + } +} + +# Try to make an alt tag if there is none +sub alttag { + my ($base,$src)=@_; + my $fullpath=&Apache::lonnet::hreflocation($base,$src); + my $alttag=&Apache::lonnet::metadata($fullpath,'title').' '. + &Apache::lonnet::metadata($fullpath,'subject').' '. + &Apache::lonnet::metadata($fullpath,'abstract'); + $alttag=~s/\s+/ /gs; + $alttag=~s/\"//gs; + $alttag=~s/\'//gs; + $alttag=~s/\s+$//gs; + $alttag=~s/^\s+//gs; + if ($alttag) { + return $alttag; + } else { + return &mt('No information available'); + } +} -# ----------------------------------------------------------- Set document type +# Author display +sub authordisplay { + my ($aname,$adom)=@_; + return &Apache::loncommon::aboutmewrapper + (&Apache::loncommon::plainname($aname,$adom), + $aname,$adom,'preview').' ['.$aname.'@'.$adom.']'; +} - $r->content_type('text/html'); - $r->send_http_header; +# Pretty display +sub evalgraph { + my $value=shift; + if (! $value) { + return ''; + } + my $val=int($value*10.+0.5)-10; + my $output='
  | '; + } else { + $output.=''. + ' | '; + } + $output.=' | '; + if ($val>20) { + $output.=' | '. + ' | '; + } else { + $output.=' |   | '; + } + $output.='('.sprintf("%5.2f",$value).') |
$content{'abstract'}-