--- loncom/interface/lonmeta.pm 2003/10/04 20:49:40 1.38 +++ loncom/interface/lonmeta.pm 2004/04/16 21:43:56 1.73 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Metadata display handler # -# $Id: lonmeta.pm,v 1.38 2003/10/04 20:49:40 www Exp $ +# $Id: lonmeta.pm,v 1.73 2004/04/16 21:43:56 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -24,25 +24,24 @@ # /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,12/22,12/24,12/25 Gerd Kortemeyer + package Apache::lonmeta; use strict; +use LONCAPA::lonmetadata(); use Apache::Constants qw(:common); use Apache::lonnet(); use Apache::loncommon(); +use Apache::lonhtmlcommon(); use Apache::lonmsg; use Apache::lonpublisher; use Apache::lonlocal; +use Apache::lonmysql; +use Apache::lonmsg; -# ----------------------------------------- Fetch and evaluate dynamic metadata +# Fetch and evaluate dynamic metadata sub dynamicmeta { my $url=&Apache::lonnet::declutter(shift); $url=~s/\.meta$//; @@ -52,484 +51,834 @@ sub dynamicmeta { $regexp='___'.$regexp.'___'; my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain, $aauthor,$regexp); - my %sum=(); - my %cnt=(); - my %concat=(); - my %listitems=('count' => 'add', - 'course' => 'add', - 'goto' => 'add', - 'comefrom' => 'add', - 'avetries' => 'avg', - 'stdno' => 'add', - 'difficulty' => 'avg', - 'clear' => 'avg', - 'technical' => 'avg', - 'helpful' => 'avg', - 'correct' => 'avg', - 'depth' => 'avg', - 'comments' => 'app', - 'usage' => 'cnt' - ); - foreach (keys %evaldata) { - my ($item,$purl,$cat)=&Apache::lonnet::decode_symb($_); -### print "\n".$_.' - '.$item.'
'; - if (defined($cnt{$cat})) { $cnt{$cat}++; } else { $cnt{$cat}=1; } - unless ($listitems{$cat} eq 'app') { - if (defined($sum{$cat})) { - $sum{$cat}+=$evaldata{$_}; - $concat{$cat}.=','.$item; - } else { - $sum{$cat}=$evaldata{$_}; - $concat{$cat}=$item; - } - } else { - if (defined($sum{$cat})) { - if ($evaldata{$_}) { - $sum{$cat}.='
'.$evaldata{$_}; - } - } else { - $sum{$cat}=''.$evaldata{$_}; - } - } - } - my %returnhash=(); - foreach (keys %cnt) { - if ($listitems{$_} eq 'avg') { - $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0; - } elsif ($listitems{$_} eq 'cnt') { - $returnhash{$_}=$cnt{$_}; - } else { - $returnhash{$_}=$sum{$_}; - } - $returnhash{$_.'_list'}=$concat{$_}; -### print "\n
".$_.': '.$returnhash{$_}.'
'.$returnhash{$_.'_list'}; + 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 %returnhash; + return %Data; } -# ------------------------------------- Try to make an alt tag if there is none +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'); + &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 'No information available'; } + if ($alttag) { + return $alttag; + } else { + return &mt('No information available'); + } } -# -------------------------------------------------------------- Author display - +# Author display sub authordisplay { my ($aname,$adom)=@_; - return &Apache::loncommon::aboutmewrapper( - &Apache::loncommon::plainname($aname,$adom), - $aname,$adom).' ['.$aname.'@'.$adom.']'; + return &Apache::loncommon::aboutmewrapper + (&Apache::loncommon::plainname($aname,$adom), + $aname,$adom,'preview').' ['.$aname.'@'.$adom.']'; } -# -------------------------------------------------------------- Pretty display - +# Pretty display sub evalgraph { my $value=shift; - unless ($value) { return ''; } + if (! $value) { + 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; } sub diffgraph { my $value=shift; - unless ($value) { return ''; } + if (! $value) { + return ''; + } 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; } -# ================================================================ Main Handler -sub handler { - my $r=shift; +# The field names +sub fieldnames { + return &Apache::lonlocal::texthash + ( + 'title' => 'Title', + 'author' =>'Author(s)', + 'authorspace' => 'Author Space', + 'modifyinguser' => 'Last Modifying User', + 'subject' => 'Subject', + 'keywords' => 'Keyword(s)', + 'notes' => 'Notes', + 'abstract' => 'Abstract', + 'lowestgradelevel' => 'Lowest Grade Level', + 'highestgradelevel' => 'Highest Grade Level', + 'standards' => 'Standards', + 'mime' => 'MIME Type', + 'language' => 'Language', + 'creationdate' => 'Creation Date', + 'lastrevisiondate' => 'Last Revision Date', + 'owner' => 'Publisher/Owner', + 'copyright' => 'Copyright/Distribution', + 'customdistributionfile' => 'Custom Distribution File', + 'obsolete' => 'Obsolete', + 'obsoletereplacement' => 'Suggested Replacement for Obsolete File', + 'count' => 'Network-wide number of accesses (hits)', + 'course' => 'Network-wide number of courses using resource', + 'course_list' => 'Network-wide courses using resource', + 'sequsage' => 'Number of resources using or importing resource', + 'sequsage_list' => 'Resources using or importing resource', + 'goto' => 'Number of resources that follow this resource in maps', + 'goto_list' => 'Resources that follow this resource in maps', + 'comefrom' => 'Number of resources that lead up to this resource in maps', + 'comefrom_list' => 'Resources that lead up to this resource in maps', + 'clear' => 'Material presented in clear way', + 'depth' => 'Material covered with sufficient depth', + 'helpful' => 'Material is helpful', + 'correct' => 'Material appears to be correct', + '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', + 'disc' => 'Degree of discrimination', + ); +} - my $loaderror=&Apache::lonnet::overloaderror($r); - if ($loaderror) { return $loaderror; } +# Pretty printing of metadata field +sub prettyprint { + my ($type,$value)=@_; + if (! defined($value)) { + return ' '; + } + # Title + if ($type eq 'title') { + return ''.$value.''; + } + # Dates + if (($type eq 'creationdate') || + ($type eq 'lastrevisiondate')) { + return ($value?&Apache::lonlocal::locallocaltime( + &Apache::lonmysql::unsqltime($value)): + &mt('not available')); + } + # Language + if ($type eq 'language') { + return &Apache::loncommon::languagedescription($value); + } + # Copyright + if ($type eq 'copyright') { + return &Apache::loncommon::copyrightdescription($value); + } + # MIME + if ($type eq 'mime') { + return ' '. + &Apache::loncommon::filedescription($value); + } + # Person + if (($type eq 'author') || + ($type eq 'owner') || + ($type eq 'modifyinguser') || + ($type eq 'authorspace')) { + $value=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse; + return $value; + } + # Gradelevel + if (($type eq 'lowestgradelevel') || + ($type eq 'highestgradelevel')) { + return &Apache::loncommon::gradeleveldescription($value); + } + # Only for advance users below + if (! $ENV{'user.adv'}) { + return '- '.&mt('not displayed').' -'; + } + # File + if (($type eq 'customdistributionfile') || + ($type eq 'obsoletereplacement') || + ($type eq 'goto_list') || + ($type eq 'comefrom_list') || + ($type eq 'sequsage_list')) { + return join('
',map { + 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 + if (($type eq 'clear') || + ($type eq 'depth') || + ($type eq 'helpful') || + ($type eq 'correct') || + ($type eq 'technical')) { + return &evalgraph($value); + } + # Difficulty + if ($type eq 'difficulty' || $type eq 'disc') { + return &diffgraph($value); + } + # List of courses + if ($type=~/\_list/) { + 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; +} - my $uri=$r->uri; +# Pretty input of metadata field +sub direct { + return shift; +} + +sub selectbox { + my ($name,$value,$functionref,@idlist)=@_; + if (! defined($functionref)) { + $functionref=\&direct; + } + my $selout=''; +} + +sub relatedfield { + my ($show,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue)=@_; + if (! $relatedsearchflag) { + return ''; + } + if (! defined($relatedsep)) { + $relatedsep=' '; + } + if (! $show) { + return $relatedsep.' '; + } + return $relatedsep.''; +} - unless ($uri=~/^\/\~/) { -# =========================================== This is not in construction space +sub prettyinput { + my ($type,$value,$fieldname,$formname, + $relatedsearchflag,$relatedsep,$relatedvalue)=@_; + # Language + if ($type eq 'language') { + return &selectbox($fieldname, + $value, + \&Apache::loncommon::languagedescription, + (&Apache::loncommon::languageids)). + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Copyright + if ($type eq 'copyright') { + return &selectbox($fieldname, + $value, + \&Apache::loncommon::copyrightdescription, + (&Apache::loncommon::copyrightids)). + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Gradelevels + if (($type eq 'lowestgradelevel') || + ($type eq 'highestgradelevel')) { + return &Apache::loncommon::select_level_form($value,$fieldname). + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Obsolete + if ($type eq 'obsolete') { + return ''. + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Obsolete replacement file + if ($type eq 'obsoletereplacement') { + return '".&mt('Select').''. + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Customdistribution file + if ($type eq 'customdistributionfile') { + return '".&mt('Select').''. + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # Dates + if (($type eq 'creationdate') || + ($type eq 'lastrevisiondate')) { + return + &Apache::lonhtmlcommon::date_setter($formname,$fieldname,$value). + &relatedfield(0,$relatedsearchflag,$relatedsep); + } + # No pretty input found + $value=~s/^\s+//gs; + $value=~s/\s+$//gs; + $value=~s/\s+/ /gs; + $value=~s/\"/\&quod\;/gs; + return + ''. + &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname, + $relatedvalue); +} + +# Main Handler +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; + } + # + # Check to see if original resource server is overloaded my ($resdomain,$resuser)= - (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); + (&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; +} - $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,$_); - } -# ------------------------------------------------------------------ Hide stuff - - unless ($ENV{'user.adv'}) { - foreach ('keywords','notes','abstract','subject') { - $content{$_}='- '.&mt('not displayed').' -'; - } - } - -# --------------------------------------------------------------- Render Output - my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/); -my $creationdate=&Apache::lonlocal::locallocaltime( - &Apache::loncommon::unsqltime($content{'creationdate'})); -my $lastrevisiondate=&Apache::lonlocal::locallocaltime( - &Apache::loncommon::unsqltime($content{'lastrevisiondate'})); -my $language=&Apache::loncommon::languagedescription($content{'language'}); -my $mime=&Apache::loncommon::filedescription($content{'mime'}); -my $disuri=&Apache::lonnet::declutter($uri); - $disuri=~s/\.meta$//; -my $currentversion=&Apache::lonnet::getversion($disuri); -my $author=$content{'author'}; -$author=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse; -my $owner=$content{'owner'}; -$owner=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse; -my $versiondisplay=''; -if ($thisversion) { - $versiondisplay=&mt('Version').': '.$thisversion. - ' ('.&mt('most recent version').': '.$currentversion.')'; -} else { - $versiondisplay='Version: '.$currentversion; -} -my $customdistributionfile=''; -if ($content{'customdistributionfile'}) { - $customdistributionfile=''.$content{'customdistributionfile'}.''; -} - -my $obsolete=$content{'obsolete'}; -my $obsoletereplace=$content{'obsoletereplacement'}; -my $obsoletewarning=''; -if (($obsolete) && ($ENV{'user.adv'})) { - $obsoletewarning='

'.&mt('This resource has been marked obsolete by the author(s)').'

'; -} - -my %lt=&Apache::lonlocal::texthash( - 'au' =>'Author(s)', - 'sb' => 'Subject', - 'kw' => 'Keyword(s)', - 'no' => 'Notes', - 'ab' => 'Abstract', - 'mi' => 'MIME Type', - 'la' => 'Language', - 'cd' => 'Creation Date', - 'pu' => 'Publisher/Owner', - 'co' => 'Copyright/Distribution', - 'cf' => 'Custom Distribution File', - 'ob' => 'Obsolete', - 'or' => - 'Suggested Replacement for Obsolete File'); -my $bodytag=&Apache::loncommon::bodytag - ('Catalog Information','','','',$resdomain); - $r->print(<Catalog Information -$bodytag -

$content{'title'}

-

$disuri

+##################################################### +##################################################### +### ### +### Report Bombs ### +### ### +##################################################### +##################################################### +sub report_bombs { + my ($r,$uri) = @_; + # Set document type + $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))) { + if ($_=~/^\Q$uri\E/) { + $r->print + (''.$_.''. + &Apache::lonmsg::retrieve_author_res_msg($_). + '
'); + } + } + } else { + $r->print(&mt('Not authorized')); + } + return; +} + +##################################################### +##################################################### +### ### +### Uneditable Metadata Display ### +### ### +##################################################### +##################################################### +sub present_uneditable_metadata { + my ($r,$uri) = @_; + # + my %content=(); + # Read file + foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) { + $content{$_}=&Apache::lonnet::metadata($uri,$_); + } + # Render Output + # displayed url + my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/); + $uri=~s/\.meta$//; + my $disuri=&Apache::lonnet::clutter($uri); + # version + my $currentversion=&Apache::lonnet::getversion($disuri); + my $versiondisplay=''; + if ($thisversion) { + $versiondisplay=&mt('Version').': '.$thisversion. + ' ('.&mt('most recent version').': '. + ($currentversion>0 ? + $currentversion : + &mt('information not available')).')'; + } else { + $versiondisplay='Version: '.$currentversion; + } + # crumbify displayed URL uri target prefix form size + $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef,'+1'); + $disuri =~ s:
::g; + # obsolete + my $obsolete=$content{'obsolete'}; + my $obsoletewarning=''; + if (($obsolete) && ($ENV{'user.adv'})) { + $obsoletewarning='

'. + &mt('This resource has been marked obsolete by the author(s)'). + '

'; + } + # + my %lt=&fieldnames(); + my $table=''; + my $title = $content{'title'}; + if (! defined($title)) { + $title = 'Untitled Resource'; + } + foreach ('title', + 'author', + 'subject', + 'keywords', + 'notes', + 'abstract', + 'lowestgradelevel', + 'highestgradelevel', + 'standards', + 'mime', + 'language', + 'creationdate', + 'lastrevisiondate', + 'owner', + 'copyright', + 'customdistributionfile', + 'obsolete', + 'obsoletereplacement') { + $table.=''.$lt{$_}. + ''. + &prettyprint($_,$content{$_}).''; + delete $content{$_}; + } + # + $r->print(<$title +

+$disuri
$obsoletewarning -$versiondisplay
+$versiondisplay +

- - - - - - - - - - - - - - - - - - - - - - - - - - - +$table
$lt{'au'}$author 
$lt{'sb'}$content{'subject'} 
$lt{'kw'}$content{'keywords'} 
$lt{'no'}$content{'notes'} 
$lt{'ab'}$content{'abstract'} 
$lt{'mi'}$mime ($content{'mime'}) 
$lt{'la'}$language 
$lt{'cd'}$creationdate 
-Last Revision Date$lastrevisiondate 
$lt{'pu'}$owner 
$lt{'co'}$content{'copyright'} 
$lt{'cf'}$customdistributionfile 
$lt{'ob'}$obsolete 
$lt{'or'}$obsoletereplace 
ENDHEAD - delete($content{'title'}); - delete($content{'author'}); - delete($content{'subject'}); - delete($content{'keywords'}); - delete($content{'notes'}); - delete($content{'abstract'}); - delete($content{'mime'}); - delete($content{'language'}); - delete($content{'creationdate'}); - delete($content{'lastrevisiondate'}); - delete($content{'owner'}); - delete($content{'copyright'}); - delete($content{'customdistributionfile'}); - delete($content{'obsolete'}); - delete($content{'obsoletereplacement'}); - if ($ENV{'user.adv'}) { -# ------------------------------------------------------------ Dynamic Metadata - $r->print( - '

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

'.&mt('Processing'). - ' ...
'); - $r->rflush(); - my %items=&Apache::lonlocal::texthash( - 'count' => 'Network-wide number of accesses (hits)', - 'course' => 'Network-wide number of courses using resource', - 'usage' => 'Number of resources using or importing resource', - 'goto' => 'Number of resources that follow this resource in maps', - 'comefrom' => 'Number of resources that lead up to this resource in maps', - 'clear' => 'Material presented in clear way', - 'depth' => 'Material covered with sufficient depth', - 'helpful' => 'Material is helpful', - 'correct' => 'Material appears to be correct', - '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'); - my %dynmeta=&dynamicmeta($uri); - $r->print( -'

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

'); - foreach ('count') { - $r->print( -'\n"); - } - foreach my $cat ('usage','comefrom','goto') { - $r->print( -'\n"); - } - foreach my $cat ('course') { - $r->print( -'\n"); - } - $r->print('
'.$items{$_}.''. -$dynmeta{$_}." 
'.$items{$cat}.''. -$dynmeta{$cat}.'
'.$items{$cat}.''. -$dynmeta{$cat}.'
'); - if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) { - $r->print( -'

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

'); - foreach ('stdno','avetries') { - $r->print( -'\n"); - } - foreach ('difficulty') { - $r->print( -'\n"); - } - $r->print('
'.$items{$_}.''. -$dynmeta{$_}." 
'.$items{$_}.''. -&diffgraph($dynmeta{$_})."
'); - } - $r->print('

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

'); - foreach ('clear','depth','helpful','correct','technical') { - $r->print( -'\n"); - } - $r->print('
'.$items{$_}.''. -&evalgraph($dynmeta{$_})."
'); - $disuri=~/^(\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').')

'); - my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$1,$2); - foreach (keys %errormsgs) { - if ($_=~/^\Q$disuri\E\_\d+$/) { - my %content=&Apache::lonmsg::unpackagemsg($errormsgs{$_}); - $r->print(''.$content{'time'}.': '.$content{'message'}. - '
'); - } - } - } -# ------------------------------------------------------------- All other stuff - $r->print( - '

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

'); - foreach (sort keys %content) { - my $name=$_; - unless ($name=~/\.display$/) { - my $display=&Apache::lonnet::metadata($uri,$name.'.display'); - unless ($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("
\n"); - } - } - } -# ===================================================== End Resource Space Call - } else { -# ===================================================== Construction Space Call - -# ----------------------------------------------------------- Set document type - - $r->content_type('text/html'); - $r->send_http_header; - - return OK if $r->header_only; -# ---------------------------------------------------------------------- Header - my $bodytag=&Apache::loncommon::bodytag('Edit Catalog Information'); - my $disuri=$uri; - my $fn=&Apache::lonnet::filelocation('',$uri); - $disuri=~s/^\/\~\w+//; - $disuri=~s/\.meta$//; - my $displayfile='Catalog Information for '.$disuri; - if ($disuri=~/\/default$/) { - my $dir=$disuri; - $dir=~s/default$//; - $displayfile=&mt('Default Cataloging Information for Directory').' '. - $dir; - } - %Apache::lonpublisher::metadatafields=(); - %Apache::lonpublisher::metadatakeys=(); - &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile($fn)); - $r->print(<print('

'.&mt($description).'

'. + &mt('Processing')); + $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'}) || + exists($dynmeta{'sequsage'}) || + exists($dynmeta{'comefrom'}) || + exists($dynmeta{'goto'}) || + exists($dynmeta{'course'})) { + $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{$_})."
'); + } else { + $r->print('

'.&mt('No Access or Usages Statistics are available for this resource.').'

'); + } + # + # Assessment statistics + if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) { + if (exists($dynmeta{'stdno'}) || + exists($dynmeta{'avetries'}) || + exists($dynmeta{'difficulty'}) || + exists($dynmeta{'disc'})) { + # This is an assessment, print assessment data + $r->print('

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

'. + ''); + $r->print(''. + ''."\n"); + foreach ('avetries','difficulty','disc') { + $r->print(''. + ''."\n"); + } + $r->print('
'.$lt{'stdno'}.''. + &prettyprint('stdno',$dynmeta{'stdno'}). + '
'.$lt{$_}.''. + &prettyprint($_,sprintf('%5.2f',$dynmeta{$_})). + '
'); + } + if (exists($dynmeta{'stats'})) { + # + # New assessment statistics + $r->print('

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

'); + my $table = ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''.$/; + foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) { + my $data = $dynmeta{'stats'}->{$identifier}; + my $course = $data->{'course'}; + my %courseinfo = &Apache::lonnet::coursedescription($course); + if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') { + &Apache::lonnet::logthis('lookup for '.$course.' failed'); + next; + } + $table .= ''; + $table .= + ''; + $table .= + ''; + $table .= + ''; + foreach ('avetries','difficulty','disc') { + $table .= ''; + } + $table .= + ''; + $table .= + ''.$/; + } + $table .= '
CourseSection(s)Num StudentsMean TriesDegree of DifficultyDegree of DiscriminationTime of computation
'.$courseinfo{'description'}.''.$data->{'sections'}.''.$data->{'stdno'}.''; + if (exists($data->{$_})) { + $table .= sprintf('%.2f',$data->{$_}).' '; + } else { + $table .= ''; + } + $table .= ''. + &Apache::lonlocal::locallocaltime($data->{'timestamp'}). + '
'.$/; + $r->print($table); + } else { + $r->print('No new dynamic data found.'); + } + } else { + $r->print('

'. + &mt('No Assessment Statistical Data is available for this resource'). + '

'); + } + + # + # + if (exists($dynmeta{'clear'}) || + exists($dynmeta{'depth'}) || + exists($dynmeta{'helpful'}) || + exists($dynmeta{'correct'}) || + exists($dynmeta{'technical'})){ + $r->print('

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

'. + ''); + foreach ('clear','depth','helpful','correct','technical') { + $r->print(''. + '\n"); + } + $r->print('
'.$lt{$_}.''. + &prettyprint($_,$dynmeta{$_})."
'); + } else { + $r->print('

'.&mt('No Evaluation Data is available for this resource.').'

'); + } + $uri=~/^\/res\/(\w+)\/(\w+)\//; + if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2)) + || ($ENV{'user.role.ca./'.$1.'/'.$2})) { + if (exists($dynmeta{'comments'})) { + $r->print('

'.&mt('Evaluation Comments').' ('. + &mt('visible to author and co-authors only'). + ')

'. + '
'.$dynmeta{'comments'}.'
'); + } else { + $r->print('

'.&mt('There are no Evaluation Comments on this resource.').'

'); + } + my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri); + if (defined($bombs) && $bombs ne '') { + $r->print('

'.&mt('Error Messages').' ('. + &mt('visible to author and co-authors only').')'. + '

'.$bombs); + } else { + $r->print('

'.&mt('There are currently no Error Messages for this resource.').'

'); + } + } + # + # 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("
\n"); + } + } + return; +} + +##################################################### +##################################################### +### ### +### Editable metadata display ### +### ### +##################################################### +##################################################### +sub present_editable_metadata { + my ($r,$uri) = @_; + # Construction Space Call + # Header + my $disuri=$uri; + my $fn=&Apache::lonnet::filelocation('',$uri); + $disuri=~s/^\/\~/\/priv\//; + $disuri=~s/\.meta$//; + my $target=$uri; + $target=~s/^\/\~/\/res\/$ENV{'request.role.domain'}\//; + $target=~s/\.meta$//; + my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target); + if ($bombs) { + if ($ENV{'form.delmsg'}) { + if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') { + $bombs=&mt('Messages deleted.'); + } else { + $bombs=&mt('Error deleting messages'); + } + } + my $del=&mt('Delete Messages'); + $r->print(<$disuri +
+ +
$bombs +ENDBOMBS + } else { + my $displayfile='Catalog Information for '.$disuri; + if ($disuri=~/\/default$/) { + my $dir=$disuri; + $dir=~s/default$//; + $displayfile= + &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 - foreach ('author','title','subject','keywords','abstract','notes', - 'copyright','customdistributionfile','language', - 'obsolete','obsoletereplacement') { - if ($ENV{'form.new_'.$_}) { - $Apache::lonpublisher::metadatafields{$_}=$ENV{'form.new_'.$_}; - } - if (m/copyright/) { - $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_, - $Apache::lonpublisher::metadatafields{$_}, - \&Apache::loncommon::copyrightdescription, - (&Apache::loncommon::copyrightids))); - } elsif (m/language/) { - $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_, - $Apache::lonpublisher::metadatafields{$_}, - \&Apache::loncommon::languagedescription, - (&Apache::loncommon::languageids))); - } else { - $r->print(&Apache::lonpublisher::textfield($_,'new_'.$_, - $Apache::lonpublisher::metadatafields{$_})); - } - } - if ($ENV{'form.store'}) { - my $mfh; - unless ($mfh=Apache::File->new('>'.$fn)) { - $r->print( - '

'.&mt('Could not write metadata').', '. - &mt('FAIL').''); - } else { - foreach (sort keys %Apache::lonpublisher::metadatafields) { - unless ($_=~/\./) { - 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.'"'; + $r->print(''); + my %lt=&fieldnames(); + foreach ('author','title','subject','keywords','abstract','notes', + 'copyright','customdistributionfile','language', + 'standards', + 'lowestgradelevel','highestgradelevel', + 'obsolete','obsoletereplacement') { + if (defined($ENV{'form.new_'.$_})) { + $Apache::lonpublisher::metadatafields{$_}= + $ENV{'form.new_'.$_}; + } + if (! $Apache::lonpublisher::metadatafields{'copyright'}) { + $Apache::lonpublisher::metadatafields{'copyright'}= + 'default'; + } + $r->print('

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

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

'. + &mt('Could not write metadata').', '. + &mt('FAIL').''); + } else { + foreach (sort keys %Apache::lonpublisher::metadatafields) { + 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}, + '<>&"'). + ''; } - print $mfh '>'. - &HTML::Entities::encode($Apache::lonpublisher::metadatafields{$unikey}) - .''; - } - } - $r->print('

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

'); - return OK; - } + $r->print('

'.&mt('Wrote Metadata')); + } + } + $r->print('
'); + } + $r->print(''); + return; } 1; __END__ - - - - - - - 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.