Diff for /loncom/interface/lonmeta.pm between versions 1.199 and 1.216

version 1.199, 2007/01/16 07:26:45 version 1.216, 2008/11/20 15:19:39
Line 42  use Apache::lonmsg; Line 42  use Apache::lonmsg;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
 ############################################################  
 ############################################################  
 ##  
 ## &get_dynamic_metadata_from_sql($url)  
 ##   
 ## Queries sql database for dynamic metdata  
 ## Returns a hash of hashes, with keys of urls which match $url  
 ## Returned fields are given below.  
 ##  
 ## Examples:  
 ##   
 ## %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql  
 ##     ('/res/msu/korte/');  
 ##  
 ## $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}  
 ##  
 ############################################################  
 ############################################################  
 sub get_dynamic_metadata_from_sql {  sub get_dynamic_metadata_from_sql {
     my ($url) = shift();      my ($url) = shift();
     my ($authordom,$author)=($url=~m{^/res/($match_domain)/($match_username)/});      my ($authordom,$author)=($url=~m{^/res/($match_domain)/($match_username)/});
Line 265  sub fieldnames { Line 247  sub fieldnames {
          'correct'    => 'Material appears to be correct',           'correct'    => 'Material appears to be correct',
          'technical'  => 'Resource is technically correct',            'technical'  => 'Resource is technically correct', 
          'avetries'   => 'Average number of tries till solved',           'avetries'   => 'Average number of tries till solved',
          'stdno'      => 'Total number of students who have worked on this problem',           'stdno'      => 'Statistics calculated for number of students',
          'difficulty' => 'Degree of difficulty',           'difficulty' => 'Degree of difficulty',
          'disc'       => 'Degree of discrimination',           'disc'       => 'Degree of discrimination',
      'dependencies' => 'Resources used by this resource',       'dependencies' => 'Resources used by this resource',
Line 383  sub select_course { Line 365  sub select_course {
  $Apache::lonpublisher::metadatafields{'courserestricted'};   $Apache::lonpublisher::metadatafields{'courserestricted'};
     my $selected = ($current_restriction eq 'none' ? 'selected="selected"'       my $selected = ($current_restriction eq 'none' ? 'selected="selected"' 
                                    : '');                                     : '');
       if ($current_restriction =~ /^course\.($match_domain\_$match_courseid)$/) {
           my $assoc_crs = $1;
           my $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
           if (ref($added_metadata_fields) eq 'HASH') {
               if (keys(%{$added_metadata_fields}) > 0) {
                   my $transfernotes;
                   foreach my $field_name (keys(%{$added_metadata_fields})) {
                       my $value = $Apache::lonpublisher::metadatafields{$field_name};
                       if ($value) {
                           $transfernotes .= 
                               &Apache::loncommon::start_data_table_row(). 
                               '<td><input type="checkbox" name="transfer_'.
                               $field_name.'" value="1" /></td><td>'.
                               $field_name.'</td><td>'.$value.'</td>'.
                               &Apache::loncommon::end_data_table_row();
                       }
                   }
                   if ($transfernotes ne '') {
                       my %courseinfo = &Apache::lonnet::coursedescription($assoc_crs,{'one_time' => 1});
                       my $assoc_crs_description = $courseinfo{'description'};
                       $output .= &mt('This resource is currently associated with a course ([_1]) which includes added metadata fields specific to the course.',$assoc_crs_description).'<br />'."\n".
                       &mt('You can choose to transfer data from the added fields to the "Notes" field if you are planning to change the course association.').'<br /><br />'.
                       &Apache::loncommon::start_data_table().
                       &Apache::loncommon::start_data_table_header_row().
                       '<th>Copy to notes?</th>'."\n".
                       '<th>Field name</th>'."\n".
                       '<th>Values</th>'."\n".
                       &Apache::loncommon::end_data_table_header_row().
                       $transfernotes.
                       &Apache::loncommon::end_data_table().'<br />';
                   }
               }
           }
       }
     $output .= '<select name="new_courserestricted" >';      $output .= '<select name="new_courserestricted" >';
     $output .= '<option value="none" '.$selected.'>'.      $output .= '<option value="none" '.$selected.'>'.
  &mt('None').'</option>'.$/;   &mt('None').'</option>'.$/;
Line 598  sub prettyinput { Line 613  sub prettyinput {
                 if ($meta_options{$item}) {                  if ($meta_options{$item}) {
                     push(@cur_values_inst,$item);                      push(@cur_values_inst,$item);
                 } else {                  } else {
                     if ($item ne 'Not Specified') {                      if ($item ne '') {
                         $cur_values_stu .= $item.',';                          $cur_values_stu .= $item.',';
                     }                      }
                 }                  }
             }              }
                $cur_values_stu =~ s/,$//;
             my @key_order = sort(keys(%meta_options));              my @key_order = sort(keys(%meta_options));
             unshift (@key_order,'Not Specified');              unshift(@key_order,'');
             $meta_options{'Not Specified'} = 'Not Specified';              $meta_options{''} = 'Not specified';
             $meta_options{'select_form_order'} = \@key_order;              $meta_options{'select_form_order'} = \@key_order;
         } else {          } else {
             $cur_values_stu = $value;              $cur_values_stu = $value;
Line 770  sub handler { Line 786  sub handler {
         &present_editable_metadata($r,$uri,'groups');              &present_editable_metadata($r,$uri,'groups');    
     } elsif ($uri=~m|^/~|) {       } elsif ($uri=~m|^/~|) { 
         # Construction space          # Construction space
         $r->print(&Apache::loncommon::start_page('Edit Catalog nformation',          $r->print(&Apache::loncommon::start_page('Edit Catalog Information',
  undef,   "\n".'<script type="text/javascript">'."\n".
                                                   &Apache::loncommon::browser_and_searcher_javascript().
                                                   "\n".'</script>',
  {'domain' => $resdomain,}));   {'domain' => $resdomain,}));
         &present_editable_metadata($r,$uri);          &present_editable_metadata($r,$uri);
     } else {      } else {
         $r->print(&Apache::loncommon::start_page('Catalog Information',          $r->print(&Apache::loncommon::start_page('Metadata',
  undef,   undef,
  {'domain' => $resdomain,}));   {'domain' => $resdomain,}));
         &present_uneditable_metadata($r,$uri);          &present_uneditable_metadata($r,$uri);
Line 803  sub report_bombs { Line 821  sub report_bombs {
     &Apache::lonmsg::clear_author_res_msg($uri);      &Apache::lonmsg::clear_author_res_msg($uri);
  }   }
         my $clear=&mt('Clear all Messages in Subdirectory');          my $clear=&mt('Clear all Messages in Subdirectory');
  $r->print(<<ENDCLEAR);          my $cancel=&mt('Back to Directory');
           my $cancelurl=$uri;
           $cancelurl=~s/^\Q$domain\E/\/priv/;
           $r->print(<<ENDCLEAR);
 <form method="post">  <form method="post">
 <input type="submit" name="clearbombs" value="$clear" />  <input type="submit" name="clearbombs" value="$clear" />
 </form>  <a href="$cancelurl">$cancel</a>
   </form><hr />
 ENDCLEAR  ENDCLEAR
         my %brokenurls =           my %brokenurls = 
             &Apache::lonmsg::all_url_author_res_msg($author,$domain);              &Apache::lonmsg::all_url_author_res_msg($author,$domain);
Line 990  sub print_dynamic_metadata { Line 1012  sub print_dynamic_metadata {
             #              #
             # New assessment statistics              # New assessment statistics
             $r->print('<h4>'.              $r->print('<h4>'.
                       &mt('Detailed Assessment Statistical Data').                        &mt('Recent Detailed Assessment Statistical Data').
                       '</h4>');                        '</h4>');
             my $table = '<table cellspacing="2" border="0">'.              my $table = '<table cellspacing="2" border="0">'.
                 '<tr>'.                  '<tr>'.
                 '<th>Course</th>'.                  '<th>'.&mt('Course').'</th>'.
                 '<th>Section(s)</th>'.                  '<th>'.&mt('Section(s)').'</th>'.
                 '<th>Num Students</th>'.                  '<th>'.&mt('Num Student').'s</th>'.
                 '<th>Mean Tries</th>'.                  '<th>'.&mt('Mean Tries').'</th>'.
                 '<th>Degree of Difficulty</th>'.                  '<th>'.&mt('Degree of Difficulty').'</th>'.
                 '<th>Degree of Discrimination</th>'.                  '<th>'.&mt('Degree of Discrimination').'</th>'.
                 '<th>Time of computation</th>'.                  '<th>'.&mt('Time of computation').'</th>'.
                 '</tr>'.$/;                  '</tr>'.$/;
             foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) {              foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) {
                 my $data = $dynmeta{'stats'}->{$identifier};                  my $data = $dynmeta{'stats'}->{$identifier};
Line 1038  sub print_dynamic_metadata { Line 1060  sub print_dynamic_metadata {
             $table .= '</table>'.$/;              $table .= '</table>'.$/;
             $r->print($table);              $r->print($table);
         } else {          } else {
             $r->print('No new dynamic data found.');              $r->print(&mt('No new dynamic data found.'));
         }          }
     } else {      } else {
         $r->print('<h4>'.          $r->print('<h4>'.
Line 1176  ENDBOMBS Line 1198  ENDBOMBS
 <input type="submit" name="clearmsg" value="$clear" />  <input type="submit" name="clearmsg" value="$clear" />
 ENDDEL  ENDDEL
         } else {          } else {
             $r->print('<a href="'.$disuri.'" />'.$goback.'</a>');              $r->print('<p><a href="'.$disuri.'">'.$goback.'</a></p>');
       if ($env{'form.clearmsg'}) {
    my ($diruri) = ($disuri =~ m{(.*/)[^/]*});
    $r->print('<p><a href="'.$diruri.'">'.
     &mt('Back To Directory').'</a></p>');
       }
  }   }
  $r->print('<br />'.$bombs);   $r->print('<br />'.$bombs);
     } else {      } else {
         my $displayfile='Catalog Information for '.$disuri;          my $displayfile=&mt('Metadata for [_1]',$disuri);
         if ($disuri=~/\/default$/) {          if ($disuri=~/\/default$/) {
             my $dir=$disuri;              my $dir=$disuri;
             $dir=~s/default$//;              $dir=~s/default$//;
             $displayfile=              $displayfile=&mt('Default Metadata for Directory [_1]',$dir);
                 &mt('Default Cataloging Information for Directory').' '.  
                 $dir;  
         }          }
         %Apache::lonpublisher::metadatafields=();          %Apache::lonpublisher::metadatafields=();
         %Apache::lonpublisher::metadatakeys=();          %Apache::lonpublisher::metadatakeys=();
Line 1196  ENDDEL Line 1221  ENDDEL
         } else {          } else {
             &Apache::lonpublisher::metaeval($result);              &Apache::lonpublisher::metaeval($result);
         }          }
           if ($env{'form.new_courserestricted'}) {
               my $new_assoc_course = $env{'form.new_courserestricted'};
               my $prev_courserestricted = $Apache::lonpublisher::metadatafields{'courserestricted'};
               if (($prev_courserestricted) && 
                   ($prev_courserestricted ne $new_assoc_course)) {
                   my $transfers = [];
                   foreach my $key (keys(%env)) {
                       if ($key =~ /^form\.transfer_(.+)$/) {
                           push(@{$transfers},$1);
                       }
                   }
                   if (@{$transfers} > 0) {
                       &store_transferred_addedfields($fn,$uri,$transfers);
                   }
               }
           }
         $r->print(<<ENDEDIT);          $r->print(<<ENDEDIT);
 <h1>$displayfile</h1>  <h1>$displayfile</h1>
 <form method="post" action="" name="defaultmeta">  <form method="post" action="" name="defaultmeta">
 ENDEDIT  ENDEDIT
         $r->print('<script type="JavaScript">'.  
                   &Apache::loncommon::browser_and_searcher_javascript().  
                   '</script>');  
         my %lt=&fieldnames($file_type);          my %lt=&fieldnames($file_type);
  my $output;   my $output;
  my @fields;   my @fields;
Line 1258  ENDEDIT Line 1296  ENDEDIT
  $Apache::lonpublisher::metadatafields{'owner'} =   $Apache::lonpublisher::metadatafields{'owner'} =
     $env{'user.name'}.':'.$env{'user.domain'};      $env{'user.name'}.':'.$env{'user.domain'};
     }      }
       if (! $Apache::lonpublisher::metadatafields{'author'}) {
    $Apache::lonpublisher::metadatafields{'author'} =
       &Apache::loncommon::plainname($env{'user.name'},
     $env{'user.domain'});
       }
     if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {      if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {
   
                 if ($file_type eq 'portfolio') {                  if ($file_type eq 'portfolio') {
Line 1273  ENDEDIT Line 1316  ENDEDIT
                         ".description"}.'</strong>').'<br />');                          ".description"}.'</strong>').'<br />');
                 }                  }
     } else {      } else {
  $r->print('<a href="'.$uri.'?changecourse=true">This resource is not associated with a course.</a><br />');   $r->print('<a href="'.$uri.'?changecourse=true">'.&mt('This resource is not associated with a course.').'</a><br />');
     }      }
  }   }
  if (@added_order) {   if (@added_order) {
Line 1291  ENDEDIT Line 1334  ENDEDIT
         my $row_alt = 1;          my $row_alt = 1;
         foreach my $field_name (@fields) {          foreach my $field_name (@fields) {
             if (defined($env{'form.new_'.$field_name})) {              if (defined($env{'form.new_'.$field_name})) {
                 $Apache::lonpublisher::metadatafields{$field_name}=                  my @values = &Apache::loncommon::get_env_multiple('form.new_'.$field_name);
                     join(',',&Apache::loncommon::get_env_multiple('form.new_'.$field_name));                  my $newvalue = '';
                   foreach my $item (@values) {
                       if ($item ne '') {
                           $newvalue .= $item.',';
                       }
                   }
                   $newvalue =~ s/,$//; 
                   $Apache::lonpublisher::metadatafields{$field_name}=$newvalue;
             }              }
             if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none'              if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none'
  && exists($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'})) {   && exists($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'})) {
Line 1321  ENDEDIT Line 1371  ENDEDIT
         }          }
         $output .= &Apache::loncommon::end_data_table();          $output .= &Apache::loncommon::end_data_table();
  if ($env{'form.store'}) {   if ($env{'form.store'}) {
     my $mfh;              my ($outcome,$result) = &store_metadata($fn,$uri,'store');
     my $formname='store';               $r->print($result);
     my $file_content;  
     if (&Apache::loncommon::get_env_multiple('form.new_keywords')) {  
  $Apache::lonpublisher::metadatafields{'keywords'} =   
     join (',', &Apache::loncommon::get_env_multiple('form.new_keywords'));  
     }  
     foreach my $field (sort(keys(%Apache::lonpublisher::metadatafields))) {  
  next if ($field =~ /\./);  
  my $unikey=$field;  
  $unikey=~/^([A-Za-z_]+)/;  
  my $tag=$1;  
  $tag=~tr/A-Z/a-z/;  
  $file_content.= "\n\<$tag";  
  foreach my $key (split(/\,/,  
        $Apache::lonpublisher::metadatakeys{$unikey})  
  ) {  
     my $value=  
  $Apache::lonpublisher::metadatafields{$unikey.'.'.$key};  
     $value=~s/\"/\'\'/g;  
     $file_content.=' '.$key.'="'.$value.'"' ;  
  }  
  $file_content.= '>'.  
     &HTML::Entities::encode  
     ($Apache::lonpublisher::metadatafields{$unikey},  
      '<>&"').  
      '</'.$tag.'>';  
     }  
     if ($fn =~ m|^$Apache::lonnet::perlvar{'lonDocRoot'}/userfiles|) {  
         my ($path, $new_fn);  
         if ($fn =~ m|$match_name/groups/\w+/portfolio/|) {  
                     ($path, $new_fn) = ($fn =~ m|/(groups/\w+/portfolio.*)/([^/]*)$|);  
         } else {  
     ($path, $new_fn) = ($fn =~ m|/(portfolio.*)/([^/]*)$|);  
         }  
                 $r->print(&store_portfolio_metadata($formname,$file_content,$path,  
                                                     $new_fn,$uri));  
             } else {  
  if (! ($mfh=Apache::File->new('>'.$fn))) {  
     $r->print('<p><font color="red">'.  
       &mt('Could not write metadata').', '.  
       &mt('FAIL').'</font></p>');  
  } else {  
     print $mfh ($file_content);  
                     close($mfh);  
                     &update_metadata_table($uri);  
     $r->print('<p><font color="blue">'.&mt('Wrote Metadata').  
       ' '.&Apache::lonlocal::locallocaltime(time).  
       '</font></p>');  
  }  
     }  
  }   }
  $r->print($output.'<br /><input type="submit" name="store" value="'.   $r->print($output.'<br /><input type="submit" title="Save Metadata" name="store" value="'.
                   &mt('Store Catalog Information').'" />');                    &mt('Save').'" />');
   
  if ($file_type eq 'portfolio' || $file_type eq 'groups') {   if ($file_type eq 'portfolio' || $file_type eq 'groups') {
     my ($port_path,$group) = &get_port_path_and_group($uri);      my ($port_path,$group) = &get_port_path_and_group($uri);
Line 1396  ENDEDIT Line 1397  ENDEDIT
     return;      return;
 }  }
   
   sub store_metadata {
       my ($fn,$uri,$caller) = @_;
       my $mfh;
       my $formname='store';
       my ($file_content,$output,$outcome);
       if (&Apache::loncommon::get_env_multiple('form.new_keywords')) {
           $Apache::lonpublisher::metadatafields{'keywords'} =
               join (',', &Apache::loncommon::get_env_multiple('form.new_keywords'));
               }
       foreach my $field (sort(keys(%Apache::lonpublisher::metadatafields))) {
           next if ($field =~ /\./);
           my $unikey=$field;
           $unikey=~/^([A-Za-z_]+)/;
           my $tag=$1;
           $tag=~tr/A-Z/a-z/;
           $file_content.= "\n\<$tag";
           foreach my $key (split(/\,/,$Apache::lonpublisher::metadatakeys{$unikey})) {
               my $value = $Apache::lonpublisher::metadatafields{$unikey.'.'.$key};
               $value=~s/\"/\'\'/g;
               $file_content.=' '.$key.'="'.$value.'"' ;
           }
           $file_content.= '>'.
               &HTML::Entities::encode
                   ($Apache::lonpublisher::metadatafields{$unikey},'<>&"').
                   '</'.$tag.'>';
       }
       if ($fn =~ m|^$Apache::lonnet::perlvar{'lonDocRoot'}/userfiles|) {
           my ($path, $new_fn);
           if ($fn =~ m|$match_name/groups/\w+/portfolio/|) {
               ($path, $new_fn) = ($fn =~ m|/(groups/\w+/portfolio.*)/([^/]*)$|);
           } else {
               ($path, $new_fn) = ($fn =~ m|/(portfolio.*)/([^/]*)$|);
           }
           ($outcome,my $result) = 
               &store_portfolio_metadata($formname,$file_content,
                                         $path,$new_fn,$uri,$caller);
           $output .= $result;
       } else {
           if (! ($mfh=Apache::File->new('>'.$fn))) {
               $output .= '<p><font color="red">';
               if ($caller eq 'transfer') {
                   $output .= &mt('Could not transfer data in added fields to notes');
               } else { 
                   $output .= &mt('Could not write metadata');
               }
               $output .= ', '.&mt('FAIL').'</font></p>';
               $outcome = 'fail';
           } else {
               print $mfh ($file_content);
               close($mfh);
               &update_metadata_table($uri);
               $output .= '<p><font color="blue">';
               if ($caller eq 'transfer') {
                   $output .= &mt('Transferred data in added fields to notes');
               } else {
                   $output .= &mt('Wrote Metadata');
               }
               $output .= ' '.&Apache::lonlocal::locallocaltime(time).
                          '</font></p>';
               $outcome = 'ok';
           }
       }
       return ($outcome,$output);
   }
   
   sub store_transferred_addedfields {
       my ($fn,$uri,$transfers) = @_;
       foreach my $item (@{$transfers}) {
           $Apache::lonpublisher::metadatafields{'notes'} .= 
              ' '.$item.' = '.$Apache::lonpublisher::metadatafields{$item};
       }
       my ($outcome,$output) = &store_metadata($fn,$uri,'transfer');
       if ($outcome eq 'ok') {
           foreach my $item (@{$transfers}) {
               delete($Apache::lonpublisher::metadatafields{$item});
           }
       }
   }
   
 sub store_portfolio_metadata {  sub store_portfolio_metadata {
     my ($formname,$content,$path,$new_fn,$uri) = @_;      my ($formname,$content,$path,$new_fn,$uri,$caller) = @_;
       my ($outcome,$output);
     $env{'form.'.$formname}=$content."\n";      $env{'form.'.$formname}=$content."\n";
     $env{'form.'.$formname.'.filename'}=$new_fn;      $env{'form.'.$formname.'.filename'}=$new_fn;
     my $result =&Apache::lonnet::userfileupload($formname,'',$path);      my $result =&Apache::lonnet::userfileupload($formname,'',$path);
     if ($result =~ /(error|notfound)/) {      if ($result =~ /(error|notfound)/) {
         return '<p><font color="red">'.          $output = '<p><font color="red">';
                   &mt('Could not write metadata').', '.          if ($caller eq 'transfer') {
                   &mt('FAIL').'</font></p>';              $output .= 
                   &mt('Could not transfer data in added fields to notes'); 
           } else {
               $output .= &mt('Could not write metadata');
           }
           $output .= ', '.&mt('FAIL').'</font></p>';
           $outcome = 'fail';
     } else {      } else {
         &update_metadata_table($uri);          &update_metadata_table($uri);
         return '<p><font color="blue">'.&mt('Wrote Metadata').          $output = '<p><font color="blue">';
                   ' '.&Apache::lonlocal::locallocaltime(time).'</font></p>';          if ($caller eq 'transfer') {
               $output .= &mt('Transferred data in added fields to notes');
           } else {
               $output .= &mt('Wrote Metadata');
           }
           $output .= ' '.&Apache::lonlocal::locallocaltime(time).
                      '</font></p>';
           $outcome = 'ok';
     }      }
       return ($outcome,$output);
 }  }
   
 sub update_metadata_table {  sub update_metadata_table {
Line 1445  sub update_metadata_table { Line 1540  sub update_metadata_table {
 1;  1;
 __END__  __END__
   
   
   =head1 NAME
   
   Apache::lonmeta - display meta data
   
   =head1 SYNOPSIS
   
   Handler to display meta data
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 SUBROUTINES
   
   =over
   
   =item &get_dynamic_metadata_from_sql($url) :
   
   Queries sql database for dynamic metdata
   Returns a hash of hashes, with keys of urls which match $url
   Returned fields are given below.
   
   Examples:
   
       %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql
       ('/res/msu/korte/');
   
       $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}
   
   =item dynamicmeta()
   
   Fetch and evaluate dynamic metadata
   
   =item access_count()
   
   =item alttag()
   
   Try to make an alt tag if there is none
   
   =item authordisplay()
   
   Author display
   
   =item evalgraph()
   
   Pretty display
   
   =item diffgraph()
   
   =item fieldnames()
   
   =item portfolio_linked_path()
   
   =item get_port_path_and_group()
   
   =item portfolio_display_uri()
   
   =item pre_select_course()
   
   =item select_course()
   
   =item prettyprint()
   
   Pretty printing of metadata field
   
   =item direct()
   
   Pretty input of metadata field
   
   =item selectbox()
   
   =item relatedfield()
   
   =item prettyinput()
   
   =item report_bombs()
   
   =item present_uneditable_metadata()
   
   =item present_editable_metadata()
   
   =item store_metadata()
   
   =item store_transferred_addedfields()
   
   =item store_portfolio_metadata()
   
   =item update_metadata_table()
   
   =back
   
   =cut

Removed from v.1.199  
changed lines
  Added in v.1.216


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.