Diff for /loncom/interface/lonmeta.pm between versions 1.45 and 1.66

version 1.45, 2003/12/29 15:10:54 version 1.66, 2004/04/13 16:03:46
Line 29 Line 29
 package Apache::lonmeta;  package Apache::lonmeta;
   
 use strict;  use strict;
   use LONCAPA::lonmetadata();
 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::lonlocal;
 use Apache::lonmysql;  use Apache::lonmysql;
   use Apache::lonmsg;
   
 # MySQL table columns  # MySQL table columns
   
 my @columns;  my @columns;
   
 # ----------------------------------------- Fetch and evaluate dynamic metadata  # Fetch and evaluate dynamic metadata
   
 sub dynamicmeta {  sub dynamicmeta {
     my $url=&Apache::lonnet::declutter(shift);      my $url=&Apache::lonnet::declutter(shift);
     $url=~s/\.meta$//;      $url=~s/\.meta$//;
Line 52  sub dynamicmeta { Line 54  sub dynamicmeta {
     $regexp='___'.$regexp.'___';      $regexp='___'.$regexp.'___';
     my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain,      my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain,
        $aauthor,$regexp);         $aauthor,$regexp);
     my %sum=();      my %DynamicData = &LONCAPA::lonmetadata::process_reseval_data(\%evaldata);
     my %cnt=();      my %Data = &LONCAPA::lonmetadata::process_dynamic_metadata($url,
     my %concat=();                                                                 \%DynamicData);
     my %listitems=(  
                    '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'  
                    );  
     while ($_=each(%evaldata)) {  
  my ($item,$purl,$cat)=split(/___/,$_);  
  ### Apache->request->print("\n".$_.' - '.$item.'<br />');  
  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}.='<hr>'.$evaldata{$_};  
        }  
      } else {  
        $sum{$cat}=''.$evaldata{$_};  
     }  
  }  
     }  
     my %returnhash=();  
     while ($_=each(%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{$_};  
        ### Apache->request->print("\n<hr />".$_.': '.$returnhash{$_}.'<br />'.$returnhash{$_.'_list'});  
     }  
     #      #
     # Deal with 'count' seperately      # Deal with 'count' separately
     $returnhash{'count'} = &access_count($url,$aauthor,$adomain);      $Data{'count'} = &access_count($url,$aauthor,$adomain);
       return %Data;
     return %returnhash;  
 }  }
   
 sub access_count {  sub access_count {
Line 116  sub access_count { Line 68  sub access_count {
     my %countdata=&Apache::lonnet::dump('nohist_accesscount',$adomain,      my %countdata=&Apache::lonnet::dump('nohist_accesscount',$adomain,
                                         $author,$src);                                          $author,$src);
     if (! exists($countdata{$src})) {      if (! exists($countdata{$src})) {
         return 'Not Available';          return &mt('Not Available');
     } else {      } else {
         return $countdata{$src};          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 {
     my ($base,$src)=@_;      my ($base,$src)=@_;
     my $fullpath=&Apache::lonnet::hreflocation($base,$src);      my $fullpath=&Apache::lonnet::hreflocation($base,$src);
     my $alttag=&Apache::lonnet::metadata($fullpath,'title').' '.      my $alttag=&Apache::lonnet::metadata($fullpath,'title').' '.
                &Apache::lonnet::metadata($fullpath,'subject').' '.          &Apache::lonnet::metadata($fullpath,'subject').' '.
                &Apache::lonnet::metadata($fullpath,'abstract');          &Apache::lonnet::metadata($fullpath,'abstract');
     $alttag=~s/\s+/ /gs;      $alttag=~s/\s+/ /gs;
     $alttag=~s/\"//gs;      $alttag=~s/\"//gs;
     $alttag=~s/\'//gs;      $alttag=~s/\'//gs;
     $alttag=~s/\s+$//gs;      $alttag=~s/\s+$//gs;
     $alttag=~s/^\s+//gs;      $alttag=~s/^\s+//gs;
     if ($alttag) { return $alttag; } else       if ($alttag) { 
                  { return 'No information available'; }          return $alttag; 
       } else { 
           return &mt('No information available'); 
       }
 }  }
   
 # -------------------------------------------------------------- Author display  # Author display
   
 sub authordisplay {  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
   
 sub evalgraph {  sub evalgraph {
     my $value=shift;      my $value=shift;
     unless ($value) { return ''; }      if (! $value) { 
           return '';
       }
     my $val=int($value*10.+0.5)-10;      my $val=int($value*10.+0.5)-10;
     my $output='<table border=0 cellpadding=0 cellspacing=0><tr>';      my $output='<table border=0 cellpadding=0 cellspacing=0><tr>';
     if ($val>=20) {      if ($val>=20) {
Line 166  sub evalgraph { Line 120  sub evalgraph {
  $output.='<td width='.($val-20).' bgcolor="#33FF33">&nbsp;</td>'.   $output.='<td width='.($val-20).' bgcolor="#33FF33">&nbsp;</td>'.
                  '<td width='.(40-$val).' bgcolor="#555555">&nbsp;</td>';                   '<td width='.(40-$val).' bgcolor="#555555">&nbsp;</td>';
     } else {      } else {
        $output.='<td width=20 bgcolor="#555555">&nbsp&nbsp;</td>';          $output.='<td width=20 bgcolor="#555555">&nbsp&nbsp;</td>';
     }      }
     $output.='<td> ('.$value.') </td></tr></table>';      $output.='<td> ('.$value.') </td></tr></table>';
     return $output;      return $output;
Line 174  sub evalgraph { Line 128  sub evalgraph {
   
 sub diffgraph {  sub diffgraph {
     my $value=shift;      my $value=shift;
     unless ($value) { return ''; }      if (! $value) { 
           return '';
       }
     my $val=int(40.0*$value+0.5);      my $val=int(40.0*$value+0.5);
     my @colors=('#FF9933','#EEAA33','#DDBB33','#CCCC33',      my @colors=('#FF9933','#EEAA33','#DDBB33','#CCCC33',
                 '#BBDD33','#CCCC33','#DDBB33','#EEAA33');                  '#BBDD33','#CCCC33','#DDBB33','#EEAA33');
Line 190  sub diffgraph { Line 146  sub diffgraph {
     return $output;      return $output;
 }  }
   
 # ==================================================== Turn MySQL row into hash  #
   # 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 {  sub metadata_col_to_hash {
     my @cols=@_;      my @cols=@_;
     my %hash=();      my %hash=();
Line 201  sub metadata_col_to_hash { Line 159  sub metadata_col_to_hash {
     return %hash;      return %hash;
 }  }
   
 # ============================================================= The field names  # The field names
   
 sub fieldnames {  sub fieldnames {
     return &Apache::lonlocal::texthash(      return &Apache::lonlocal::texthash
    'title' => 'Title',          (
    'author' =>'Author(s)',           'title' => 'Title',
    'subject' => 'Subject',           'author' =>'Author(s)',
    'keywords' => 'Keyword(s)',           'authorspace' => 'Author Space',
    'notes' => 'Notes',           'modifyinguser' => 'Last Modifying User',
    'abstract' => 'Abstract',           'subject' => 'Subject',
                                    'lowestgradelevel' => 'Lowest Grade Level',           'keywords' => 'Keyword(s)',
                                    'highestgradelevel' => 'Highest Grade Level',           'notes' => 'Notes',
                                    'standards' => 'Standards',           'abstract' => 'Abstract',
    'mime' => 'MIME Type',           'lowestgradelevel' => 'Lowest Grade Level',
    'language' => 'Language',           'highestgradelevel' => 'Highest Grade Level',
    'creationdate' => 'Creation Date',           'standards' => 'Standards',
    'lastrevisiondate' => 'Last Revision Date',           'mime' => 'MIME Type',
    'owner' => 'Publisher/Owner',           'language' => 'Language',
                                    'copyright' => 'Copyright/Distribution',           'creationdate' => 'Creation Date',
    'customdistributionfile' => 'Custom Distribution File',           'lastrevisiondate' => 'Last Revision Date',
                                    'obsolete' => 'Obsolete',           'owner' => 'Publisher/Owner',
    'obsoletereplacement' => 'Suggested Replacement for Obsolete File',           'copyright' => 'Copyright/Distribution',
    'count'      => 'Network-wide number of accesses (hits)',           'customdistributionfile' => 'Custom Distribution File',
    'course'     => 'Network-wide number of courses using resource',           'obsolete' => 'Obsolete',
    'usage'      => 'Number of resources using or importing resource',           'obsoletereplacement' => 'Suggested Replacement for Obsolete File',
    'goto'       => 'Number of resources that follow this resource in maps',           'count'      => 'Network-wide number of accesses (hits)',
    'comefrom'   => 'Number of resources that lead up to this resource in maps',           'course'     => 'Network-wide number of courses using resource',
    'clear'      => 'Material presented in clear way',           'course_list' => 'Network-wide courses using resource',
    'depth'      => 'Material covered with sufficient depth',           'sequsage'      => 'Number of resources using or importing resource',
    'helpful'    => 'Material is helpful',           'sequsage_list' => 'Resources using or importing resource',
    'correct'    => 'Material appears to be correct',           'goto'       => 'Number of resources that follow this resource in maps',
    'technical'  => 'Resource is technically correct',            'goto_list'  => 'Resources that follow this resource in maps',
    'avetries'   => 'Average number of tries till solved',           'comefrom'   => 'Number of resources that lead up to this resource in maps',
    'stdno'      => 'Total number of students who have worked on this problem',           'comefrom_list' => 'Resources that lead up to this resource in maps',
    'difficulty' => 'Degree of difficulty'           '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'
            );
 }  }
 # ================================================================ Main Handler  
   
 sub handler {  
   my $r=shift;  
   
     my $loaderror=&Apache::lonnet::overloaderror($r);  
     if ($loaderror) { return $loaderror; }  
   
   # Pretty printing of metadata field
   
     my $uri=$r->uri;  sub prettyprint {
       my ($type,$value)=@_;
   unless ($uri=~/^\/\~/) {       if (! defined($value)) { 
 # =========================================== This is not in construction space          return '&nbsp;'; 
     my ($resdomain,$resuser)=      }
            (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);      # Title
       if ($type eq 'title') {
     $loaderror=   return '<font size="+1" face="arial">'.$value.'</font>';
        &Apache::lonnet::overloaderror($r,      }
          &Apache::lonnet::homeserver($resuser,$resdomain));      # Dates
     if ($loaderror) { return $loaderror; }      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
       if (! $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($_);
               '<b>'.&Apache::lonnet::gettitle($url).'</b>'.
                   &Apache::lonhtmlcommon::crumbs($url,'preview','',undef,'+0');
           } 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;
   }
   
   my %content=();  # Pretty input of metadata field
   sub direct {
       return shift;
   }
   
 # ----------------------------------------------------------- Set document type  sub selectbox {
       my ($name,$value,$functionref,@idlist)=@_;
       if (! 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>';
   }
   
   &Apache::loncommon::content_type($r,'text/html');  sub relatedfield {
   $r->send_http_header;      my ($show,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue)=@_;
       if (! $relatedsearchflag) { 
           return '';
       }
       if (! defined($relatedsep)) {
           $relatedsep=' ';
       }
       if (! $show) {
           return $relatedsep.'&nbsp;';
       }
       return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.
    ($relatedvalue?' checked="1"':'').' />';
   }
   
   return OK if $r->header_only;  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); 
   }
   
 # ------------------------------------------------------------------- Read file  # Main Handler
   foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {  sub handler {
       $content{$_}=&Apache::lonnet::metadata($uri,$_);      my $r=shift;
   }      #
 # ------------------------------------------------------------------ Hide stuff      my $loaderror=&Apache::lonnet::overloaderror($r);
       if ($loaderror) { return $loaderror; }
       #
       my $uri=$r->uri;
       #
       if ($uri=~m:/adm/bombs/(.*)$:) {
           # Looking for all bombs?
           &report_bombs($r,$uri);
       } elsif ($uri=~/^\/\~/) { 
           # Construction space
           &present_editable_metadata($r,$uri);
       } else {
           &present_uneditable_metadata($r,$uri);
       }
       return OK;
   }
   
   unless ($ENV{'user.adv'}) {  sub report_bombs {
       foreach ('keywords','notes','abstract','subject') {      my ($r,$uri) = @_;
           $content{$_}='<i>- '.&mt('not displayed').' -</i>';      # Set document type
       }      $uri=~ s:/adm/bombs/::;
   }      $uri=&Apache::lonnet::declutter($uri);
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       #
       return OK if $r->header_only;
       $r->print(&Apache::loncommon::bodytag('Error Messages'));
       $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>');
       return;
   }
   
 # --------------------------------------------------------------- Render Output  sub present_uneditable_metadata {
       my ($r,$uri) = @_;
       my ($resdomain,$resuser)=
           (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);
       my $loaderror=&Apache::lonnet::overloaderror
           ($r,
            &Apache::lonnet::homeserver($resuser,$resdomain));
       if ($loaderror) { 
           return $loaderror;
       }
       #
       my %content=();
       # Set document type
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       return OK if $r->header_only;
       # Read file
       foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
           $content{$_}=&Apache::lonnet::metadata($uri,$_);
       }
       # Render Output
       # displayed url
     my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);      my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);
     $content{'creationdate'}=&Apache::lonlocal::locallocaltime(      $uri=~s/\.meta$//;
  &Apache::lonmysql::unsqltime($content{'creationdate'}));      my $disuri=&Apache::lonnet::clutter($uri);
     $content{'lastrevisiondate'}=&Apache::lonlocal::locallocaltime(      # version
  &Apache::lonmysql::unsqltime($content{'lastrevisiondate'}));  
     $content{'language'}=&Apache::loncommon::languagedescription($content{'language'});  
     $content{'mime'}=&Apache::loncommon::filedescription($content{'mime'});   
     my $disuri=&Apache::lonnet::declutter($uri);  
     $disuri=~s/\.meta$//;  
     my $currentversion=&Apache::lonnet::getversion($disuri);      my $currentversion=&Apache::lonnet::getversion($disuri);
     my $author=$content{'author'};  
     $content{'author'}=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;  
     $content{'owner'}=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;  
     my $versiondisplay='';      my $versiondisplay='';
     if ($thisversion) {      if ($thisversion) {
  $versiondisplay=&mt('Version').': '.$thisversion.          $versiondisplay=&mt('Version').': '.$thisversion.
     ' ('.&mt('most recent version').': '.$currentversion.')';              ' ('.&mt('most recent version').': '.
     } else {              ($currentversion>0 ? 
  $versiondisplay='Version: '.$currentversion;               $currentversion   :
     }               &mt('information not available')).')';
     if ($content{'customdistributionfile'}) {  
  $content{'customdistributionfile'}='<a href="'.$content{'customdistributionfile'}.  
     '"><tt>'.$content{'customdistributionfile'}.'</tt></a>';  
     } else {      } else {
  $content{'customdistributionfile'}='';          $versiondisplay='Version: '.$currentversion;
     }      }
       # crumbify displayed URL
       $disuri=&Apache::lonhtmlcommon::crumbs($disuri);
       # obsolete
     my $obsolete=$content{'obsolete'};      my $obsolete=$content{'obsolete'};
     my $obsoletewarning='';      my $obsoletewarning='';
     if (($obsolete) && ($ENV{'user.adv'})) {      if (($obsolete) && ($ENV{'user.adv'})) {
  $obsoletewarning='<p><font color="red">'.          $obsoletewarning='<p><font color="red">'.
     &mt('This resource has been marked obsolete by the author(s)').'</font></p>';              &mt('This resource has been marked obsolete by the author(s)').
               '</font></p>';
     }      }
       #
     my %lt=&fieldnames();      my %lt=&fieldnames();
     my $table='';      my $table='';
     my $bodytag=&Apache::loncommon::bodytag      my $bodytag=&Apache::loncommon::bodytag
             ('Catalog Information','','','',$resdomain);          ('Catalog Information','','','',$resdomain);
     foreach ('title',       foreach ('title', 
      'author',                'author', 
      'subject',                'subject', 
      'keywords',                'keywords', 
      'notes',                'notes', 
      'abstract',                'abstract',
      'mime',                'lowestgradelevel',
      'language',                'highestgradelevel',
      'creationdate',                'standards', 
      'lastrevisiondate',                'mime', 
      'owner',                'language', 
      'copyright',                'creationdate', 
      'customdistributionfile',                'lastrevisiondate', 
      'obsolete',                'owner', 
      'obsoletereplacement') {               'copyright', 
  $table.='<tr><td bgcolor="#AAAAAA">'.$lt{$_}.               'customdistributionfile', 
         '</td><td bgcolor="#CCCCCC">'.               'obsolete', 
                 $content{$_}.'&nbsp;</td></tr>';               'obsoletereplacement') {
  delete $content{$_};          $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>
Line 350  $versiondisplay<br /> Line 528  $versiondisplay<br />
 $table  $table
 </table>  </table>
 ENDHEAD  ENDHEAD
   if ($ENV{'user.adv'}) {      if ($ENV{'user.adv'}) {
 # ------------------------------------------------------------ Dynamic Metadata          # Dynamic Metadata
    $r->print(          $r->print(
    '<h3>'.&mt('Dynamic Metadata').' ('.                    '<h3>'.&mt('Dynamic Metadata').' ('.
      &mt('updated periodically').')</h3>'.&mt('Processing').                    &mt('updated periodically').')</h3>'.&mt('Processing').
      ' ...<br>');                    ' ...<br />');
    $r->rflush();          $r->rflush();
    my %items=&fieldnames();          my %items=&fieldnames();
    my %dynmeta=&dynamicmeta($uri);          my %dynmeta=&dynamicmeta($uri);
    $r->print(          # General Access and Usage Statistics
 '</table><h4>'.&mt('Access and Usage Statistics').'</h4><table cellspacing=2 border=0>');          $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'.
    foreach ('count') {                    '<table cellspacing=2 border=0>');
        $r->print(          foreach ('count',
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.                   'sequsage','sequsage_list',
 $dynmeta{$_}."&nbsp;</td></tr>\n");                   'comefrom','comefrom_list',
    }                   'goto','goto_list',
    foreach my $cat ('usage','comefrom','goto') {                   'course','course_list') {
        $r->print(              $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.
 '<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.                        '<td bgcolor="#CCCCCC">'.
 $dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",                        &prettyprint($_,$dynmeta{$_})."</td></tr>\n");
       map { my $murl=$_;           }
  '<li><a href="'.&Apache::lonnet::clutter($murl).'" target="preview">'.          $r->print('</table>');
                         &Apache::lonnet::gettitle($murl).' [<tt>'.$murl          if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) {
                         .'</tt>]</a></li>' }              # This is an assessment, print assessment data
       split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");              $r->print(
    }                        '<h4>'.&mt('Assessment Statistical Data').'</h4>'.
    foreach my $cat ('course') {                        '<table cellspacing=2 border=0>');
        $r->print(              foreach ('stdno','avetries','difficulty') {
 '<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.                  $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.
 $dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",                            '<td bgcolor="#CCCCCC">'.
       map { my %courseinfo=&Apache::lonnet::coursedescription($_);                              &prettyprint($_,$dynmeta{$_})."</td></tr>\n");
  '<li><a href="/public/'.              }
   $courseinfo{'domain'}.'/'.$courseinfo{'num'}.'/syllabus" target="preview">'.              $r->print('</table>');    
   $courseinfo{'description'}.'</a></li>' }          }
       split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");          $r->print('<h4>'.&mt('Evaluation Data').'</h4>'.
    }                    '<table cellspacing=2 border=0>');
        $r->print('</table>');          foreach ('clear','depth','helpful','correct','technical') {
    if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) {              $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.
       $r->print(                        '<td bgcolor="#CCCCCC">'.
 '<h4>'.&mt('Assessment Statistical Data').'</h4><table cellspacing=2 border=0>');                        &prettyprint($_,$dynmeta{$_})."</td></tr>\n");
       foreach ('stdno','avetries') {          }
           $r->print(          $r->print('</table>');
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.          $uri=~/^\/res\/(\w+)\/(\w+)\//; 
 $dynmeta{$_}."&nbsp;</td></tr>\n");          if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2))
       }              || ($ENV{'user.role.ca./'.$1.'/'.$2})) {
       foreach ('difficulty') {              $r->print('<h4>'.&mt('Evaluation Comments').' ('.
          $r->print(                        &mt('visible to author and co-authors only').
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.                        ')</h4>'.
 &diffgraph($dynmeta{$_})."</td></tr>\n");                        '<blockquote>'.$dynmeta{'comments'}.'</blockquote>');
       }              $r->print('<a name="bombs" /><h4>'.&mt('Error Messages').' ('.
       $r->print('</table>');                            &mt('visible to author and co-authors only').')'.
    }                        '</h4>'.
    $r->print('<h4>'.&mt('Evaluation Data').'</h4><table cellspacing=2 border=0>');                        &Apache::lonmsg::retrieve_author_res_msg($uri));
    foreach ('clear','depth','helpful','correct','technical') {          }
        $r->print(          # All other stuff
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.          $r->print('<h3>'.
 &evalgraph($dynmeta{$_})."</td></tr>\n");                    &mt('Additional Metadata (non-standard, parameters, exports)').
    }                        '</h3>');
    $r->print('</table>');          foreach (sort keys %content) {
    $disuri=~/^(\w+)\/(\w+)\//;                 my $name=$_;
    if ((($ENV{'user.domain'} eq $1) && ($ENV{'user.name'} eq $2))              if ($name!~/\.display$/) {
        || ($ENV{'user.role.ca./'.$1.'/'.$2})) {                  my $display=&Apache::lonnet::metadata($uri,
       $r->print(                                                        $name.'.display');
   '<h4>'.&mt('Evaluation Comments').' ('.&mt('visible to author and co-authors only').')</h4>'.                  if (! $display) { 
       '<blockquote>'.$dynmeta{'comments'}.'</blockquote>');                      $display=$name;
       $r->print(                  };
    '<h4>'.&mt('Error Messages').' ('.                  my $otherinfo='';
           &mt('visible to author and co-authors only').')</h4>');                  foreach ('name','part','type','default') {
       my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$1,$2);                      if (defined(&Apache::lonnet::metadata($uri,
       foreach (keys %errormsgs) {                                                            $name.'.'.$_))) {
  if ($_=~/^\Q$disuri\E\_\d+$/) {                          $otherinfo.=' '.$_.'='.
           my %content=&Apache::lonmsg::unpackagemsg($errormsgs{$_});                              &Apache::lonnet::metadata($uri,
   $r->print('<b>'.$content{'time'}.'</b>: '.$content{'message'}.                                                        $name.'.'.$_).'; ';
                     '<br />');                      }
                   }
                   $r->print('<b>'.$display.':</b> '.$content{$name});
                   if ($otherinfo) {
                       $r->print(' ('.$otherinfo.')');
                   }
                   $r->print("<br />\n");
               }
           }
       }
   }
   
   sub present_editable_metadata {
       my ($r,$uri) = @_;
       # Construction Space Call
       # Set document type
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       #
       return OK if $r->header_only;
       # Header
       my $disuri=$uri;
       my $fn=&Apache::lonnet::filelocation('',$uri);
       $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 $bodytag=&Apache::loncommon::bodytag('Error Messages');
    }          my $del=&mt('Delete Messages');
 # ------------------------------------------------------------- All other stuff          $r->print(<<ENDBOMBS);
    $r->print(  <html><head><title>Edit Catalog Information</title></head>
  '<h3>'.&mt('Additional Metadata (non-standard, parameters, exports)').'</h3>');  $bodytag
    foreach (sort keys %content) {  <h1>$disuri</h1>
       my $name=$_;  <form method="post" name="defaultmeta">
       unless ($name=~/\.display$/) {  <input type="submit" name="delmsg" value="$del" />
   my $display=&Apache::lonnet::metadata($uri,$name.'.display');  <br />$bombs
   unless ($display) { $display=$name; };  </form>
   my $otherinfo='';  </body>
   foreach ('name','part','type','default') {  </html>
       if (defined(&Apache::lonnet::metadata($uri,$name.'.'.$_))) {  ENDBOMBS
   $otherinfo.=' '.$_.'='.      } else {
       &Apache::lonnet::metadata($uri,$name.'.'.$_).'; ';          my $displayfile='Catalog Information for '.$disuri;
       }          if ($disuri=~/\/default$/) {
   }              my $dir=$disuri;
   $r->print('<b>'.$display.':</b> '.$content{$name});              $dir=~s/default$//;
   if ($otherinfo) {              $displayfile=
       $r->print(' ('.$otherinfo.')');                  &mt('Default Cataloging Information for Directory').' '.
   }                  $dir;
   $r->print("<br>\n");          }
       }          my $bodytag=
    }              &Apache::loncommon::bodytag('Edit Catalog Information');
   }          %Apache::lonpublisher::metadatafields=();
 # ===================================================== End Resource Space Call          %Apache::lonpublisher::metadatakeys=();
  } else {          &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile($fn));
 # ===================================================== Construction Space Call          $r->print(<<ENDEDIT);
   
 # ----------------------------------------------------------- Set document type  
   
   &Apache::loncommon::content_type($r,'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(<<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
    my %lt=&fieldnames();          $r->print('<script language="JavaScript">'.
    foreach ('author','title','subject','keywords','abstract','notes',                    &Apache::loncommon::browser_and_searcher_javascript.
             'copyright','customdistributionfile','language',                    '</script>');
             'obsolete','obsoletereplacement') {          my %lt=&fieldnames();
        if ($ENV{'form.new_'.$_}) {          foreach ('author','title','subject','keywords','abstract','notes',
    $Apache::lonpublisher::metadatafields{$_}=$ENV{'form.new_'.$_};                   'copyright','customdistributionfile','language',
        }                   'standards',
        if (m/copyright/) {                   'lowestgradelevel','highestgradelevel',
    $r->print(&Apache::lonpublisher::selectbox($lt{$_},'new_'.$_,                   'obsolete','obsoletereplacement') {
        ($Apache::lonpublisher::metadatafields{$_}?              if (defined($ENV{'form.new_'.$_})) {
  $Apache::lonpublisher::metadatafields{$_}:'default'),                  $Apache::lonpublisher::metadatafields{$_}=
        \&Apache::loncommon::copyrightdescription,                      $ENV{'form.new_'.$_};
        (&Apache::loncommon::copyrightids)));              }
        } elsif (m/language/) {              if (! $Apache::lonpublisher::metadatafields{'copyright'}) {
    $r->print(&Apache::lonpublisher::selectbox($lt{$_},'new_'.$_,                  $Apache::lonpublisher::metadatafields{'copyright'}=
       $Apache::lonpublisher::metadatafields{$_},                      'default';
       \&Apache::loncommon::languagedescription,              }
       (&Apache::loncommon::languageids)));              $r->print('<p>'.$lt{$_}.': '.
        } else {                        &prettyinput
    $r->print(&Apache::lonpublisher::textfield($lt{$_},'new_'.$_,                        ($_,$Apache::lonpublisher::metadatafields{$_},
      $Apache::lonpublisher::metadatafields{$_}));                         'new_'.$_,'defaultmeta').'</p>');
        }          }
    }          if ($ENV{'form.store'}) {
    if ($ENV{'form.store'}) {              my $mfh;
       my $mfh;              if (!  ($mfh=Apache::File->new('>'.$fn))) {
       unless ($mfh=Apache::File->new('>'.$fn)) {                  $r->print('<p><font color=red>'.
             $r->print(                            &mt('Could not write metadata').', '.
             '<p><font color=red>'.&mt('Could not write metadata').', '.                            &mt('FAIL').'</font>');
       &mt('FAIL').'</font>');              } else {
       } else {                  foreach (sort keys %Apache::lonpublisher::metadatafields) {
           foreach (sort keys %Apache::lonpublisher::metadatafields) {                      if ($_!~/\./) {
             unless ($_=~/\./) {                          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                                    $Apache::lonpublisher::metadatakeys{$unikey})
                   (split(/\,/,$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 '>'.                  $r->print('<p>'.&mt('Wrote Metadata'));
         &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>');
     $r->print(      }
  '<br /><input type="submit" name="store" value="'.      return;
 &mt('Store Catalog Information').'"></form></body></html>');  
     return OK;  
   }  
 }  }
   
 # ================================================================= BEGIN Block  # BEGIN Block
 BEGIN {  BEGIN {
 # Get columns of MySQL metadata table      # Get columns of MySQL metadata table
     @columns=&Apache::lonmysql::col_order('metadata');      @columns=&Apache::lonmysql::col_order('metadata');
 }  }
   
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.45  
changed lines
  Added in v.1.66


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>