Diff for /loncom/interface/lonmeta.pm between versions 1.34 and 1.60

version 1.34, 2003/09/09 18:46:28 version 1.60, 2004/02/09 20:22:18
Line 24 Line 24
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
 # http://www.lon-capa.org/  # 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;  package Apache::lonmeta;
   
Line 37  use strict; Line 32  use strict;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lonnet();  use Apache::lonnet();
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonhtmlcommon();
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonpublisher;  use Apache::lonpublisher;
   use Apache::lonlocal;
   use Apache::lonmysql;
   use Apache::lonmsg;
   
   # MySQL table columns
   
   my @columns;
   
 # ----------------------------------------- Fetch and evaluate dynamic metadata  # ----------------------------------------- Fetch and evaluate dynamic metadata
   
Line 54  sub dynamicmeta { Line 57  sub dynamicmeta {
     my %sum=();      my %sum=();
     my %cnt=();      my %cnt=();
     my %concat=();      my %concat=();
     my %listitems=('count'        => 'add',      my %listitems=(
                    'course'       => 'add',                     'course'       => 'add',
                    'goto'         => 'add',                     'goto'         => 'add',
                    'comefrom'     => 'add',                     'comefrom'     => 'add',
Line 69  sub dynamicmeta { Line 72  sub dynamicmeta {
                    'comments'     => 'app',                     'comments'     => 'app',
                    'usage'        => 'cnt'                     'usage'        => 'cnt'
                    );                     );
     foreach (keys %evaldata) {      while ($_=each(%evaldata)) {
  my ($item,$purl,$cat)=&Apache::lonnet::decode_symb($_);   my ($item,$purl,$cat)=split(/___/,$_);
 ### print "\n".$_.' - '.$item.'<br />';   ### Apache->request->print("\n".$_.' - '.$item.'<br />');
         if (defined($cnt{$cat})) { $cnt{$cat}++; } else { $cnt{$cat}=1; }   if (defined($cnt{$cat})) { $cnt{$cat}++; } else { $cnt{$cat}=1; }
         unless ($listitems{$cat} eq 'app') {          unless ($listitems{$cat} eq 'app') {
             if (defined($sum{$cat})) {              if (defined($sum{$cat})) {
                $sum{$cat}+=$evaldata{$_};                 $sum{$cat}+=$evaldata{$_};
Line 84  sub dynamicmeta { Line 87  sub dynamicmeta {
         } else {          } else {
             if (defined($sum{$cat})) {              if (defined($sum{$cat})) {
                if ($evaldata{$_}) {                 if ($evaldata{$_}) {
                   $sum{$cat}.='<hr>'.$evaldata{$_};                    $sum{$cat}.='<hr />'.$evaldata{$_};
        }         }
      } else {       } else {
        $sum{$cat}=''.$evaldata{$_};         $sum{$cat}=''.$evaldata{$_};
Line 92  sub dynamicmeta { Line 95  sub dynamicmeta {
  }   }
     }      }
     my %returnhash=();      my %returnhash=();
     foreach (keys %cnt) {      while ($_=each(%cnt)) {
        if ($listitems{$_} eq 'avg') {         if ($listitems{$_} eq 'avg') {
    $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0;     $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0;
        } elsif ($listitems{$_} eq 'cnt') {         } elsif ($listitems{$_} eq 'cnt') {
Line 101  sub dynamicmeta { Line 104  sub dynamicmeta {
            $returnhash{$_}=$sum{$_};             $returnhash{$_}=$sum{$_};
        }         }
        $returnhash{$_.'_list'}=$concat{$_};         $returnhash{$_.'_list'}=$concat{$_};
 ### print "\n<hr />".$_.': '.$returnhash{$_}.'<br />'.$returnhash{$_.'_list'};         ### Apache->request->print("\n<hr />".$_.': '.$returnhash{$_}.'<br />'.$returnhash{$_.'_list'});
     }      }
       #
       # Deal with 'count' separately
       $returnhash{'count'} = &access_count($url,$aauthor,$adomain);
       # since "usage" is reserved word in MySQL ...
       $returnhash{'sequsage'}=$returnhash{'usage'};
       $returnhash{'sequsage_list'}=$returnhash{'usage_list'};
   
     return %returnhash;      return %returnhash;
 }  }
   
   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  # ------------------------------------- Try to make an alt tag if there is none
   
 sub alttag {  sub alttag {
Line 120  sub alttag { Line 141  sub alttag {
     $alttag=~s/\s+$//gs;      $alttag=~s/\s+$//gs;
     $alttag=~s/^\s+//gs;      $alttag=~s/^\s+//gs;
     if ($alttag) { return $alttag; } else       if ($alttag) { return $alttag; } else 
                  { return 'No information available'; }                   { return &mt('No information available'); }
 }  }
   
 # -------------------------------------------------------------- Author display  # -------------------------------------------------------------- Author display
Line 129  sub authordisplay { Line 150  sub authordisplay {
     my ($aname,$adom)=@_;      my ($aname,$adom)=@_;
     return &Apache::loncommon::aboutmewrapper(      return &Apache::loncommon::aboutmewrapper(
                 &Apache::loncommon::plainname($aname,$adom),                  &Apache::loncommon::plainname($aname,$adom),
                     $aname,$adom).' <tt>['.$aname.'@'.$adom.']</tt>';                      $aname,$adom,'preview').' <tt>['.$aname.'@'.$adom.']</tt>';
 }  }
   
 # -------------------------------------------------------------- Pretty display  # -------------------------------------------------------------- Pretty display
Line 174  sub diffgraph { Line 195  sub diffgraph {
     return $output;      return $output;
 }  }
   
   # ==================================================== Turn MySQL row into hash
   
   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 {
       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'
          );
   }
   
   # =========================================== Pretty printing of metadata field
   
   sub prettyprint {
       my ($type,$value)=@_;
       unless (defined($value)) { return '&nbsp;'; }
   # Title
       if ($type eq 'title') {
    return '<font size="+1" face="arial">'.$value.'</font>';
       }
   # 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 '<img src="'.&Apache::loncommon::icon($value).'" />&nbsp;'.
      &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
       unless ($ENV{'user.adv'}) { return '<i>- '.&mt('not displayed').' -</i>' };
   # File
       if (($type eq 'customdistributionfile') ||
    ($type eq 'obsoletereplacement') ||
    ($type eq 'goto_list') ||
    ($type eq 'comefrom_list') ||
    ($type eq 'sequsage_list')) {
    return join('<br />',map {
          my $url=&Apache::lonnet::clutter($_);
          '<br /><b>'.&Apache::lonnet::gettitle($url).'</b>'.
          &Apache::lonhtmlcommon::crumbs($url,'preview','');
       } 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') {
    return &diffgraph($value);
       }
   # List of courses
       if ($type=~/\_list/) {
    return join('<br />',map {
       my %courseinfo=&Apache::lonnet::coursedescription($_);  
       '<a href="/public/'.
    $courseinfo{'domain'}.'/'.$courseinfo{'num'}.'/syllabus" target="preview">'.
    $courseinfo{'description'}.'</a>';
    } split(/\s*\,\s*/,$value));
       }
   # No pretty print found
       return $value;
   }
   # ============================================== Pretty input of metadata field
   
   sub direct {
       return shift;
   }
   
   sub selectbox {
       my ($name,$value,$functionref,@idlist)=@_;
       unless (defined($functionref)) { $functionref=\&direct; }
       my $selout='<select name="'.$name.'">';
       foreach (@idlist) {
           $selout.='<option value=\''.$_.'\'';
           if ($_ eq $value) {
       $selout.=' selected>'.&{$functionref}($_).'</option>';
    }
           else {$selout.='>'.&{$functionref}($_).'</option>';}
       }
       return $selout.'</select>';
   }
   
   sub relatedfield {
       my ($show,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue)=@_;
       unless ($relatedsearchflag) { return ''; }
       unless (defined($relatedsep)) { $relatedsep=' '; }
       unless ($show) { return $relatedsep.'&nbsp;'; }
       return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.
    ($relatedvalue?' checked="1"':'').' />';
   }
   
   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 '<input type="checkbox" name="'.$fieldname.'"'.
       ($value?' checked="1"':'').' />'.
          &relatedfield(0,$relatedsearchflag,$relatedsep); 
       }
   # Obsolete replacement file
       if ($type eq 'obsoletereplacement') {
    return '<input type="text" name="'.$fieldname.
       '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.
       "('".$formname."','".$fieldname."'".
       ",'')\">".&mt('Select').'</a>'.
          &relatedfield(0,$relatedsearchflag,$relatedsep); 
      }
   # Customdistribution file
       if ($type eq 'customdistributionfile') {
    return '<input type="text" name="'.$fieldname.
       '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.
       "('".$formname."','".$fieldname."'".
       ",'rights')\">".&mt('Select').'</a>'.
          &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 
       '<input type="text" name="'.$fieldname.'" size="80" value="'.$value.'" />'.
       &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue); 
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 185  sub handler { Line 434  sub handler {
   
     my $uri=$r->uri;      my $uri=$r->uri;
   
   unless ($uri=~/^\/\~/) {   # ====================================================== Looking for all bombs?
     if ($uri=~/\/adm\/bombs\/(.*)$/) {
   # ----------------------------------------------------------- Set document type
         $uri=&Apache::lonnet::declutter($1);
         &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>');
         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::lonhtmlcommon::crumbs(&Apache::lonnet::clutter($_)).
       &Apache::lonmsg::retrieve_author_res_msg($_).'<hr />');
         }
     }
         } else {
     $r->print(&mt('Not authorized'));
         }
         $r->print('</body></html>');
     } elsif ($uri!~/^\/\~/) { 
 # =========================================== This is not in construction space  # =========================================== This is not in construction space
     my ($resdomain,$resuser)=      my ($resdomain,$resuser)=
            (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);             (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);
Line 199  sub handler { Line 471  sub handler {
   
 # ----------------------------------------------------------- Set document type  # ----------------------------------------------------------- Set document type
   
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   return OK if $r->header_only;    return OK if $r->header_only;
Line 208  sub handler { Line 480  sub handler {
   foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {    foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
       $content{$_}=&Apache::lonnet::metadata($uri,$_);        $content{$_}=&Apache::lonnet::metadata($uri,$_);
   }    }
 # ------------------------------------------------------------------ Hide stuff  
   
   unless ($ENV{'user.adv'}) {  
       foreach ('keywords','notes','abstract','subject') {  
           $content{$_}='<i>- not displayed -</i>';  
       }  
   }  
   
 # --------------------------------------------------------------- Render Output  # --------------------------------------------------------------- Render Output
   my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);  # displayed url
 my $creationdate=localtime(      my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);
  &Apache::loncommon::unsqltime($content{'creationdate'}));      $uri=~s/\.meta$//;
 my $lastrevisiondate=localtime(      my $disuri=&Apache::lonnet::clutter($uri);
  &Apache::loncommon::unsqltime($content{'lastrevisiondate'}));  # version
 my $language=&Apache::loncommon::languagedescription($content{'language'});      my $currentversion=&Apache::lonnet::getversion($disuri);
 my $mime=&Apache::loncommon::filedescription($content{'mime'});       my $versiondisplay='';
 my $disuri=&Apache::lonnet::declutter($uri);      if ($thisversion) {
   $disuri=~s/\.meta$//;   $versiondisplay=&mt('Version').': '.$thisversion.
 my $currentversion=&Apache::lonnet::getversion($disuri);      ' ('.&mt('most recent version').': '.
 my $author=$content{'author'};      ($currentversion>0?$currentversion:&mt('information not available')).')';
 $author=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;      } else {
 my $owner=$content{'owner'};   $versiondisplay='Version: '.$currentversion;
 $owner=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;      }
 my $versiondisplay='';  # crumbify displayed URL
 if ($thisversion) {      $disuri=&Apache::lonhtmlcommon::crumbs($disuri);
     $versiondisplay='Version: '.$thisversion.  # obsolete
     ' (most recent version: '.$currentversion.')';      my $obsolete=$content{'obsolete'};
 } else {      my $obsoletewarning='';
     $versiondisplay='Version: '.$currentversion;      if (($obsolete) && ($ENV{'user.adv'})) {
 }   $obsoletewarning='<p><font color="red">'.
 my $customdistributionfile='';      &mt('This resource has been marked obsolete by the author(s)').'</font></p>';
 if ($content{'customdistributionfile'}) {      }
    $customdistributionfile='<a href="'.$content{'customdistributionfile'}.  
      '"><tt>'.$content{'customdistributionfile'}.'</tt></a>';      my %lt=&fieldnames();
 }      my $table='';
 my $bodytag=&Apache::loncommon::bodytag      my $bodytag=&Apache::loncommon::bodytag
             ('Catalog Information','','','',$resdomain);              ('Catalog Information','','','',$resdomain);
       foreach ('title', 
        'author', 
        'subject', 
        'keywords', 
        'notes', 
        'abstract',
        'lowestgradelevel',
        'highestgradelevel',
        'standards', 
        'mime', 
        'language', 
        'creationdate', 
        'lastrevisiondate', 
        'owner', 
        'copyright', 
        'customdistributionfile', 
        'obsolete', 
        'obsoletereplacement') {
    $table.='<tr><td bgcolor="#AAAAAA">'.$lt{$_}.
           '</td><td bgcolor="#CCCCCC">'.
                   &prettyprint($_,$content{$_}).'</td></tr>';
    delete $content{$_};
       }
   
   $r->print(<<ENDHEAD);    $r->print(<<ENDHEAD);
 <html><head><title>Catalog Information</title></head>  <html><head><title>Catalog Information</title></head>
 $bodytag  $bodytag
 <h2>$content{'title'}</h2>  <h2>$content{'title'}</h2>
 <h3><tt>$disuri</tt></h3>  <h3><tt>$disuri</tt></h3>
   $obsoletewarning
 $versiondisplay<br />  $versiondisplay<br />
 <table cellspacing=2 border=0>  <table cellspacing=2 border=0>
 <tr><td bgcolor='#AAAAAA'>Author(s)</td>  $table
 <td bgcolor="#CCCCCC">$author&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Subject</td>  
 <td bgcolor="#CCCCCC">$content{'subject'}&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Keyword(s)</td>  
 <td bgcolor="#CCCCCC">$content{'keywords'}&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Notes</td>  
 <td bgcolor="#CCCCCC">$content{'notes'}&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Abstract</td>  
 <td bgcolor="#CCCCCC">$content{'abstract'}&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>MIME Type</td>  
 <td bgcolor="#CCCCCC">$mime ($content{'mime'})&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Language</td>  
 <td bgcolor="#CCCCCC">$language&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Creation Date</td>  
 <td bgcolor="#CCCCCC">$creationdate&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>  
 Last Revision Date</td><td bgcolor="#CCCCCC">$lastrevisiondate&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Publisher/Owner</td>  
 <td bgcolor="#CCCCCC">$owner&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Copyright/Distribution</td>  
 <td bgcolor="#CCCCCC">$content{'copyright'}&nbsp;</td></tr>  
 <tr><td bgcolor='#AAAAAA'>Custom Distribution File</td>  
 <td bgcolor="#CCCCCC">$customdistributionfile&nbsp;</td></tr>  
 </table>  </table>
 ENDHEAD  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'});  
   if ($ENV{'user.adv'}) {    if ($ENV{'user.adv'}) {
 # ------------------------------------------------------------ Dynamic Metadata  # ------------------------------------------------------------ Dynamic Metadata
    $r->print(  
    '<h3>Dynamic Metadata (updated periodically)</h3>Processing ...<br>');  
    $r->rflush();  
     my %items=(  
  '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(  
 '</table><h4>Access and Usage Statistics</h4><table cellspacing=2 border=0>');  
    foreach ('count') {  
        $r->print(  
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.  
 $dynmeta{$_}."&nbsp;</td></tr>\n");  
    }  
    foreach my $cat ('usage','comefrom','goto') {  
        $r->print(  
 '<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.  
 $dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",  
       map { my $murl=$_;   
  '<li><a href="'.&Apache::lonnet::clutter($murl).'" target="preview">'.  
                         &Apache::lonnet::gettitle($murl).' [<tt>'.$murl  
                         .'</tt>]</a></li>' }  
       split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");  
    }  
    foreach my $cat ('course') {  
        $r->print(  
 '<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.  
 $dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",  
       map { my %courseinfo=&Apache::lonnet::coursedescription($_);    
  '<li><a href="/public/'.  
   $courseinfo{'domain'}.'/'.$courseinfo{'num'}.'/syllabus" target="preview">'.  
   $courseinfo{'description'}.'</a></li>' }  
       split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");  
    }  
        $r->print('</table>');  
    if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) {  
       $r->print(        $r->print(
 '<h4>Assessment Statistical Data</h4><table cellspacing=2 border=0>');   '<h3>'.&mt('Dynamic Metadata').' ('.
       foreach ('stdno','avetries') {   &mt('updated periodically').')</h3>'.&mt('Processing').
           $r->print(   ' ...<br />');
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.        $r->rflush();
 $dynmeta{$_}."&nbsp;</td></tr>\n");        my %items=&fieldnames();
         my %dynmeta=&dynamicmeta($uri);
   # General Access and Usage Statistics
         $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4><table cellspacing=2 border=0>');
         foreach ('count',
          'sequsage','sequsage_list',
          'comefrom','comefrom_list',
          'goto','goto_list',
          'course','course_list') {
     $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td><td bgcolor="#CCCCCC">'.
       &prettyprint($_,$dynmeta{$_})."</td></tr>\n");
       }        }
       foreach ('difficulty') {        $r->print('</table>');
          $r->print(        if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) {
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.  # This is an assessment, print assessment data
 &diffgraph($dynmeta{$_})."</td></tr>\n");    $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>');    
         }
         $r->print('<h4>'.&mt('Evaluation Data').'</h4><table cellspacing=2 border=0>');
         foreach ('clear','depth','helpful','correct','technical') {
     $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td><td bgcolor="#CCCCCC">'.
       &prettyprint($_,$dynmeta{$_})."</td></tr>\n");
        }    
         $r->print('</table>');
         $uri=~/^\/res\/(\w+)\/(\w+)\//; 
         if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2))
     || ($ENV{'user.role.ca./'.$1.'/'.$2})) {
     $r->print('<h4>'.&mt('Evaluation Comments').' ('.
       &mt('visible to author and co-authors only').')</h4>'.
       '<blockquote>'.$dynmeta{'comments'}.'</blockquote>');
     $r->print('<a name="bombs" /><h4>'.&mt('Error Messages').' ('.
       &mt('visible to author and co-authors only').')</h4>'.
       &Apache::lonmsg::retrieve_author_res_msg($uri));
       }        }
       $r->print('</table>');      
    }  
    $r->print('<h4>Evaluation Data</h4><table cellspacing=2 border=0>');  
    foreach ('clear','depth','helpful','correct','technical') {  
        $r->print(  
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.  
 &evalgraph($dynmeta{$_})."</td></tr>\n");  
    }      
    $r->print('</table>');  
    $disuri=~/^(\w+)\/(\w+)\//;     
    if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2))  
        || ($ENV{'user.role.ca./'.$1.'/'.$2})) {  
       $r->print(  
   '<h4>Evaluation Comments (visible to author and co-authors only)</h4>'.  
       '<blockquote>'.$dynmeta{'comments'}.'</blockquote>');  
       $r->print(  
    '<h4>Error Messages (visible to author and co-authors only)</h4>');  
       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('<b>'.$content{'time'}.'</b>: '.$content{'message'}.  
                     '<br />');  
         }  
       }        
    }  
 # ------------------------------------------------------------- All other stuff  # ------------------------------------------------------------- All other stuff
    $r->print(        $r->print(
  '<h3>Additional Metadata (non-standard, parameters, exports)</h3>');   '<h3>'.&mt('Additional Metadata (non-standard, parameters, exports)').'</h3>');
    foreach (sort keys %content) {        foreach (sort keys %content) {
       my $name=$_;    my $name=$_;
       unless ($name=~/\.display$/) {    unless ($name=~/\.display$/) {
   my $display=&Apache::lonnet::metadata($uri,$name.'.display');        my $display=&Apache::lonnet::metadata($uri,$name.'.display');
   unless ($display) { $display=$name; };        unless ($display) { $display=$name; };
   my $otherinfo='';        my $otherinfo='';
   foreach ('name','part','type','default') {        foreach ('name','part','type','default') {
       if (defined(&Apache::lonnet::metadata($uri,$name.'.'.$_))) {    if (defined(&Apache::lonnet::metadata($uri,$name.'.'.$_))) {
   $otherinfo.=' '.$_.'='.        $otherinfo.=' '.$_.'='.
       &Apache::lonnet::metadata($uri,$name.'.'.$_).'; ';    &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");  
       }        }
    }  
   }    }
 # ===================================================== End Resource Space Call  # ===================================================== End Resource Space Call
  } else {   } else {
Line 407  $dynmeta{$_}."&nbsp;</td></tr>\n"); Line 619  $dynmeta{$_}."&nbsp;</td></tr>\n");
   
 # ----------------------------------------------------------- Set document type  # ----------------------------------------------------------- Set document type
   
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   return OK if $r->header_only;    return OK if $r->header_only;
 # ---------------------------------------------------------------------- Header  # ---------------------------------------------------------------------- Header
   my $bodytag=&Apache::loncommon::bodytag('Edit Catalog Information');  
   my $disuri=$uri;    my $disuri=$uri;
   my $fn=&Apache::lonnet::filelocation('',$uri);    my $fn=&Apache::lonnet::filelocation('',$uri);
   $disuri=~s/^\/\~\w+//;    $disuri=~s/^\/\~/\/priv\//;
   $disuri=~s/\.meta$//;    $disuri=~s/\.meta$//;
   my $displayfile='Catalog Information for '.$disuri;    my $target=$uri;
   if ($disuri=~/\/default$/) {    $target=~s/^\/\~/\/res\/$ENV{'request.role.domain'}\//;
       my $dir=$disuri;    $target=~s/\.meta$//;
       $dir=~s/default$//;    my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
       $displayfile='Default Cataloging Information for Directory '.$dir;    if ($bombs) {
   }        if ($ENV{'form.delmsg'}) {
   %Apache::lonpublisher::metadatafields=();    if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
   %Apache::lonpublisher::metadatakeys=();        $bombs=&mt('Messages deleted.');
   &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile($fn));    } else {
   $r->print(<<ENDEDIT);        $bombs=&mt('Error deleting messages');
     }
         }
         my $bodytag=&Apache::loncommon::bodytag('Error Messages');
         my $del=&mt('Delete Messages');
         $r->print(<<ENDBOMBS);
   <html><head><title>Edit Catalog Information</title></head>
   $bodytag
   <h1>$disuri</h1>
   <form method="post" name="defaultmeta">
   <input type="submit" name="delmsg" value="$del" />
   <br />$bombs
   </form>
   </body>
   </html>
   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(<<ENDEDIT);
 <html><head><title>Edit Catalog Information</title></head>  <html><head><title>Edit Catalog Information</title></head>
 $bodytag  $bodytag
 <h1>$displayfile</h1>  <h1>$displayfile</h1>
 <form method="post">  <form method="post" name="defaultmeta">
 ENDEDIT  ENDEDIT
    foreach ('author','title','subject','keywords','abstract','notes',        $r->print('<script language="JavaScript">'.
             'copyright','customdistributionfile','language') {   &Apache::loncommon::browser_and_searcher_javascript.
        if ($ENV{'form.new_'.$_}) {   '</script>');
    $Apache::lonpublisher::metadatafields{$_}=$ENV{'form.new_'.$_};        my %lt=&fieldnames();
        }        foreach ('author','title','subject','keywords','abstract','notes',
        if (m/copyright/) {         'copyright','customdistributionfile','language','standards',
    $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_,         'lowestgradelevel','highestgradelevel',
        $Apache::lonpublisher::metadatafields{$_},         'obsolete','obsoletereplacement') {
        \&Apache::loncommon::copyrightdescription,    if (defined($ENV{'form.new_'.$_})) {
        (&Apache::loncommon::copyrightids)));        $Apache::lonpublisher::metadatafields{$_}=$ENV{'form.new_'.$_};
        } elsif (m/language/) {    }
    $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_,    unless ($Apache::lonpublisher::metadatafields{'copyright'}) {
       $Apache::lonpublisher::metadatafields{$_},        $Apache::lonpublisher::metadatafields{'copyright'}='default';
       \&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(  
             '<p><font color=red>Could not write metadata, FAIL</font>');  
       } 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.'"';  
                 }  
                 print $mfh '>'.  
         &HTML::Entities::encode($Apache::lonpublisher::metadatafields{$unikey})  
                         .'</'.$tag.'>';  
             }  
   }    }
           $r->print('<p>Wrote Metadata');    $r->print('<p>'.$lt{$_}.': '.&prettyinput($_,
       $Apache::lonpublisher::metadatafields{$_},
       'new_'.$_,'defaultmeta').'</p>');
       }        }
     }        if ($ENV{'form.store'}) {
     $r->print(    my $mfh;
  '<br /><input type="submit" name="store" value="Store Catalog Information"></form></body></html>');    unless ($mfh=Apache::File->new('>'.$fn)) {
     return OK;        $r->print(
    '<p><font color=red>'.&mt('Could not write metadata').', '.
    &mt('FAIL').'</font>');
     } 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.'"';
     }
         print $mfh '>'.
     &HTML::Entities::encode($Apache::lonpublisher::metadatafields{$unikey})
     .'</'.$tag.'>';
     }
         }
         $r->print('<p>'.&mt('Wrote Metadata'));
     }
         }
         $r->print(
    '<br /><input type="submit" name="store" value="'.
    &mt('Store Catalog Information').'"></form></body></html>');
      }
   }    }
     return OK;
 }  }
   
   # ================================================================= BEGIN Block
   BEGIN {
   # Get columns of MySQL metadata table
       @columns=&Apache::lonmysql::col_order('metadata');
   }
 1;  1;
 __END__  __END__
   

Removed from v.1.34  
changed lines
  Added in v.1.60


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.