version 1.66, 2004/04/13 16:03:46
|
version 1.70, 2004/04/14 20:45:14
|
Line 40 use Apache::lonlocal;
|
Line 40 use Apache::lonlocal;
|
use Apache::lonmysql; |
use Apache::lonmysql; |
use Apache::lonmsg; |
use Apache::lonmsg; |
|
|
# MySQL table columns |
|
|
|
my @columns; |
|
|
|
# Fetch and evaluate dynamic metadata |
# Fetch and evaluate dynamic metadata |
sub dynamicmeta { |
sub dynamicmeta { |
Line 60 sub dynamicmeta {
|
Line 57 sub dynamicmeta {
|
# |
# |
# Deal with 'count' separately |
# Deal with 'count' separately |
$Data{'count'} = &access_count($url,$aauthor,$adomain); |
$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; |
return %Data; |
} |
} |
|
|
Line 146 sub diffgraph {
|
Line 152 sub diffgraph {
|
return $output; |
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 |
# The field names |
sub fieldnames { |
sub fieldnames { |
Line 258 sub prettyprint {
|
Line 252 sub prettyprint {
|
($type eq 'comefrom_list') || |
($type eq 'comefrom_list') || |
($type eq 'sequsage_list')) { |
($type eq 'sequsage_list')) { |
return join('<br />',map { |
return join('<br />',map { |
my $url=&Apache::lonnet::clutter($_); |
my $url = &Apache::lonnet::clutter($_); |
'<b>'.&Apache::lonnet::gettitle($url).'</b>'. |
$_ = '<b>'.&Apache::lonnet::gettitle($url).'</b> '. |
&Apache::lonhtmlcommon::crumbs($url,'preview','',undef,'+0'); |
'<a href="'.$url.'" target="preview">'. |
|
'<font size="-1">'.$url.'</font>'. |
|
'</a>' |
} split(/\s*\,\s*/,$value)); |
} split(/\s*\,\s*/,$value)); |
} |
} |
# Evaluations |
# Evaluations |
Line 394 sub prettyinput {
|
Line 390 sub prettyinput {
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
# |
# |
|
my $uri=$r->uri; |
|
# |
|
# Check to see if this server is overloaded |
my $loaderror=&Apache::lonnet::overloaderror($r); |
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('<html><head><title>'. |
|
'Catalog Information'. |
|
'</title></head>'); |
if ($uri=~m:/adm/bombs/(.*)$:) { |
if ($uri=~m:/adm/bombs/(.*)$:) { |
|
$r->print(&Apache::loncommon::bodytag('Error Messages')); |
# Looking for all bombs? |
# Looking for all bombs? |
&report_bombs($r,$uri); |
&report_bombs($r,$uri); |
} elsif ($uri=~/^\/\~/) { |
} elsif ($uri=~/^\/\~/) { |
# Construction space |
# Construction space |
|
$r->print(&Apache::loncommon::bodytag |
|
('Edit Catalog Information','','','',$resdomain)); |
&present_editable_metadata($r,$uri); |
&present_editable_metadata($r,$uri); |
} else { |
} else { |
|
$r->print(&Apache::loncommon::bodytag |
|
('Catalog Information','','','',$resdomain)); |
&present_uneditable_metadata($r,$uri); |
&present_uneditable_metadata($r,$uri); |
} |
} |
|
$r->print('</body></html>'); |
return OK; |
return OK; |
} |
} |
|
|
|
##################################################### |
|
##################################################### |
|
### ### |
|
### Report Bombs ### |
|
### ### |
|
##################################################### |
|
##################################################### |
sub report_bombs { |
sub report_bombs { |
my ($r,$uri) = @_; |
my ($r,$uri) = @_; |
# Set document type |
# Set document type |
$uri=~ s:/adm/bombs/::; |
$uri =~ s:/adm/bombs/::; |
$uri=&Apache::lonnet::declutter($uri); |
$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')); |
|
$r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>'); |
$r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>'); |
my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//); |
my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//); |
if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) { |
if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) { |
my %brokenurls=&Apache::lonmsg::all_url_author_res_msg($author, |
my %brokenurls = |
$domain); |
&Apache::lonmsg::all_url_author_res_msg($author,$domain); |
foreach (sort keys %brokenurls) { |
foreach (sort(keys(%brokenurls))) { |
if ($_=~/^\Q$uri\E/) { |
if ($_=~/^\Q$uri\E/) { |
$r->print(&Apache::lonhtmlcommon::crumbs |
$r->print |
(&Apache::lonnet::clutter($_)). |
('<a href="'.&Apache::lonnet::clutter($_).'">'.$_.'</a>'. |
&Apache::lonmsg::retrieve_author_res_msg($_). |
&Apache::lonmsg::retrieve_author_res_msg($_). |
'<hr />'); |
'<hr />'); |
} |
} |
} |
} |
} else { |
} else { |
$r->print(&mt('Not authorized')); |
$r->print(&mt('Not authorized')); |
} |
} |
$r->print('</body></html>'); |
|
return; |
return; |
} |
} |
|
|
|
##################################################### |
|
##################################################### |
|
### ### |
|
### Uneditable Metadata Display ### |
|
### ### |
|
##################################################### |
|
##################################################### |
sub present_uneditable_metadata { |
sub present_uneditable_metadata { |
my ($r,$uri) = @_; |
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=(); |
my %content=(); |
# Set document type |
|
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
|
return OK if $r->header_only; |
|
# Read file |
# Read file |
foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) { |
foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) { |
$content{$_}=&Apache::lonnet::metadata($uri,$_); |
$content{$_}=&Apache::lonnet::metadata($uri,$_); |
Line 491 sub present_uneditable_metadata {
|
Line 509 sub present_uneditable_metadata {
|
# |
# |
my %lt=&fieldnames(); |
my %lt=&fieldnames(); |
my $table=''; |
my $table=''; |
my $bodytag=&Apache::loncommon::bodytag |
|
('Catalog Information','','','',$resdomain); |
|
foreach ('title', |
foreach ('title', |
'author', |
'author', |
'subject', |
'subject', |
Line 518 sub present_uneditable_metadata {
|
Line 534 sub present_uneditable_metadata {
|
} |
} |
# |
# |
$r->print(<<ENDHEAD); |
$r->print(<<ENDHEAD); |
<html><head><title>Catalog Information</title></head> |
|
$bodytag |
|
<h2>$content{'title'}</h2> |
<h2>$content{'title'}</h2> |
<h3><tt>$disuri</tt></h3> |
<h3><tt>$disuri</tt></h3> |
$obsoletewarning |
$obsoletewarning |
Line 529 $table
|
Line 543 $table
|
</table> |
</table> |
ENDHEAD |
ENDHEAD |
if ($ENV{'user.adv'}) { |
if ($ENV{'user.adv'}) { |
# Dynamic Metadata |
&print_dynamic_metadata($r,$uri,\%content); |
$r->print( |
} |
'<h3>'.&mt('Dynamic Metadata').' ('. |
return; |
&mt('updated periodically').')</h3>'.&mt('Processing'). |
} |
' ...<br />'); |
|
$r->rflush(); |
sub print_dynamic_metadata { |
my %items=&fieldnames(); |
my ($r,$uri,$content) = @_; |
my %dynmeta=&dynamicmeta($uri); |
# |
# General Access and Usage Statistics |
my %content = %$content; |
|
my %lt=&fieldnames(); |
|
# |
|
my $description = 'Dynamic Metadata (updated periodically)'; |
|
$r->print('<h3>'.&mt($description).'</h3>'. |
|
&mt('Processing')); |
|
$r->rflush(); |
|
my %items=&fieldnames(); |
|
my %dynmeta=&dynamicmeta($uri); |
|
# |
|
# General Access and Usage Statistics |
|
if (exists($dynmeta{'count'}) || |
|
exists($dynmeta{'sequsage'}) || |
|
exists($dynmeta{'comefrom'}) || |
|
exists($dynmeta{'goto'}) || |
|
exists($dynmeta{'course'})) { |
$r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'. |
$r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'. |
'<table cellspacing=2 border=0>'); |
'<table cellspacing=2 border=0>'); |
foreach ('count', |
foreach ('count', |
Line 550 ENDHEAD
|
Line 579 ENDHEAD
|
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
} |
} |
$r->print('</table>'); |
$r->print('</table>'); |
if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) { |
} else { |
# This is an assessment, print assessment data |
$r->print('<h4>'.&mt('No Access or Usages Statistics are available for this resource.').'</h4>'); |
$r->print( |
} |
'<h4>'.&mt('Assessment Statistical Data').'</h4>'. |
# |
'<table cellspacing=2 border=0>'); |
# Assessment statistics |
foreach ('stdno','avetries','difficulty') { |
if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/ && |
$r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'. |
(exists($dynmeta{'stdno'}) || |
'<td bgcolor="#CCCCCC">'. |
exists($dynmeta{'avetries'}) || |
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
exists($dynmeta{'difficulty'}))) { |
} |
# This is an assessment, print assessment data |
$r->print('</table>'); |
$r->print( |
|
'<h4>'.&mt('Assessment Statistical Data').'</h4>'. |
|
'<table cellspacing=2 border=0>'); |
|
foreach ('stdno','avetries','difficulty') { |
|
$r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'. |
|
'<td bgcolor="#CCCCCC">'. |
|
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
} |
} |
|
$r->print('</table>'); |
|
} else { |
|
$r->print('<h4>'.&mt('No Assessment Statistical Data is available for this resource').'</h4>'); |
|
} |
|
if (exists($dynmeta{'clear'}) || |
|
exists($dynmeta{'depth'}) || |
|
exists($dynmeta{'helpful'}) || |
|
exists($dynmeta{'correct'}) || |
|
exists($dynmeta{'technical'})){ |
$r->print('<h4>'.&mt('Evaluation Data').'</h4>'. |
$r->print('<h4>'.&mt('Evaluation Data').'</h4>'. |
'<table cellspacing=2 border=0>'); |
'<table cellspacing=2 border=0>'); |
foreach ('clear','depth','helpful','correct','technical') { |
foreach ('clear','depth','helpful','correct','technical') { |
Line 570 ENDHEAD
|
Line 614 ENDHEAD
|
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
&prettyprint($_,$dynmeta{$_})."</td></tr>\n"); |
} |
} |
$r->print('</table>'); |
$r->print('</table>'); |
$uri=~/^\/res\/(\w+)\/(\w+)\//; |
} else { |
if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2)) |
$r->print('<h4>'.&mt('No Evaluation Data is available for this resource.').'</h4>'); |
|| ($ENV{'user.role.ca./'.$1.'/'.$2})) { |
} |
|
$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('<h4>'.&mt('Evaluation Comments').' ('. |
$r->print('<h4>'.&mt('Evaluation Comments').' ('. |
&mt('visible to author and co-authors only'). |
&mt('visible to author and co-authors only'). |
')</h4>'. |
')</h4>'. |
'<blockquote>'.$dynmeta{'comments'}.'</blockquote>'); |
'<blockquote>'.$dynmeta{'comments'}.'</blockquote>'); |
|
} else { |
|
$r->print('<h4>'.&mt('There are no Evaluation Comments on this resource.').'</h4>'); |
|
} |
|
my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri); |
|
if (defined($bombs) && $bombs ne '') { |
$r->print('<a name="bombs" /><h4>'.&mt('Error Messages').' ('. |
$r->print('<a name="bombs" /><h4>'.&mt('Error Messages').' ('. |
&mt('visible to author and co-authors only').')'. |
&mt('visible to author and co-authors only').')'. |
'</h4>'. |
'</h4>'.$bombs); |
&Apache::lonmsg::retrieve_author_res_msg($uri)); |
} else { |
|
$r->print('<h4>'.&mt('There are currently no Error Messages for this resource.').'</h4>'); |
} |
} |
# All other stuff |
} |
$r->print('<h3>'. |
# |
&mt('Additional Metadata (non-standard, parameters, exports)'). |
# All other stuff |
'</h3>'); |
$r->print('<h3>'. |
foreach (sort keys %content) { |
&mt('Additional Metadata (non-standard, parameters, exports)'). |
my $name=$_; |
'</h3>'); |
if ($name!~/\.display$/) { |
foreach (sort(keys(%content))) { |
my $display=&Apache::lonnet::metadata($uri, |
my $name=$_; |
$name.'.display'); |
if ($name!~/\.display$/) { |
if (! $display) { |
my $display=&Apache::lonnet::metadata($uri, |
$display=$name; |
$name.'.display'); |
}; |
if (! $display) { |
my $otherinfo=''; |
$display=$name; |
foreach ('name','part','type','default') { |
}; |
if (defined(&Apache::lonnet::metadata($uri, |
my $otherinfo=''; |
$name.'.'.$_))) { |
foreach ('name','part','type','default') { |
$otherinfo.=' '.$_.'='. |
if (defined(&Apache::lonnet::metadata($uri, |
&Apache::lonnet::metadata($uri, |
$name.'.'.$_))) { |
$name.'.'.$_).'; '; |
$otherinfo.=' '.$_.'='. |
} |
&Apache::lonnet::metadata($uri, |
} |
$name.'.'.$_).'; '; |
$r->print('<b>'.$display.':</b> '.$content{$name}); |
|
if ($otherinfo) { |
|
$r->print(' ('.$otherinfo.')'); |
|
} |
} |
$r->print("<br />\n"); |
|
} |
} |
|
$r->print('<b>'.$display.':</b> '.$content{$name}); |
|
if ($otherinfo) { |
|
$r->print(' ('.$otherinfo.')'); |
|
} |
|
$r->print("<br />\n"); |
} |
} |
} |
} |
|
return; |
} |
} |
|
|
|
##################################################### |
|
##################################################### |
|
### ### |
|
### Editable metadata display ### |
|
### ### |
|
##################################################### |
|
##################################################### |
sub present_editable_metadata { |
sub present_editable_metadata { |
my ($r,$uri) = @_; |
my ($r,$uri) = @_; |
# Construction Space Call |
# Construction Space Call |
# Set document type |
|
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
|
# |
|
return OK if $r->header_only; |
|
# Header |
# Header |
my $disuri=$uri; |
my $disuri=$uri; |
my $fn=&Apache::lonnet::filelocation('',$uri); |
my $fn=&Apache::lonnet::filelocation('',$uri); |
Line 638 sub present_editable_metadata {
|
Line 696 sub present_editable_metadata {
|
$bombs=&mt('Error deleting messages'); |
$bombs=&mt('Error deleting messages'); |
} |
} |
} |
} |
my $bodytag=&Apache::loncommon::bodytag('Error Messages'); |
|
my $del=&mt('Delete Messages'); |
my $del=&mt('Delete Messages'); |
$r->print(<<ENDBOMBS); |
$r->print(<<ENDBOMBS); |
<html><head><title>Edit Catalog Information</title></head> |
|
$bodytag |
|
<h1>$disuri</h1> |
<h1>$disuri</h1> |
<form method="post" name="defaultmeta"> |
<form method="post" name="defaultmeta"> |
<input type="submit" name="delmsg" value="$del" /> |
<input type="submit" name="delmsg" value="$del" /> |
<br />$bombs |
<br />$bombs |
</form> |
|
</body> |
|
</html> |
|
ENDBOMBS |
ENDBOMBS |
} else { |
} else { |
my $displayfile='Catalog Information for '.$disuri; |
my $displayfile='Catalog Information for '.$disuri; |
Line 701 ENDEDIT
|
Line 753 ENDEDIT
|
&mt('FAIL').'</font>'); |
&mt('FAIL').'</font>'); |
} else { |
} else { |
foreach (sort keys %Apache::lonpublisher::metadatafields) { |
foreach (sort keys %Apache::lonpublisher::metadatafields) { |
if ($_!~/\./) { |
next if ($_ =~ /\./); |
my $unikey=$_; |
my $unikey=$_; |
$unikey=~/^([A-Za-z]+)/; |
$unikey=~/^([A-Za-z]+)/; |
my $tag=$1; |
my $tag=$1; |
$tag=~tr/A-Z/a-z/; |
$tag=~tr/A-Z/a-z/; |
print $mfh "\n\<$tag"; |
print $mfh "\n\<$tag"; |
foreach (split(/\,/, |
foreach (split(/\,/, |
$Apache::lonpublisher::metadatakeys{$unikey}) |
$Apache::lonpublisher::metadatakeys{$unikey}) |
) { |
) { |
my $value= |
my $value= |
$Apache::lonpublisher::metadatafields{$unikey.'.'.$_}; |
$Apache::lonpublisher::metadatafields{$unikey.'.'.$_}; |
$value=~s/\"/\'\'/g; |
$value=~s/\"/\'\'/g; |
print $mfh ' '.$_.'="'.$value.'"'; |
print $mfh ' '.$_.'="'.$value.'"'; |
} |
|
print $mfh '>'. |
|
&HTML::Entities::encode |
|
($Apache::lonpublisher::metadatafields{$unikey}, |
|
'<>&"'). |
|
'</'.$tag.'>'; |
|
} |
} |
|
print $mfh '>'. |
|
&HTML::Entities::encode |
|
($Apache::lonpublisher::metadatafields{$unikey}, |
|
'<>&"'). |
|
'</'.$tag.'>'; |
} |
} |
$r->print('<p>'.&mt('Wrote Metadata')); |
$r->print('<p>'.&mt('Wrote Metadata')); |
} |
} |
} |
} |
$r->print('<br /><input type="submit" name="store" value="'. |
$r->print('<br /><input type="submit" name="store" value="'. |
&mt('Store Catalog Information').'"></form>'. |
&mt('Store Catalog Information').'">'); |
'</body></html>'); |
|
} |
} |
|
$r->print('</form>'); |
return; |
return; |
} |
} |
|
|
# BEGIN Block |
|
BEGIN { |
|
# Get columns of MySQL metadata table |
|
@columns=&Apache::lonmysql::col_order('metadata'); |
|
} |
|
|
|
1; |
1; |
__END__ |
__END__ |